Hello community,

here is the log from the commit of package xfce4-panel for openSUSE:Factory
checked in at Mon Jul 11 09:02:27 CEST 2011.



--------
--- xfce4-panel/xfce4-panel.changes     2011-06-21 23:42:39.000000000 +0200
+++ /mounts/work_src_done/STABLE/xfce4-panel/xfce4-panel.changes        
2011-07-10 18:13:57.000000000 +0200
@@ -1,0 +2,7 @@
+Sun Jul 10 13:41:51 UTC 2011 - [email protected]
+
+- added xfce4-panel-4.8.-wait-until-wm-is-ready.patch which makes
+  the panel wait until the wm is ready on all screens in order to
+  ensure that it ends up on the correct screen in multipanel setups
+
+-------------------------------------------------------------------

calling whatdependson for head-i586


New:
----
  xfce4-panel-4.8.-wait-until-wm-is-ready.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ xfce4-panel.spec ++++++
--- /var/tmp/diff_new_pack.ZxlcmF/_old  2011-07-11 09:01:03.000000000 +0200
+++ /var/tmp/diff_new_pack.ZxlcmF/_new  2011-07-11 09:01:03.000000000 +0200
@@ -19,13 +19,15 @@
 
 Name:           xfce4-panel
 Version:        4.8.5
-Release:        1
+Release:        2
 License:        GPLv2+ and LGPLv2.1+
 Summary:        Panel for the Xfce Desktop Environment
 Url:            http://www.xfce.org/projects/xfce4-panel/
 Group:          System/GUI/XFCE
 Source:         %{name}-%{version}.tar.bz2
 Source1:        %{name}-rpmlintrc
+# PATCH-FIX-UPSTREAM xfce4-panel-4.8.-wait-until-wm-is-ready.patch bxo#7161 
[email protected] -- Wait until the wm is ready on all screens in order to 
ensure that the panel ends up on the correct screen in multipanel setups 
(backported from upstream git)
+Patch0:         xfce4-panel-4.8.-wait-until-wm-is-ready.patch
 BuildRequires:  gtk-doc
 BuildRequires:  intltool
 BuildRequires:  perl-XML-Parser
@@ -95,6 +97,7 @@
 
 %prep
 %setup -q
+%patch0 -p1
 
 %build
 %configure \

++++++ xfce4-panel-4.8.-wait-until-wm-is-ready.patch ++++++
diff --git a/panel/main.c b/panel/main.c
index 76c851a..15600c8 100644
--- a/panel/main.c
+++ b/panel/main.c
@@ -58,6 +58,7 @@ static gchar     *opt_add = NULL;
 static gboolean   opt_restart = FALSE;
 static gboolean   opt_quit = FALSE;
 static gboolean   opt_version = FALSE;
+static gboolean   opt_disable_wm_check = FALSE;
 static gchar     *opt_plugin_event = NULL;
 static gchar    **opt_arguments = NULL;
 static gboolean   sm_client_saved_state = FALSE;
