From fea94757cd6250ac123b713f0951cb07a9895e96 Mon Sep 17 00:00:00 2001 From: Axel Wagner Date: Sat, 19 Mar 2011 22:27:35 +0100 Subject: [PATCH] Don't reallocate the backbuffer on every refresh (thx sECuRE) --- i3bar/include/xcb.h | 6 ++++++ i3bar/src/ipc.c | 1 + i3bar/src/xcb.c | 46 ++++++++++++++++++++++++++++++--------------- 3 files changed, 38 insertions(+), 15 deletions(-) diff --git a/i3bar/include/xcb.h b/i3bar/include/xcb.h index 5ace4f0b..3817a320 100644 --- a/i3bar/include/xcb.h +++ b/i3bar/include/xcb.h @@ -56,6 +56,12 @@ void get_atoms(); */ void destroy_window(i3_output *output); +/* + * Reallocate the statusline-buffer + * + */ +void realloc_sl_buffer(); + /* * Reconfigure all bars and create new for newly activated outputs * diff --git a/i3bar/src/ipc.c b/i3bar/src/ipc.c index dc2255ea..d5c18033 100644 --- a/i3bar/src/ipc.c +++ b/i3bar/src/ipc.c @@ -93,6 +93,7 @@ void got_output_reply(char *reply) { DLOG("Parsing Outputs-JSON...\n"); parse_outputs_json(reply); DLOG("Reconfiguring Windows...\n"); + realloc_sl_buffer(); reconfig_windows(); } diff --git a/i3bar/src/xcb.c b/i3bar/src/xcb.c index c6cda4ed..c3ba149b 100644 --- a/i3bar/src/xcb.c +++ b/i3bar/src/xcb.c @@ -186,22 +186,10 @@ void refresh_statusline() { xcb_char2b_t *text = (xcb_char2b_t*) convert_utf8_to_ucs2(statusline, &glyph_count); statusline_width = predict_text_extents(text, glyph_count); - xcb_free_pixmap(xcb_connection, statusline_pm); - statusline_pm = xcb_generate_id(xcb_connection); - xcb_void_cookie_t sl_pm_cookie = xcb_create_pixmap_checked(xcb_connection, - xcb_screen->root_depth, - statusline_pm, - xcb_root, - statusline_width, - font_height); - + xcb_clear_area(xcb_connection, 0, statusline_pm, 0, 0, xcb_screen->width_in_pixels, font_height); draw_text(statusline_pm, statusline_ctx, 0, 0, text, glyph_count); FREE(text); - - if (xcb_request_failed(sl_pm_cookie, "Could not allocate statusline-buffer")) { - exit(EXIT_FAILURE); - } } /* @@ -531,9 +519,14 @@ void init_xcb(char *fontname) { mask, vals); - /* We only generate an id for the pixmap, because the width of it is dependent on the - * input we get */ statusline_pm = xcb_generate_id(xcb_connection); + xcb_void_cookie_t sl_pm_cookie = xcb_create_pixmap_checked(xcb_connection, + xcb_screen->root_depth, + statusline_pm, + xcb_root, + xcb_screen->width_in_pixels, + xcb_screen->height_in_pixels); + /* The varios Watchers to communicate with xcb */ xcb_io = malloc(sizeof(ev_io)); @@ -570,6 +563,10 @@ void init_xcb(char *fontname) { DLOG("Calculated Font-height: %d\n", font_height); + if (xcb_request_failed(sl_pm_cookie, "Could not allocate statusline-buffer")) { + exit(EXIT_FAILURE); + } + if (xcb_request_failed(sl_ctx_cookie, "Could not create context for statusline")) { exit(EXIT_FAILURE); } @@ -636,6 +633,25 @@ void destroy_window(i3_output *output) { output->bar = XCB_NONE; } +/* + * Reallocate the statusline-buffer + * + */ +void realloc_sl_buffer() { + xcb_free_pixmap(xcb_connection, statusline_pm); + statusline_pm = xcb_generate_id(xcb_connection); + xcb_void_cookie_t sl_pm_cookie = xcb_create_pixmap_checked(xcb_connection, + xcb_screen->root_depth, + statusline_pm, + xcb_root, + xcb_screen->width_in_pixels, + xcb_screen->height_in_pixels); + if (xcb_request_failed(sl_pm_cookie, "Could not allocate statusline-buffer")) { + exit(EXIT_FAILURE); + } + +} + /* * Reconfigure all bars and create new for newly activated outputs *