diff options
Diffstat (limited to 'decorate-render.c')
-rw-r--r-- | decorate-render.c | 75 |
1 files changed, 63 insertions, 12 deletions
diff --git a/decorate-render.c b/decorate-render.c index 6012ca3..a04a3fc 100644 --- a/decorate-render.c +++ b/decorate-render.c @@ -45,13 +45,19 @@ enum style_id { }; #define TITLE_FONT_SIZE 12 -#define MENU_FONT_SIZE 10 +#define MENU_FONT_SIZE 14 #define STRING2(x) #x #define STRING(x) STRING2(x) #define TITLE_FONT_SIZE_STRING STRING( TITLE_FONT_SIZE ) #define MENU_FONT_SIZE_STRING STRING( MENU_FONT_SIZE ) +#define MENU_X_PAD 4 +#define MENU_Y_PAD 2 + +#define FEEDBACK_WIDTH 96 /* width of size feedback window */ +#define FEEDBACK_HEIGHT 24 /* height of size feedback window */ + static const FcChar8 *const style_names[ NUM_STYLES ] = { /* FIXME make this configurable */ (FcChar8 *) "sans:pixelsize=" TITLE_FONT_SIZE_STRING ":bold", @@ -83,7 +89,11 @@ static const uint16_t decoration_cols[ NUM_COLS ][ 3 ] = { { 0xFFFF, 0xFFFF, 0xFFFF }, /* COL_TITLE_ACTIVE */ { 0x3333, 0x3333, 0x3333 }, /* COL_TITLE_INACTIVE */ { 0xFFFF, 0xFFFF, 0xFFFF }, /* COL_FEEDBACK_BACK */ - { 0x0000, 0x0000, 0x0000 } /* COL_FEEDBACK_FORE */ + { 0x0000, 0x0000, 0x0000 }, /* COL_FEEDBACK_FORE */ + { 0x2222, 0x3333, 0xEEEE }, /* COL_MENU_ACTIVE_BACK */ + { 0xFFFF, 0xFFFF, 0xFFFF }, /* COL_MENU_ACTIVE_FORE */ + { 0xCCCC, 0xCCCC, 0xCCCC }, /* COL_MENU_INACTIVE_BACK */ + { 0x0000, 0x0000, 0x0000 } /* COL_MENU_INACTIVE_FORE */ }; #define METRIC_CACHE_SIZE_BITS 14 @@ -559,6 +569,21 @@ static xcb_void_cookie_t render_text( xcb_drawable_t drawable, int screen, return xcb_render_free_picture( c, dest ); } +static int text_width( enum style_id style, const char *text ) { + + const char *p; + int width; + + for( width = 0, p = text; *p; p++ ) { + int dx, dy; + + query_metrics( style, *p, &dx, &dy ); + width += dx; + } + + return width; +} + extern void render_update_window( struct gwm_window *window ) { if( !window->cleared ) @@ -573,23 +598,49 @@ extern void render_update_window( struct gwm_window *window ) { button_size( window->u.frame.button, TRUE ) + 4, TITLE_FONT_SIZE, name ? name : "(Untitled)", STYLE_TITLE, &window->update ); + } else if( window->type == WINDOW_MENUITEM ) { + struct gwm_window *menu = window->u.menuitem.menu; + + render_text( window->w, window->screen, + menu->u.menu.active_item >= 0 && + menu->u.menu.items[ menu->u.menu.active_item ] == window ? + COL_MENU_ACTIVE_FORE : COL_MENU_INACTIVE_FORE, + MENU_X_PAD, MENU_FONT_SIZE, + window->u.menuitem.label, STYLE_MENU, &window->update ); } else if( window->type == WINDOW_FEEDBACK ) { - char *p, text[ 32 ]; - int width; + char text[ 32 ]; sprintf( text, "%dx%d", window->u.feedback.fb_width, window->u.feedback.fb_height ); - for( width = 0, p = text; *p; p++ ) { - int dx, dy; + render_text( window->w, window->screen, COL_FEEDBACK_FORE, + ( FEEDBACK_WIDTH - text_width( STYLE_TITLE, text ) ) >> 1, + 16, text, STYLE_TITLE, &window->update ); + } +} - query_metrics( STYLE_TITLE, *p, &dx, &dy ); - width += dx; - } +extern void render_window_size( struct gwm_window *window, int *width, + int *height ) { - render_text( window->w, window->screen, COL_FEEDBACK_FORE, - ( FEEDBACK_WIDTH - width ) >> 1, 16, text, - STYLE_TITLE, &window->update ); + switch( window->type ) { + case WINDOW_MENUITEM: + if( window->u.menuitem.label ) { + *width = text_width( STYLE_MENU, window->u.menuitem.label ) + + ( MENU_X_PAD << 1 ); + *height = MENU_FONT_SIZE + ( MENU_Y_PAD << 1 ); + } else { + *width = MENU_X_PAD << 1; + *height = MENU_Y_PAD << 1; + } + return; + + case WINDOW_FEEDBACK: + *width = FEEDBACK_WIDTH; + *height = FEEDBACK_HEIGHT; + return; + + default: + assert( FALSE ); } } |