X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fscreen.c;h=d48d0dda2284fc6b1ec80cd1bfcf7a8de93ff3cb;hb=f0fdba8ad36010280fc84c2425010c195b76562a;hp=1faf521eced56e9edebc131a2f02be0b74babf72;hpb=82b2f0aa7a1723632e8d3cf7dc772e4bdb66868a;p=chaz%2Fopenbox diff --git a/openbox/screen.c b/openbox/screen.c index 1faf521e..d48d0dda 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -299,55 +299,55 @@ gboolean screen_annex(const gchar *program_name) void screen_startup(gboolean reconfig) { - if (!reconfig) { - guint i, numnames; - gchar **names; - GSList *it; + guint i, numnames; + gchar **names; + GSList *it; + guint32 d; - /* get the initial size */ - screen_resize(); + desktop_cycle_popup = pager_popup_new(FALSE); + pager_popup_height(desktop_cycle_popup, POPUP_HEIGHT); - /* get the desktop names */ - numnames = g_slist_length(config_desktops_names); - names = g_new(gchar*, numnames + 1); - names[numnames] = NULL; - for (i = 0, it = config_desktops_names; it; ++i, it = g_slist_next(it)) - names[i] = g_strdup(it->data); + if (reconfig) + return; - /* set the root window property */ - PROP_SETSS(RootWindow(ob_display, ob_screen), net_desktop_names,names); + /* get the initial size */ + screen_resize(); - g_strfreev(names); - } + /* get the desktop names */ + numnames = g_slist_length(config_desktops_names); + names = g_new(gchar*, numnames + 1); + names[numnames] = NULL; + for (i = 0, it = config_desktops_names; it; ++i, it = g_slist_next(it)) + names[i] = g_strdup(it->data); - desktop_cycle_popup = pager_popup_new(FALSE); - pager_popup_height(desktop_cycle_popup, POPUP_HEIGHT); + /* set the root window property */ + PROP_SETSS(RootWindow(ob_display, ob_screen), net_desktop_names,names); - if (!reconfig) - screen_num_desktops = 0; + g_strfreev(names); + + /* set the number of desktops */ + screen_num_desktops = 0; screen_set_num_desktops(config_desktops_num); - if (!reconfig) { - guint32 d; - /* start on the current desktop when a wm was already running */ - if (PROP_GET32(RootWindow(ob_display, ob_screen), - net_current_desktop, cardinal, &d) && - d < screen_num_desktops) - { - screen_set_desktop(d, FALSE); - } else if (session_desktop >= 0) - screen_set_desktop(MIN((guint)session_desktop, - screen_num_desktops), FALSE); - else - screen_set_desktop(MIN(config_screen_firstdesk, - screen_num_desktops) - 1, FALSE); - /* don't start in showing-desktop mode */ - screen_showing_desktop = FALSE; - PROP_SET32(RootWindow(ob_display, ob_screen), - net_showing_desktop, cardinal, screen_showing_desktop); + /* start on the current desktop when a wm was already running */ + if (PROP_GET32(RootWindow(ob_display, ob_screen), + net_current_desktop, cardinal, &d) && + d < screen_num_desktops) + { + screen_set_desktop(d, FALSE); + } else if (session_desktop >= 0) + screen_set_desktop(MIN((guint)session_desktop, + screen_num_desktops), FALSE); + else + screen_set_desktop(MIN(config_screen_firstdesk, + screen_num_desktops) - 1, FALSE); - screen_update_layout(); - } + /* don't start in showing-desktop mode */ + screen_showing_desktop = FALSE; + PROP_SET32(RootWindow(ob_display, ob_screen), + net_showing_desktop, cardinal, screen_showing_desktop); + + screen_update_layout(); } void screen_shutdown(gboolean reconfig) @@ -356,22 +356,24 @@ void screen_shutdown(gboolean reconfig) pager_popup_free(desktop_cycle_popup); - if (!reconfig) { - XSelectInput(ob_display, RootWindow(ob_display, ob_screen), - NoEventMask); + if (reconfig) + return; + + XSelectInput(ob_display, RootWindow(ob_display, ob_screen), + NoEventMask); - /* we're not running here no more! */ - PROP_ERASE(RootWindow(ob_display, ob_screen), openbox_pid); - /* not without us */ - PROP_ERASE(RootWindow(ob_display, ob_screen), net_supported); - /* don't keep this mode */ - PROP_ERASE(RootWindow(ob_display, ob_screen), net_showing_desktop); + /* we're not running here no more! */ + PROP_ERASE(RootWindow(ob_display, ob_screen), openbox_pid); + /* not without us */ + PROP_ERASE(RootWindow(ob_display, ob_screen), net_supported); + /* don't keep this mode */ + PROP_ERASE(RootWindow(ob_display, ob_screen), net_showing_desktop); - XDestroyWindow(ob_display, screen_support_win); - } + XDestroyWindow(ob_display, screen_support_win); g_strfreev(screen_desktop_names); screen_desktop_names = NULL; + for (r = area; *r; ++r) g_free(*r); g_free(area); @@ -483,6 +485,27 @@ void screen_set_desktop(guint num, gboolean dofocus) } } + /* have to try focus here because when you leave an empty desktop + there is no focus out to watch for + + do this before hiding the windows so if helper windows are coming + with us, they don't get hidden + */ + if (dofocus && (c = focus_fallback_target(TRUE, focus_client))) { + /* only do the flicker reducing stuff ahead of time if we are going + to call xsetinputfocus on the window ourselves. otherwise there is + no guarantee the window will actually take focus.. */ + if (c->can_focus) { + /* do this here so that if you switch desktops to a window with + helper windows then the helper windows won't flash */ + client_bring_helper_windows(c); + /* reduce flicker by hiliting now rather than waiting for the + server FocusIn event */ + frame_adjust_focus(c->frame, TRUE); + } + client_focus(c); + } + /* hide windows from bottom to top */ for (it = g_list_last(stacking_list); it; it = g_list_previous(it)) { if (WINDOW_IS_CLIENT(it->data)) { @@ -491,15 +514,6 @@ void screen_set_desktop(guint num, gboolean dofocus) } } - /* have to try focus here because when you leave an empty desktop - there is no focus out to watch for */ - if (dofocus && (c = focus_fallback_target(TRUE, focus_client))) { - /* reduce flicker by hiliting now rather than waiting for the server - FocusIn event */ - frame_adjust_focus(c->frame, TRUE); - client_focus(c); - } - event_ignore_queued_enters(); if (event_curtime != CurrentTime)