示例#1
0
文件: resize.c 项目: dkogan/notion
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;
    }
}
示例#2
0
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;
        }
    }
示例#3
0
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));
}
示例#4
0
文件: resize.c 项目: dkogan/notion
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;
    }
}
示例#5
0
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;
}
示例#6
0
文件: resize.c 项目: dkogan/notion
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;
}