[Xfce4-commits] <xfce4-indicator-plugin:master> Improved handling of popup menus

Andrzej noreply at xfce.org
Wed Jan 22 22:46:01 CET 2014


Updating branch refs/heads/master
         to 9003be9a2ba233c68c706e691741c3dea09a44c2 (commit)
       from 11fbd8c67c272706dbde3ca9fa0722b4691ec817 (commit)

commit 9003be9a2ba233c68c706e691741c3dea09a44c2
Author: Andrzej <ndrwrdck at gmail.com>
Date:   Wed Jan 22 21:44:00 2014 +0000

    Improved handling of popup menus
    
    _set_menu should clean up/disactivate previous menu,
    Menus should only be attached once (and detached when needed),
    _deactivate function should only be called once.

 panel-plugin/indicator-box.c    |    3 +--
 panel-plugin/indicator-button.c |   48 ++++++++++++++++++---------------------
 panel-plugin/indicator-button.h |    2 +-
 panel-plugin/indicator.c        |    6 +++--
 4 files changed, 28 insertions(+), 31 deletions(-)

diff --git a/panel-plugin/indicator-box.c b/panel-plugin/indicator-box.c
index c0fa328..66523d6 100644
--- a/panel-plugin/indicator-box.c
+++ b/panel-plugin/indicator-box.c
@@ -595,8 +595,7 @@ xfce_indicator_box_remove_entry (XfceIndicatorBox     *box,
           button = XFCE_INDICATOR_BUTTON (li_tmp->data);
           if (xfce_indicator_button_get_entry (button) == entry)
             {
-              xfce_indicator_button_disconnect_signals (button);
-              gtk_widget_destroy (GTK_WIDGET (button));
+              xfce_indicator_button_destroy (button);
               return;
             }
         }
diff --git a/panel-plugin/indicator-button.c b/panel-plugin/indicator-button.c
index 2963e84..8440c62 100644
--- a/panel-plugin/indicator-button.c
+++ b/panel-plugin/indicator-button.c
@@ -43,7 +43,6 @@
 //#define INDICATOR_OBJECT_SIGNAL_ENTRY_SCROLLED "scroll-entry"
 //#endif
 
-static void                 xfce_indicator_button_finalize        (GObject                *object);
 static gboolean             xfce_indicator_button_button_press    (GtkWidget              *widget,
                                                                    GdkEventButton         *event);
 static gboolean             xfce_indicator_button_button_release  (GtkWidget              *widget,
@@ -73,6 +72,7 @@ struct _XfceIndicatorButton
 
   GtkWidget            *align_box;
   GtkWidget            *box;
+  gulong                deactivate_id;
 };
 
 struct _XfceIndicatorButtonClass
