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 - gber@opensuse.org
+
+- 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 gber@opensuse.org -- 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
#include
+#ifdef GDK_WINDOWING_X11
+#include
+#include
+#endif
+
#include
#include
#include
@@ -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: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org