]> git.sur5r.net Git - i3/i3/commitdiff
Invalidate cached pixmaps on reload and redraw.
authorFernando Tarlá Cardoso Lemos <fernandotcl@gmail.com>
Wed, 23 Nov 2011 23:12:36 +0000 (21:12 -0200)
committerMichael Stapelberg <michael@stapelberg.de>
Sat, 26 Nov 2011 21:51:49 +0000 (21:51 +0000)
After a reload, the drawing parameters for the decorations might
have changed, so we need to invalidate the cache and force a redraw
of the currently visible decorations. Also, don't leak the previous
font when reloading by freeing it before parsing the config.

include/data.h
include/libi3.h
libi3/font.c
src/config.c
src/x.c

index 3bc425d9c792f4161115c3d6a34ded12642859ac..40fffbfc4cebf8c71d2a4d18f38003968083357f 100644 (file)
@@ -119,7 +119,6 @@ struct deco_render_params {
     Rect con_deco_rect;
     uint32_t background;
     bool con_is_leaf;
-    xcb_font_t font;
 };
 
 /**
index 17f8a5eb99260bae09340ebff96c54929a7d8352..b8ed6c31c875f299929341e5e19590b36b7b318c 100644 (file)
@@ -186,6 +186,18 @@ uint32_t get_mod_mask_for(uint32_t keysym,
  */
 i3Font load_font(const char *pattern, const bool fallback);
 
+/**
+ * Defines the font to be used for the forthcoming calls.
+ *
+ */
+void set_font(i3Font *font);
+
+/**
+ * Frees the resources taken by the current font.
+ *
+ */
+void free_font();
+
 /**
  * Converts the given string to UTF-8 from UCS-2 big endian. The return value
  * must be freed after use.
@@ -202,13 +214,6 @@ char *convert_ucs2_to_utf8(xcb_char2b_t *text, size_t num_glyphs);
  */
 xcb_char2b_t *convert_utf8_to_ucs2(char *input, size_t *real_strlen);
 
-/**
- * Defines the font to be used for the forthcoming draw_text and
- * predict_text_width calls.
- *
- */
-void set_font(i3Font *font);
-
 /**
  * Defines the colors to be used for the forthcoming draw_text calls.
  *
index 045972d9ac080636d4ad38d724ee71654bef924b..5dfdf3d30a26e0283fee75ba42ff90a556ec0418 100644 (file)
@@ -73,14 +73,24 @@ i3Font load_font(const char *pattern, const bool fallback) {
 }
 
 /*
- * Defines the font to be used for the forthcoming draw_text and
- * predict_text_width calls.
+ * Defines the font to be used for the forthcoming calls.
  *
  */
 void set_font(i3Font *font) {
     savedFont = font;
 }
 
+/*
+ * Frees the resources taken by the current font.
+ *
+ */
+void free_font() {
+    /* Close the font and free the info */
+    xcb_close_font(conn, savedFont->id);
+    if (savedFont->info)
+        free(savedFont->info);
+}
+
 /*
  * Defines the colors to be used for the forthcoming draw_text calls.
  *
index 2d7fb3bf6e4d12aa0f1d848c94fd0a62dc0c95b9..673f297e36b9fcba3c7dc1fcdd420b29bd05f498 100644 (file)
@@ -320,6 +320,14 @@ void load_configuration(xcb_connection_t *conn, const char *override_configpath,
         TAILQ_FOREACH(ws, workspaces, workspaces)
             workspace_set_name(ws, NULL);
 #endif
+
+        /* Invalidate pixmap caches in case font or colors changed */
+        Con *con;
+        TAILQ_FOREACH(con, &all_cons, all_cons)
+            FREE(con->deco_render_params);
+
+        /* Get rid of the current font */
+        free_font();
     }
 
     SLIST_INIT(&modes);
@@ -374,6 +382,13 @@ void load_configuration(xcb_connection_t *conn, const char *override_configpath,
         set_font(&config.font);
     }
 
+    /* Redraw the currently visible decorations on reload, so that
+     * the possibly new drawing parameters changed. */
+    if (reload) {
+        x_deco_recurse(croot);
+        xcb_flush(conn);
+    }
+
 #if 0
     /* Set an empty name for every workspace which got no name */
     Workspace *ws;
diff --git a/src/x.c b/src/x.c
index aaa5b188e50691bf753295fefc087a45d52cd008..070fae91b1e74097e9caf910099ad7c4302aec41 100644 (file)
--- a/src/x.c
+++ b/src/x.c
@@ -307,7 +307,6 @@ void x_draw_decoration(Con *con) {
     p->con_deco_rect = con->deco_rect;
     p->background = config.client.background;
     p->con_is_leaf = con_is_leaf(con);
-    p->font = config.font.id;
 
     if (con->deco_render_params != NULL &&
         (con->window == NULL || !con->window->name_x_changed) &&