/*
* ion/ioncore/group-ws.c
*
- * Copyright (c) Tuomo Valkonen 1999-2006.
+ * 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>
#include "framedpholder.h"
#include "float-placement.h"
#include "resize.h"
+#include "conf.h"
/*{{{ Settings */
-static bool default_ws_params_set=FALSE;
-static ExtlTab default_ws_params;
-
-
-/*EXTL_DOC
- * Set module basic settings. Currently only the \code{placement_method}
- * parameter is supported.
- *
- * The method can be one of ''udlr'', ''lrud'' (default) and ''random''.
- * The ''udlr'' method looks for free space starting from top the top left
- * corner of the workspace moving first down keeping the x coordinate fixed.
- * If it find no free space, it start looking similarly at next x coordinate
- * unoccupied by other objects and so on. ''lrud' is the same but with the
- * role of coordinates changed and both fall back to ''random'' placement
- * if no free area was found.
- */
-
void ioncore_groupws_set(ExtlTab tab)
{
char *method=NULL;
warn(TR("Unknown placement method \"%s\"."), method);
free(method);
}
-
- if(extl_table_gets_t(tab, "default_ws_params", &t)){
- if(default_ws_params_set)
- extl_unref_table(default_ws_params);
- default_ws_params=t;
- default_ws_params_set=TRUE;
- }
}
: (ioncore_placement_method==PLACEMENT_LRUD
? "lrud"
: "random")));
-
- if(default_ws_params_set)
- extl_table_sets_t(t, "default_ws_params", default_ws_params);
}
/*{{{ groupws_prepare_manage */
-#define REG_OK(R) OBJ_IS(R, WMPlex)
-
-
-static WMPlex *find_existing(WGroupWS *ws)
-{
- WGroupIterTmp tmp;
- WRegion *r=(ws->grp.current_managed!=NULL
- ? ws->grp.current_managed->reg
- : NULL);
-
- if(r!=NULL && REG_OK(r))
- return (WMPlex*)r;
-
- FOR_ALL_MANAGED_BY_GROUP(&ws->grp, r, tmp){
- if(REG_OK(r))
- return (WMPlex*)r;
- }
-
- return NULL;
-}
-
-
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){
- WMPlex *m=find_existing(ws);
- if(m!=NULL){
- WPHolder *ph;
- ph=region_prepare_manage((WRegion*)m, cwin, param,
- MANAGE_REDIR_STRICT_YES);
- if(ph!=NULL)
- return ph;
- }
- }
-
- if(redir==MANAGE_REDIR_STRICT_YES)
- return NULL;
fp.inner_geom_gravity_set=TRUE;
fp.inner_geom=param->geom;
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);
- bool always_float, use_bottom;
+ bool use_bottom;
int weak=0;
if(param->maprq && ioncore_g.opmode!=IONCORE_OPMODE_INIT
: 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;
}
fp.inner_geom_gravity_set=TRUE;
fp.inner_geom=param->geom;
fp.gravity=param->gravity;
- fp.mkframe=create_transient_frame;
+ fp.mode=FRAME_MODE_TRANSIENT;
ap.geom_weak_set=1;
ap.geom_weak=0;
WRegion *groupws_load(WWindow *par, const WFitParams *fp,
- ExtlTab tab)
+ ExtlTab tab)
{
WGroupWS *ws;
}
-WRegion *groupws_load_default(WWindow *par, const WFitParams *fp)
-{
- return groupws_load(par, fp, (default_ws_params_set
- ? default_ws_params
- : extl_table_none()));
-}
-
-
static DynFunTab groupws_dynfuntab[]={
{(DynFun*)region_prepare_manage,
(DynFun*)groupws_prepare_manage},