]> git.sur5r.net Git - i3/i3/commitdiff
libi3: free previous font on font load 1453/head
authorTony Crisci <tony@dubstepdish.com>
Tue, 10 Feb 2015 20:11:40 +0000 (15:11 -0500)
committerTony Crisci <tony@dubstepdish.com>
Tue, 10 Feb 2015 20:11:40 +0000 (15:11 -0500)
When loading a new font with `load_font`, free the previously loaded
font with `free_font`.

If no font is loaded, `free_font` will simply return (instead of
crashing because of a double free).

include/libi3.h
libi3/font.c

index 7c0ead32be1df03170396c11ba09e606aefe3f2e..7a2bdf581c6bae07a32715b11977a283a7d1f8ae 100644 (file)
@@ -290,7 +290,8 @@ uint32_t get_mod_mask_for(uint32_t keysym,
 
 /**
  * Loads a font for usage, also getting its height. If fallback is true,
- * the fonts 'fixed' or '-misc-*' will be loaded instead of exiting.
+ * the fonts 'fixed' or '-misc-*' will be loaded instead of exiting. If any
+ * font was previously loaded, it will be freed.
  *
  */
 i3Font load_font(const char *pattern, const bool fallback);
@@ -302,7 +303,8 @@ i3Font load_font(const char *pattern, const bool fallback);
 void set_font(i3Font *font);
 
 /**
- * Frees the resources taken by the current font.
+ * Frees the resources taken by the current font. If no font was previously
+ * loaded, it simply returns.
  *
  */
 void free_font(void);
index 7670335fa805fb62f0869fae3b181c000d8a287d..a338f9752cc29714c5c357e63323de786aa62f3f 100644 (file)
@@ -160,10 +160,14 @@ static int predict_text_width_pango(const char *text, size_t text_len) {
 
 /*
  * Loads a font for usage, also getting its metrics. If fallback is true,
- * the fonts 'fixed' or '-misc-*' will be loaded instead of exiting.
+ * the fonts 'fixed' or '-misc-*' will be loaded instead of exiting. If any
+ * font was previously loaded, it will be freed.
  *
  */
 i3Font load_font(const char *pattern, const bool fallback) {
+    /* if any font was previously loaded, free it now */
+    free_font();
+
     i3Font font;
     font.type = FONT_TYPE_NONE;
 
@@ -257,10 +261,15 @@ void set_font(i3Font *font) {
 }
 
 /*
- * Frees the resources taken by the current font.
+ * Frees the resources taken by the current font. If no font was previously
+ * loaded, it simply returns.
  *
  */
 void free_font(void) {
+    /* if there is no saved font, simply return */
+    if (savedFont == NULL)
+        return;
+
     free(savedFont->pattern);
     switch (savedFont->type) {
         case FONT_TYPE_NONE:
@@ -283,6 +292,8 @@ void free_font(void) {
             assert(false);
             break;
     }
+
+    savedFont = NULL;
 }
 
 /*