Exemple #1
0
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;
}
Exemple #2
0
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;
        }
Exemple #3
0
/* 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;
    }
}
Exemple #4
0
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;
}
Exemple #5
0
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;
    }
}
Exemple #6
0
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));
    }
}
Exemple #7
0
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);
    }
}
Exemple #8
0
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);
    }
}
Exemple #9
0
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;
}
Exemple #10
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);
}
Exemple #11
0
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;
}
Exemple #12
0
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;
        }
    }
}
Exemple #13
0
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);
    }
}
Exemple #14
0
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);
        }
    }
}