diff options
author | Olivier Fourdan <fourdan.olivier@wanadoo.fr> | 2004-10-08 17:06:09 +0000 |
---|---|---|
committer | Olivier Fourdan <fourdan.olivier@wanadoo.fr> | 2004-10-08 17:06:09 +0000 |
commit | 2828c4d03fecc1bf5ba81355dd02676058490844 (patch) | |
tree | 95010ec0a7188fba3973ca191a3633f0a070021b /src/transients.c | |
parent | 0051fd1debd44ddaa830c8d0b2dee637a9274abb (diff) | |
download | xfwm4-2828c4d03fecc1bf5ba81355dd02676058490844.tar.gz |
Improve handling of transients/modals which aren't tied to a parent window.
(Old svn revision: 12044)
Diffstat (limited to 'src/transients.c')
-rw-r--r-- | src/transients.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/transients.c b/src/transients.c index a8e0f8a77..56889c23d 100644 --- a/src/transients.c +++ b/src/transients.c @@ -80,6 +80,39 @@ clientIsTransientOrModal (Client * c) } gboolean +clientIsValidTransientOrModal (Client * c) +{ + g_return_val_if_fail (c != NULL, FALSE); + + TRACE ("entering clientIsValidTransientOrModal"); + if (clientIsTransientOrModalForGroup (c)) + { + ScreenInfo *screen_info = c->screen_info; + GList *index; + + /* Look for a valid transient ormodal for the same group */ + for (index = screen_info->windows_stack; index; index = g_list_next (index)) + { + Client *c2 = (Client *) index->data; + if (c2 != c) + { + if (clientIsTransientOrModalFor (c, c2)) + { + /* We found one, look no further */ + return TRUE; + } + } + } + } + else if (clientIsTransientOrModal (c)) + { + return (clientGetTransient (c) != NULL); + } + + return (FALSE); +} + +gboolean clientSameGroup (Client * c1, Client * c2) { g_return_val_if_fail (c1 != NULL, FALSE); @@ -174,6 +207,38 @@ clientIsTransientOrModalForGroup (Client * c) return (clientIsTransientForGroup(c) || clientIsModalForGroup(c)); } +gboolean +clientTransientOrModalHasAncestor (Client * c, int ws) +{ + Client *c2 = NULL; + GList *index = NULL; + ScreenInfo *screen_info = NULL; + + g_return_val_if_fail (c != NULL, FALSE); + + TRACE ("entering clientTransientOrModalHasAncestor"); + + if (!clientIsTransientOrModal (c)) + { + return FALSE; + } + + screen_info = c->screen_info; + for (index = screen_info->windows_stack; index; index = g_list_next (index)) + { + c2 = (Client *) index->data; + if ((c2 != c) && !clientIsTransientOrModal (c2) + && clientIsTransientOrModalFor (c, c2) + && !FLAG_TEST (c2->flags, CLIENT_FLAG_ICONIFIED) + && (c2->win_workspace == ws)) + { + return TRUE; + } + } + return FALSE; + +} + Client * clientGetModalFor (Client * c) { |