all repos — openbox @ 083f2f5d5d3b5295b824a23b39fcef648b117ef7

openbox fork - make it a bit more like ryudo

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.
Dana Jansens danakj@orodu.net
commit

083f2f5d5d3b5295b824a23b39fcef648b117ef7

parent

2dac2cc01b004a282c8f041065a0e73f2ef538b5

3 files changed, 43 insertions(+), 17 deletions(-)

jump to
M data/rc3data/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]
M openbox/focus.copenbox/focus.c

@@ -18,7 +18,9 @@ sets the number of desktops */

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 @@ yyerror("invalid 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 @@ XSetWindowAttributes attrib;

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 @@

void focus_fallback(gboolean switching_desks) { GList *it; - gboolean under = FALSE; Client *old = NULL; old = focus_client;

@@ -163,19 +178,20 @@

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 @@ if (linear) list = client_list;

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) {
M openbox/focus.hopenbox/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();