[Xfce4-commits] <xfce4-indicator-plugin:andrzejr/tmp3> Refactored XfceIndicatorButton class

Andrzej noreply at xfce.org
Sat Apr 28 08:34:02 CEST 2012


Updating branch refs/heads/andrzejr/tmp3
         to c9785b9b7beb502e6b7bd03cbfbc6cd765040a29 (commit)
       from 8af1dffe564bf937c61ff0d3381a1d543b628e5b (commit)

commit c9785b9b7beb502e6b7bd03cbfbc6cd765040a29
Author: Andrzej <ndrwrdck at gmail.com>
Date:   Sat Apr 28 15:31:55 2012 +0900

    Refactored XfceIndicatorButton class
    
    Moved box-specific fields to XfceIndicatorBox and added
    a box-layout-changed signal to update all buttons at once.
    This may also be faster and less glitchy as signals
    are merged by the main loop.

 panel-plugin/indicator-box.c    |  141 +++++++++++++++++--------
 panel-plugin/indicator-box.h    |   20 +++-
 panel-plugin/indicator-button.c |  222 ++++++++++++++++++++-------------------
 panel-plugin/indicator-button.h |   29 ++----
 panel-plugin/indicator.c        |   11 +--
 5 files changed, 241 insertions(+), 182 deletions(-)

diff --git a/panel-plugin/indicator-box.c b/panel-plugin/indicator-box.c
index ffaf455..37248c4 100644
--- a/panel-plugin/indicator-box.c
+++ b/panel-plugin/indicator-box.c
@@ -65,6 +65,15 @@ enum
   PROP_ALIGN_LEFT
 };
 
+enum
+{
+  BOX_LAYOUT_CHANGED,
+  LAST_SIGNAL
+};
+
+static guint xfce_indicator_box_signals[LAST_SIGNAL] = { 0, };
+
+
 G_DEFINE_TYPE (XfceIndicatorBox, xfce_indicator_box, GTK_TYPE_CONTAINER)
 
 static void
@@ -103,7 +112,13 @@ xfce_indicator_box_class_init (XfceIndicatorBoxClass *klass)
                                                          FALSE,
                                                          EXO_PARAM_READWRITE));
 
-
+  xfce_indicator_box_signals[BOX_LAYOUT_CHANGED] =
+    g_signal_new (g_intern_static_string ("box-layout-changed"),
+                  G_TYPE_FROM_CLASS (gobject_class),
+                  G_SIGNAL_RUN_LAST,
+                  0, NULL, NULL,
+                  g_cclosure_marshal_VOID__VOID,
+                  G_TYPE_NONE, 0);
 }
 
 
@@ -190,13 +205,7 @@ xfce_indicator_box_set_property (GObject      *object,
       if (box->icon_size_max != val)
         {
           box->icon_size_max = val;
-          size = xfce_indicator_box_get_row_size (box);
-          for (li = box->children; li != NULL; li = li->next)
-            {
-              child = XFCE_INDICATOR_BUTTON (li->data);
-              g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (child));
-              xfce_indicator_button_set_size (child, box->panel_size, size);
-            }
+          g_signal_emit (G_OBJECT (box), xfce_indicator_box_signals[BOX_LAYOUT_CHANGED], 0);
         }
       break;
 
@@ -205,12 +214,7 @@ xfce_indicator_box_set_property (GObject      *object,
       if (box->align_left != val)
         {
           box->align_left = val;
-          for (li = box->children; li != NULL; li = li->next)
-            {
-              child = XFCE_INDICATOR_BUTTON (li->data);
-              g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (child));
-              xfce_indicator_button_set_align_left (child, box->align_left);
-            }
+          g_signal_emit (G_OBJECT (box), xfce_indicator_box_signals[BOX_LAYOUT_CHANGED], 0);
         }
       break;
 
