[Xfce4-commits] r24234 - xfce4-panel/trunk/libxfce4panel

Jasper Huijsmans jasper at xfce.org
Mon Jan 1 20:09:05 CET 2007


Author: jasper
Date: 2007-01-01 19:09:05 +0000 (Mon, 01 Jan 2007)
New Revision: 24234

Modified:
   xfce4-panel/trunk/libxfce4panel/xfce-panel-external-item.c
Log:
Restart external panel items when the GtkPlug disappears during a screen change. Hopefully a real solution can still be found.

Modified: xfce4-panel/trunk/libxfce4panel/xfce-panel-external-item.c
===================================================================
--- xfce4-panel/trunk/libxfce4panel/xfce-panel-external-item.c	2007-01-01 19:08:25 UTC (rev 24233)
+++ xfce4-panel/trunk/libxfce4panel/xfce-panel-external-item.c	2007-01-01 19:09:05 UTC (rev 24234)
@@ -51,6 +51,9 @@
     guint expand:1;
     /* detect problems */
     guint to_be_removed:1;
+    guint restart:1;
+
+    char *file;
 };
 
 
@@ -101,6 +104,8 @@
 
 static void _item_construct (XfceExternalPanelItem * item);
 
+static void _item_screen_changed (XfceExternalPanelItem * item, GdkScreen *screen);
+
 static void _item_setup (XfceExternalPanelItem * item, const char *file);
 
 
@@ -159,6 +164,8 @@
     priv->screen_position = XFCE_SCREEN_POSITION_NONE;
     priv->expand          = FALSE;
     priv->to_be_removed   = FALSE;
+    priv->restart         = FALSE;
+    priv->file            = NULL;
 }
 
 /* GObject */
@@ -179,6 +186,7 @@
     g_free (priv->name);
     g_free (priv->id);
     g_free (priv->display_name);
+    g_free (priv->file);
 
     G_OBJECT_CLASS (xfce_external_panel_item_parent_class)->finalize (object);
 }
@@ -480,6 +488,33 @@
 }
 
 static void
+_item_screen_changed (XfceExternalPanelItem *item, 
+                      GdkScreen             *screen)
+{
+    XfceExternalPanelItemPrivate *priv;
+
+    priv = XFCE_EXTERNAL_PANEL_ITEM_GET_PRIVATE (XFCE_EXTERNAL_PANEL_ITEM (item));
+
+    screen = gtk_widget_get_screen (GTK_WIDGET (item));
+    g_message ("%s: screen changed: %d\n",
+               xfce_external_panel_item_get_display_name (XFCE_PANEL_ITEM (item)),
+               gdk_screen_get_number (screen));
+
+    if (GTK_SOCKET(item)->plug_window)
+    {
+        xfce_panel_plugin_message_send (GTK_WIDGET (item)->window,
+            GDK_WINDOW_XID (GTK_SOCKET (item)->plug_window),
+            XFCE_PANEL_PLUGIN_SIZE, priv->size);
+    }
+    else
+    {
+        g_message ("No valid plug window.");
+        priv->restart = TRUE;
+        _item_setup (item, priv->file);
+    }
+}
+
+static void
 _item_setup (XfceExternalPanelItem * item, const char *file)
 {
     GdkScreen *gscreen;
@@ -507,10 +542,13 @@
     argv[6] = g_strdup_printf ("screen_position=%d", priv->screen_position);
     argv[7] = NULL;
 
-    g_signal_connect (item, "plug-added", G_CALLBACK (_item_construct), NULL);
+    if (!priv->restart)
+    {
+        g_signal_connect (item, "plug-added", G_CALLBACK (_item_construct), NULL);
 
-    g_signal_connect (item, "client-event",
-                      G_CALLBACK (_item_event_received), NULL);
+        g_signal_connect (item, "client-event",
+                          G_CALLBACK (_item_event_received), NULL);
+    }
 
     gscreen = gtk_widget_get_screen (GTK_WIDGET (item));
     gdkdisplay_name = gdk_screen_make_display_name (gscreen);
@@ -521,6 +559,7 @@
             g_critical ("Could not run plugin: %s", g_strerror (errno));
             gtk_widget_destroy (GTK_WIDGET (item));
             break;
+
         case 0:
             xfce_setenv ("DISPLAY", gdkdisplay_name, TRUE);
             g_free (gdkdisplay_name);
@@ -529,8 +568,16 @@
             g_critical ("Could not run plugin: %s", g_strerror (errno));
             gtk_widget_destroy (GTK_WIDGET (item));
             _exit (1);
+            break;
+
         default:
             /* parent: do nothing */;
+            if (!priv->restart)
+            {
+                g_signal_connect (item, "screen-changed", 
+                                  G_CALLBACK (_item_screen_changed), NULL);
+            }
+            break;
     }
     
     g_free (gdkdisplay_name);
@@ -572,6 +619,7 @@
     priv->display_name    = g_strdup (display_name);
     priv->size            = size;
     priv->screen_position = position;
+    priv->file            = g_strdup (file);
 
     g_signal_connect_after (item, "realize", G_CALLBACK (_item_setup),
 			    (gpointer) file);



More information about the Xfce4-commits mailing list