/*
* 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>
#include "group-ws.h"
#include "group-cw.h"
#include "grouppholder.h"
-#include "groupedpholder.h"
#include "framedpholder.h"
#include "float-placement.h"
#include "resize.h"
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", >)){
- 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);
}
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;
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;
}
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);
: 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;
}
}
-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;
}
{(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},