]> git.decadent.org.uk Git - ion3.git/blobdiff - ioncore/stacking.c
[svn-upgrade] Integrating new upstream version, ion3 (20070506)
[ion3.git] / ioncore / stacking.c
index 9d77ac9489ecd981f68acbfe9e9204a060a0eb2a..9c0be9f02686f37db8d94e6a1ff1c84c8f04469e 100644 (file)
@@ -3,13 +3,11 @@
  *
  * Copyright (c) Tuomo Valkonen 1999-2007.
  *
- * Ion is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
+ * See the included file LICENSE for details.
  */
 
 #include <libtu/rb.h>
+#include <libtu/minmax.h>
 
 #include "common.h"
 #include "region.h"
@@ -32,6 +30,7 @@ WStacking *create_stacking()
         st->szplcy=SIZEPOLICY_DEFAULT;
         st->hidden=FALSE;
         st->lnode=NULL;
+        st->pseudomodal=FALSE;
     }
     
     return st;
@@ -521,8 +520,8 @@ uint stacking_min_level(WStacking *stacking,
                         WStackingFilter *include_filt, 
                         void *filt_data)
 {
+    uint min_level=STACKING_LEVEL_BOTTOM;
     WStacking *st=NULL;
-    uint min_level=0;
     
     if(stacking==NULL)
         return STACKING_LEVEL_BOTTOM;
@@ -546,35 +545,39 @@ uint stacking_min_level(WStacking *stacking,
 }
 
 
-WStacking *stacking_find_to_focus(WStacking *stacking, WStacking *to_try,
+WStacking *stacking_find_to_focus(WStacking *stacking, 
+                                  WStacking *to_try,
                                   WStackingFilter *include_filt, 
                                   WStackingFilter *approve_filt, 
                                   void *filt_data)
 {
+    uint min_level=STACKING_LEVEL_BOTTOM;
     WStacking *st=NULL;
-    uint min_level=0;
     
     if(stacking==NULL)
         return NULL;
     
-    min_level=stacking_min_level(stacking, include_filt, filt_data);
-    
-    if(to_try!=NULL && to_try->level>=min_level)
-        return to_try;
-    
     st=stacking;
     do{
         st=st->prev;
         
-        if(st->level<min_level)
-            break;
+        if(st->reg==NULL)
+            continue;
         
-        if(st->reg!=NULL 
-           && !(st->reg->flags&REGION_SKIP_FOCUS)
-           && cf(include_filt, filt_data, st)
-           && cf(approve_filt, filt_data, st)){
-            return st;
+        if(st!=to_try && (st->reg->flags&REGION_SKIP_FOCUS ||
+                          !cf(include_filt, filt_data, st))){
+            /* skip */
+            continue;
         }
+        
+        if(st->level<min_level)
+            break; /* no luck */
+            
+        if(st==to_try || cf(approve_filt, filt_data, st))
+            return st;
+            
+        if(st->level>=STACKING_LEVEL_MODAL1)
+            min_level=maxof(min_level, st->level);
     }while(st!=stacking);
     
     return NULL;