refactor calculation of dimentions

This commit is contained in:
Sascha Kruse 2013-03-08 02:47:03 +01:00
parent 5099b57ee5
commit 411434a18f

75
x.c
View File

@ -173,24 +173,55 @@ static void free_colored_layout(void *data)
g_free(cl->text); g_free(cl->text);
} }
static int calculate_width(void) static bool have_dynamic_width(void)
{ {
return (xctx.geometry.mask & WidthValue && xctx.geometry.w == 0);
}
static dimension_t calculate_dimensions(GSList *layouts)
{
dimension_t dim;
dim.w = 0;
dim.h = 0;
dim.x = 0;
dim.y = 0;
dim.mask = xctx.geometry.mask;
screen_info scr; screen_info scr;
x_screen_info(&scr); x_screen_info(&scr);
if (xctx.geometry.mask & WidthValue && xctx.geometry.w == 0) { if (have_dynamic_width()) {
/* dynamic width */ /* dynamic width */
return 0; dim.w = 0;
} else if (xctx.geometry.mask & WidthValue) { } else if (xctx.geometry.mask & WidthValue) {
/* fixed width */ /* fixed width */
if (xctx.geometry.negative_width) { if (xctx.geometry.negative_width) {
return scr.dim.w - xctx.geometry.w; dim.w = scr.dim.w - xctx.geometry.w;
} else { } else {
return xctx.geometry.w; dim.w = xctx.geometry.w;
} }
} else { } else {
/* across the screen */ /* across the screen */
return scr.dim.w; dim.w = scr.dim.w;
} }
dim.h += (g_slist_length(layouts) - 1) * settings.separator_height;
dim.h += g_slist_length(layouts) * settings.padding * 2;
int text_width = 0;
for (GSList *iter = layouts; iter; iter = iter->next) {
colored_layout *cl = iter->data;
int w,h;
pango_layout_get_pixel_size(cl->l, &w, &h);
dim.h += h;
text_width = MAX(w, text_width);
}
if (dim.w <= 0) {
dim.w = text_width + 2 * settings.h_padding;
dim.w += 2 * settings.frame_width;
}
return dim;
} }
static colored_layout *r_init_shared(cairo_t *c, notification *n) static colored_layout *r_init_shared(cairo_t *c, notification *n)
@ -206,13 +237,15 @@ static colored_layout *r_init_shared(cairo_t *c, notification *n)
cl->fg = x_string_to_color_t(n->color_strings[ColFG]); cl->fg = x_string_to_color_t(n->color_strings[ColFG]);
cl->bg = x_string_to_color_t(n->color_strings[ColBG]); cl->bg = x_string_to_color_t(n->color_strings[ColBG]);
int width = calculate_width(); dimension_t dim = calculate_dimensions(NULL);
if (width) { int width = dim.w;
if (have_dynamic_width()) {
r_setup_pango_layout(cl->l, -1);
} else {
width -= 2 * settings.h_padding; width -= 2 * settings.h_padding;
width -= 2 * settings.frame_width; width -= 2 * settings.frame_width;
r_setup_pango_layout(cl->l, width); r_setup_pango_layout(cl->l, width);
} else {
r_setup_pango_layout(cl->l, -1);
} }
return cl; return cl;
@ -298,27 +331,11 @@ void r_free_layouts(GSList *layouts)
void x_win_draw(void) void x_win_draw(void)
{ {
int height = 0;
int text_width = 0;
GSList *layouts = r_create_layouts(cairo_ctx.context); GSList *layouts = r_create_layouts(cairo_ctx.context);
for (GSList *iter = layouts; iter; iter = iter->next) { dimension_t dim = calculate_dimensions(layouts);
colored_layout *cl = iter->data; int width = dim.w;
int w,h; int height = dim.h;
pango_layout_get_pixel_size(cl->l, &w, &h);
height += h;
text_width = MAX(w, text_width);
}
int width = calculate_width();
if (width <= 0) {
width = text_width + 2 * settings.h_padding;
width += 2 * settings.frame_width;
}
height += (g_slist_length(layouts) - 1) * settings.separator_height;
height += g_slist_length(layouts) * settings.padding * 2;
cairo_t *c; cairo_t *c;
cairo_surface_t *image_surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); cairo_surface_t *image_surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);