summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2021-09-29 18:04:51 +0200
committerChristian Grothoff <christian@grothoff.org>2021-09-29 18:04:51 +0200
commit4128bbafa716a9889ea33ca0d43cd0559cf1a4f7 (patch)
tree7011b049e60f7939f41582118b98cba1481851da /src
parentec6267d7b4957ad060fc602cbb17db3740f546e5 (diff)
downloadanastasis-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.c205
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);
}
}