bool moveresmode_do_end(WMoveresMode *mode, bool apply) { WRegion *reg=mode->reg; assert(reg!=NULL); assert(tmpmode==mode); tmpmode=NULL; if(XOR_RESIZE){ moveres_draw_rubberband(mode); if(apply){ WRQGeomParams rq=RQGEOMPARAMS_INIT; rq.geom=mode->geom; rq.flags=mode->rqflags&~REGION_RQGEOM_TRYONLY; region_rqgeom(reg, &rq, &mode->geom); } XUngrabServer(ioncore_g.dpy); } if(apply) set_saved(mode, reg); if(mode->infowin!=NULL){ mainloop_defer_destroy((Obj*)mode->infowin); mode->infowin=NULL; } destroy_obj((Obj*)mode); return TRUE; }
ExtlTab region_rqgeom_extl(WRegion *reg, ExtlTab g) { WRQGeomParams rq=RQGEOMPARAMS_INIT; WRectangle res; rqgeomparams_from_table(&rq, ®ION_GEOM(reg), g); region_rqgeom(reg, &rq, &res); return extl_table_from_rectangle(&res); }
static void moveresmode_do_newgeom(WMoveresMode *mode, WRQGeomParams *rq) { if(XOR_RESIZE) moveres_draw_rubberband(mode); if(mode->reg!=NULL){ rq->flags|=mode->rqflags; region_rqgeom(mode->reg, rq, &mode->geom); } moveres_draw_infowin(mode); if(XOR_RESIZE) moveres_draw_rubberband(mode); }
static bool rqw(WFrame *frame, int x, int w) { WRQGeomParams rq=RQGEOMPARAMS_INIT; WRectangle rgeom; int dummy_h; rq.flags=REGION_RQGEOM_HORIZ_ONLY; rq.geom.x=x; rq.geom.w=w; rq.geom.y=REGION_GEOM(frame).y; rq.geom.h=REGION_GEOM(frame).h; dummy_h=rq.geom.h; region_size_hints_correct((WRegion*)frame, &(rq.geom.w), &dummy_h, TRUE); region_rqgeom((WRegion*)frame, &rq, &rgeom); return (abs(rgeom.x-REGION_GEOM(frame).x)>1 || abs(rgeom.w-REGION_GEOM(frame).w)>1); }
static bool rqh(WFrame *frame, int y, int h) { WRQGeomParams rq=RQGEOMPARAMS_INIT; WRectangle rgeom; int dummy_w; rq.flags=REGION_RQGEOM_VERT_ONLY; rq.geom.x=REGION_GEOM(frame).x; rq.geom.w=REGION_GEOM(frame).w; rq.geom.y=y; rq.geom.h=h; dummy_w=rq.geom.w; region_size_hints_correct((WRegion*)frame, &dummy_w, &(rq.geom.h), TRUE); region_rqgeom((WRegion*)frame, &rq, &rgeom); return (abs(rgeom.y-REGION_GEOM(frame).y)>1 || abs(rgeom.h-REGION_GEOM(frame).h)>1); }
static void infowin_resize(WInfoWin *p) { WRQGeomParams rq=RQGEOMPARAMS_INIT; const char *str=INFOWIN_BUFFER(p); GrBorderWidths bdw; GrFontExtents fnte; rq.flags=REGION_RQGEOM_WEAK_X|REGION_RQGEOM_WEAK_Y; rq.geom.x=REGION_GEOM(p).x; rq.geom.y=REGION_GEOM(p).y; grbrush_get_border_widths(p->brush, &bdw); grbrush_get_font_extents(p->brush, &fnte); rq.geom.w=bdw.left+bdw.right; rq.geom.w+=grbrush_get_text_width(p->brush, str, strlen(str)); rq.geom.h=fnte.max_height+bdw.top+bdw.bottom; if(rectangle_compare(&rq.geom, ®ION_GEOM(p))!=RECTANGLE_SAME) region_rqgeom((WRegion*)p, &rq, NULL); }
static void dock_managed_rqgeom_(WDock *dock, WRegion *reg, int flags, const WRectangle *geom, WRectangle *geomret, bool just_update_minmax) { WDockApp *dockapp=NULL, *thisdockapp=NULL, thisdockapp_copy; WRectangle dock_geom, border_dock_geom; GrBorderWidths dock_bdw, dockapp_bdw; int n_dockapps=0, max_w=1, max_h=1, total_w=0, total_h=0; int pos, grow; WRectangle tile_size; /* dock_resize calls with NULL parameters. */ assert(reg!=NULL || (geomret==NULL && !(flags®ION_RQGEOM_TRYONLY))); dock_get_pos_grow(dock, &pos, &grow); dock_get_tile_size(dock, &tile_size); /* 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; } } /* Calculate widths and heights */ for(dockapp=dock->dockapps; dockapp!=NULL; dockapp=dockapp->next){ WDockApp *da=dockapp; bool update=!(flags®ION_RQGEOM_TRYONLY); if(dockapp->reg==reg){ thisdockapp=dockapp; if(flags®ION_RQGEOM_TRYONLY){ thisdockapp_copy=*dockapp; thisdockapp_copy.geom=*geom; da=&thisdockapp_copy; update=TRUE; } da->geom=*geom; } if(update){ /* Calculcate preferred size */ dockapp_calc_preferred_size(dock, grow, &tile_size, da); /* Determine whether dockapp should be placed on a tile */ da->tile=da->geom.w<=tile_size.w && da->geom.h<=tile_size.h; /* Calculate width and height */ if(da->tile){ da->tile_geom.w=tile_size.w; da->tile_geom.h=tile_size.h; }else{ da->tile_geom.w=da->geom.w; da->tile_geom.h=da->geom.h; } /* Calculate border width and height */ da->border_geom.w=dockapp_bdw.left+da->tile_geom.w+dockapp_bdw.right; da->border_geom.h=dockapp_bdw.top+da->tile_geom.h+dockapp_bdw.right; } /* Calculate maximum and accumulated widths and heights */ if(da->border_geom.w>max_w) max_w=da->border_geom.w; total_w+=da->border_geom.w+(n_dockapps ? dockapp_bdw.spacing : 0); if(da->border_geom.h>max_h) max_h=da->border_geom.h; total_h+=da->border_geom.h+(n_dockapps ? dockapp_bdw.spacing : 0); /* Count dockapps */ ++n_dockapps; } if(thisdockapp==NULL && reg!=NULL){ warn("Requesting dockapp not found."); if(geomret) *geomret=REGION_GEOM(reg); return; } /* Calculate width and height of dock */ if(n_dockapps){ switch(grow){ case DOCK_GROW_LEFT: case DOCK_GROW_RIGHT: dock_geom.w=total_w; dock_geom.h=max_h; break; case DOCK_GROW_UP: case DOCK_GROW_DOWN: default: dock_geom.w=max_w; dock_geom.h=total_h; break; } }else{ 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; /* Fit dock to new geom if required */ if(!(flags®ION_RQGEOM_TRYONLY)){ WRQGeomParams rq=RQGEOMPARAMS_INIT; dock_set_minmax(dock, grow, &border_dock_geom); if(just_update_minmax) return; rq.flags=REGION_RQGEOM_WEAK_X|REGION_RQGEOM_WEAK_Y; rq.geom=border_dock_geom; dock->arrange_called=FALSE; region_rqgeom((WRegion*)dock, &rq, NULL); if(!dock->arrange_called) dock_arrange_dockapps(dock, ®ION_GEOM(dock), NULL, NULL); if(thisdockapp!=NULL && geomret!=NULL) *geomret=thisdockapp->geom; }else{ if(thisdockapp!=NULL && geomret!=NULL){ dock_arrange_dockapps(dock, ®ION_GEOM(dock), thisdockapp, &thisdockapp_copy); *geomret=thisdockapp_copy.geom; } } }