summaryrefslogtreecommitdiff
path: root/decorate-render.c
diff options
context:
space:
mode:
Diffstat (limited to 'decorate-render.c')
-rw-r--r--decorate-render.c75
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 );
}
}