diff options
author | Christian Grothoff <christian@grothoff.org> | 2021-09-29 18:04:51 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2021-09-29 18:04:51 +0200 |
commit | 4128bbafa716a9889ea33ca0d43cd0559cf1a4f7 (patch) | |
tree | 7011b049e60f7939f41582118b98cba1481851da /src | |
parent | ec6267d7b4957ad060fc602cbb17db3740f546e5 (diff) | |
download | anastasis-gtk-4128bbafa716a9889ea33ca0d43cd0559cf1a4f7.tar.gz anastasis-gtk-4128bbafa716a9889ea33ca0d43cd0559cf1a4f7.tar.bz2 anastasis-gtk-4128bbafa716a9889ea33ca0d43cd0559cf1a4f7.zip |
-add logic to right-click open TOS/PP from provider dialog
Diffstat (limited to 'src')
-rw-r--r-- | src/anastasis/anastasis-gtk_handle-auth-edit-provider-clicked.c | 205 |
1 files changed, 146 insertions, 59 deletions
diff --git a/src/anastasis/anastasis-gtk_handle-auth-edit-provider-clicked.c b/src/anastasis/anastasis-gtk_handle-auth-edit-provider-clicked.c index fdff487..02da9d5 100644 --- a/src/anastasis/anastasis-gtk_handle-auth-edit-provider-clicked.c +++ b/src/anastasis/anastasis-gtk_handle-auth-edit-provider-clicked.c @@ -33,7 +33,6 @@ #include <microhttpd.h> - /** * Context for menu callbacks. */ @@ -66,6 +65,50 @@ context_popup_selection_done (GtkMenuShell *menushell, /** + * Open @a url in a browser. + * + * @param url the URL to open + */ +static void +xdg_open (const char *url) +{ + pid_t chld; + int status; + + chld = fork (); + if (-1 == chld) + { + GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, + "fork"); + return; + } + if (0 == chld) + { + pid_t c2; + + c2 = fork (); + if (-1 == c2) + _exit (EXIT_FAILURE); + if (0 != c2) + _exit (EXIT_SUCCESS); + execlp ("xdg-open", + "xdg-open", + url, + NULL); + execlp ("open", + "open", + url, + NULL); + GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, + "exec", + "open"); + _exit (EXIT_FAILURE); + } + waitpid (chld, &status, 0); +} + + +/** * The user selected the 'view pp' menu. * * @param menuitem the selected menu @@ -73,11 +116,16 @@ context_popup_selection_done (GtkMenuShell *menushell, */ static void view_terms_of_service (GtkMenuItem *menuitem, - gpointer user_data) + gpointer user_data) { struct MenuContext *ctx = user_data; - GNUNET_break (0); // FIXME: not implemented + char *tos; + GNUNET_asprintf (&tos, + "%sterms", + ctx->url); + xdg_open (tos); + GNUNET_free (tos); } @@ -89,12 +137,51 @@ view_terms_of_service (GtkMenuItem *menuitem, */ static void view_privacy_policy (GtkMenuItem *menuitem, - gpointer user_data) + gpointer user_data) { struct MenuContext *ctx = user_data; + char *pp; + + GNUNET_asprintf (&pp, + "%sprivacy", + ctx->url); + xdg_open (pp); + GNUNET_free (pp); +} + +void +provider_toggle_callback (GtkCellRendererToggle *cell, + gchar *path_str, + gpointer user_data) +{ + GtkBuilder *builder = GTK_BUILDER (user_data); + GtkTreeIter iter; + GtkTreePath *path; + gboolean enabled; + GtkTreeModel *tm; - GNUNET_break (0); // FIXME: not implemented + tm = GTK_TREE_MODEL (gtk_builder_get_object (builder, + "provider_liststore")); + if (NULL == tm) + { + GNUNET_break (0); + return; + } + path = gtk_tree_path_new_from_string (path_str); + gtk_tree_model_get_iter (tm, + &iter, + path); + gtk_tree_model_get (tm, + &iter, + AG_PMC_PROVIDER_ENABLED, &enabled, + -1); + enabled = ! enabled; + gtk_list_store_set (GTK_LIST_STORE (tm), + &iter, + AG_PMC_PROVIDER_ENABLED, enabled, + -1); + gtk_tree_path_free (path); } @@ -108,8 +195,8 @@ view_privacy_policy (GtkMenuItem *menuitem, */ gboolean provider_tree_view_button_press_event_cb (GtkWidget *widget, - GdkEvent *event, - gpointer user_data) + GdkEvent *event, + gpointer user_data) { GtkBuilder *builder = GTK_BUILDER (user_data); GdkEventButton *event_button = (GdkEventButton *) event; @@ -119,7 +206,7 @@ provider_tree_view_button_press_event_cb (GtkWidget *widget, GtkTreeIter iter; struct MenuContext *ctx; GtkMenu *menu; - + if ((GDK_BUTTON_PRESS != event->type) || (3 != event_button->button)) return FALSE; /* not a right-click */ @@ -130,8 +217,8 @@ provider_tree_view_button_press_event_cb (GtkWidget *widget, GNUNET_break (0); return FALSE; } - tv = GTK_TREE_VIEW (GCG_get_main_window_object ( - "provider_tree_view")); + tv = GTK_TREE_VIEW (gtk_builder_get_object (builder, + "provider_tree_view")); if (! gtk_tree_view_get_path_at_pos (tv, event_button->x, event_button->y, @@ -144,8 +231,8 @@ provider_tree_view_button_press_event_cb (GtkWidget *widget, return FALSE; } if (! gtk_tree_model_get_iter (tm, - &iter, - path)) + &iter, + path)) { /* not sure how we got a path but no iter... */ GNUNET_break (0); @@ -154,49 +241,49 @@ provider_tree_view_button_press_event_cb (GtkWidget *widget, gtk_tree_path_free (path); ctx = GNUNET_new (struct MenuContext); gtk_tree_model_get (tm, - &iter, - AG_PMC_PROVIDER_URL, &ctx->url, - -1); + &iter, + AG_PMC_PROVIDER_URL, &ctx->url, + -1); menu = GTK_MENU (gtk_menu_new ()); { GtkWidget *child; child = gtk_menu_item_new_with_label (_ ("View _privacy policy...")); g_signal_connect (child, - "activate", - G_CALLBACK (&view_privacy_policy), - ctx); + "activate", + G_CALLBACK (&view_privacy_policy), + ctx); gtk_label_set_use_underline (GTK_LABEL ( - gtk_bin_get_child (GTK_BIN (child))), - TRUE); + gtk_bin_get_child (GTK_BIN (child))), + TRUE); gtk_widget_show (child); gtk_menu_shell_append (GTK_MENU_SHELL (menu), - child); + child); } { GtkWidget *child; - child = gtk_menu_item_new_with_label (_("View _terms of service...")); + child = gtk_menu_item_new_with_label (_ ("View _terms of service...")); g_signal_connect (child, - "activate", - G_CALLBACK (&view_terms_of_service), - ctx); + "activate", + G_CALLBACK (&view_terms_of_service), + ctx); gtk_label_set_use_underline (GTK_LABEL ( - gtk_bin_get_child (GTK_BIN (child))), - TRUE); + gtk_bin_get_child (GTK_BIN (child))), + TRUE); gtk_widget_show (child); gtk_menu_shell_append (GTK_MENU_SHELL (menu), - child); + child); } g_signal_connect (menu, "selection-done", G_CALLBACK (&context_popup_selection_done), ctx); - + gtk_menu_popup_at_pointer (menu, event); - + return FALSE; } @@ -226,12 +313,12 @@ url_add_button_clicked_cb (GtkButton *button, NULL, -1, AG_PMC_PROVIDER_URL, url, - AG_PMC_PROVIDER_STATUS, _("new"), - AG_PMC_PROVIDER_STATUS_COLOR, "yellow", - AG_PMC_PROVIDER_ENABLED, true, - AG_PMC_PROVIDER_SENSITIVE, false, - AG_PMC_PROVIDER_NOT_SENSITIVE, true, - -1); + AG_PMC_PROVIDER_STATUS, _ ("new"), + AG_PMC_PROVIDER_STATUS_COLOR, "yellow", + AG_PMC_PROVIDER_ENABLED, true, + AG_PMC_PROVIDER_SENSITIVE, false, + AG_PMC_PROVIDER_NOT_SENSITIVE, true, + -1); gtk_entry_set_text (entry, ""); } @@ -304,12 +391,12 @@ edit_provider_dialog_response_cb (GtkDialog *dialog, gtk_tree_model_get (tm, &iter, AG_PMC_PROVIDER_URL, &url, - AG_PMC_PROVIDER_ENABLED, &enabled, + AG_PMC_PROVIDER_ENABLED, &enabled, -1); if (NULL == json_object_get (providers, url)) { - // FIXME: store enabled status in JSON state! + // FIXME: store enabled status in JSON state! GNUNET_assert (0 == json_array_append_new (urls, json_string (url))); @@ -375,10 +462,10 @@ anastasis_gtk_edit_provider_list_clicked_cb (GtkButton *object, GNUNET_JSON_spec_mark_optional ( GNUNET_JSON_spec_uint32 ("http_status", &http_code)), - // FIXME: check: right fieldname? + // FIXME: check: right fieldname? GNUNET_JSON_spec_mark_optional ( - TALER_JSON_spec_amount_any ("liability_limit", - &ll)), + TALER_JSON_spec_amount_any ("liability_limit", + &ll)), GNUNET_JSON_spec_mark_optional ( GNUNET_JSON_spec_uint32 ("error_code", &ec)), @@ -390,8 +477,8 @@ anastasis_gtk_edit_provider_list_clicked_cb (GtkButton *object, const char *ll_s = NULL; memset (&ll, - 0, - sizeof (ll)); + 0, + sizeof (ll)); if (GNUNET_OK != GNUNET_JSON_parse (provider, spec, @@ -407,12 +494,12 @@ anastasis_gtk_edit_provider_list_clicked_cb (GtkButton *object, { status = GNUNET_strdup (_ ("available")); color = "green"; - sensitive = true; - if (GNUNET_OK == - TALER_amount_is_valid (&ll)) - ll_s = TALER_amount2s (&ll); - else - GNUNET_break (0); + sensitive = true; + if (GNUNET_OK == + TALER_amount_is_valid (&ll)) + ll_s = TALER_amount2s (&ll); + else + GNUNET_break (0); } else if (0 == http_code) { @@ -434,16 +521,16 @@ anastasis_gtk_edit_provider_list_clicked_cb (GtkButton *object, } gtk_list_store_insert_with_values ( ls, - NULL, - -1, - AG_PMC_PROVIDER_URL, url, - AG_PMC_PROVIDER_STATUS, status, - AG_PMC_PROVIDER_STATUS_COLOR, color, - AG_PMC_PROVIDER_LIABILITY_LIMIT, ll_s, - AG_PMC_PROVIDER_ENABLED, sensitive, // FIXME: store active/inactive status in JSON state! - AG_PMC_PROVIDER_SENSITIVE, sensitive, - AG_PMC_PROVIDER_NOT_SENSITIVE, ! sensitive, - -1); + NULL, + -1, + AG_PMC_PROVIDER_URL, url, + AG_PMC_PROVIDER_STATUS, status, + AG_PMC_PROVIDER_STATUS_COLOR, color, + AG_PMC_PROVIDER_LIABILITY_LIMIT, ll_s, + AG_PMC_PROVIDER_ENABLED, sensitive, // FIXME: store active/inactive status in JSON state! + AG_PMC_PROVIDER_SENSITIVE, sensitive, + AG_PMC_PROVIDER_NOT_SENSITIVE, ! sensitive, + -1); GNUNET_free (status); } } |