@@ -247,12 +251,7 @@ xfce_indicator_box_set_orientation (XfceIndicatorBox *box,
 
   if (needs_update)
     {
-      for (li = box->children; li != NULL; li = li->next)
-        {
-          child = XFCE_INDICATOR_BUTTON (li->data);
-          g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (child));
-          xfce_indicator_button_set_orientation (child, panel_orientation, orientation);
-        }
+      g_signal_emit (G_OBJECT (box), xfce_indicator_box_signals[BOX_LAYOUT_CHANGED], 0);
       gtk_widget_queue_resize (GTK_WIDGET (box));
     }
 }
@@ -285,13 +284,7 @@ xfce_indicator_box_set_size (XfceIndicatorBox *box,
 
   if (needs_update)
     {
-      size = xfce_indicator_box_get_row_size (box);
-      for (li = box->children; li != NULL; li = li->next)
-        {
-          child = XFCE_INDICATOR_BUTTON (li->data);
-          g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (child));
-          xfce_indicator_button_set_size (child, panel_size, size);
-        }
+      g_signal_emit (G_OBJECT (box), xfce_indicator_box_signals[BOX_LAYOUT_CHANGED], 0);
       gtk_widget_queue_resize (GTK_WIDGET (box));
     }
 }
@@ -322,10 +315,6 @@ xfce_indicator_box_add (GtkContainer *container,
   box->children = g_slist_append (box->children, child);
 
   gtk_widget_set_parent (child, GTK_WIDGET (box));
-  xfce_indicator_button_set_orientation (button, box->panel_orientation, box->orientation);
-  size = xfce_indicator_box_get_row_size (box);
-  xfce_indicator_button_set_size (button, box->panel_size, size);
-  xfce_indicator_button_set_align_left (button, box->align_left);
 
   gtk_widget_queue_resize (GTK_WIDGET (container));
 }
