void region_rqgeom(WRegion *reg, const WRQGeomParams *rq, WRectangle *geomret) { WRegion *mgr=REGION_MANAGER(reg); if(mgr!=NULL){ if(rq->flags®ION_RQGEOM_ABSOLUTE) region_managed_rqgeom_absolute(mgr, reg, rq, geomret); else region_managed_rqgeom(mgr, reg, rq, geomret); }else{ WRectangle tmp; if(rq->flags®ION_RQGEOM_ABSOLUTE) region_absolute_geom_to_parent(reg, &rq->geom, &tmp); else tmp=rq->geom; if(geomret!=NULL) *geomret=tmp; if(!(rq->flags®ION_RQGEOM_TRYONLY)) region_fit(reg, &tmp, REGION_FIT_EXACT); } }
void splitfloat_update_handles(WSplitFloat *split, const WRectangle *tlg_, const WRectangle *brg_) { WRectangle tlg=*tlg_, brg=*brg_; if(split->ssplit.dir==SPLIT_HORIZONTAL){ tlg.w=split->tlpwin->bdw.right; tlg.x=tlg_->x+tlg_->w-tlg.w; brg.w=split->brpwin->bdw.left; }else{ tlg.h=split->tlpwin->bdw.bottom; tlg.y=tlg_->y+tlg_->h-tlg.h; brg.h=split->brpwin->bdw.top; } region_fit((WRegion*)split->tlpwin, &tlg, REGION_FIT_EXACT); region_fit((WRegion*)split->brpwin, &brg, REGION_FIT_EXACT); }
void region_managed_rqgeom_allow(WRegion *UNUSED(mgr), WRegion *reg, const WRQGeomParams *rq, WRectangle *geomret) { if(geomret!=NULL) *geomret=rq->geom; if(!(rq->flags®ION_RQGEOM_TRYONLY)) region_fit(reg, &rq->geom, REGION_FIT_EXACT); }
static void dock_arrange_dockapps(WDock *dock, const WRectangle *bd_dockg, const WDockApp *replace_this, WDockApp *with_this) { GrBorderWidths dock_bdw, dockapp_bdw; WDockApp dummy_copy, *dockapp; int pos, grow, cur_coord=0; WRectangle dock_geom; dock->arrange_called=TRUE; dock_get_pos_grow(dock, &pos, &grow); /* Determine dock and dockapp border widths */ memset(&dock_bdw, 0, sizeof(GrBorderWidths)); memset(&dockapp_bdw, 0, sizeof(GrBorderWidths)); if(dock->brush){ int outline_style; dock_get_outline_style(dock, &outline_style); switch(outline_style){ case DOCK_OUTLINE_STYLE_NONE: break; case DOCK_OUTLINE_STYLE_ALL: grbrush_get_border_widths(dock->brush, &dock_bdw); dockapp_bdw.spacing=dock_bdw.spacing; break; case DOCK_OUTLINE_STYLE_EACH: grbrush_get_border_widths(dock->brush, &dockapp_bdw); break; } } dock_geom.w=bd_dockg->w-dock_bdw.left-dock_bdw.right; dock_geom.h=bd_dockg->h-dock_bdw.top-dock_bdw.bottom; /* Calculate initial co-ordinate for layout algorithm */ switch(grow){ case DOCK_GROW_UP: cur_coord=dock_bdw.top+dock_geom.h; break; case DOCK_GROW_DOWN: cur_coord=dock_bdw.top; break; case DOCK_GROW_LEFT: cur_coord=dock_bdw.left+dock_geom.w; break; case DOCK_GROW_RIGHT: cur_coord=dock_bdw.left; break; } /* Arrange dockapps */ for(dockapp=dock->dockapps; dockapp!=NULL; dockapp=dockapp->next){ WDockApp *da=dockapp; if(replace_this!=NULL){ if(replace_this==dockapp){ da=with_this; }else{ dummy_copy=*dockapp; da=&dummy_copy; } } /* Calculate first co-ordinate */ switch(grow){ case DOCK_GROW_UP: case DOCK_GROW_DOWN: switch(pos&DOCK_HPOS_MASK){ case DOCK_HPOS_LEFT: da->border_geom.x=0; break; case DOCK_HPOS_CENTER: da->border_geom.x=(dock_geom.w-da->border_geom.w)/2; break; case DOCK_HPOS_RIGHT: da->border_geom.x=dock_geom.w-da->border_geom.w; break; } da->border_geom.x+=dock_bdw.left; break; case DOCK_GROW_LEFT: case DOCK_GROW_RIGHT: switch(pos&DOCK_VPOS_MASK){ case DOCK_VPOS_TOP: da->border_geom.y=0; break; case DOCK_VPOS_MIDDLE: da->border_geom.y=(dock_geom.h-da->border_geom.h)/2; break; case DOCK_VPOS_BOTTOM: da->border_geom.y=dock_geom.h-da->border_geom.h; break; } da->border_geom.y+=dock_bdw.top; break; } /* Calculate second co-ordinate */ switch(grow){ case DOCK_GROW_UP: cur_coord-=da->border_geom.h; da->border_geom.y=cur_coord; cur_coord-=dockapp_bdw.spacing; break; case DOCK_GROW_DOWN: da->border_geom.y=cur_coord; cur_coord+=da->border_geom.h+dockapp_bdw.spacing; break; case DOCK_GROW_LEFT: cur_coord-=da->border_geom.w; da->border_geom.x=cur_coord; cur_coord-=dockapp_bdw.spacing; break; case DOCK_GROW_RIGHT: da->border_geom.x=cur_coord; cur_coord+=da->border_geom.w+dockapp_bdw.spacing; break; } /* Calculate tile geom */ da->tile_geom.x=da->border_geom.x+dockapp_bdw.left; da->tile_geom.y=da->border_geom.y+dockapp_bdw.top; /* Calculate dockapp geom */ if(da->tile){ da->geom.x=da->tile_geom.x+(da->tile_geom.w-da->geom.w)/2; da->geom.y=da->tile_geom.y+(da->tile_geom.h-da->geom.h)/2; }else{ da->geom.x=da->tile_geom.x; da->geom.y=da->tile_geom.y; } if(replace_this==NULL) region_fit(da->reg, &(da->geom), REGION_FIT_BOUNDS); } }
void tiling_manage_stdisp(WTiling *ws, WRegion *stdisp, const WMPlexSTDispInfo *di) { bool mcf=region_may_control_focus((WRegion*)ws); int flags=REGION_RQGEOM_WEAK_X|REGION_RQGEOM_WEAK_Y; int orientation=region_orientation(stdisp); bool act=FALSE; WRectangle dg, *stdg; if(orientation!=REGION_ORIENTATION_VERTICAL /*&& orientation!=REGION_ORIENTATION_HORIZONTAL*/){ orientation=REGION_ORIENTATION_HORIZONTAL; } if(ws->stdispnode==NULL || ws->stdispnode->regnode.reg!=stdisp) region_detach_manager(stdisp); /* Remove old stdisp if corner and orientation don't match. */ if(ws->stdispnode!=NULL && (di->pos!=ws->stdispnode->corner || orientation!=ws->stdispnode->orientation)){ tiling_unmanage_stdisp(ws, TRUE, TRUE); } if(ws->stdispnode==NULL){ tiling_create_stdispnode(ws, stdisp, di->pos, orientation, di->fullsize); if(ws->stdispnode==NULL) return; }else{ WRegion *od=ws->stdispnode->regnode.reg; if(od!=NULL){ act=REGION_IS_ACTIVE(od); splittree_set_node_of(od, NULL); tiling_managed_remove(ws, od); assert(ws->stdispnode->regnode.reg==NULL); } ws->stdispnode->fullsize=di->fullsize; ws->stdispnode->regnode.reg=stdisp; splittree_set_node_of(stdisp, &(ws->stdispnode->regnode)); } if(!tiling_managed_add(ws, stdisp)){ tiling_unmanage_stdisp(ws, TRUE, TRUE); return; } stdisp->flags|=REGION_SKIP_FOCUS; dg=((WSplit*)(ws->stdispnode))->geom; dg.h=stdisp_recommended_h(ws->stdispnode); dg.w=stdisp_recommended_w(ws->stdispnode); splittree_rqgeom((WSplit*)(ws->stdispnode), flags, &dg, FALSE); stdg=&(((WSplit*)ws->stdispnode)->geom); if(stdisp->geom.x!=stdg->x || stdisp->geom.y!=stdg->y || stdisp->geom.w!=stdg->w || stdisp->geom.h!=stdg->h){ region_fit(stdisp, stdg, REGION_FIT_EXACT); } /* Restack to ensure the split tree is stacked in the expected order. */ if(ws->split_tree!=NULL) split_restack(ws->split_tree, ws->dummywin, Above); if(mcf && act) region_set_focus(stdisp); }