X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=mod_dock%2Fdock.c;h=6da1a6f85ed1f4468ef6a8031a3f84408683c085;hb=b355f9832d094cdb9e700e01cbc063e3fdb4f58b;hp=c67ce6d45c83ba16f13f2b9ec5c8d585ec83bbea;hpb=471a5e5f9928e2d324b2e10422a420f458bd63ff;p=ion3.git diff --git a/mod_dock/dock.c b/mod_dock/dock.c index c67ce6d..6da1a6f 100644 --- a/mod_dock/dock.c +++ b/mod_dock/dock.c @@ -611,34 +611,6 @@ static void dock_arrange_dockapps(WDock *dock, const WRectangle *bd_dockg, } -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; @@ -799,11 +771,12 @@ static void dock_managed_rqgeom_(WDock *dock, WRegion *reg, int flags, 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; @@ -991,6 +964,33 @@ static void mplexpos(int pos, int *mpos) 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) @@ -1036,6 +1036,10 @@ 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); } } @@ -1124,8 +1128,6 @@ static bool dock_init(WDock *dock, WWindow *parent, const WFitParams *fp) 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); @@ -1155,18 +1157,6 @@ static void dock_deinit(WDock *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) { @@ -1177,6 +1167,7 @@ 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){ @@ -1214,62 +1205,53 @@ WDock *mod_dock_create(ExtlTab tab) } /* 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 */ @@ -1449,9 +1431,9 @@ static WPHolder *dock_managed_get_pholder(WDock *dock, WRegion *mgd) 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, @@ -1595,7 +1577,7 @@ static bool clientwin_do_manage_hook(WClientWin *cwin, const WManageParams *para } return region_manage_clientwin((WRegion*)dock, cwin, param, - MANAGE_REDIR_PREFER_NO); + MANAGE_PRIORITY_NONE); } @@ -1683,7 +1665,6 @@ static DynFunTab dock_dynfuntab[]={ {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,