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.
This commit is contained in:
parent
b3d26fdb20
commit
0d0ce065df
5 changed files with 21 additions and 12 deletions
|
@ -274,6 +274,9 @@ void client_manage(Window window)
|
||||||
/* get all the stuff off the window */
|
/* get all the stuff off the window */
|
||||||
client_get_all(self, TRUE);
|
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
|
/* specify that if we exit, the window should not be destroyed and
|
||||||
should be reparented back to root automatically */
|
should be reparented back to root automatically */
|
||||||
XChangeSaveSet(ob_display, window, SetModeInsert);
|
XChangeSaveSet(ob_display, window, SetModeInsert);
|
||||||
|
@ -320,7 +323,7 @@ void client_manage(Window window)
|
||||||
client_search_focus_tree_full(self)) &&
|
client_search_focus_tree_full(self)) &&
|
||||||
/* this checks for focus=false for the window */
|
/* this checks for focus=false for the window */
|
||||||
(!settings || settings->focus != 0) &&
|
(!settings || settings->focus != 0) &&
|
||||||
focus_valid_target(self, FALSE, TRUE, FALSE, FALSE))
|
focus_valid_target(self, FALSE, FALSE, TRUE, FALSE, FALSE))
|
||||||
{
|
{
|
||||||
activate = TRUE;
|
activate = TRUE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -126,7 +126,7 @@ static ObClient* focus_fallback_target(gboolean allow_refocus,
|
||||||
3. it is not shaded
|
3. it is not shaded
|
||||||
*/
|
*/
|
||||||
if ((allow_omnipresent || c->desktop == screen_desktop) &&
|
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 &&
|
!c->shaded &&
|
||||||
(allow_refocus || client_focus_target(c) != old) &&
|
(allow_refocus || client_focus_target(c) != old) &&
|
||||||
client_focus(c))
|
client_focus(c))
|
||||||
|
@ -146,7 +146,7 @@ static ObClient* focus_fallback_target(gboolean allow_refocus,
|
||||||
a splashscreen or a desktop window (save the desktop as a
|
a splashscreen or a desktop window (save the desktop as a
|
||||||
backup fallback though)
|
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) &&
|
(allow_refocus || client_focus_target(c) != old) &&
|
||||||
client_focus(c))
|
client_focus(c))
|
||||||
{
|
{
|
||||||
|
@ -284,7 +284,8 @@ static gboolean focus_target_has_siblings(ObClient *ft,
|
||||||
ObClient *c = it->data;
|
ObClient *c = it->data;
|
||||||
/* check that it's not a helper window to avoid infinite recursion */
|
/* check that it's not a helper window to avoid infinite recursion */
|
||||||
if (c != ft && c->type == OB_CLIENT_TYPE_NORMAL &&
|
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;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -293,6 +294,7 @@ static gboolean focus_target_has_siblings(ObClient *ft,
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean focus_valid_target(ObClient *ft,
|
gboolean focus_valid_target(ObClient *ft,
|
||||||
|
gboolean helper_windows,
|
||||||
gboolean iconic_windows,
|
gboolean iconic_windows,
|
||||||
gboolean all_desktops,
|
gboolean all_desktops,
|
||||||
gboolean dock_windows,
|
gboolean dock_windows,
|
||||||
|
@ -326,10 +328,12 @@ gboolean focus_valid_target(ObClient *ft,
|
||||||
||
|
||
|
||||||
/* helper windows are valid targets if... */
|
/* helper windows are valid targets if... */
|
||||||
(client_helper(ft) &&
|
(client_helper(ft) &&
|
||||||
/* ...a window in its group already has focus ... */
|
/* ...a window in its group already has focus and we want to
|
||||||
((focus_client && ft->group == focus_client->group) ||
|
include helper windows ... */
|
||||||
|
((focus_client && ft->group == focus_client->group &&
|
||||||
|
helper_windows) ||
|
||||||
/* ... or if there are no other windows in its group
|
/* ... 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))));
|
!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
|
/* it's not set to skip the taskbar (unless it is a type that would be
|
||||||
|
@ -348,6 +352,7 @@ gboolean focus_valid_target(ObClient *ft,
|
||||||
{
|
{
|
||||||
ObClient *cft = client_focus_target(ft);
|
ObClient *cft = client_focus_target(ft);
|
||||||
ok = ok && (ft == cft || !focus_valid_target(cft,
|
ok = ok && (ft == cft || !focus_valid_target(cft,
|
||||||
|
TRUE,
|
||||||
iconic_windows,
|
iconic_windows,
|
||||||
all_desktops,
|
all_desktops,
|
||||||
dock_windows,
|
dock_windows,
|
||||||
|
|
|
@ -64,6 +64,7 @@ void focus_order_to_bottom(struct _ObClient *c);
|
||||||
struct _ObClient *focus_order_find_first(guint desktop);
|
struct _ObClient *focus_order_find_first(guint desktop);
|
||||||
|
|
||||||
gboolean focus_valid_target(struct _ObClient *ft,
|
gboolean focus_valid_target(struct _ObClient *ft,
|
||||||
|
gboolean helper_windows,
|
||||||
gboolean iconic_windows,
|
gboolean iconic_windows,
|
||||||
gboolean all_desktops,
|
gboolean all_desktops,
|
||||||
gboolean dock_windows,
|
gboolean dock_windows,
|
||||||
|
|
|
@ -56,7 +56,7 @@ void focus_cycle_stop(ObClient *ifclient)
|
||||||
/* stop focus cycling if the given client is a valid focus target,
|
/* stop focus cycling if the given client is a valid focus target,
|
||||||
and so the cycling is being disrupted */
|
and so the cycling is being disrupted */
|
||||||
if (focus_cycle_target && ifclient &&
|
if (focus_cycle_target && ifclient &&
|
||||||
focus_valid_target(ifclient,
|
focus_valid_target(ifclient, TRUE,
|
||||||
focus_cycle_iconic_windows,
|
focus_cycle_iconic_windows,
|
||||||
focus_cycle_all_desktops,
|
focus_cycle_all_desktops,
|
||||||
focus_cycle_dock_windows,
|
focus_cycle_dock_windows,
|
||||||
|
@ -119,7 +119,7 @@ ObClient* focus_cycle(gboolean forward, gboolean all_desktops,
|
||||||
if (it == NULL) it = g_list_last(list);
|
if (it == NULL) it = g_list_last(list);
|
||||||
}
|
}
|
||||||
ft = it->data;
|
ft = it->data;
|
||||||
if (focus_valid_target(ft,
|
if (focus_valid_target(ft, TRUE,
|
||||||
focus_cycle_iconic_windows,
|
focus_cycle_iconic_windows,
|
||||||
focus_cycle_all_desktops,
|
focus_cycle_all_desktops,
|
||||||
focus_cycle_dock_windows,
|
focus_cycle_dock_windows,
|
||||||
|
@ -190,7 +190,7 @@ static ObClient *focus_find_directional(ObClient *c, ObDirection dir,
|
||||||
/* the currently selected window isn't interesting */
|
/* the currently selected window isn't interesting */
|
||||||
if (cur == c)
|
if (cur == c)
|
||||||
continue;
|
continue;
|
||||||
if (!focus_valid_target(it->data, FALSE, FALSE, dock_windows,
|
if (!focus_valid_target(it->data, TRUE, FALSE, FALSE, dock_windows,
|
||||||
desktop_windows))
|
desktop_windows))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -295,7 +295,7 @@ ObClient* focus_directional_cycle(ObDirection dir, gboolean dock_windows,
|
||||||
GList *it;
|
GList *it;
|
||||||
|
|
||||||
for (it = focus_order; it; it = g_list_next(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_iconic_windows,
|
||||||
focus_cycle_all_desktops,
|
focus_cycle_all_desktops,
|
||||||
focus_cycle_dock_windows,
|
focus_cycle_dock_windows,
|
||||||
|
|
|
@ -174,7 +174,7 @@ static void popup_setup(ObFocusCyclePopup *p, gboolean create_targets,
|
||||||
for (it = g_list_last(focus_order); it; it = g_list_previous(it)) {
|
for (it = g_list_last(focus_order); it; it = g_list_previous(it)) {
|
||||||
ObClient *ft = it->data;
|
ObClient *ft = it->data;
|
||||||
|
|
||||||
if (focus_valid_target(ft,
|
if (focus_valid_target(ft, TRUE,
|
||||||
iconic_windows,
|
iconic_windows,
|
||||||
all_desktops,
|
all_desktops,
|
||||||
dock_windows,
|
dock_windows,
|
||||||
|
|
Loading…
Reference in a new issue