void region_convert_root_geom(WRegion *reg, WRectangle *geom) { int rx, ry; if(reg!=NULL){ region_rootpos(reg, &rx, &ry); geom->x-=rx; geom->y-=ry; } }
int frame_press(WFrame *frame, XButtonEvent *ev, WRegion **reg_ret) { WRegion *sub=NULL; WRectangle g; p_tabnum=-1; window_p_resize_prepare((WWindow*)frame, ev); /* Check tab */ frame_bar_geom(frame, &g); /* Borders act like tabs at top of the parent region */ if(REGION_GEOM(frame).y==0){ g.h+=g.y; g.y=0; } if(frame->barmode!=FRAME_BAR_NONE && rectangle_contains(&g, ev->x, ev->y)){ p_tabnum=frame_tab_at_x(frame, ev->x); region_rootpos((WRegion*)frame, &p_tab_x, &p_tab_y); p_tab_x+=frame_nth_tab_x(frame, p_tabnum); p_tab_y+=g.y; sub=mplex_mx_nth(&(frame->mplex), p_tabnum); if(reg_ret!=NULL) *reg_ret=sub; return FRAME_AREA_TAB; }else{ WLListIterTmp tmp; FRAME_MX_FOR_ALL(sub, frame, tmp){ p_tabnum++; if(sub==FRAME_CURRENT(frame)) break; } if(sub!=NULL){ p_tab_x=ev->x_root-frame_nth_tab_w(frame, p_tabnum)/2; p_tab_y=ev->y_root-frame->bar_h/2; }else{ p_tabnum=-1; } }
static void check_scroll(WMenu *menu, int x, int y) { WRegion *parent=REGION_PARENT_REG(menu); int rx, ry; WTimerHandler *fn=NULL; if(!menu->pmenu_mode) return; if(parent==NULL){ end_scroll(menu); return; } region_rootpos(parent, &rx, &ry); x-=rx; y-=ry; if(x<=SCROLL_OFFSET){ fn=(WTimerHandler*)scroll_right; }else if(y<=SCROLL_OFFSET){ fn=(WTimerHandler*)scroll_down; }else if(x>=REGION_GEOM(parent).w-SCROLL_OFFSET){ fn=(WTimerHandler*)scroll_left; }else if(y>=REGION_GEOM(parent).h-SCROLL_OFFSET){ fn=(WTimerHandler*)scroll_up; }else{ end_scroll(menu); return; } assert(fn!=NULL); if(scroll_timer!=NULL){ if(scroll_timer->handler==(WTimerHandler*)fn && timer_is_set(scroll_timer)){ return; } }else{ scroll_timer=create_timer(); if(scroll_timer==NULL) return; } fn(scroll_timer, (Obj*)menu_head(menu)); }
void region_absolute_geom_to_parent(WRegion *reg, const WRectangle *rgeom, WRectangle *pgeom) { WRegion *parent=REGION_PARENT_REG(reg); pgeom->w=rgeom->w; pgeom->h=rgeom->h; if(parent==NULL){ pgeom->x=rgeom->x; pgeom->y=rgeom->y; }else{ region_rootpos(reg, &pgeom->x, &pgeom->y); pgeom->x=rgeom->x-pgeom->x; pgeom->y=rgeom->y-pgeom->y; } }
int menu_entry_at_root(WMenu *menu, int root_x, int root_y) { int rx, ry, x, y, entry; WRectangle ig; region_rootpos((WRegion*)menu, &rx, &ry); get_inner_geom(menu, &ig); x=root_x-rx-ig.x; y=root_y-ry-ig.y; if(x<0 || x>=ig.w || y<0 || y>=ig.h) return -1; entry=y/(menu->entry_h+menu->entry_spacing); if(entry<0 || entry>=menu->vis_entries) return -1; return entry+menu->first_entry; }
static bool moveresmode_init(WMoveresMode *mode, WRegion *reg, WDrawRubberbandFn *rubfn, bool cumulative) { WWindow *parent; WRegion *mgr; if(tmpmode!=NULL) return FALSE; parent=REGION_PARENT(reg); if(parent==NULL) return FALSE; tmpmode=mode; mode->snap_enabled=FALSE; region_size_hints(reg, &mode->hints); region_rootpos((WRegion*)parent, &mode->parent_rx, &mode->parent_ry); mode->geom=REGION_GEOM(reg); mode->origgeom=REGION_GEOM(reg); mode->dx1=0; mode->dx2=0; mode->dy1=0; mode->dy2=0; mode->rubfn=rubfn; mode->resize_cumulative=cumulative; mode->rqflags=(XOR_RESIZE ? REGION_RQGEOM_TRYONLY : 0); mode->reg=reg; mode->mode=MOVERES_SIZE; /* Get snapping geometry */ mgr=REGION_MANAGER(reg); if(mgr!=NULL){ mode->snapgeom=REGION_GEOM(mgr); if(mgr==(WRegion*)parent){ mode->snapgeom.x=0; mode->snapgeom.y=0; /*mode->snap_enabled=FALSE;*/ } mode->snap_enabled=TRUE; } if(!mode->hints.min_set || mode->hints.min_width<1) mode->hints.min_width=1; if(!mode->hints.min_set || mode->hints.min_height<1) mode->hints.min_height=1; /* Set up info window */ { int x=mode->geom.x+mode->geom.w/2; int y=mode->geom.y+mode->geom.h/2; mode->infowin=setup_moveres_display(parent, x, y); } moveres_draw_infowin(mode); if(XOR_RESIZE){ XGrabServer(ioncore_g.dpy); moveres_draw_rubberband(mode); } return TRUE; }