@@ -402,9 +391,7 @@ xfce_indicator_box_size_request (GtkWidget      *widget,
   row = 0;
   length = 0;
   x = 0;
-  //nrows = MAX (box->nrows,
-  //             box->panel_size / xfce_indicator_box_get_row_size (box));
-  nrows = box->panel_size / xfce_indicator_box_get_row_size (box);
+  nrows = xfce_indicator_box_get_nrows (box);
 
   for (li = box->children; li != NULL; li = li->next)
     {
@@ -478,8 +465,7 @@ xfce_indicator_box_size_allocate (GtkWidget     *widget,
   x0 = allocation->x;
   y0 = allocation->y;
 
-  //nrows = MAX (box->nrows, box->panel_size / box->icon_size_max);
-  nrows = box->panel_size / xfce_indicator_box_get_row_size (box);
+  nrows = xfce_indicator_box_get_nrows (box);
   panel_size = box->panel_size;
   size = panel_size / nrows;
 
@@ -557,24 +543,93 @@ xfce_indicator_box_get_row_size (XfceIndicatorBox *box)
 }
 
 
-XfceIndicatorButton *
-xfce_indicator_box_get_button (XfceIndicatorBox     *box,
-                               IndicatorObjectEntry *entry)
+void
+xfce_indicator_box_remove_entry (XfceIndicatorBox     *box,
+                                 IndicatorObjectEntry *entry)
 {
   GSList              *li;
   GtkWidget           *child;
   XfceIndicatorButton *button;
 
-  g_return_val_if_fail (XFCE_IS_INDICATOR_BOX (box), NULL);
+  g_return_if_fail (XFCE_IS_INDICATOR_BOX (box));
 
   for (li = box->children; li != NULL; li = li->next)
     {
       child = GTK_WIDGET (li->data);
-      g_return_val_if_fail (XFCE_IS_INDICATOR_BUTTON (child), NULL);
+      g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (child));
 
       button = XFCE_INDICATOR_BUTTON (child);
       if (xfce_indicator_button_get_entry (button) == entry)
-        return button;
+        {
+          xfce_indicator_button_disconnect_signals (button);
+          gtk_widget_destroy (GTK_WIDGET (button));
+        }
     }
-  return NULL;
+}
+
+
+
+
+
+GtkOrientation
+xfce_indicator_box_get_panel_orientation (XfceIndicatorBox *box)
+{
+  g_return_val_if_fail (XFCE_IS_INDICATOR_BOX (box), GTK_ORIENTATION_HORIZONTAL);
+
+  return box->panel_orientation;
+}
+
+
+GtkOrientation
+xfce_indicator_box_get_indicator_orientation (XfceIndicatorBox *box)
+{
+  g_return_val_if_fail (XFCE_IS_INDICATOR_BOX (box), GTK_ORIENTATION_HORIZONTAL);
+
+  return box->orientation;
+}
+
+
+gint
+xfce_indicator_box_get_nrows (XfceIndicatorBox *box)
+{
+  g_return_val_if_fail (XFCE_IS_INDICATOR_BOX (box), 0);
+
+  return box->panel_size / xfce_indicator_box_get_row_size (box);
+
+}
+
+
+gint
+xfce_indicator_box_get_panel_size (XfceIndicatorBox *box)
+{
+  g_return_val_if_fail (XFCE_IS_INDICATOR_BOX (box), 0);
+
+  return box->panel_size;
+}
+
+
+gint
+xfce_indicator_box_get_indicator_size (XfceIndicatorBox *box)
+{
+  g_return_val_if_fail (XFCE_IS_INDICATOR_BOX (box), 0);
+
+  return xfce_indicator_box_get_row_size (box);
+}
+
+
+gint
+xfce_indicator_box_get_icon_size_max (XfceIndicatorBox *box)
+{
+  g_return_val_if_fail (XFCE_IS_INDICATOR_BOX (box), 0);
+
+  return box->icon_size_max;
+}
+
+
+gboolean
+xfce_indicator_box_get_align_left (XfceIndicatorBox *box)
+{
+  g_return_val_if_fail (XFCE_IS_INDICATOR_BOX (box), FALSE);
+
+  return box->align_left;
 }
diff --git a/panel-plugin/indicator-box.h b/panel-plugin/indicator-box.h
index 79b212d..e4ee8c9 100644
--- a/panel-plugin/indicator-box.h
+++ b/panel-plugin/indicator-box.h
@@ -21,7 +21,6 @@
 #include <glib.h>
 #include <gtk/gtk.h>
 #include <libindicator/indicator-object.h>
-#include "indicator-button.h"
 
 G_BEGIN_DECLS
 
@@ -65,8 +64,23 @@ void xfce_indicator_box_set_size (XfceIndicatorBox *box,
                                   gint panel_size,
                                   gint nrows);
 
-XfceIndicatorButton *xfce_indicator_box_get_button (XfceIndicatorBox     *box,
-                                                    IndicatorObjectEntry *entry);
+
+GtkOrientation xfce_indicator_box_get_panel_orientation (XfceIndicatorBox *box);
+
+GtkOrientation xfce_indicator_box_get_indicator_orientation (XfceIndicatorBox *box);
+
+gint xfce_indicator_box_get_nrows (XfceIndicatorBox *box);
+
+gint xfce_indicator_box_get_panel_size (XfceIndicatorBox *box);
+
+gint xfce_indicator_box_get_indicator_size (XfceIndicatorBox *box);
+
+gint xfce_indicator_box_get_icon_size_max (XfceIndicatorBox *box);
+
+gboolean xfce_indicator_box_get_align_left (XfceIndicatorBox *box);
+
+void xfce_indicator_box_remove_entry (XfceIndicatorBox     *box,
+                                      IndicatorObjectEntry *entry);
 
 GtkWidget *xfce_indicator_box_new ();
 
diff --git a/panel-plugin/indicator-button.c b/panel-plugin/indicator-button.c
index 364d137..58ff3cc 100644
--- a/panel-plugin/indicator-button.c
+++ b/panel-plugin/indicator-button.c
@@ -32,7 +32,8 @@
 
 #include "indicator-button.h"
 
-static void                 xfce_indicator_button_finalize     (GObject *object);
+static void                 xfce_indicator_button_finalize        (GObject                *object);
+static gint                 xfce_indicator_button_get_icon_size   (XfceIndicatorButton    *button);
 
 
 G_DEFINE_TYPE (XfceIndicatorButton, xfce_indicator_button, GTK_TYPE_TOGGLE_BUTTON)
@@ -57,27 +58,23 @@ xfce_indicator_button_init (XfceIndicatorButton *button)
   gtk_button_set_focus_on_click (GTK_BUTTON (button), FALSE);
   gtk_widget_set_name (GTK_WIDGET (button), "indicator-button");
 
+  button->io = NULL;
   button->entry = NULL;
+  button->buttonbox = NULL;
   button->menu = NULL;
 
   button->label = NULL;
   button->orig_icon = NULL;
   button->icon = NULL;
-  button->orig_icon_handler = 0;
+  button->orig_icon_changed_id = 0;
+  button->box_layout_changed_id = 0;
 
-  button->size = 0;
-  button->panel_size = 0;
-  button->icon_size = 24;
-  button->align_left = FALSE;
-  button->panel_orientation = GTK_ORIENTATION_HORIZONTAL;
-  button->orientation = GTK_ORIENTATION_HORIZONTAL;
+  button->align_box = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
+  gtk_container_add (GTK_CONTAINER (button), button->align_box);
+  gtk_widget_show (button->align_box);
 
-  button->alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
-  gtk_container_add (GTK_CONTAINER (button), button->alignment);
-  gtk_widget_show (button->alignment);
-
-  button->box = xfce_hvbox_new (button->orientation, FALSE, 1);
-  gtk_container_add (GTK_CONTAINER (button->alignment), button->box);
+  button->box = xfce_hvbox_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 1);
+  gtk_container_add (GTK_CONTAINER (button->align_box), button->box);
   gtk_widget_show (button->box);
 }
 
