]> git.decadent.org.uk Git - ion3.git/blobdiff - ioncore/group-ws.c
[svn-upgrade] Integrating new upstream version, ion3 (20071109)
[ion3.git] / ioncore / group-ws.c
index 48ee838cb4a5a7dccdd00b83ae175ebf2f82847c..3fd8cb765bd30577781dc8d57a736cf204a663a1 100644 (file)
@@ -3,10 +3,7 @@
  *
  * 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 <string.h>
@@ -123,44 +120,26 @@ EXTL_EXPORT_AS(WGroupWS, attach_framed)
 bool groupws_attach_framed_extl(WGroupWS *ws, WRegion *reg, ExtlTab t)
 {
     WGroupAttachParams ap=GROUPATTACHPARAMS_INIT;
-    WFramedParam fp=FRAMEDPARAM_INIT;
-    ExtlTab gt;
+    WFramedParam frp=FRAMEDPARAM_INIT;
     
     if(reg==NULL)
         return FALSE;
     
-    fp.gravity=ForgetGravity;
-    
-    if(extl_table_is_bool_set(t, "switchto")){
-        ap.switchto_set=TRUE;
-        ap.switchto=TRUE;
-    }
+    group_get_attach_params(&ws->grp, t, &ap);
     
-    if(extl_table_gets_t(t, "geom", &gt)){
-        int pos=0, size=0;
-        
-        fp.inner_geom.x=0;
-        fp.inner_geom.y=0;
-
-        if(extl_table_gets_i(gt, "x", &(ap.geom.x)))
-            pos++;
-        if(extl_table_gets_i(gt, "y", &(ap.geom.y)))
-            pos++;
-    
-        if(extl_table_gets_i(gt, "w", &(ap.geom.w)))
-            size++;
-        if(extl_table_gets_i(gt, "h", &(ap.geom.h)))
-            size++;
-        
-        fp.inner_geom.w=maxof(fp.inner_geom.w, 1);
-        fp.inner_geom.h=maxof(fp.inner_geom.h, 1);
+    /* Sensible size is given in framedparams */
+    if(ap.geom_set){
+        ap.geom_set=0;
+        ap.geom_weak_set=1;
+        ap.geom_weak=0;
         
-        fp.inner_geom_gravity_set=(size==2 && pos==2);
-        
-        extl_unref_table(gt);
+        frp.inner_geom_gravity_set=1;
+        frp.inner_geom=ap.geom;
+        frp.gravity=NorthWestGravity;
+        extl_table_gets_i(t, "gravity", &frp.gravity);
     }
     
-    return groupws_attach_framed(ws, &ap, &fp, reg);
+    return groupws_attach_framed(ws, &ap, &frp, reg);
 }
 
 
@@ -173,34 +152,12 @@ bool groupws_attach_framed_extl(WGroupWS *ws, WRegion *reg, ExtlTab t)
 static WPHolder *groupws_do_prepare_manage(WGroupWS *ws, 
                                            const WClientWin *cwin,
                                            const WManageParams *param, 
-                                           int redir, int geom_weak)
+                                           int geom_weak)
 {
     WGroupAttachParams ap=GROUPATTACHPARAMS_INIT;
     WFramedParam fp=FRAMEDPARAM_INIT;
     WPHolder *ph;
     
-    if(redir==MANAGE_REDIR_PREFER_YES){
-        WRegion *r=(ws->grp.current_managed!=NULL 
-                    ? ws->grp.current_managed->reg 
-                    : NULL);
-        WGroupIterTmp tmp;
-        WPHolder *ph=NULL;
-        
-        if(r!=NULL)
-            ph=region_prepare_manage(r, cwin, param, MANAGE_REDIR_PREFER_YES);
-        
-        if(ph==NULL){
-            FOR_ALL_MANAGED_BY_GROUP(&ws->grp, r, tmp){
-                ph=region_prepare_manage(r, cwin, param, 
-                                         MANAGE_REDIR_PREFER_YES);
-                if(ph!=NULL)
-                    break;
-            }
-        }
-    }
-    
-    if(redir==MANAGE_REDIR_STRICT_YES)
-        return NULL;
 
     fp.inner_geom_gravity_set=TRUE;
     fp.inner_geom=param->geom;
@@ -223,8 +180,10 @@ static WPHolder *groupws_do_prepare_manage(WGroupWS *ws,
 
 WPHolder *groupws_prepare_manage(WGroupWS *ws, const WClientWin *cwin,
                                  const WManageParams *param,
-                                 int redir)
+                                 int priority)
 {
+    int cpriority=MANAGE_PRIORITY_SUB(priority, MANAGE_PRIORITY_GROUP);
+    int bpriority=MANAGE_PRIORITY_SUBX(priority, MANAGE_PRIORITY_GROUP);
     WRegion *b=(ws->grp.bottom!=NULL ? ws->grp.bottom->reg : NULL);
     WPHolder *ph=NULL;
     bool act_b=(ws->grp.bottom==ws->grp.current_managed);
@@ -249,13 +208,23 @@ WPHolder *groupws_prepare_manage(WGroupWS *ws, const WClientWin *cwin,
                 : act_b);
     
     if(b!=NULL && use_bottom)
-        ph=region_prepare_manage(b, cwin, param, redir);
+        ph=region_prepare_manage(b, cwin, param, bpriority);
+    
+    if(ph==NULL){
+        /* Check current */
+        WRegion *r=(ws->grp.current_managed!=NULL 
+                    ? ws->grp.current_managed->reg 
+                    : NULL);
+        
+        if(r!=NULL && r!=b)
+            ph=region_prepare_manage(r, cwin, param, cpriority);
+    }
+    
+    if(ph==NULL && MANAGE_PRIORITY_OK(priority, MANAGE_PRIORITY_GROUP))
+        ph=groupws_do_prepare_manage(ws, cwin, param, weak);
     
-    if(ph==NULL)
-        ph=groupws_do_prepare_manage(ws, cwin, param, redir, weak);
-
     if(ph==NULL && b!=NULL && !use_bottom)
-        ph=region_prepare_manage(b, cwin, param, redir);
+        ph=region_prepare_manage(b, cwin, param, cpriority);
     
     return ph;
 }
@@ -308,6 +277,33 @@ WPHolder *groupws_get_rescue_pholder_for(WGroupWS *ws,
 }
 
 
+static bool group_empty_for_bottom_stdisp(WGroup *ws)
+{
+    WGroupIterTmp tmp;
+    WStacking *st;
+    
+    FOR_ALL_NODES_IN_GROUP(ws, st, tmp){
+        if(st!=ws->bottom && st!=ws->managed_stdisp)
+            return FALSE;
+    }
+    
+    return TRUE;
+}
+
+
+static WRegion *groupws_managed_disposeroot(WGroupWS *ws, WRegion *reg)
+{
+    if(group_bottom(&ws->grp)==reg){
+        if(group_empty_for_bottom_stdisp(&ws->grp)){
+            WRegion *tmpr=region_disposeroot((WRegion*)ws);
+            return (tmpr!=NULL ? tmpr : reg);
+        }
+    }
+    
+    return reg;
+}
+
+
 /*}}}*/
 
 
@@ -361,6 +357,9 @@ static DynFunTab groupws_dynfuntab[]={
     
     {(DynFun*)region_prepare_manage_transient,
      (DynFun*)groupws_prepare_manage_transient},
+     
+    {(DynFun*)region_managed_disposeroot,
+     (DynFun*)groupws_managed_disposeroot},
     
     {(DynFun*)region_handle_drop,
      (DynFun*)groupws_handle_drop},