static void calc_entry_dimens(WMenu *menu) { int i, n=extl_table_get_n(menu->tab); GrFontExtents fnte; GrBorderWidths bdw; int maxw=0; char *str; #if 0 if(extl_table_gets_s(menu->tab, title, &str)){ maxw=grbrush_get_text_width(title_brush, str, strlen(str)); free(str); } #endif for(i=1; i<=n; i++){ if(extl_table_getis(menu->tab, i, "name", 's', &str)){ int w=grbrush_get_text_width(menu->entry_brush, str, strlen(str)); if(w>maxw) maxw=w; free(str); } } grbrush_get_border_widths(menu->entry_brush, &bdw); grbrush_get_font_extents(menu->entry_brush, &fnte); menu->max_entry_w=maxw+bdw.left+bdw.right; menu->entry_h=fnte.max_height+bdw.top+bdw.bottom; menu->entry_spacing=bdw.spacing; }
static void frame_shaped_recalc_bar_size(WFrame *frame, bool complete) { int bar_w=0, textw=0, tmaxw=frame->tab_min_w, tmp=0; WLListIterTmp itmp; WRegion *sub; const char *p; GrBorderWidths bdw; char *title; uint bdtotal; int i, m; if(frame->bar_brush==NULL) return; m=FRAME_MCOUNT(frame); if(m>0){ grbrush_get_border_widths(frame->bar_brush, &bdw); bdtotal=((m-1)*(bdw.tb_ileft+bdw.tb_iright+bdw.spacing) +bdw.right+bdw.left); FRAME_MX_FOR_ALL(sub, frame, itmp){ p=region_displayname(sub); if(p==NULL) continue; textw=grbrush_get_text_width(frame->bar_brush, p, strlen(p)); if(textw>tmaxw) tmaxw=textw; }
/* Return offset from bottom-left corner of containing mplex or top-right * corner of parent menu for the respective corner of menu. */ static void get_placement_offs(WMenu *menu, int *xoff, int *yoff) { GrBorderWidths bdw; *xoff=0; *yoff=0; if(menu->brush!=NULL){ grbrush_get_border_widths(menu->brush, &bdw); *xoff+=bdw.right; *yoff+=bdw.top; } if(menu->entry_brush!=NULL){ grbrush_get_border_widths(menu->entry_brush, &bdw); *xoff+=bdw.right; *yoff+=bdw.top; } }
static uint get_spacing(const WFrame *frame) { GrBorderWidths bdw; if(frame->brush==NULL) return 0; grbrush_get_border_widths(frame->brush, &bdw); return bdw.spacing; }
int frame_shaded_height(const WFrame *frame) { if(frame->barmode==FRAME_BAR_NONE){ return 0; }else if(!BAR_INSIDE_BORDER(frame)){ return frame->bar_h; }else { GrBorderWidths bdw; grbrush_get_border_widths(frame->brush, &bdw); return frame->bar_h+bdw.top+bdw.bottom; } }
void frame_border_inner_geom(const WFrame *frame, WRectangle *geom) { GrBorderWidths bdw; frame_border_geom(frame, geom); if(frame->brush!=NULL){ grbrush_get_border_widths(frame->brush, &bdw); geom->x+=bdw.left; geom->y+=bdw.top; geom->w=MAXOF(0, geom->w-(bdw.left+bdw.right)); geom->h=MAXOF(0, geom->h-(bdw.top+bdw.bottom)); } }
static void panehandle_getbrush(WPaneHandle *pwin) { GrBrush *brush=gr_get_brush(pwin->wwin.win, region_rootwin_of((WRegion*)pwin), "pane"); if(brush!=NULL){ if(pwin->brush!=NULL) grbrush_release(pwin->brush); pwin->brush=brush; grbrush_get_border_widths(brush, &(pwin->bdw)); grbrush_enable_transparency(brush, GR_TRANSPARENCY_YES); } }
static void get_inner_geom(WMenu *menu, WRectangle *geom) { GrBorderWidths bdw; get_outer_geom(menu, geom); if(menu->brush!=NULL){ grbrush_get_border_widths(menu->brush, &bdw); geom->x+=bdw.left; geom->y+=bdw.top; geom->w-=bdw.left+bdw.right; geom->h-=bdw.top+bdw.bottom; geom->w=maxof(0, geom->w); geom->h=maxof(0, geom->h); } }
void menu_size_hints(WMenu *menu, WSizeHints *hints_ret) { int n=menu->n_entries; int w=menu->max_entry_w; int h=menu->entry_h*n + menu->entry_spacing*maxof(0, n-1); if(menu->brush!=NULL){ GrBorderWidths bdw; grbrush_get_border_widths(menu->brush, &bdw); w+=bdw.left+bdw.right; h+=bdw.top+bdw.bottom; } hints_ret->min_set=TRUE; hints_ret->min_width=w; hints_ret->min_height=h; }
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 WInfoWin *setup_moveres_display(WWindow *parent, int cx, int cy) { GrBorderWidths bdw; GrFontExtents fnte; WInfoWin *infowin; WFitParams fp; fp.mode=REGION_FIT_EXACT; fp.g.x=0; fp.g.y=0; fp.g.w=1; fp.g.h=1; infowin=create_infowin(parent, &fp, "moveres_display"); if(infowin==NULL) return NULL; grbrush_get_border_widths(INFOWIN_BRUSH(infowin), &bdw); grbrush_get_font_extents(INFOWIN_BRUSH(infowin), &fnte); /* Create move/resize position/size display window */ fp.g.w=3; fp.g.w+=chars_for_num(REGION_GEOM(parent).w); fp.g.w+=chars_for_num(REGION_GEOM(parent).h); fp.g.w*=max_width(INFOWIN_BRUSH(infowin), "0123456789x+"); fp.g.w+=bdw.left+bdw.right; fp.g.h=fnte.max_height+bdw.top+bdw.bottom;; fp.g.x=cx-fp.g.w/2; fp.g.y=cy-fp.g.h/2; region_fitrep((WRegion*)infowin, NULL, &fp); region_map((WRegion*)infowin); return infowin; }
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; } } }
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); } }
static void menu_calc_size(WMenu *menu, bool maxexact, int maxw, int maxh, int *w_ret, int *h_ret) { GrBorderWidths bdw, e_bdw; char *str; int i; int nath, bdh, maxew=menu->max_entry_w; grbrush_get_border_widths(menu->brush, &bdw); grbrush_get_border_widths(menu->entry_brush, &e_bdw); if(maxexact || maxew>maxw-(int)bdw.left-(int)bdw.right){ maxew=maxw-bdw.left-bdw.right; *w_ret=maxw; }else{ *w_ret=maxew+bdw.left+bdw.right; } bdh=bdw.top+bdw.bottom; if(menu->n_entries==0){ *h_ret=(maxexact ? maxh : bdh); menu->first_entry=0; menu->vis_entries=0; }else{ int vis=(maxh-bdh+e_bdw.spacing)/(e_bdw.spacing+menu->entry_h); if(vis>menu->n_entries){ vis=menu->n_entries; menu->first_entry=0; }else if(menu->selected_entry>=0){ if(menu->selected_entry<menu->first_entry) menu->first_entry=menu->selected_entry; else if(menu->selected_entry>=menu->first_entry+vis) menu->first_entry=menu->selected_entry-vis+1; } if(vis<=0) vis=1; menu->vis_entries=vis; if(maxexact) *h_ret=maxh; else *h_ret=vis*menu->entry_h+(vis-1)*e_bdw.spacing+bdh; } /* Calculate new shortened entry names */ maxew-=e_bdw.left+e_bdw.right; for(i=0; i<menu->n_entries; i++){ if(menu->entries[i].title){ free(menu->entries[i].title); menu->entries[i].title=NULL; } if(maxew<=0) continue; if(extl_table_getis(menu->tab, i+1, "name", 's', &str)){ menu->entries[i].title=grbrush_make_label(menu->entry_brush, str, maxew); free(str); } } }