all repos — openbox @ 0d0ce065df9ff1acc06fe63e4a0fe45c184de693

openbox fork - make it a bit more like ryudo

don't focus helper windows that map unless there are no other valid targets in the group (don't move focus from a group window to a new helper window).
this fixes gucharmap.
Dana Jansens danakj@orodu.net
commit

0d0ce065df9ff1acc06fe63e4a0fe45c184de693

parent

b3d26fdb20e5a939210265ecdf8e5b51340991c6

5 files changed, 21 insertions(+), 12 deletions(-)

jump to
M openbox/client.copenbox/client.c

@@ -274,6 +274,9 @@

/* get all the stuff off the window */ client_get_all(self, TRUE); + ob_debug("Window type: %d\n", self->type); + ob_debug("Window group: 0x%x\n", self->group?self->group->leader:0); + /* specify that if we exit, the window should not be destroyed and should be reparented back to root automatically */ XChangeSaveSet(ob_display, window, SetModeInsert);

@@ -320,7 +323,7 @@ ((config_focus_new || (settings && settings->focus == 1)) ||

client_search_focus_tree_full(self)) && /* this checks for focus=false for the window */ (!settings || settings->focus != 0) && - focus_valid_target(self, FALSE, TRUE, FALSE, FALSE)) + focus_valid_target(self, FALSE, FALSE, TRUE, FALSE, FALSE)) { activate = TRUE; }
M openbox/focus.copenbox/focus.c

@@ -126,7 +126,7 @@ 2. it is a valid auto-focus target

3. it is not shaded */ if ((allow_omnipresent || c->desktop == screen_desktop) && - focus_valid_target(c, FALSE, FALSE, FALSE, FALSE) && + focus_valid_target(c, TRUE, FALSE, FALSE, FALSE, FALSE) && !c->shaded && (allow_refocus || client_focus_target(c) != old) && client_focus(c))

@@ -146,7 +146,7 @@ 2. it is a normal type window, don't fall back onto a dock or

a splashscreen or a desktop window (save the desktop as a backup fallback though) */ - if (focus_valid_target(c, FALSE, FALSE, FALSE, TRUE) && + if (focus_valid_target(c, TRUE, FALSE, FALSE, FALSE, TRUE) && (allow_refocus || client_focus_target(c) != old) && client_focus(c)) {

@@ -284,7 +284,8 @@ for (it = ft->group->members; it; it = g_slist_next(it)) {

ObClient *c = it->data; /* check that it's not a helper window to avoid infinite recursion */ if (c != ft && c->type == OB_CLIENT_TYPE_NORMAL && - focus_valid_target(c, iconic_windows, all_desktops, FALSE, FALSE)) + focus_valid_target(c, TRUE, iconic_windows, all_desktops, + FALSE, FALSE)) { return TRUE; }

@@ -293,6 +294,7 @@ return FALSE;

} gboolean focus_valid_target(ObClient *ft, + gboolean helper_windows, gboolean iconic_windows, gboolean all_desktops, gboolean dock_windows,

@@ -326,10 +328,12 @@ ((client_normal(ft) && !client_helper(ft))

|| /* helper windows are valid targets if... */ (client_helper(ft) && - /* ...a window in its group already has focus ... */ - ((focus_client && ft->group == focus_client->group) || + /* ...a window in its group already has focus and we want to + include helper windows ... */ + ((focus_client && ft->group == focus_client->group && + helper_windows) || /* ... or if there are no other windows in its group - that can be cycled to instead */ + that can be focused instead */ !focus_target_has_siblings(ft, iconic_windows, all_desktops)))); /* it's not set to skip the taskbar (unless it is a type that would be

@@ -348,6 +352,7 @@ you choose this window and bring the modal one here */

{ ObClient *cft = client_focus_target(ft); ok = ok && (ft == cft || !focus_valid_target(cft, + TRUE, iconic_windows, all_desktops, dock_windows,
M openbox/focus.hopenbox/focus.h

@@ -64,6 +64,7 @@

struct _ObClient *focus_order_find_first(guint desktop); gboolean focus_valid_target(struct _ObClient *ft, + gboolean helper_windows, gboolean iconic_windows, gboolean all_desktops, gboolean dock_windows,
M openbox/focus_cycle.copenbox/focus_cycle.c

@@ -56,7 +56,7 @@ {

/* stop focus cycling if the given client is a valid focus target, and so the cycling is being disrupted */ if (focus_cycle_target && ifclient && - focus_valid_target(ifclient, + focus_valid_target(ifclient, TRUE, focus_cycle_iconic_windows, focus_cycle_all_desktops, focus_cycle_dock_windows,

@@ -119,7 +119,7 @@ it = it->prev;

if (it == NULL) it = g_list_last(list); } ft = it->data; - if (focus_valid_target(ft, + if (focus_valid_target(ft, TRUE, focus_cycle_iconic_windows, focus_cycle_all_desktops, focus_cycle_dock_windows,

@@ -190,7 +190,7 @@

/* the currently selected window isn't interesting */ if (cur == c) continue; - if (!focus_valid_target(it->data, FALSE, FALSE, dock_windows, + if (!focus_valid_target(it->data, TRUE, FALSE, FALSE, dock_windows, desktop_windows)) continue;

@@ -295,7 +295,7 @@ else {

GList *it; for (it = focus_order; it; it = g_list_next(it)) - if (focus_valid_target(it->data, + if (focus_valid_target(it->data, TRUE, focus_cycle_iconic_windows, focus_cycle_all_desktops, focus_cycle_dock_windows,
M openbox/focus_cycle_popup.copenbox/focus_cycle_popup.c

@@ -174,7 +174,7 @@ n = 0;

for (it = g_list_last(focus_order); it; it = g_list_previous(it)) { ObClient *ft = it->data; - if (focus_valid_target(ft, + if (focus_valid_target(ft, TRUE, iconic_windows, all_desktops, dock_windows,