Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
ExtlTab region_rqgeom_extl(WRegion *reg, ExtlTab g)
{
    WRQGeomParams rq=RQGEOMPARAMS_INIT;
    WRectangle res;

    rqgeomparams_from_table(&rq, &REGION_GEOM(reg), g);

    region_rqgeom(reg, &rq, &res);

    return extl_table_from_rectangle(&res);
}
Exemplo n.º 3
0
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);
}
Exemplo n.º 4
0
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);
}
Exemplo n.º 5
0
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);
}
Exemplo n.º 6
0
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, &REGION_GEOM(p))!=RECTANGLE_SAME)
        region_rqgeom((WRegion*)p, &rq, NULL);
}
Exemplo n.º 7
0
Arquivo: dock.c Projeto: dkogan/notion
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&REGION_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&REGION_RQGEOM_TRYONLY);
        if(dockapp->reg==reg){
            thisdockapp=dockapp;
            if(flags&REGION_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&REGION_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, &REGION_GEOM(dock), NULL, NULL);

        if(thisdockapp!=NULL && geomret!=NULL)
            *geomret=thisdockapp->geom;
    }else{
        if(thisdockapp!=NULL && geomret!=NULL){
            dock_arrange_dockapps(dock, &REGION_GEOM(dock),
                                  thisdockapp, &thisdockapp_copy);
            *geomret=thisdockapp_copy.geom;
        }
    }
}