X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fscreen.c;h=379a12d82524c5bb1a21d3b8f21eb82f938dd2bb;hb=78cd9bba523f4986413e3aefe87704e9d11cd081;hp=04a3b452be033989b99c5e8c614a965d7381e592;hpb=c12d09bde85e40fdfbb36225a1b596b5f27c2335;p=chaz%2Fopenbox diff --git a/openbox/screen.c b/openbox/screen.c index 04a3b452..379a12d8 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -52,14 +52,16 @@ ButtonPressMask | ButtonReleaseMask) static gboolean screen_validate_layout(ObDesktopLayout *l); -static gboolean replace_wm(); -static void screen_tell_ksplash(); -static void screen_fallback_focus(); +static gboolean replace_wm(void); +static void screen_tell_ksplash(void); +static void screen_fallback_focus(void); guint screen_num_desktops; guint screen_num_monitors; guint screen_desktop; -guint screen_last_desktop; +guint screen_last_desktop = 1; +guint screen_old_desktop; +gboolean screen_desktop_timeout = TRUE; Size screen_physical_size; gboolean screen_showing_desktop; ObDesktopLayout screen_desktop_layout; @@ -77,7 +79,11 @@ static GSList *struts_bottom = NULL; static ObPagerPopup *desktop_popup; -static gboolean replace_wm() +/*! The number of microseconds that you need to be on a desktop before it will + replace the remembered "last desktop" */ +#define REMEMBER_LAST_DESKTOP_TIME 750000 + +static gboolean replace_wm(void) { gchar *wm_sn; Atom wm_sn_atom; @@ -149,7 +155,7 @@ static gboolean replace_wm() return TRUE; } -gboolean screen_annex() +gboolean screen_annex(void) { XSetWindowAttributes attrib; pid_t pid; @@ -304,7 +310,7 @@ gboolean screen_annex() return TRUE; } -static void screen_tell_ksplash() +static void screen_tell_ksplash(void) { XEvent e; char **argv; @@ -453,7 +459,7 @@ void screen_shutdown(gboolean reconfig) screen_desktop_names = NULL; } -void screen_resize() +void screen_resize(void) { static gint oldw = 0, oldh = 0; gint w, h; @@ -536,7 +542,7 @@ void screen_set_num_desktops(guint num) screen_set_desktop(num - 1, TRUE); } -static void screen_fallback_focus() +static void screen_fallback_focus(void) { ObClient *c; gboolean allow_omni; @@ -577,23 +583,90 @@ static void screen_fallback_focus() } } +static gboolean last_desktop_func(gpointer data) +{ + screen_desktop_timeout = TRUE; + return FALSE; +} + void screen_set_desktop(guint num, gboolean dofocus) { GList *it; - guint old; + guint previous; gulong ignore_start; g_assert(num < screen_num_desktops); - old = screen_desktop; + previous = screen_desktop; screen_desktop = num; - if (old == num) return; + if (previous == num) return; PROP_SET32(RootWindow(ob_display, ob_screen), net_current_desktop, cardinal, num); - screen_last_desktop = old; + /* This whole thing decides when/how to save the screen_last_desktop so + that it can be restored later if you want */ + if (screen_desktop_timeout) { + /* If screen_desktop_timeout is true, then we've been on this desktop + long enough and we can save it as the last desktop. */ + + /* save the "last desktop" as the "old desktop" */ + screen_old_desktop = screen_last_desktop; + /* save the desktop we're coming from as the "last desktop" */ + screen_last_desktop = previous; + } + else { + /* If screen_desktop_timeout is false, then we just got to this desktop + and we are moving away again. */ + + if (screen_desktop == screen_last_desktop) { + /* If we are moving to the "last desktop" .. */ + if (previous == screen_old_desktop) { + /* .. from the "old desktop", change the last desktop to + be where we are coming from */ + screen_last_desktop = screen_old_desktop; + } + else if (screen_last_desktop == screen_old_desktop) { + /* .. and also to the "old desktop", change the "last + desktop" to be where we are coming from */ + screen_last_desktop = previous; + } + else { + /* .. from some other desktop, then set the "last desktop" to + be the saved "old desktop", i.e. where we were before the + "last desktop" */ + screen_last_desktop = screen_old_desktop; + } + } + else { + /* If we are moving to any desktop besides the "last desktop".. + (this is the normal case) */ + if (screen_desktop == screen_old_desktop) { + /* If moving to the "old desktop", which is not the + "last desktop", don't save anything */ + } + else if (previous == screen_old_desktop) { + /* If moving from the "old desktop", and not to the + "last desktop", don't save anything */ + } + else if (screen_last_desktop == screen_old_desktop) { + /* If the "last desktop" is the same as "old desktop" and + you're not moving to the "last desktop" then save where + we're coming from as the "last desktop" */ + screen_last_desktop = previous; + } + else { + /* If the "last desktop" is different from the "old desktop" + and you're not moving to the "last desktop", then don't save + anything */ + } + } + } + screen_desktop_timeout = FALSE; + ob_main_loop_timeout_remove(ob_main_loop, last_desktop_func); + ob_main_loop_timeout_add(ob_main_loop, REMEMBER_LAST_DESKTOP_TIME, + last_desktop_func, NULL, NULL, NULL); ob_debug("Moving to desktop %d\n", num+1); @@ -858,7 +931,7 @@ void screen_show_desktop_popup(guint d) g_free(a); } -void screen_hide_desktop_popup() +void screen_hide_desktop_popup(void) { ob_main_loop_timeout_remove(ob_main_loop, hide_desktop_popup_func); pager_popup_hide(desktop_popup); @@ -1007,7 +1080,7 @@ static gboolean screen_validate_layout(ObDesktopLayout *l) return TRUE; } -void screen_update_layout() +void screen_update_layout(void) { ObDesktopLayout l; @@ -1056,7 +1129,7 @@ void screen_update_layout() } } -void screen_update_desktop_names() +void screen_update_desktop_names(void) { guint i; @@ -1218,7 +1291,7 @@ typedef struct { } \ } -void screen_update_areas() +void screen_update_areas(void) { guint i, j; gulong *dims; @@ -1510,7 +1583,7 @@ Rect* screen_area(guint desktop, guint head, Rect *search) guint screen_find_monitor(Rect *search) { guint i; - guint most = 0; + guint most = screen_num_monitors; guint mostv = 0; for (i = 0; i < screen_num_monitors; ++i) { @@ -1532,7 +1605,7 @@ guint screen_find_monitor(Rect *search) return most; } -Rect* screen_physical_area_all_monitors() +Rect* screen_physical_area_all_monitors(void) { return screen_physical_area_monitor(screen_num_monitors); } @@ -1554,7 +1627,7 @@ gboolean screen_physical_area_monitor_contains(guint head, Rect *search) return RECT_INTERSECTS_RECT(monitor_area[head], *search); } -Rect* screen_physical_area_active() +Rect* screen_physical_area_active(void) { Rect *a; gint x, y; @@ -1574,7 +1647,7 @@ Rect* screen_physical_area_active() return a; } -void screen_set_root_cursor() +void screen_set_root_cursor(void) { if (sn_app_starting()) XDefineCursor(ob_display, RootWindow(ob_display, ob_screen),