From 083f2f5d5d3b5295b824a23b39fcef648b117ef7 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Mon, 7 Apr 2003 22:29:40 +0000 Subject: [PATCH] add focusLast and focusLastOnDesktop options in the [focus] section of the rc3. allows more customizaton of the focus model. default to click-focus style. add handling for focus cycling when nothing on the desktop is focused. --- data/rc3 | 12 ++++++++++-- openbox/focus.c | 46 ++++++++++++++++++++++++++++++++-------------- openbox/focus.h | 2 +- 3 files changed, 43 insertions(+), 17 deletions(-) diff --git a/data/rc3 b/data/rc3 index c700fc3b..abd2766d 100644 --- a/data/rc3 +++ b/data/rc3 @@ -16,8 +16,16 @@ # focus new windows when they appear #focusNew = yes -# does focus follow the mouse pointer -#followMouse = yes +# does focus follow the mouse pointer when it enters a window +#followMouse = no + +# when no windows are left with focus, focus the last window on the desktop +# to previously have focus +#focusLast = yes + +# a special case of focusLast that applies when switching between desktops; if +# set, the previously focused window on the desktop is focused when switching +#focusLastOnDesktop = yes [engine] diff --git a/openbox/focus.c b/openbox/focus.c index 058ad9be..cf6e7b51 100644 --- a/openbox/focus.c +++ b/openbox/focus.c @@ -18,7 +18,9 @@ GList **focus_order = NULL; /* these lists are created when screen_startup Window focus_backup = None; gboolean focus_new = TRUE; -gboolean focus_follow = TRUE; +gboolean focus_follow = FALSE; +static gboolean focus_last = TRUE; +static gboolean focus_last_on_desktop = TRUE; static gboolean noreorder = 0; @@ -36,6 +38,18 @@ static void parse_assign(char *name, ParseToken *value) else { focus_follow = value->data.bool; } + } else if (!g_ascii_strcasecmp(name, "focuslast")) { + if (value->type != TOKEN_BOOL) + yyerror("invalid value"); + else { + focus_last = value->data.bool; + } + } else if (!g_ascii_strcasecmp(name, "focuslastondesktop")) { + if (value->type != TOKEN_BOOL) + yyerror("invalid value"); + else { + focus_last_on_desktop = value->data.bool; + } } else yyerror("invalid option"); parse_free_token(value); @@ -50,7 +64,9 @@ void focus_startup() focus_client = NULL; focus_new = TRUE; - focus_follow = TRUE; + focus_follow = FALSE; + focus_last = TRUE; + focus_last_on_desktop = TRUE; attrib.override_redirect = TRUE; focus_backup = XCreateWindow(ob_display, ob_root, @@ -149,7 +165,6 @@ static gboolean focus_under_pointer() void focus_fallback(gboolean switching_desks) { GList *it; - gboolean under = FALSE; Client *old = NULL; old = focus_client; @@ -163,19 +178,20 @@ void focus_fallback(gboolean switching_desks) if (switching_desks) { /* don't skip any windows when switching desktops */ old = NULL; - } else { - if (focus_follow) - under = focus_under_pointer(); } - if (!under) { - for (it = focus_order[screen_desktop]; it != NULL; it = it->next) - if (it->data != old && client_normal(it->data)) - if (client_focus(it->data)) - break; - if (it == NULL) /* nothing to focus */ - focus_set_client(NULL); + if (!(switching_desks ? focus_last_on_desktop : focus_last)) { + if (focus_follow) focus_under_pointer(); + return; } + + for (it = focus_order[screen_desktop]; it != NULL; it = it->next) + if (it->data != old && client_normal(it->data)) + if (client_focus(it->data)) + return; + + /* nothing to focus */ + focus_set_client(NULL); } void focus_cycle(gboolean forward, gboolean linear, gboolean done, @@ -203,7 +219,9 @@ void focus_cycle(gboolean forward, gboolean linear, gboolean done, else list = focus_order[screen_desktop]; start = it = g_list_find(list, focus_client); - if (!start) goto done_cycle; /* switched desktops or something? */ + if (!start) /* switched desktops or something? */ + start = it = forward ? g_list_last(list) : g_list_first(list); + if (!start) goto done_cycle; do { if (forward) { diff --git a/openbox/focus.h b/openbox/focus.h index 19e3b363..6a86965a 100644 --- a/openbox/focus.h +++ b/openbox/focus.h @@ -17,7 +17,7 @@ extern GList **focus_order; /*! Should new windows be focused */ extern gboolean focus_new; -/*! Should focus follow the mouse pointer */ +/*! Focus windows when the mouse enters them */ extern gboolean focus_follow; void focus_startup(); -- 2.45.2