diff options
Diffstat (limited to 'sway/commands/font.c')
| -rw-r--r-- | sway/commands/font.c | 27 | 
1 files changed, 25 insertions, 2 deletions
| diff --git a/sway/commands/font.c b/sway/commands/font.c index cea720f5..74bb6b9f 100644 --- a/sway/commands/font.c +++ b/sway/commands/font.c @@ -4,6 +4,7 @@  #include "sway/config.h"  #include "log.h"  #include "stringop.h" +#include <pango/pangocairo.h>  struct cmd_results *cmd_font(int argc, char **argv) {  	struct cmd_results *error = NULL; @@ -16,12 +17,34 @@ struct cmd_results *cmd_font(int argc, char **argv) {  	if (strncmp(font, "pango:", 6) == 0) {  		config->pango_markup = true;  		config->font = strdup(font + 6); +		free(font);  	} else {  		config->pango_markup = false; -		config->font = strdup(font); +		config->font = font;  	} -	free(font); +	// Parse the font early so we can reject it if it's not valid for pango. +	// Also avoids re-parsing each time we render text. +	PangoFontDescription *font_description = pango_font_description_from_string(config->font); + +	const char *family = pango_font_description_get_family(font_description); +	if (family == NULL) { +		pango_font_description_free(font_description); +		return cmd_results_new(CMD_FAILURE, "Invalid font family."); +	} + +	const gint size = pango_font_description_get_size(font_description); +	if (size == 0) { +		pango_font_description_free(font_description); +		return cmd_results_new(CMD_FAILURE, "Invalid font size."); +	} + +	if (config->font_description != NULL) { +		pango_font_description_free(config->font_description); +	} + +	config->font_description = font_description;  	config_update_font_height(); +  	return cmd_results_new(CMD_SUCCESS, NULL);  } | 
