* Ion dock module
* Copyright (C) 2003 Tom Payne
* Copyright (C) 2003 Per Olofsson
- * Copyright (C) 2004-2006 Tuomo Valkonen
+ * Copyright (C) 2004-2009 Tuomo Valkonen
*
* by Tom Payne <ion@tompayne.org>
* based on code by Per Olofsson <pelle@dsv.su.se>
}
-static void calc_dock_pos(WRectangle *dg, const WRectangle *pg, int pos)
-{
- switch(pos&DOCK_HPOS_MASK){
- case DOCK_HPOS_LEFT:
- dg->x=pg->x;
- break;
- case DOCK_HPOS_CENTER:
- dg->x=pg->x+(pg->w-dg->w)/2;
- break;
- case DOCK_HPOS_RIGHT:
- dg->x=pg->x+(pg->w-dg->w);
- break;
- }
-
- switch(pos&DOCK_VPOS_MASK){
- case DOCK_VPOS_TOP:
- dg->y=pg->y;
- break;
- case DOCK_VPOS_MIDDLE:
- dg->y=pg->y+(pg->h-dg->h)/2;
- break;
- case DOCK_VPOS_BOTTOM:
- dg->y=pg->y+(pg->h-dg->h);
- break;
- }
-}
-
-
static void dock_set_minmax(WDock *dock, int grow, const WRectangle *g)
{
dock->min_w=g->w;
dock_geom.w=tile_size.w;
dock_geom.h=tile_size.h;
}
+
+ border_dock_geom.x=REGION_GEOM(dock).x;
+ border_dock_geom.y=REGION_GEOM(dock).y;
border_dock_geom.w=dock_bdw.left+dock_geom.w+dock_bdw.right;
border_dock_geom.h=dock_bdw.top+dock_geom.h+dock_bdw.bottom;
- calc_dock_pos(&border_dock_geom, &parent_geom, pos);
-
/* Fit dock to new geom if required */
if(!(flags®ION_RQGEOM_TRYONLY)){
WRQGeomParams rq=RQGEOMPARAMS_INIT;
{
WRectangle geom=REGION_GEOM(dock);
geom.x=geom.y=0;
- grbrush_draw_border(dock->brush, &geom, "dock");
+ grbrush_draw_border(dock->brush, &geom);
}
break;
case DOCK_OUTLINE_STYLE_EACH:
WDockApp *dockapp;
for(dockapp=dock->dockapps; dockapp!=NULL;
dockapp=dockapp->next){
- grbrush_draw_border(dock->brush, &dockapp->tile_geom,
- "dock");
+ grbrush_draw_border(dock->brush, &dockapp->tile_geom);
}
}
break;
else
*mpos=p;
}
+
+
+static void mplexszplcy(int pos, WSizePolicy *szplcy)
+{
+ int hp=pos&DOCK_HPOS_MASK, vp=pos&DOCK_VPOS_MASK;
+ WSizePolicy p;
+
+ p=(vp!=DOCK_VPOS_MIDDLE
+ ? (vp==DOCK_VPOS_TOP
+ ? (hp!=DOCK_HPOS_CENTER
+ ? (hp==DOCK_HPOS_RIGHT
+ ? SIZEPOLICY_GRAVITY_NORTHEAST
+ : SIZEPOLICY_GRAVITY_NORTHWEST)
+ : SIZEPOLICY_GRAVITY_NORTH)
+ : (hp!=DOCK_HPOS_CENTER
+ ? (hp==DOCK_HPOS_RIGHT
+ ? SIZEPOLICY_GRAVITY_SOUTHEAST
+ : SIZEPOLICY_GRAVITY_SOUTHWEST)
+ : SIZEPOLICY_GRAVITY_SOUTH))
+ : (hp!=DOCK_HPOS_CENTER
+ ? (hp==DOCK_HPOS_RIGHT
+ ? SIZEPOLICY_GRAVITY_EAST
+ : SIZEPOLICY_GRAVITY_WEST)
+ : SIZEPOLICY_GRAVITY_CENTER));
+
+ *szplcy=p;
+}
static void dock_do_set(WDock *dock, ExtlTab conftab, bool resize)
dock_managed_rqgeom_(dock, NULL, 0, NULL, NULL, TRUE);
}
mplex_set_stdisp(par, (WRegion*)dock, &din);
+ }else if((WRegion*)par==REGION_MANAGER(dock)){
+ WSizePolicy szplcy;
+ mplexszplcy(dock->pos, &szplcy);
+ mplex_set_szplcy(par, (WRegion*)dock, szplcy);
}
}
region_add_bindmap((WRegion*)dock, dock_bindmap);
- ((WRegion*)dock)->flags|=REGION_SKIP_FOCUS;
-
window_select_input(&(dock->win), IONCORE_EVENTMASK_CWINMGR);
dock_brush_get(dock);
}
-bool dock_may_destroy(WDock *dock)
-{
- if(dock->dockapps!=NULL){
- warn_obj(modname, "Dock \"%s\" is still managing other objects "
- " -- refusing to close.", region_name((WRegion*)dock));
- return FALSE;
- }
-
- return TRUE;
-}
-
-
EXTL_EXPORT
WDock *mod_dock_create(ExtlTab tab)
{
WDock *dock=NULL;
WRegion *stdisp=NULL;
WMPlexSTDispInfo din;
+ WFitParams fp;
if(extl_table_gets_s(tab, "mode", &mode)){
if(strcmp(mode, "floating")==0){
}
/* Create the dock */
-
- if(floating){
- WMPlexAttachParams par;
-
- par.flags=(MPLEX_ATTACH_UNNUMBERED
- |MPLEX_ATTACH_SIZEPOLICY
- |MPLEX_ATTACH_GEOM);
-
- par.szplcy=SIZEPOLICY_FREE;
- par.geom.x=0;
- par.geom.y=0;
- par.geom.w=1;
- par.geom.h=1;
-
- if(extl_table_is_bool_set(tab, "floating_hidden"))
- par.flags|=MPLEX_ATTACH_HIDDEN;
-
- dock=(WDock*)mplex_do_attach_new((WMPlex*)screen, &par,
- (WRegionCreateFn*)create_dock,
- NULL);
- }else{
- WFitParams fp;
-
- fp.mode=REGION_FIT_BOUNDS|REGION_FIT_WHATEVER;
- fp.g.x=0;
- fp.g.y=0;
- fp.g.w=1;
- fp.g.h=1;
+ fp.mode=REGION_FIT_BOUNDS|REGION_FIT_WHATEVER;
+ fp.g.x=0;
+ fp.g.y=0;
+ fp.g.w=1;
+ fp.g.h=1;
- dock=create_dock((WWindow*)screen, &fp);
- }
+ dock=create_dock((WWindow*)screen, &fp);
if(dock==NULL){
warn("Failed to create dock.");
return NULL;
}
+
/* Get parameters */
dock->save=FALSE;
dock_do_set(dock, tab, FALSE);
+ /* Calculate min/max size */
+ dock_managed_rqgeom_(dock, NULL, 0, NULL, NULL, TRUE);
+
/* Final setup */
if(floating){
- WRQGeomParams rq=RQGEOMPARAMS_INIT;
const WRectangle *pg=®ION_GEOM(screen);
+ WMPlexAttachParams par=MPLEXATTACHPARAMS_INIT;
+ WRegionAttachData data;
- /* Just calculate real min/max size */
- dock_managed_rqgeom_(dock, NULL, 0, NULL, NULL, TRUE);
+ par.flags=(MPLEX_ATTACH_UNNUMBERED
+ |MPLEX_ATTACH_SIZEPOLICY
+ |MPLEX_ATTACH_GEOM
+ |MPLEX_ATTACH_PASSIVE);
- rq.geom.w=minof(dock->min_w, pg->w);
- rq.geom.h=minof(dock->min_h, pg->h);
- calc_dock_pos(&rq.geom, pg, dock->pos);
+ par.geom.w=dock->min_w;
+ par.geom.h=dock->min_h;
+ par.geom.x=0;
+ par.geom.y=0;
- region_rqgeom((WRegion*)dock, &rq, NULL);
+ mplexszplcy(dock->pos, &par.szplcy);
+
+ if(extl_table_is_bool_set(tab, "floating_hidden"))
+ par.flags|=MPLEX_ATTACH_HIDDEN;
- return dock;
+ data.type=REGION_ATTACH_REPARENT;
+ data.u.reg=(WRegion*)dock;
+
+ if(mplex_do_attach((WMPlex*)screen, &par, &data))
+ return dock;
}else{
mplexpos(dock->pos, &din.pos);
din.fullsize=FALSE; /* not supported */
static WPHolder *dock_prepare_manage(WDock *dock, const WClientWin *cwin,
const WManageParams *param UNUSED,
- int redir)
+ int priority)
{
- if(redir==MANAGE_REDIR_STRICT_YES)
+ if(!MANAGE_PRIORITY_OK(priority, MANAGE_PRIORITY_LOW))
return NULL;
return (WPHolder*)create_basicpholder((WRegion*)dock,
}
return region_manage_clientwin((WRegion*)dock, cwin, param,
- MANAGE_REDIR_PREFER_NO);
+ MANAGE_PRIORITY_NONE);
}
{region_size_hints, dock_size_hints},
{(DynFun*)region_fitrep, (DynFun*)dock_fitrep},
{(DynFun*)region_orientation, (DynFun*)dock_orientation},
- {(DynFun*)region_may_destroy, (DynFun*)dock_may_destroy},
{(DynFun*)region_handle_drop, (DynFun*)dock_handle_drop},
{(DynFun*)region_managed_get_pholder,