summaryrefslogtreecommitdiff
path: root/src/transients.c
diff options
context:
space:
mode:
authorOlivier Fourdan <fourdan.olivier@wanadoo.fr>2004-10-08 17:06:09 +0000
committerOlivier Fourdan <fourdan.olivier@wanadoo.fr>2004-10-08 17:06:09 +0000
commit2828c4d03fecc1bf5ba81355dd02676058490844 (patch)
tree95010ec0a7188fba3973ca191a3633f0a070021b /src/transients.c
parent0051fd1debd44ddaa830c8d0b2dee637a9274abb (diff)
downloadxfwm4-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.c65
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)
{