From 8f4a4d51c65a98e3e3c7a307d575fc8eb8bf50d5 Mon Sep 17 00:00:00 2001 From: Dave Davenport Date: Fri, 3 Feb 2017 09:52:56 +0100 Subject: [PATCH] Don't apply fonts that don't result in family name or have size 0. Issue: 554 --- include/helper.h | 8 ++++++++ source/helper.c | 14 ++++++++++++++ source/view.c | 4 +++- source/widgets/textbox.c | 19 ++++++++++++++----- 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/include/helper.h b/include/helper.h index a74a162e..85ff158a 100644 --- a/include/helper.h +++ b/include/helper.h @@ -234,4 +234,12 @@ int rofi_scorer_fuzzy_evaluate ( const char *pattern, glong plen, const char *st * characters (not bytes) of `b`. */ int utf8_strncmp ( const char *a, const char* b, size_t n ); + +/** + * @param pfd Pango font description to validate. + * @param font The name of the font to check. + * + * @returns true if font is valid. + */ +gboolean helper_validate_font ( PangoFontDescription *pfd, const char *font ); #endif // ROFI_HELPER_H diff --git a/source/helper.c b/source/helper.c index 9f136dbf..159a05bb 100644 --- a/source/helper.c +++ b/source/helper.c @@ -50,6 +50,8 @@ #include "rofi.h" #include "view.h" +#define LOG_DOMAIN "Helper" + const char *const monitor_position_entries[] = { "on focused monitor", "on focused window", @@ -524,6 +526,18 @@ void remove_pid_file ( int fd ) } } +gboolean helper_validate_font ( PangoFontDescription *pfd, const char *font ) +{ + const char *fam = pango_font_description_get_family ( pfd ); + int size = pango_font_description_get_size ( pfd ); + if ( fam == NULL || size == 0 ){ + g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Pango failed to parse font: '%s'", font); + g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Got family: %s at size: %d", fam?fam:"{unknown}", size); + return FALSE; + } + return TRUE; +} + /** * Do some input validation, especially the first few could break things. * It is good to catch them beforehand. diff --git a/source/view.c b/source/view.c index 967178f8..ed494853 100644 --- a/source/view.c +++ b/source/view.c @@ -694,7 +694,9 @@ void __create_window ( MenuFlags menu_flags ) char *font = rofi_theme_get_string ( WIDGET ( win ), "font", config.menu_font ); if ( font ) { PangoFontDescription *pfd = pango_font_description_from_string ( font ); - pango_context_set_font_description ( p, pfd ); + if ( helper_validate_font(pfd, font)) { + pango_context_set_font_description ( p, pfd ); + } pango_font_description_free ( pfd ); } PangoLanguage *l = pango_language_get_default(); diff --git a/source/widgets/textbox.c b/source/widgets/textbox.c index 06cf5d0d..76ef94af 100644 --- a/source/widgets/textbox.c +++ b/source/widgets/textbox.c @@ -31,6 +31,7 @@ #include #include "widgets/textbox.h" #include "keyb.h" +#include "helper.h" #include "x11-helper.h" #include "mode.h" #include "view.h" @@ -125,12 +126,20 @@ textbox* textbox_create ( const char *name, TextboxFlags flags, TextBoxFontType if ( tbfc == NULL ){ tbfc = g_malloc0 ( sizeof (TBFontConfig) ); tbfc->pfd = pango_font_description_from_string ( font ); - tbfc->metrics = pango_context_get_metrics ( p_context, tbfc->pfd, NULL ); - g_hash_table_insert ( tbfc_cache, font, tbfc); + if ( helper_validate_font ( tbfc->pfd, font)) { + tbfc->metrics = pango_context_get_metrics ( p_context, tbfc->pfd, NULL ); + g_hash_table_insert ( tbfc_cache, font, tbfc); + } else { + pango_font_description_free ( tbfc->pfd ); + g_free( tbfc); + tbfc = NULL; + } + } + if ( tbfc ) { + // Update for used font. + pango_layout_set_font_description ( tb->layout, tbfc->pfd ); + tb->metrics = tbfc->metrics; } - // Update for used font. - pango_layout_set_font_description ( tb->layout, tbfc->pfd ); - tb->metrics = tbfc->metrics; }