aboutsummaryrefslogtreecommitdiff
path: root/sway/commands
diff options
context:
space:
mode:
authorHugo Osvaldo Barrera <hugo@barrera.io>2022-06-29 21:38:24 +0200
committerSimon Ser <contact@emersion.fr>2022-07-01 13:05:58 +0200
commit75605491a54f8647740fdba75dd2ad7bae9e0ca7 (patch)
treef1d7476fbc893517ea01ed0f92841219f8b4808a /sway/commands
parent9e8866ae20b0999b54fda9a52644ac937fedc0a1 (diff)
Reject font values that are invalid for pango
Use pango to parse font configuration early, and reject the command as invalid if the value is invalid for pango. Since we're already parsing the font into a `PangoFontDescription`, keep that instance around and avoid re-parsing the font each time we render text. Fixes: https://github.com/swaywm/sway/issues/6805
Diffstat (limited to 'sway/commands')
-rw-r--r--sway/commands/font.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/sway/commands/font.c b/sway/commands/font.c
index 3eda0a9c..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;
@@ -22,6 +23,28 @@ struct cmd_results *cmd_font(int argc, char **argv) {
config->font = 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);
}