]> git.sur5r.net Git - i3/i3/commitdiff
Don't reallocate the backbuffer on every refresh (thx sECuRE)
authorAxel Wagner <mail@merovius.de>
Sat, 19 Mar 2011 21:27:35 +0000 (22:27 +0100)
committerAxel Wagner <mail@merovius.de>
Sat, 19 Mar 2011 21:27:35 +0000 (22:27 +0100)
i3bar/include/xcb.h
i3bar/src/ipc.c
i3bar/src/xcb.c

index 0adb29ab1d966aa03ffba5108a4da9c9a75b024d..931e7643d8aadfb78c6bfaa91209941fc8b829cb 100644 (file)
@@ -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
  *
index dc2255eadd8d68499958e2a2b6d1e7cbe7a0386c..d5c180338da038ae313e682ae355f81022d95ed6 100644 (file)
@@ -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();
 }
 
index f9f3f79afab172997ffc5242bcfcb49b2f9b7cf8..f717f487f7591d4d2ddaa95888018e0257ee0675 100644 (file)
@@ -187,22 +187,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);
-    }
 }
 
 /*
@@ -536,9 +524,14 @@ char *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));
@@ -595,6 +588,10 @@ char *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);
     }
@@ -663,6 +660,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
  *