X-Git-Url: https://git.decadent.org.uk/gitweb/?p=ion3.git;a=blobdiff_plain;f=ioncore%2Fgroup-ws.c;h=d7b74473e37cff9be5406e77d96dcb17da185d89;hp=48ee838cb4a5a7dccdd00b83ae175ebf2f82847c;hb=HEAD;hpb=803afbc1cd633f6c025bcd9537e9b7e9aedadd0d diff --git a/ioncore/group-ws.c b/ioncore/group-ws.c index 48ee838..d7b7447 100644 --- a/ioncore/group-ws.c +++ b/ioncore/group-ws.c @@ -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 @@ -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", >)){ - 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},