]> git.decadent.org.uk Git - ion3.git/blobdiff - ioncore/stacking.c
Imported Upstream version 20090110
[ion3.git] / ioncore / stacking.c
index 9c0be9f02686f37db8d94e6a1ff1c84c8f04469e..0c6480d7b5331ecc7479ca59b16dd6a22f1a6360 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/stacking.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2007.
+ * Copyright (c) Tuomo Valkonen 1999-2009.
  *
  * See the included file LICENSE for details.
  */
@@ -552,7 +552,7 @@ WStacking *stacking_find_to_focus(WStacking *stacking,
                                   void *filt_data)
 {
     uint min_level=STACKING_LEVEL_BOTTOM;
-    WStacking *st=NULL;
+    WStacking *st=NULL, *found=NULL;
     
     if(stacking==NULL)
         return NULL;
@@ -572,15 +572,21 @@ WStacking *stacking_find_to_focus(WStacking *stacking,
         
         if(st->level<min_level)
             break; /* no luck */
-            
-        if(st==to_try || cf(approve_filt, filt_data, st))
+        
+        if(st==to_try)
             return st;
             
+        if(found==NULL && cf(approve_filt, filt_data, st)){
+            found=st;
+            if(to_try==NULL)
+                break;
+        }
+            
         if(st->level>=STACKING_LEVEL_MODAL1)
             min_level=maxof(min_level, st->level);
     }while(st!=stacking);
     
-    return NULL;
+    return found;
 }
 
 
@@ -590,6 +596,12 @@ static bool mapped_filt(WStacking *st, void *unused)
 }
 
 
+static bool mapped_filt_neq(WStacking *st, void *st_neq)
+{
+    return (st!=(WStacking*)st_neq && mapped_filt(st, NULL));
+}
+
+
 static bool mgr_filt(WStacking *st, void *mgr_)
 {
     return (st->reg!=NULL && REGION_MANAGER(st->reg)==(WRegion*)mgr_);
@@ -616,5 +628,16 @@ uint stacking_min_level_mapped(WStacking *stacking)
 }
 
 
+bool stacking_must_focus(WStacking *stacking, WStacking *st)
+{
+    WStacking *stf=stacking_find_to_focus(stacking, NULL, 
+                                          mapped_filt_neq, NULL, st);
+    
+    return (stf==NULL || 
+            (st->level>stf->level &&
+             st->level>=STACKING_LEVEL_MODAL1));
+}
+
+
 /*}}}*/