@@ -88,6 +85,8 @@ xfce_indicator_button_finalize (GObject *object)
 {
   XfceIndicatorButton *button = XFCE_INDICATOR_BUTTON (object);
 
+  xfce_indicator_button_disconnect_signals (button);
+
   if (button->label != NULL)
     g_object_unref (G_OBJECT (button->label));
   if (button->orig_icon != NULL)
@@ -96,6 +95,8 @@ xfce_indicator_button_finalize (GObject *object)
     g_object_unref (G_OBJECT (button->icon));
   if (button->menu != NULL)
     g_object_unref (G_OBJECT (button->menu));
+  if (button->buttonbox != NULL)
+    g_object_unref (G_OBJECT (button->buttonbox));
   /* IndicatorObjectEntry is not GObject */
   /* if (button->entry != NULL) */
   /*   g_object_unref (G_OBJECT (button->entry)); */
@@ -113,33 +114,48 @@ xfce_indicator_button_update_layout (XfceIndicatorButton *button)
   GtkRequisition          label_size;
 
   g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (button));
+  g_return_if_fail (XFCE_IS_INDICATOR_BOX (button->buttonbox));
 
   if (button->label != NULL &&
-      button->panel_orientation == GTK_ORIENTATION_VERTICAL &&
-      button->orientation == GTK_ORIENTATION_HORIZONTAL)
+      xfce_indicator_box_get_panel_orientation (button->buttonbox) == GTK_ORIENTATION_VERTICAL &&
+      xfce_indicator_box_get_indicator_orientation (button->buttonbox) == GTK_ORIENTATION_HORIZONTAL)
     {
-      gtk_alignment_set (GTK_ALIGNMENT (button->alignment), button->align_left ? 0.0 : 0.5, 0.5, 0.0, 0.0);
       gtk_widget_size_request (button->label, &label_size);
 
-      /* put icon above the label if number of rows > 1 (they look better)
-         or if they don't fit when arranged horizontally */
-      if ((!button->align_left && button->panel_size != button->size) ||
-          label_size.width > button->panel_size - button->size)
-        gtk_orientable_set_orientation (GTK_ORIENTABLE (button->box), GTK_ORIENTATION_VERTICAL);
+      if (!xfce_indicator_box_get_align_left (button->buttonbox)
+          || (button->icon != NULL
+              && label_size.width >
+              xfce_indicator_box_get_panel_size (button->buttonbox)
+              - xfce_indicator_box_get_indicator_size (button->buttonbox)))
+        {
+          gtk_alignment_set (GTK_ALIGNMENT (button->align_box), 0.5, 0.5, 0.0, 0.0);
+          gtk_orientable_set_orientation (GTK_ORIENTABLE (button->box), GTK_ORIENTATION_VERTICAL);
+        }
       else
-        gtk_orientable_set_orientation (GTK_ORIENTABLE (button->box), GTK_ORIENTATION_HORIZONTAL);
+        {
+          gtk_alignment_set (GTK_ALIGNMENT (button->align_box), 0.0, 0.5, 0.0, 0.0);
+          gtk_orientable_set_orientation (GTK_ORIENTABLE (button->box), GTK_ORIENTATION_HORIZONTAL);
+        }
     }
   else
     {
-      gtk_alignment_set (GTK_ALIGNMENT (button->alignment), 0.5, 0.5, 0.0, 0.0);
+      gtk_alignment_set (GTK_ALIGNMENT (button->align_box), 0.5, 0.5, 0.0, 0.0);
+      gtk_orientable_set_orientation (GTK_ORIENTABLE (button->box),
+                                      xfce_indicator_box_get_indicator_orientation (button->buttonbox));
     }
 
