[balsa] improve HTML context menus



commit 2b7aedffd08499c0d7472e3fb6b8af81bc313f21
Author: Albrecht Dreß <albrecht dress netcologne de>
Date:   Fri Jan 21 16:49:57 2022 +0100

    improve HTML context menus
    
    In HTML parts, display
    * the standard WebKit context menu iff a selection exists,
    * the similar context menu as for plain text parts iff triggered over a
    link, and
    * the standard Balsa HTML menu as before otherwise.
    
    See also issue #65 for further details.
    
    Changes:
    * libbalsa/html.[hc]: call WebKit menu iff a selection exists; pass link
    URI to parent signal handler
    * src/balsa-mime-widget-text.c: create and use a link popup menu iff a
    link has been passed
    
    Signed-off-by: Albrecht Dreß <albrecht dress netcologne de>

 libbalsa/html.c              |  8 ++++++++
 libbalsa/html.h              |  1 +
 src/balsa-mime-widget-text.c | 33 ++++++++++++++++++++++++++++++++-
 3 files changed, 41 insertions(+), 1 deletion(-)
---
diff --git a/libbalsa/html.c b/libbalsa/html.c
index 4ed0f6b30..e5bc2b06b 100644
--- a/libbalsa/html.c
+++ b/libbalsa/html.c
@@ -598,14 +598,22 @@ lbh_context_menu_cb(WebKitWebView       * web_view,
     GtkWidget *parent;
     gboolean retval;
 
+    /* display the default Webkit context menu if the user selected some content */
+    if (webkit_hit_test_result_context_is_selection(hit_test_result)) {
+        return FALSE;
+    }
+
     parent = gtk_widget_get_parent(GTK_WIDGET(web_view));
     /* The signal is asynchronous, so gtk_get_current_event() gets NULL;
      * we pass the event to the popup-menu handler: */
     g_object_set_data(G_OBJECT(parent), LIBBALSA_HTML_POPUP_EVENT, event);
+    g_object_set_data(G_OBJECT(parent), LIBBALSA_HTML_POPUP_URL,
+        (gpointer) webkit_hit_test_result_get_link_uri(hit_test_result));
 
     g_signal_emit_by_name(parent, "popup-menu", &retval);
 
     g_object_set_data(G_OBJECT(parent), LIBBALSA_HTML_POPUP_EVENT, NULL);
+    g_object_set_data(G_OBJECT(parent), LIBBALSA_HTML_POPUP_URL, NULL);
 
     return retval;
 }
diff --git a/libbalsa/html.h b/libbalsa/html.h
index e68867444..a46af578e 100644
--- a/libbalsa/html.h
+++ b/libbalsa/html.h
@@ -70,6 +70,7 @@ gboolean libbalsa_html_get_selection_bounds(GtkWidget * widget,
                                             selection_bounds);
 
 #define LIBBALSA_HTML_POPUP_EVENT "libbalsa-html-popup-event"
+#define LIBBALSA_HTML_POPUP_URL "libbalsa-html-popup-url"
 GtkWidget *libbalsa_html_popup_menu_widget(GtkWidget * widget);
 GtkWidget *libbalsa_html_get_view_widget(GtkWidget * widget);
 
diff --git a/src/balsa-mime-widget-text.c b/src/balsa-mime-widget-text.c
index 96859cbcd..cdf2ed9a5 100644
--- a/src/balsa-mime-widget-text.c
+++ b/src/balsa-mime-widget-text.c
@@ -1197,15 +1197,46 @@ bmwt_html_populate_popup_menu(BalsaMessage * bm,
     gtk_widget_show_all(GTK_WIDGET(menu));
 }
 
+static void
+bmwt_html_populate_url_menu(GtkMenu *menu, const gchar *url)
+{
+       GtkWidget *menuitem;
+       message_url_t *popup_url;
+
+       popup_url = g_new0(message_url_t, 1U);
+       popup_url->url = g_strdup(url);
+       g_object_set_data_full(G_OBJECT(menu), "url", popup_url, (GDestroyNotify) free_url);
+
+       menuitem = gtk_menu_item_new_with_label(_("Copy link"));
+       g_signal_connect(menuitem, "activate", G_CALLBACK(url_copy_cb), popup_url);
+       gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+
+       menuitem = gtk_menu_item_new_with_label(_("Open link"));
+       g_signal_connect(menuitem, "activate", G_CALLBACK(url_open_cb), popup_url);
+       gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+
+       menuitem = gtk_menu_item_new_with_label(_("Send link…"));
+       g_signal_connect(menuitem, "activate", G_CALLBACK(url_send_cb), popup_url);
+       gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+
+       gtk_widget_show_all(GTK_WIDGET(menu));
+}
+
 static gboolean
 bmwt_html_popup_context_menu(GtkWidget * html, BalsaMessage * bm)
 {
     GtkWidget *menu;
+    const gchar *popup_url;
     const GdkEvent *event;
     GdkEvent *current_event = NULL;
 
     menu = gtk_menu_new();
-    bmwt_html_populate_popup_menu(bm, html, GTK_MENU(menu));
+    popup_url = (const gchar *) g_object_get_data(G_OBJECT(html), LIBBALSA_HTML_POPUP_URL);
+    if (popup_url != NULL) {
+       bmwt_html_populate_url_menu(GTK_MENU(menu), popup_url);
+    } else {
+       bmwt_html_populate_popup_menu(bm, html, GTK_MENU(menu));
+    }
 
     /* In WebKit2, the context menu signal is asynchronous, so the
      * GdkEvent is no longer current; instead it is preserved and passed


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]