]> git.decadent.org.uk Git - ion3.git/blobdiff - ioncore/group-ws.c
Imported Upstream version 20090110
[ion3.git] / ioncore / group-ws.c
index 48ee838cb4a5a7dccdd00b83ae175ebf2f82847c..d7b74473e37cff9be5406e77d96dcb17da185d89 100644 (file)
@@ -1,12 +1,9 @@
 /*
  * ion/ioncore/group-ws.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2007
+ * Copyright (c) Tuomo Valkonen 1999-2009
  *
- * 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>
@@ -25,7 +22,6 @@
 #include "group-ws.h"
 #include "group-cw.h"
 #include "grouppholder.h"
-#include "groupedpholder.h"
 #include "framedpholder.h"
 #include "float-placement.h"
 #include "resize.h"
@@ -123,44 +119,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);
-        
-        fp.inner_geom_gravity_set=(size==2 && pos==2);
+    /* Sensible size is given in framedparams */
+    if(ap.geom_set){
+        ap.geom_set=0;
+        ap.geom_weak_set=1;
+        ap.geom_weak=0;
         
-        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 +151,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;
@@ -214,8 +170,21 @@ static WPHolder *groupws_do_prepare_manage(WGroupWS *ws,
     if(ph!=NULL)
         ph=pholder_either((WPHolder*)create_framedpholder(ph, &fp), ph);
     
-    if(ph!=NULL)
-        ph=pholder_either((WPHolder*)create_groupedpholder((WPHolder*)ph), ph);
+    if(ph!=NULL){
+        WGroupPHolder *gph;
+        WGroupAttachParams gp=GROUPATTACHPARAMS_INIT;
+        
+        gp.switchto_set=1;
+        gp.switchto=1;
+        gp.bottom=1;
+        
+        gph=create_grouppholder(NULL, NULL, &gp);
+        
+        if(gph!=NULL){
+            gph->recreate_pholder=ph;
+            return (WPHolder*)gph;
+        }
+    }
     
     return ph;
 }
@@ -223,8 +192,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 +220,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;
 }
@@ -287,24 +268,28 @@ WPHolder *groupws_prepare_manage_transient(WGroupWS *ws, const WClientWin *cwin,
 }
 
 
-WPHolder *groupws_get_rescue_pholder_for(WGroupWS *ws, 
-                                         WRegion *forwhat)
+static bool group_empty_for_bottom_stdisp(WGroup *ws)
 {
-    WGroupAttachParams ap=GROUPATTACHPARAMS_INIT;
-    WFramedParam fp=FRAMEDPARAM_INIT;
-    WPHolder *ph;
+    WGroupIterTmp tmp;
+    WStacking *st;
     
-    ap.geom_set=TRUE;
-    ap.geom=REGION_GEOM(forwhat);
+    FOR_ALL_NODES_IN_GROUP(ws, st, tmp){
+        if(st!=ws->bottom && st!=ws->managed_stdisp)
+            return FALSE;
+    }
+    
+    return TRUE;
+}
 
-    ap.geom_weak_set=1;
-    ap.geom_weak=(REGION_PARENT(forwhat)!=REGION_PARENT(ws)
-                  ? REGION_RQGEOM_WEAK_X|REGION_RQGEOM_WEAK_Y
-                  : 0);
 
-    ph=(WPHolder*)create_grouppholder(&ws->grp, NULL, &ap);
+static WRegion *groupws_managed_disposeroot(WGroupWS *ws, WRegion *reg)
+{
+    if(group_bottom(&ws->grp)==reg){
+        if(group_empty_for_bottom_stdisp(&ws->grp))
+            return region_disposeroot((WRegion*)ws);
+    }
     
-    return pholder_either((WPHolder*)create_framedpholder(ph, &fp), ph);
+    return reg;
 }
 
 
@@ -361,13 +346,13 @@ 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},
     
-    {(DynFun*)region_get_rescue_pholder_for,
-     (DynFun*)groupws_get_rescue_pholder_for},
-    
     {region_manage_stdisp,
      group_manage_stdisp},