diff --git a/src/transients.c b/src/transients.c index 82946a1de52b7223d6dab06d927f9e34c24156c8..8dab4c0a7c7b4211c97060da8bc48bc4bbd6c9f1 100644 --- a/src/transients.c +++ b/src/transients.c @@ -46,6 +46,26 @@ clientGetTransient (Client * c) return NULL; } +gboolean +clientIsDirectTransient (Client * c) +{ + g_return_val_if_fail (c != NULL, FALSE); + + TRACE ("client \"%s\" (0x%lx)", c->name, c->window); + + return ((c->transient_for != c->screen_info->xroot) && (c->transient_for != None) && (c->transient_for != c->window)); +} + +gboolean +clientIsTransientForGroup (Client * c) +{ + g_return_val_if_fail (c != NULL, FALSE); + + TRACE ("client \"%s\" (0x%lx)", c->name, c->window); + + return ((c->transient_for == c->screen_info->xroot) && (c->group_leader != None) && (c->group_leader != c->window)); +} + gboolean clientIsTransient (Client * c) { @@ -53,8 +73,7 @@ clientIsTransient (Client * c) TRACE ("client \"%s\" (0x%lx)", c->name, c->window); - return (((c->transient_for != c->screen_info->xroot) && (c->transient_for != None) && (c->transient_for != c->window)) || - ((c->transient_for == c->screen_info->xroot) && (c->group_leader != None) && (c->group_leader != c->window))); + return (clientIsDirectTransient(c) || clientIsTransientForGroup (c)); } gboolean @@ -68,8 +87,28 @@ clientIsModal (Client * c) if WM_TRANSIENT_FOR is not set or set to the root window the dialog is modal for its window group. */ return (FLAG_TEST (c->flags, CLIENT_FLAG_STATE_MODAL) && (c->type & WINDOW_REGULAR_FOCUSABLE) && - (((c->transient_for != c->screen_info->xroot) && (c->transient_for != None) && (c->transient_for != c->window)) || - ((c->group_leader != None) && (c->group_leader != c->window)))); + clientIsTransient (c)); +} + +gboolean +clientIsModalForGroup (Client * c) +{ + g_return_val_if_fail (c != NULL, FALSE); + + TRACE ("client \"%s\" (0x%lx)", c->name, c->window); + + return (FLAG_TEST (c->flags, CLIENT_FLAG_STATE_MODAL) && (c->type & WINDOW_REGULAR_FOCUSABLE) && + !clientIsTransient(c) && (c->group_leader != None)); +} + +gboolean +clientIsTransientOrModalForGroup (Client * c) +{ + g_return_val_if_fail (c != NULL, FALSE); + + TRACE ("client \"%s\" (0x%lx)", c->name, c->window); + + return (clientIsTransientForGroup(c) || clientIsModalForGroup(c)); } gboolean @@ -191,37 +230,6 @@ clientIsTransientOrModalFor (Client * c1, Client * c2) return (clientIsTransientFor(c1, c2) || clientIsModalFor(c1, c2)); } -gboolean -clientIsTransientForGroup (Client * c) -{ - g_return_val_if_fail (c != NULL, FALSE); - - TRACE ("client \"%s\" (0x%lx)", c->name, c->window); - - return ((c->transient_for == c->screen_info->xroot) && (c->group_leader != None)); -} - -gboolean -clientIsModalForGroup (Client * c) -{ - g_return_val_if_fail (c != NULL, FALSE); - - TRACE ("client \"%s\" (0x%lx)", c->name, c->window); - - return (FLAG_TEST (c->flags, CLIENT_FLAG_STATE_MODAL) && (c->type & WINDOW_REGULAR_FOCUSABLE) && - !clientIsTransient(c) && (c->group_leader != None)); -} - -gboolean -clientIsTransientOrModalForGroup (Client * c) -{ - g_return_val_if_fail (c != NULL, FALSE); - - TRACE ("client \"%s\" (0x%lx)", c->name, c->window); - - return (clientIsTransientForGroup(c) || clientIsModalForGroup(c)); -} - gboolean clientIsValidTransientOrModal (Client * c) { @@ -315,7 +323,7 @@ clientGetModalFor (Client * c) return NULL; } -/* Find the deepest parent of that window */ +/* Find the deepest direct parent of that window */ Client * clientGetTransientFor (Client * c) { @@ -339,7 +347,7 @@ clientGetTransientFor (Client * c) continue; } - if (clientIsTransientFor (c, c2)) + if (clientIsDirectTransient (c) && clientIsTransientFor (c, c2)) { parents = g_list_append (parents, c2); first_parent = c2; @@ -349,7 +357,7 @@ clientGetTransientFor (Client * c) for (l2 = parents; l2; l2 = g_list_next (l2)) { Client *c3 = (Client *) l2->data; - if ((c3 != c2) && clientIsTransientFor (c3, c2)) + if ((c3 != c2) && clientIsDirectTransient (c3) && clientIsTransientFor (c3, c2)) { parents = g_list_append (parents, c2); first_parent = c2; diff --git a/src/transients.h b/src/transients.h index 029e25dcb3ca8c1962f9f05622d9a01480f57ad0..57029e37f3331bb85c8a1129597465013761950f 100644 --- a/src/transients.h +++ b/src/transients.h @@ -31,8 +31,11 @@ #include "client.h" Client *clientGetTransient (Client *); +gboolean clientIsDirectTransient (Client *); +gboolean clientIsTransientForGroup (Client *); gboolean clientIsTransient (Client *); gboolean clientIsModal (Client *); +gboolean clientIsModalForGroup (Client *); gboolean clientIsTransientOrModal (Client *); gboolean clientIsValidTransientOrModal (Client *); gboolean clientSameGroup (Client *, @@ -49,8 +52,6 @@ gboolean clientIsModalFor (Client *, Client *); gboolean clientIsTransientOrModalFor (Client *, Client *); -gboolean clientIsTransientForGroup (Client *); -gboolean clientIsModalForGroup (Client *); gboolean clientIsTransientOrModalForGroup (Client *); gboolean clientTransientOrModalHasAncestor (Client *, guint);