+
+  if (button->label != NULL)
+    gtk_label_set_angle (GTK_LABEL (button->label),
+                         (xfce_indicator_box_get_indicator_orientation (button->buttonbox) == GTK_ORIENTATION_VERTICAL)
+                         ? -90 : 0);
   if (button->icon != NULL)
-    xfce_panel_image_set_size (XFCE_PANEL_IMAGE (button->icon), button->icon_size);
+    xfce_panel_image_set_size (XFCE_PANEL_IMAGE (button->icon), xfce_indicator_button_get_icon_size (button));
 }
 
 
 
+
 static void
 xfce_indicator_button_update_icon (XfceIndicatorButton *button)
 {
@@ -150,9 +166,8 @@ xfce_indicator_button_update_icon (XfceIndicatorButton *button)
   g_return_if_fail (GTK_IS_IMAGE (button->orig_icon));
   g_return_if_fail (XFCE_IS_PANEL_IMAGE (button->icon));
 
-  size = button->icon_size;
+  size = xfce_indicator_button_get_icon_size (button);
 
-  /* Copied from xfce_panel_image.c, try to snap to icon sizes, which minimize smoothing */
 #if 0
   if (size > 16 && size < 22)
     size = 16;
@@ -183,7 +198,17 @@ xfce_indicator_button_update_icon (XfceIndicatorButton *button)
       xfce_panel_image_set_from_source (XFCE_PANEL_IMAGE (button->icon), "image-missing");
     }
 
-  xfce_panel_image_set_size (XFCE_PANEL_IMAGE (button->icon), button->icon_size);
+  xfce_panel_image_set_size (XFCE_PANEL_IMAGE (button->icon), size);
+}
+
+
+
+static void
+xfce_indicator_button_label_changed (GtkLabel            *label,
+                                     GParamSpec          *pspec,
+                                     XfceIndicatorButton *button)
+{
+  xfce_indicator_button_update_layout (button);
 }
 
 
