[balsa] improve HTML context menus
- From: Albrecht Dreß <albrecht src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [balsa] improve HTML context menus
- Date: Fri, 21 Jan 2022 15:50:01 +0000 (UTC)
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]