From d38d2dc3e3454642f8ceaaadeaa0fd8d0b88feea Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Tue, 10 Feb 2015 14:26:22 -0500 Subject: [PATCH 1/2] Update bar font config on reload Dynamically update the font when the `reload` command is called by reloading the font with `xcb_init_late` and adjusting the size of the bar by updating the output dimensions with a call to the ipc. --- i3bar/src/ipc.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/i3bar/src/ipc.c b/i3bar/src/ipc.c index 3eb50beb..e1b343e5 100644 --- a/i3bar/src/ipc.c +++ b/i3bar/src/ipc.c @@ -159,6 +159,9 @@ void got_bar_config_update(char *event) { if (found_id == NULL) return; + /* reconfigure the bar based on the current outputs */ + i3_send_msg(I3_IPC_MESSAGE_TYPE_GET_OUTPUTS, NULL); + free_colors(&(config.colors)); /* update the configuration with the received settings */ @@ -169,6 +172,8 @@ void got_bar_config_update(char *event) { reconfig_windows(true); } + /* update fonts and colors */ + init_xcb_late(config.fontname); init_colors(&(config.colors)); realloc_sl_buffer(); From e91a9174e24d8fe0616115d777f8ee641e50a782 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Tue, 10 Feb 2015 15:11:40 -0500 Subject: [PATCH 2/2] libi3: free previous font on font load 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 | 6 ++++-- libi3/font.c | 15 +++++++++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/include/libi3.h b/include/libi3.h index 7c0ead32..7a2bdf58 100644 --- a/include/libi3.h +++ b/include/libi3.h @@ -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); diff --git a/libi3/font.c b/libi3/font.c index 7670335f..a338f975 100644 --- a/libi3/font.c +++ b/libi3/font.c @@ -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; } /*