[Xfce4-commits] <xfce4-panel:devel> Various fixes in the pager plugin.

Nick Schermer nick at xfce.org
Tue Aug 11 20:30:01 CEST 2009


Updating branch refs/heads/devel
         to 250a27750e3902f8890f8e4f71714d13b42c8210 (commit)
       from 4eb0349a5dbdf0656bf40453982269641ffeaa8d (commit)

commit 250a27750e3902f8890f8e4f71714d13b42c8210
Author: Nick Schermer <nick at xfce.org>
Date:   Thu Mar 12 21:14:36 2009 +0100

    Various fixes in the pager plugin.
    
    Don't crash when the plugin is removed from the panel.
    
    Initially show the icon, so we have an active window when
    the plugin is constructed.

 plugins/windowmenu/windowmenu.c |   38 ++++++++++++++++++++++++++++----------
 1 files changed, 28 insertions(+), 10 deletions(-)

diff --git a/plugins/windowmenu/windowmenu.c b/plugins/windowmenu/windowmenu.c
index c1a45ce..12f280f 100644
--- a/plugins/windowmenu/windowmenu.c
+++ b/plugins/windowmenu/windowmenu.c
@@ -121,15 +121,11 @@ window_menu_plugin_class_init (XfceWindowMenuPluginClass *klass)
 {
   XfcePanelPluginClass *plugin_class;
   GObjectClass         *gobject_class;
-  GtkWidgetClass       *gtkwidget_class;
 
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->get_property = window_menu_plugin_get_property;
   gobject_class->set_property = window_menu_plugin_set_property;
 
-  gtkwidget_class = GTK_WIDGET_CLASS (klass);
-  gtkwidget_class->screen_changed = window_menu_plugin_screen_changed;
-
   plugin_class = XFCE_PANEL_PLUGIN_CLASS (klass);
   plugin_class->construct = window_menu_plugin_construct;
   plugin_class->free_data = window_menu_plugin_free_data;
@@ -197,6 +193,10 @@ window_menu_plugin_init (XfceWindowMenuPlugin *plugin)
   /* show configure */
   xfce_panel_plugin_menu_show_configure (XFCE_PANEL_PLUGIN (plugin));
 
+  /* monitor screen changes */
+  g_signal_connect (G_OBJECT (plugin), "screen-changed",
+                    G_CALLBACK (window_menu_plugin_screen_changed), NULL);
+
   /* create the widgets */
   plugin->button = xfce_arrow_button_new (GTK_ARROW_NONE);
   xfce_panel_plugin_add_action_widget (XFCE_PANEL_PLUGIN (plugin), plugin->button);
@@ -315,6 +315,17 @@ window_menu_plugin_screen_changed (GtkWidget *widget,
 {
   XfceWindowMenuPlugin *plugin = XFCE_WINDOW_MENU_PLUGIN (widget);
   GdkScreen            *screen;
+  WnckScreen           *wnck_screen;
+
+  /* get the wnck screen */
+  screen = gtk_widget_get_screen (widget);
+  panel_return_if_fail (GDK_IS_SCREEN (screen));
+  wnck_screen = wnck_screen_get (gdk_screen_get_number (screen));
+  panel_return_if_fail (WNCK_IS_SCREEN (wnck_screen));
+
+  /* leave when we same wnck screen was picked */
+  if (plugin->screen == wnck_screen)
+    return;
 
   if (G_UNLIKELY (plugin->screen != NULL))
     {
@@ -327,11 +338,8 @@ window_menu_plugin_screen_changed (GtkWidget *widget,
           window_menu_plugin_window_closed, plugin);
     }
 
-  /* get the wnck screen */
-  screen = gtk_widget_get_screen (widget);
-  panel_return_if_fail (GDK_IS_SCREEN (screen));
-  plugin->screen = wnck_screen_get (gdk_screen_get_number (screen));
-  panel_return_if_fail (WNCK_IS_SCREEN (plugin->screen));
+  /* set the new screen */
+  plugin->screen = wnck_screen;
 
   /* connect signal to monitor this screen */
   g_signal_connect (G_OBJECT (plugin->screen), "active-window-changed",
@@ -352,6 +360,9 @@ window_menu_plugin_construct (XfcePanelPlugin *panel_plugin)
   /* open the xfconf channel */
   plugin->channel = xfce_panel_plugin_xfconf_channel_new (panel_plugin);
 
+  /* show the icon */
+  gtk_widget_show (plugin->icon);
+
   /* bind the properties */
   xfconf_g_property_bind (plugin->channel, "/style",
                           G_TYPE_UINT, plugin, "style");
@@ -375,8 +386,12 @@ window_menu_plugin_free_data (XfcePanelPlugin *panel_plugin)
 {
   XfceWindowMenuPlugin *plugin = XFCE_WINDOW_MENU_PLUGIN (panel_plugin);
 
+  /* disconnect screen changed signal */
+  g_signal_handlers_disconnect_by_func (G_OBJECT (plugin),
+          window_menu_plugin_screen_changed, NULL);
+
   /* disconnect from the screen */
-  if (G_UNLIKELY (plugin->screen != NULL))
+  if (G_LIKELY (plugin->screen != NULL))
     {
       g_signal_handlers_disconnect_by_func (G_OBJECT (plugin->screen),
           window_menu_plugin_active_window_changed, plugin);
@@ -384,6 +399,9 @@ window_menu_plugin_free_data (XfcePanelPlugin *panel_plugin)
           window_menu_plugin_window_opened, plugin);
       g_signal_handlers_disconnect_by_func (G_OBJECT (plugin->screen),
           window_menu_plugin_window_closed, plugin);
+
+      /* unset the screen */
+      plugin->screen = NULL;
     }
 
   /* release the xfconf channel */



More information about the Xfce4-commits mailing list