@@ -88,12 +88,8 @@ G_DEFINE_TYPE (XfceIndicatorButton, xfce_indicator_button, GTK_TYPE_TOGGLE_BUTTO
 static void
 xfce_indicator_button_class_init (XfceIndicatorButtonClass *klass)
 {
-  GObjectClass      *gobject_class;
   GtkWidgetClass    *widget_class;
 
-  gobject_class = G_OBJECT_CLASS (klass);
-  gobject_class->finalize = xfce_indicator_button_finalize;
-
   widget_class = GTK_WIDGET_CLASS (klass);
   widget_class->button_press_event = xfce_indicator_button_button_press;
   widget_class->button_release_event = xfce_indicator_button_button_release;
@@ -122,6 +118,7 @@ xfce_indicator_button_init (XfceIndicatorButton *button)
   button->plugin = NULL;
   button->config = NULL;
   button->menu = NULL;
+  button->deactivate_id = 0;
 
   button->align_box = gtk_alignment_new (0.5, 0.5, 1.0, 1.0);
   gtk_container_add (GTK_CONTAINER (button), button->align_box);
@@ -130,18 +127,6 @@ xfce_indicator_button_init (XfceIndicatorButton *button)
 
 
 
-static void
-xfce_indicator_button_finalize (GObject *object)
-{
-  XfceIndicatorButton *button = XFCE_INDICATOR_BUTTON (object);
-
-  xfce_indicator_button_disconnect_signals (button);
-
-  G_OBJECT_CLASS (xfce_indicator_button_parent_class)->finalize (object);
-}
-
-
-
 void
 xfce_indicator_button_set_label (XfceIndicatorButton *button,
                                  GtkLabel            *label)
@@ -174,13 +159,15 @@ xfce_indicator_button_set_menu (XfceIndicatorButton *button,
   g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (button));
   g_return_if_fail (GTK_IS_MENU (menu));
 
-  if (button->menu != menu)
+  if (button->menu != NULL)
     {
-      button->menu = menu;
-      g_signal_connect_swapped (G_OBJECT (button->menu), "deactivate",
-                                G_CALLBACK (xfce_indicator_button_menu_deactivate), button);
-      gtk_menu_attach_to_widget(menu, GTK_WIDGET (button), NULL);
+      gtk_menu_detach (button->menu);
+      gtk_menu_popdown (button->menu);
+      button->menu = NULL;
     }
+
+  button->menu = menu;
+  gtk_menu_attach_to_widget(menu, GTK_WIDGET (button), NULL);
 }
 
 
@@ -297,14 +284,17 @@ xfce_indicator_button_new (IndicatorObject      *io,
 
 
 void
-xfce_indicator_button_disconnect_signals (XfceIndicatorButton *button)
+xfce_indicator_button_destroy (XfceIndicatorButton *button)
 {
   g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (button));
 
-  if (button->menu != 0)
+  if (button->menu != NULL)
     {
+      gtk_menu_detach (button->menu);
       gtk_menu_popdown (button->menu);
+      button->menu = NULL;
     }
+  gtk_widget_destroy (GTK_WIDGET (button));
 }
 
 
@@ -316,13 +306,14 @@ xfce_indicator_button_button_press (GtkWidget      *widget,
 
   if(event->button == 1 && button->menu != NULL) /* left click only */
     {
-      //gtk_menu_attach_to_widget(button->menu, GTK_WIDGET (button), NULL);
       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),TRUE);
+      button->deactivate_id = g_signal_connect_swapped
+        (G_OBJECT (button->menu), "deactivate",
+         G_CALLBACK (xfce_indicator_button_menu_deactivate), button);
       gtk_menu_reposition (GTK_MENU (button->menu));
       gtk_menu_popup (button->menu, NULL, NULL,
                       xfce_panel_plugin_position_menu, button->plugin,
                       event->button, event->time);
-      //gtk_menu_detach(button->menu);
       return TRUE;
     }
 
@@ -366,6 +357,11 @@ xfce_indicator_button_menu_deactivate (XfceIndicatorButton *button,
   g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (button));
   g_return_if_fail (GTK_IS_MENU (menu));
 
+  if (button->deactivate_id)
+    {
+      g_signal_handler_disconnect (menu, button->deactivate_id);
+      button->deactivate_id = 0;
+    }
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
 }
 
diff --git a/panel-plugin/indicator-button.h b/panel-plugin/indicator-button.h
index 9347838..f0f1610 100644
--- a/panel-plugin/indicator-button.h
+++ b/panel-plugin/indicator-button.h
@@ -69,7 +69,7 @@ GtkWidget              *xfce_indicator_button_new         (IndicatorObject
                                                            XfcePanelPlugin            *plugin,
                                                            IndicatorConfig            *config);
 
-void                    xfce_indicator_button_disconnect_signals (XfceIndicatorButton *button);
+void                    xfce_indicator_button_destroy     (XfceIndicatorButton *button);
 
 G_END_DECLS
 
diff --git a/panel-plugin/indicator.c b/panel-plugin/indicator.c
index f4b60cb..b921046 100644
--- a/panel-plugin/indicator.c
+++ b/panel-plugin/indicator.c
@@ -341,8 +341,7 @@ entry_added (IndicatorObject * io, IndicatorObjectEntry * entry, gpointer user_d
   /* remove placeholder item when there are real entries to be added */
   if (indicator->item != NULL)
     {
-      xfce_indicator_button_disconnect_signals (XFCE_INDICATOR_BUTTON (indicator->item));
-      gtk_widget_destroy (GTK_WIDGET (indicator->item));
+      xfce_indicator_button_destroy (XFCE_INDICATOR_BUTTON (indicator->item));
       indicator->item = NULL;
     }
 
@@ -367,6 +366,9 @@ entry_added (IndicatorObject * io, IndicatorObjectEntry * entry, gpointer user_d
 static void
 entry_removed (IndicatorObject * io, IndicatorObjectEntry * entry, gpointer user_data)
 {
+  const gchar     *io_name = g_object_get_data (G_OBJECT (io), "io-name");
+
+  g_debug("Entry removed for io=%s", io_name);
   xfce_indicator_box_remove_entry (XFCE_INDICATOR_BOX (user_data), entry);
 }
 


More information about the Xfce4-commits mailing list