[Goodies-commits] r4528 - xfce4-places-plugin/trunk/panel-plugin

Diego Ongaro ongardie at xfce.org
Mon Apr 7 01:10:29 CEST 2008


Author: ongardie
Date: 2008-04-06 23:10:29 +0000 (Sun, 06 Apr 2008)
New Revision: 4528

Modified:
   xfce4-places-plugin/trunk/panel-plugin/view.c
Log:
Also used changed to reposition menu (see bug3872)
Clean up handler disconnection


Modified: xfce4-places-plugin/trunk/panel-plugin/view.c
===================================================================
--- xfce4-places-plugin/trunk/panel-plugin/view.c	2008-04-06 23:10:18 UTC (rev 4527)
+++ xfce4-places-plugin/trunk/panel-plugin/view.c	2008-04-06 23:10:29 UTC (rev 4528)
@@ -95,6 +95,10 @@
     GtkTooltips               *tooltips;
 #endif
 
+#if USE_RECENT_DOCUMENTS
+    gulong                     recent_manager_changed_handler[3];
+#endif
+
     gboolean                   needs_separator;
     guint                      menu_timeout_id;
     
@@ -463,17 +467,25 @@
     g_free(uri);
 }
 
+static void
+pview_cb_recent_changed_position(GtkRecentManager *recent_manager, GtkWidget *recent_menu)
+{
+    while(gtk_events_pending())
+        gtk_main_iteration();
+
+    gtk_menu_reposition(GTK_MENU(recent_menu));
+}
+
 static gboolean
 pview_cb_recent_items_clear(GtkWidget *clear_item, GtkWidget *recent_menu)
 {
     GtkRecentManager *manager = gtk_recent_manager_get_default();
+    
     gint removed = gtk_recent_manager_purge_items(manager, NULL);
     DBG("Cleared %d recent items", removed);
 
-    while(gtk_events_pending())
-        gtk_main_iteration();
-    gtk_menu_reposition(GTK_MENU(recent_menu));
-
+    pview_cb_recent_changed_position(manager, recent_menu);
+    
     return TRUE;
 }
 
@@ -484,9 +496,10 @@
 }
 
 static void
-pview_cb_recent_changed(GtkRecentManager *recent_manager, GtkWidget *widget)
+pview_cb_recent_changed_hide(GtkRecentManager *recent_manager, GtkWidget *widget)
 {
     int recent_count;
+    
     g_object_get(recent_manager,
                  "size", &recent_count,
                  NULL);
@@ -505,18 +518,21 @@
 static void
 pview_destroy_menu(PlacesView *view)
 {
-    if(view->menu != NULL){
+#ifdef USE_RECENT_DOCUMENTS
+    GtkRecentManager *recent_manager = gtk_recent_manager_get_default();
+    int i;
+#endif
+
+    if(view->menu != NULL) {
         gtk_menu_shell_deactivate(GTK_MENU_SHELL(view->menu));
 
 #ifdef USE_RECENT_DOCUMENTS
-        if (2 != g_signal_handlers_disconnect_matched(gtk_recent_manager_get_default(), 
-                                                      G_SIGNAL_MATCH_FUNC,
-                                                      g_signal_lookup("changed", gtk_recent_manager_get_type()),
-                                                      0,
-                                                      NULL, 
-                                                      pview_cb_recent_changed,
-                                                      NULL)) {
-            DBG("Warning: did not disconnect two pview_cb_recent_changed handlers");
+        for (i = 0; i < 3; i++) {
+            if (view->recent_manager_changed_handler[i]) {
+                g_signal_handler_disconnect(recent_manager,
+                                            view->recent_manager_changed_handler[i]);
+                view->recent_manager_changed_handler[i] = 0;
+            }
         }
 #endif
 
@@ -687,14 +703,17 @@
 
         g_signal_connect(recent_menu, "item-activated", 
                          G_CALLBACK(pview_cb_recent_item_open), pd);
+            
+        pd->recent_manager_changed_handler[0] = g_signal_connect(recent_manager, "changed",
+                                                                 G_CALLBACK(pview_cb_recent_changed_position), recent_menu);
     
         if(pd->cfg->show_recent_clear){
 
             separator = gtk_separator_menu_item_new();
             gtk_menu_shell_append(GTK_MENU_SHELL(recent_menu), separator);
-            pview_cb_recent_changed(recent_manager, separator);
-            g_signal_connect(recent_manager, "changed",
-                             G_CALLBACK(pview_cb_recent_changed), separator);
+            pview_cb_recent_changed_hide(recent_manager, separator);
+            pd->recent_manager_changed_handler[1] = g_signal_connect(recent_manager, "changed",
+                                                                     G_CALLBACK(pview_cb_recent_changed_hide), separator);
    
             if(pd->cfg->show_icons){
                 clear_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_CLEAR, NULL);
@@ -705,9 +724,9 @@
             }
 
             gtk_menu_shell_append(GTK_MENU_SHELL(recent_menu), clear_item);
-            pview_cb_recent_changed(recent_manager, clear_item);
-            g_signal_connect(recent_manager, "changed",
-                             G_CALLBACK(pview_cb_recent_changed), clear_item);
+            pview_cb_recent_changed_hide(recent_manager, clear_item);
+            pd->recent_manager_changed_handler[2] = g_signal_connect(recent_manager, "changed",
+                                                                     G_CALLBACK(pview_cb_recent_changed_hide), clear_item);
 
             /* try button-release-event to catch mouse clicks and not hide the menu after */
             g_signal_connect(clear_item, "button-release-event",




More information about the Goodies-commits mailing list