@@ -81,6 +82,7 @@ static GOptionEntry option_entries[] =
   { "add", '\0', 0, G_OPTION_ARG_STRING, &opt_add, N_("Add a new plugin to the 
panel"), N_("PLUGIN-NAME") },
   { "restart", 'r', 0, G_OPTION_ARG_NONE, &opt_restart, N_("Restart the 
running panel instance"), NULL },
   { "quit", 'q', 0, G_OPTION_ARG_NONE, &opt_quit, N_("Quit the running panel 
instance"), NULL },
+  { "disable-wm-check", 'd', 0, G_OPTION_ARG_NONE, &opt_disable_wm_check, 
N_("Do not wait for a window manager on startup"), NULL },
   { "version", 'V', 0, G_OPTION_ARG_NONE, &opt_version, N_("Print version 
information and exit"), NULL },
   { "plugin-event", '\0', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, 
&opt_plugin_event, NULL, NULL },
   { G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_STRING_ARRAY, &opt_arguments, 
NULL, NULL },
@@ -345,6 +347,7 @@ main (gint argc, gchar **argv)
     signal (signums[i], panel_signal_handler);
 
   application = panel_application_get ();
+  panel_application_load (application, opt_disable_wm_check);
 
   /* save the state before the quit signal if we can, this is a bit safer */
   g_signal_connect (G_OBJECT (sm_client), "save-state",
diff --git a/panel/panel-application.c b/panel/panel-application.c
index 03a6004..02a9cc6 100644
--- a/panel/panel-application.c
+++ b/panel/panel-application.c
@@ -30,6 +30,11 @@
 #include <libxfce4util/libxfce4util.h>
 #include <libxfce4ui/libxfce4ui.h>
 
+#ifdef GDK_WINDOWING_X11
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#endif
+
 #include <common/panel-private.h>
 #include <common/panel-xfconf.h>
 #include <common/panel-debug.h>
@@ -55,7 +60,6 @@
 
 
 static void      panel_application_finalize           (GObject                
*object);
-static void      panel_application_load               (PanelApplication       
*application);
 static void      panel_application_plugin_move        (GtkWidget              
*item,
                                                        PanelApplication       
*application);
 static gboolean  panel_application_plugin_insert      (PanelApplication       
*application,
@@ -126,6 +130,10 @@ struct _PanelApplication
   /* autosave timeout */
   guint               autosave_timeout_id;
 
+#ifdef GDK_WINDOWING_X11
+  guint               wait_for_wm_timeout_id;
+#endif
+
   /* drag and drop data */
   guint               drop_data_ready : 1;
   guint               drop_occurred : 1;
@@ -133,6 +141,20 @@ struct _PanelApplication
   guint               drop_index;
 };
 
+#ifdef GDK_WINDOWING_X11
+typedef struct
+{
+  PanelApplication *application;
+
+  Display          *dpy;
+  Atom             *atoms;
+  guint             atom_count;
+  guint             have_wm : 1;
+  guint             counter;
+}
+WaitForWM;
+#endif
+
 enum
 {
   TARGET_PLUGIN_NAME,
@@ -204,18 +226,11 @@ panel_application_init (PanelApplication *application)
   /* get a factory reference so it never unloads */
   application->factory = panel_module_factory_get ();
 
-  /* load setup */
-  panel_application_load (application);
-
   /* start the autosave timeout */
   application->autosave_timeout_id =
       g_timeout_add_seconds (AUTOSAVE_INTERVAL,
                              panel_application_save_timeout,
                              application);
-
-  /* create empty window if everything else failed */
-  if (G_UNLIKELY (application->windows == NULL))
-    panel_application_new_window (application, NULL, TRUE);
 }
 
 
@@ -231,6 +246,12 @@ panel_application_finalize (GObject *object)
   /* stop the autosave timeout */
   g_source_remove (application->autosave_timeout_id);
 
+#ifdef GDK_WINDOWING_X11
+  /* stop autostart timeout */
+  if (application->wait_for_wm_timeout_id != 0)
+    g_source_remove (application->wait_for_wm_timeout_id);
+#endif
+
   /* free all windows */
   for (li = application->windows; li != NULL; li = li->next)
     {
@@ -298,7 +319,7 @@ panel_application_xfconf_window_bindings (PanelApplication 
*application,
 
 
 static void
-panel_application_load (PanelApplication *application)
+panel_application_load_real (PanelApplication *application)
 {
   PanelWindow  *window;
   guint         i, j, n_panels;
@@ -375,11 +396,75 @@ panel_application_load (PanelApplication *application)
 
       xfconf_array_free (array);
     }
+
+  /* create empty window if everything else failed */
+  if (G_UNLIKELY (application->windows == NULL))
+    panel_application_new_window (application, NULL, TRUE);
+}
+
+
+
+#ifdef GDK_WINDOWING_X11
+static gboolean
+panel_application_wait_for_window_manager (gpointer data)
+{
+  WaitForWM *wfwm = data;
+  guint      i;
+  gboolean   have_wm = TRUE;
+
+  for (i = 0; i < wfwm->atom_count; i++)
+    {
+      if (XGetSelectionOwner (wfwm->dpy, wfwm->atoms[i]) == None)
+        {
+          panel_debug (PANEL_DEBUG_APPLICATION, "window manager not ready on 
screen %d", i);
+
+          have_wm = FALSE;
+          break;
+        }
+    }
+
+  wfwm->have_wm = have_wm;
+
+  /* abort if a window manager is found or 5 seconds expired */
+  return wfwm->counter++ < 20 * 5 && !wfwm->have_wm;
 }
 
 
 
 static void
+panel_application_wait_for_window_manager_destroyed (gpointer data)
+{
+  WaitForWM        *wfwm = data;
+  PanelApplication *application = wfwm->application;
+
+  application->wait_for_wm_timeout_id = 0;
+
+  if (!wfwm->have_wm)
+    {
+      g_printerr (G_LOG_DOMAIN ": No window manager registered on screen 0. "
+                  "To start the panel without this check, run with 
--disable-wm-check.\n");
+    }
+  else
+    {
+      panel_debug (PANEL_DEBUG_APPLICATION, "found window manager after %d 
tries",
+                   wfwm->counter);
+    }
+
+  g_free (wfwm->atoms);
+  XCloseDisplay (wfwm->dpy);
+  g_slice_free (WaitForWM, wfwm);
+
+  /* start loading the panels, hopefully a window manager is found, but it
+   * probably also works fine without... */
+  GDK_THREADS_ENTER ();
+  panel_application_load_real (application);
+  GDK_THREADS_LEAVE ();
+}
+#endif
+
+
+
+static void
 panel_application_plugin_move_drag_data_get (GtkWidget        *item,
                                              GdkDragContext   *drag_context,
                                              GtkSelectionData *selection_data,
@@ -1092,6 +1177,55 @@ panel_application_get (void)
 
 
 void
+panel_application_load (PanelApplication  *application,
+                        gboolean           disable_wm_check)
+{
+#ifdef GDK_WINDOWING_X11
+  WaitForWM  *wfwm;
+  guint       i;
+  gchar     **atom_names;
+
+  if (!disable_wm_check)
+    {
+      /* setup data for wm checking */
+      wfwm = g_slice_new0 (WaitForWM);
+      wfwm->application = application;
+      wfwm->dpy = XOpenDisplay (NULL);
+      wfwm->have_wm = FALSE;
+      wfwm->counter = 0;
+
+      /* preload wm atoms for all screens */
+      wfwm->atom_count = XScreenCount (wfwm->dpy);
+      wfwm->atoms = g_new (Atom, wfwm->atom_count);
+      atom_names = g_new0 (gchar *, wfwm->atom_count + 1);
+
+      for (i = 0; i < wfwm->atom_count; i++)
+        atom_names[i] = g_strdup_printf ("WM_S%d", i);
+
+      if (!XInternAtoms (wfwm->dpy, atom_names, wfwm->atom_count, False, 
wfwm->atoms))
+        wfwm->atom_count = 0;
+
+      g_strfreev (atom_names);
+
+      /* setup timeout to check for a window manager */
+      application->wait_for_wm_timeout_id =
+          g_timeout_add_full (G_PRIORITY_DEFAULT_IDLE, 50, 
panel_application_wait_for_window_manager,
+                              wfwm, 
panel_application_wait_for_window_manager_destroyed);
+    }
+  else
+    {
+      /* directly launch */
+      panel_application_load_real (application);
+    }
+#else
+  /* directly launch */
+  panel_application_load_real (application);
+#endif
+}
+
+
+
+void
 panel_application_save (PanelApplication *application,
                         gboolean          save_plugin_providers)
 {
diff --git a/panel/panel-application.h b/panel/panel-application.h
index 17238b1..5073821 100644
--- a/panel/panel-application.h
+++ b/panel/panel-application.h
@@ -38,6 +38,9 @@ GType             panel_application_get_type          (void) 
G_GNUC_CONST;
 
 PanelApplication *panel_application_get               (void);
 
+void              panel_application_load              (PanelApplication  
*application,
+                                                       gboolean           
disable_wm_check);
+
 void              panel_application_save              (PanelApplication  
*application,
                                                        gboolean           
save_plugin_providers);
 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



Remember to have fun...

-- 
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to