panel/panel-application.c | 39 +++++++++++++++++++++++++++++++++++---- 1 files changed, 35 insertions(+), 4 deletions(-) diff --git a/panel/panel-application.c b/panel/panel-application.c index 9fa863f..6e1ad6c 100644 --- a/panel/panel-application.c +++ b/panel/panel-application.c @@ -147,9 +147,11 @@ typedef struct PanelApplication *application; Display *dpy; - Atom wm_atom; + Atom *atoms; + guint atom_count; guint have_wm : 1; guint counter; + } WaitForWM; #endif @@ -408,8 +410,18 @@ static gboolean panel_application_wait_for_window_manager (gpointer data) { WaitForWM *wfwm = data; - - if (XGetSelectionOwner (wfwm->dpy, wfwm->wm_atom) != None) + gboolean wm_ready; + guint i; + + wm_ready = TRUE; + for (i = 0; i < wfwm->atom_count; i++) + if (XGetSelectionOwner (wfwm->dpy, wfwm->atoms[i]) == None) + { + wm_ready = FALSE; + break; + } + + if (wm_ready) wfwm->have_wm = TRUE; /* abort if a window manager is found or 5 seconds expired */ @@ -437,6 +449,7 @@ panel_application_wait_for_window_manager_destroyed (gpointer data) wfwm->counter); } + free (wfwm->atoms); XCloseDisplay (wfwm->dpy); g_slice_free (WaitForWM, wfwm); @@ -1168,6 +1181,9 @@ panel_application_load (PanelApplication *application, { #ifdef GDK_WINDOWING_X11 WaitForWM *wfwm; + guint i; + gchar atom_name[16]; + gchar **atom_names; if (!disable_wm_check) { @@ -1175,14 +1191,29 @@ panel_application_load (PanelApplication *application, wfwm = g_slice_new0 (WaitForWM); wfwm->application = application; wfwm->dpy = XOpenDisplay (NULL); - wfwm->wm_atom = XInternAtom (wfwm->dpy, "WM_S0", False); wfwm->have_wm = FALSE; wfwm->counter = 0; + /* preload wm atoms for all screens */ + wfwm->atom_count = XScreenCount (wfwm->dpy); + wfwm->atoms = malloc (sizeof (Atom) * wfwm->atom_count); + atom_names = malloc (sizeof (char *) * wfwm->atom_count); + + for (i = 0; i < wfwm->atom_count; i++) + { + snprintf (atom_name, sizeof (atom_name), "WM_S%d", i); + atom_names[i] = atom_name; + } + + XInternAtoms (wfwm->dpy, atom_names, wfwm->atom_count, False, + wfwm->atoms); + /* 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); + + free (atom_names); } else {