[balsa/gtk3] Pass GdkEvent when emitting "popup-menu"



commit 1963c708a15ac641612b4154a59d95d3576dfbff
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Mon Apr 8 17:05:23 2013 -0400

    Pass GdkEvent when emitting "popup-menu"
    
        * libbalsa/html.c (lbh_context_menu_cb): pass the GdkEvent when
        emitting "popup-menu";
        * libbalsa/html.h: define key for GdkEvent.
        * src/balsa-mime-widget-text.c (balsa_gtk_html_popup): use it to
        pass the event time when popping up the menu.

 ChangeLog                    |    8 ++++++++
 libbalsa/html.c              |    6 ++++++
 libbalsa/html.h              |    1 +
 src/balsa-mime-widget-text.c |   20 ++++++++++++++++++--
 4 files changed, 33 insertions(+), 2 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 0eadf52..34e6bae 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2013-04-08  Peter Bloomfield
 
+       * libbalsa/html.c (lbh_context_menu_cb): pass the GdkEvent when
+       emitting "popup-menu";
+       * libbalsa/html.h: define key for GdkEvent.
+       * src/balsa-mime-widget-text.c (balsa_gtk_html_popup): use it to
+       pass the event time when popping up the menu.
+
+2013-04-08  Peter Bloomfield
+
        * libbalsa/send.c (libbalsa_set_message_id): constify two
        strings.
 
diff --git a/libbalsa/html.c b/libbalsa/html.c
index 1483b9d..8ce4955 100644
--- a/libbalsa/html.c
+++ b/libbalsa/html.c
@@ -448,8 +448,14 @@ lbh_context_menu_cb(WebKitWebView       * web_view,
     gboolean retval;
 
     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_signal_emit_by_name(parent, "popup-menu", &retval);
 
+    g_object_set_data(G_OBJECT(parent), LIBBALSA_HTML_POPUP_EVENT, NULL);
+
     return retval;
 }
 
diff --git a/libbalsa/html.h b/libbalsa/html.h
index 03be566..1856c77 100644
--- a/libbalsa/html.h
+++ b/libbalsa/html.h
@@ -73,6 +73,7 @@ gboolean libbalsa_html_get_selection_bounds(GtkWidget * widget,
                                             GdkRectangle *
                                             selection_bounds);
 
+#define LIBBALSA_HTML_POPUP_EVENT "libbalsa-html-popup-event"
 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 4693915..1d3c844 100644
--- a/src/balsa-mime-widget-text.c
+++ b/src/balsa-mime-widget-text.c
@@ -1085,13 +1085,29 @@ static gboolean
 balsa_gtk_html_popup(GtkWidget * html, BalsaMessage * bm)
 {
     GtkWidget *menu;
+    const GdkEvent *event;
+    GdkEvent *current_event = NULL;
+    guint32 time;
+    guint button;
 
     menu = gtk_menu_new();
     bmwt_populate_popup_menu(bm, html, GTK_MENU(menu));
 
     gtk_widget_show_all(menu);
-    gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
-                   0, gtk_get_current_event_time());
+
+    /* In WebKit2, the context menu signal is asynchronous, so the
+     * GdkEvent is no longer current; instead it is preserved and passed
+     * to us: */
+    event = g_object_get_data(G_OBJECT(html), LIBBALSA_HTML_POPUP_EVENT);
+    if (!event)
+        event = current_event = gtk_get_current_event();
+    time = gdk_event_get_time(event);
+    button = 0;
+    gdk_event_get_button(event, &button);
+    if (current_event)
+        gdk_event_free(current_event);
+
+    gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, button, time);
 
     return TRUE;
 }


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