[gnumeric] Introspection fixes



commit 476351d0e969461afabe28d10e7e41637819ded7
Author: Morten Welinder <terra gnome org>
Date:   Fri May 18 19:41:21 2018 -0400

    Introspection fixes

 src/dialogs/dialog-stf-fixed-page.c |    8 +++---
 src/gui-util.c                      |   51 ++++++++++++++++++++++------------
 src/gui-util.h                      |   11 ++++---
 src/item-cursor.c                   |    4 +-
 src/sheet-control-gui.c             |    6 ++--
 5 files changed, 48 insertions(+), 32 deletions(-)
---
diff --git a/src/dialogs/dialog-stf-fixed-page.c b/src/dialogs/dialog-stf-fixed-page.c
index bb783ad..f40a047 100644
--- a/src/dialogs/dialog-stf-fixed-page.c
+++ b/src/dialogs/dialog-stf-fixed-page.c
@@ -257,10 +257,10 @@ fixed_context_menu (StfDialogData *pagedata, GdkEventButton *event,
                sensitivity_filter |= (1 << CONTEXT_STF_IMPORT_NARROW);
 
        select_column (pagedata, col);
-       gnm_create_popup_menu (popup_elements, &fixed_context_menu_handler,
-                                   pagedata, 0,
-                                   sensitivity_filter,
-                                   (GdkEvent*)event);
+       gnm_create_popup_menu (popup_elements,
+                              &fixed_context_menu_handler, pagedata, NULL,
+                              0, sensitivity_filter,
+                              (GdkEvent*)event);
 }
 
 static gint
diff --git a/src/gui-util.c b/src/gui-util.c
index dd5c178..cfc502a 100644
--- a/src/gui-util.c
+++ b/src/gui-util.c
@@ -599,14 +599,28 @@ gnm_gtk_builder_load (char const *uifile, char const *domain, GOCmdContext *cc)
 }
 
 static void
-popup_item_activate (GtkWidget *item, gpointer *user_data)
+popup_item_activate (GtkWidget *item, GnmPopupMenuElement const *elem)
 {
-       GnmPopupMenuElement const *elem =
-               g_object_get_data (G_OBJECT (item), "descriptor");
-       GnmPopupMenuHandler handler =
-               g_object_get_data (G_OBJECT (item), "handler");
-
-       g_return_if_fail (elem != NULL);
+       GtkWidget *menu;
+       GnmPopupMenuHandler handler;
+       gpointer user_data;
+
+       // Go to top-level menu.  This shouldn't be that hard.
+       menu = item;
+       while (TRUE) {
+               if (GTK_IS_MENU_ITEM (menu))
+                       menu = gtk_widget_get_parent (menu);
+               else if (GTK_IS_MENU (menu)) {
+                       GtkWidget *a = gtk_menu_get_attach_widget (GTK_MENU (menu));
+                       if (a)
+                               menu = a;
+                       else
+                               break;
+               } else
+                       break;
+       }
+       handler = g_object_get_data (G_OBJECT (menu), "handler");
+       user_data = g_object_get_data (G_OBJECT (menu), "user-data");
        g_return_if_fail (handler != NULL);
 
        handler (elem, user_data);
@@ -615,24 +629,28 @@ popup_item_activate (GtkWidget *item, gpointer *user_data)
 /**
  * gnm_create_popup_menu:
  * @elements:
- * @handler: (scope async):
+ * @handler: (scope notified):
  * @user_data: user data to pass to @handler.
+ * @notify: destroy notification for @user_data
  * @display_filter:
  * @sensitive_filter:
  * @event:
  **/
 void
 gnm_create_popup_menu (GnmPopupMenuElement const *elements,
-                           GnmPopupMenuHandler handler,
-                           gpointer user_data,
-                           int display_filter, int sensitive_filter,
-                           GdkEvent *event)
+                      GnmPopupMenuHandler handler,
+                      gpointer user_data,
+                      GDestroyNotify notify,
+                      int display_filter, int sensitive_filter,
+                      GdkEvent *event)
 {
        char const *trans;
        GSList *menu_stack = NULL;
        GtkWidget *menu, *item;
 
        menu = gtk_menu_new ();
+       g_object_set_data (G_OBJECT (menu), "handler", (gpointer)handler);
+       g_object_set_data_full (G_OBJECT (menu), "user-data", user_data, notify);
        for (; NULL != elements->name ; elements++) {
                char const * const name = elements->name;
                char const * const pix_name = elements->pixmap;
@@ -677,12 +695,9 @@ gnm_create_popup_menu (GnmPopupMenuElement const *elements,
 
                if (elements->index > 0) {
                        g_signal_connect (G_OBJECT (item),
-                               "activate",
-                               G_CALLBACK (&popup_item_activate), user_data);
-                       g_object_set_data (
-                               G_OBJECT (item), "descriptor", (gpointer)(elements));
-                       g_object_set_data (
-                               G_OBJECT (item), "handler", (gpointer)handler);
+                                         "activate",
+                                         G_CALLBACK (popup_item_activate),
+                                         (gpointer)elements);
                }
                if (NULL != item) {
                        gtk_widget_show (item);
diff --git a/src/gui-util.h b/src/gui-util.h
index c63279c..7858798 100644
--- a/src/gui-util.h
+++ b/src/gui-util.h
@@ -59,11 +59,12 @@ typedef void (*GnmPopupMenuHandler) (GnmPopupMenuElement const *e,
                                          gpointer user_data);
 
 void gnm_create_popup_menu (GnmPopupMenuElement const *elements,
-                                GnmPopupMenuHandler handler,
-                                gpointer user_data,
-                                int display_filter,
-                                int sensitive_filter,
-                                GdkEvent *event);
+                           GnmPopupMenuHandler handler,
+                           gpointer user_data,
+                           GDestroyNotify notify,
+                           int display_filter,
+                           int sensitive_filter,
+                           GdkEvent *event);
 
 #define gnm_filter_modifiers(a) ((a) & (GDK_MODIFIER_MASK & (~(GDK_LOCK_MASK|GDK_MOD2_MASK|GDK_MOD5_MASK))))
 
diff --git a/src/item-cursor.c b/src/item-cursor.c
index 1d4d11f..d63c9af 100644
--- a/src/item-cursor.c
+++ b/src/item-cursor.c
@@ -847,8 +847,8 @@ item_cursor_popup_menu (GnmItemCursor *ic, GdkEvent *event)
        };
 
        gnm_create_popup_menu (popup_elements,
-                                   &context_menu_hander, ic,
-                                   0, 0, event);
+                              &context_menu_hander, ic, NULL,
+                              0, 0, event);
 }
 
 static void
diff --git a/src/sheet-control-gui.c b/src/sheet-control-gui.c
index dae05bb..a29f6c1 100644
--- a/src/sheet-control-gui.c
+++ b/src/sheet-control-gui.c
@@ -2532,9 +2532,9 @@ scg_context_menu (SheetControlGUI *scg, GdkEvent *event,
        }
 
 
-       gnm_create_popup_menu (popup_elements, &context_menu_handler,
-                                   scg, display_filter,
-                                   sensitivity_filter, event);
+       gnm_create_popup_menu (popup_elements,
+                              &context_menu_handler, scg, NULL,
+                              display_filter, sensitivity_filter, event);
 }
 
 static gboolean


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