@@ -205,9 +230,8 @@ xfce_indicator_button_set_label (XfceIndicatorButton *button,
 
       button->label = GTK_WIDGET (label);
       g_object_ref (G_OBJECT (button->label));
-      gtk_label_set_angle (GTK_LABEL (button->label),
-                           (button->orientation == GTK_ORIENTATION_VERTICAL) ? -90 : 0);
       gtk_box_pack_end (GTK_BOX (button->box), button->label, TRUE, FALSE, 1);
+      g_signal_connect(G_OBJECT(button->label), "notify::label", G_CALLBACK(xfce_indicator_button_label_changed), button);
     }
   xfce_indicator_button_update_layout (button);
 }
@@ -244,8 +268,11 @@ xfce_indicator_button_set_image (XfceIndicatorButton *button,
     {
       if (button->orig_icon != NULL)
         {
-          g_signal_handler_disconnect
-            (G_OBJECT (button->orig_icon), button->orig_icon_handler);
+          if (button->orig_icon_changed_id != 0)
+            {
+              g_signal_handler_disconnect (G_OBJECT (button->orig_icon), button->orig_icon_changed_id);
+              button->orig_icon_changed_id = 0;
+            }
           g_object_unref (G_OBJECT (button->orig_icon));
         }
 
@@ -258,7 +285,7 @@ xfce_indicator_button_set_image (XfceIndicatorButton *button,
       button->orig_icon = GTK_WIDGET (image);
       g_object_ref (G_OBJECT (button->orig_icon));
 
-      button->orig_icon_handler = g_signal_connect
+      button->orig_icon_changed_id = g_signal_connect
         (G_OBJECT (image), "notify::pixbuf", G_CALLBACK (on_pixbuf_changed), button);
 
 
@@ -343,108 +370,87 @@ xfce_indicator_button_get_menu (XfceIndicatorButton *button)
 
 
 
-void
-xfce_indicator_button_set_orientation (XfceIndicatorButton *button,
-                                       GtkOrientation       panel_orientation,
-                                       GtkOrientation       orientation)
+static gint
+xfce_indicator_button_get_icon_size (XfceIndicatorButton *button)
 {
-  gboolean    needs_update = FALSE;
-
-  g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (button));
+  gint                 indicator_size;
+  gint                 border_thickness;
+  GtkStyle            *style;
 
-  if (button->orientation != orientation)
-    {
-      button->orientation = orientation;
+  g_return_val_if_fail (XFCE_IS_INDICATOR_BUTTON (button), 24);
+  g_return_val_if_fail (XFCE_IS_INDICATOR_BOX (button->buttonbox), 24);
 
-      if (button->label != NULL)
-        gtk_label_set_angle (GTK_LABEL (button->label),
-                             (orientation == GTK_ORIENTATION_VERTICAL) ? -90 : 0);
-      needs_update = TRUE;
-    }
+  indicator_size = xfce_indicator_box_get_indicator_size (button->buttonbox);
 
-  if (button->panel_orientation != panel_orientation)
-    {
-      button->panel_orientation = panel_orientation;
-      needs_update = TRUE;
-    }
+  style = gtk_widget_get_style (GTK_WIDGET (button));
+  border_thickness = 2 * MAX (style->xthickness, style->ythickness) + 2;
 
-  if (needs_update)
-    {
-      gtk_orientable_set_orientation (GTK_ORIENTABLE (button->box), orientation);
-      xfce_indicator_button_update_layout (button);
-    }
+  return MIN (indicator_size - border_thickness,
+              xfce_indicator_box_get_icon_size_max (button->buttonbox));
 }
 
 
 
-void
-xfce_indicator_button_set_size (XfceIndicatorButton *button,
-                                gint                 panel_size,
-                                gint                 size)
+static void
+xfce_indicator_button_box_layout_changed (XfceIndicatorButton *button,
+                                          XfceIndicatorBox    *box)
 {
-  gboolean    needs_update = FALSE;
-  gint        border_thickness;
-  GtkStyle   *style;
-  gdouble     aspect;
-
   g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (button));
+  g_return_if_fail (XFCE_IS_INDICATOR_BOX (box));
+  g_return_if_fail (GTK_WIDGET (button)->parent != NULL);
 
-  if (button->size != size)
-    {
-      button->size = size;
-      needs_update = TRUE;
-    }
+  //printf ("parent %x\n", (guint) GTK_WIDGET (button)->parent);
 
-  if (button->panel_size != panel_size)
-    {
-      button->panel_size = panel_size;
-      needs_update = TRUE;
-    }
-
-  if (needs_update)
-    {
-      style = gtk_widget_get_style (GTK_WIDGET (button));
-      border_thickness = 2 * MAX (style->xthickness, style->ythickness) + 2;
-      button->icon_size = button->size - border_thickness;
-
-      if (button->orig_icon != NULL)
-        {
-          xfce_indicator_button_update_icon (button);
-          xfce_indicator_button_update_layout (button);
-        }
-    }
-}
-
-
-
-void
-xfce_indicator_button_set_align_left (XfceIndicatorButton *button,
-                                      gboolean             align_left)
-{
-  g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (button));
-
-  if (button->align_left != align_left)
-    {
-      button->align_left = align_left;
-      xfce_indicator_button_update_layout (button);
-    }
+  if (button->orig_icon != NULL)
+    xfce_indicator_button_update_icon (button);
+  xfce_indicator_button_update_layout (button);
 }
 
 
 
