diff --git a/panel/panel-application.c b/panel/panel-application.c index 9fa863f..3fb9492 100644 --- a/panel/panel-application.c +++ b/panel/panel-application.c @@ -147,7 +147,8 @@ typedef struct PanelApplication *application; Display *dpy; - Atom wm_atom; + Atom *atoms; + guint atom_count; guint have_wm : 1; guint counter; } @@ -408,8 +409,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 +448,7 @@ panel_application_wait_for_window_manager_destroyed (gpointer data) wfwm->counter); } + g_free (wfwm->atoms); XCloseDisplay (wfwm->dpy); g_slice_free (WaitForWM, wfwm); @@ -1168,6 +1180,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 +1190,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 = g_malloc (sizeof (Atom) * wfwm->atom_count); + atom_names = g_malloc (sizeof (gchar *) * wfwm->atom_count); + + for (i = 0; i < wfwm->atom_count; i++) + { + g_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); + + g_free (atom_names); } else {