/*
* ion/ioncore/stacking.c
*
- * Copyright (c) Tuomo Valkonen 1999-2007.
+ * Copyright (c) Tuomo Valkonen 1999-2008.
*
* See the included file LICENSE for details.
*/
void *filt_data)
{
uint min_level=STACKING_LEVEL_BOTTOM;
- WStacking *st=NULL;
+ WStacking *st=NULL, *found=NULL;
if(stacking==NULL)
return NULL;
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;
}
}
+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_);
}
+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));
+}
+
+
/*}}}*/