-
 GtkWidget *
-xfce_indicator_button_new (IndicatorObject *io,
-                           IndicatorObjectEntry *entry)
+xfce_indicator_button_new (IndicatorObject      *io,
+                           IndicatorObjectEntry *entry,
+                           XfceIndicatorBox     *buttonbox)
 {
   XfceIndicatorButton *button = g_object_new (XFCE_TYPE_INDICATOR_BUTTON, NULL);
+  g_return_val_if_fail (XFCE_IS_INDICATOR_BOX (buttonbox), NULL);
+
   button->io = io;
   button->entry = entry;
+  button->buttonbox = buttonbox;
   if (button->io != NULL)
     g_object_ref (G_OBJECT (button->io));
   /* IndicatorObjectEntry is not GObject */
   /* g_object_ref (G_OBJECT (button->entry)); */
+  if (button->buttonbox != NULL)
+    g_object_ref (G_OBJECT (button->buttonbox));
+
+  button->box_layout_changed_id =
+    g_signal_connect_swapped (G_OBJECT (button->buttonbox), "box-layout-changed",
+                              G_CALLBACK (xfce_indicator_button_box_layout_changed), button);
+
   return GTK_WIDGET (button);
 }
 
 
+
+void
+xfce_indicator_button_disconnect_signals (XfceIndicatorButton *button)
+{
+  g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (button));
+
+  if (button->box_layout_changed_id != 0)
+    {
+      g_signal_handler_disconnect (button->buttonbox, button->box_layout_changed_id);
+      button->box_layout_changed_id = 0;
+    }
+
+  if (button->orig_icon_changed_id != 0)
+    {
+      g_signal_handler_disconnect (G_OBJECT (button->orig_icon), button->orig_icon_changed_id);
+      button->orig_icon_changed_id = 0;
+    }
+
+}
+
diff --git a/panel-plugin/indicator-button.h b/panel-plugin/indicator-button.h
index 4436c98..d7499bf 100644
--- a/panel-plugin/indicator-button.h
+++ b/panel-plugin/indicator-button.h
@@ -21,6 +21,7 @@
 #include <glib.h>
 #include <gtk/gtk.h>
 #include <libindicator/indicator-object.h>
+#include "indicator-box.h"
 
 G_BEGIN_DECLS
 
@@ -42,22 +43,17 @@ struct _XfceIndicatorButton
 
   IndicatorObject      *io;
   IndicatorObjectEntry *entry;
+  XfceIndicatorBox     *buttonbox;
   GtkMenu              *menu;
 
-  GtkWidget            *alignment;
+  GtkWidget            *align_box;
   GtkWidget            *box;
   GtkWidget            *label;
   GtkWidget            *icon;
   GtkWidget            *orig_icon;
-  gulong                orig_icon_handler;
 
-  gint                  panel_size;
-  gint                  size;
-  gint                  icon_size;
-  gboolean              align_left;
-
-  GtkOrientation        panel_orientation;
-  GtkOrientation        orientation;
+  gulong                orig_icon_changed_id;
+  gulong                box_layout_changed_id;
 };
 
 struct _XfceIndicatorButtonClass
@@ -81,18 +77,11 @@ IndicatorObject *xfce_indicator_button_get_io (XfceIndicatorButton *button);
 
 GtkMenu *xfce_indicator_button_get_menu (XfceIndicatorButton *button);
 
-void xfce_indicator_button_set_orientation (XfceIndicatorButton *button,
-                                            GtkOrientation panel_orientation,
-                                            GtkOrientation orientation);
-
-void xfce_indicator_button_set_size (XfceIndicatorButton *button,
-                                     gint panel_size,
-                                     gint size);
-
-void xfce_indicator_button_set_align_left (XfceIndicatorButton *button,
-                                           gboolean align_left);
+GtkWidget *xfce_indicator_button_new (IndicatorObject *io,
+                                      IndicatorObjectEntry *entry,
+                                      XfceIndicatorBox *buttonbox);
 
-GtkWidget *xfce_indicator_button_new (IndicatorObject *io, IndicatorObjectEntry *entry);
+void xfce_indicator_button_disconnect_signals (XfceIndicatorButton *button);
 
 G_END_DECLS
 
diff --git a/panel-plugin/indicator.c b/panel-plugin/indicator.c
index 3332087..e122aea 100644
--- a/panel-plugin/indicator.c
+++ b/panel-plugin/indicator.c
@@ -350,7 +350,7 @@ indicator_construct (XfcePanelPlugin *plugin)
 
   if (indicators_loaded == 0) {
     /* A label to allow for click through */
-    indicator->item = xfce_indicator_button_new(NULL, NULL);
+    indicator->item = xfce_indicator_button_new(NULL, NULL, XFCE_INDICATOR_BOX (indicator->buttonbox));
     xfce_indicator_button_set_label(XFCE_INDICATOR_BUTTON(indicator->item),
                                     GTK_LABEL (gtk_label_new(_("No Indicators"))));
     gtk_container_add (GTK_CONTAINER (indicator->buttonbox), indicator->item);
@@ -379,7 +379,7 @@ entry_added (IndicatorObject * io, IndicatorObjectEntry * entry, gpointer user_d
 {
   XfcePanelPlugin *plugin = XFCE_PANEL_PLUGIN (user_data);
   IndicatorPlugin *indicator = XFCE_INDICATOR_PLUGIN (plugin);
-  GtkWidget * button = xfce_indicator_button_new (io, entry);
+  GtkWidget * button = xfce_indicator_button_new (io, entry, XFCE_INDICATOR_BOX (indicator->buttonbox));
   gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
   gtk_button_set_use_underline(GTK_BUTTON (button),TRUE);
   gtk_widget_set_name(GTK_WIDGET (button), "indicator-button");
@@ -409,12 +409,7 @@ entry_added (IndicatorObject * io, IndicatorObjectEntry * entry, gpointer user_d
 static void
 entry_removed (IndicatorObject * io, IndicatorObjectEntry * entry, gpointer user_data)
 {
-  XfceIndicatorButton *button;
-
-  button = xfce_indicator_box_get_button (XFCE_INDICATOR_BOX (user_data), entry);
-
-  if (button != NULL)
-    gtk_widget_destroy (GTK_WIDGET (button));
+  xfce_indicator_box_remove_entry (XFCE_INDICATOR_BOX (user_data), entry);
 }
 
 


More information about the Xfce4-commits mailing list