aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/pango.c4
-rw-r--r--include/pango.h2
-rw-r--r--include/sway/config.h4
-rw-r--r--sway/commands/font.c23
-rw-r--r--sway/config.c3
5 files changed, 30 insertions, 6 deletions
diff --git a/common/pango.c b/common/pango.c
index abc18281..e8e2678d 100644
--- a/common/pango.c
+++ b/common/pango.c
@@ -109,10 +109,9 @@ void get_text_size(cairo_t *cairo, const char *font, int *width, int *height,
free(buf);
}
-void get_text_metrics(const char *font, int *height, int *baseline) {
+void get_text_metrics(const PangoFontDescription *description, int *height, int *baseline) {
cairo_t *cairo = cairo_create(NULL);
PangoContext *pango = pango_cairo_create_context(cairo);
- PangoFontDescription *description = pango_font_description_from_string(font);
// When passing NULL as a language, pango uses the current locale.
PangoFontMetrics *metrics = pango_context_get_metrics(pango, description, NULL);
@@ -120,7 +119,6 @@ void get_text_metrics(const char *font, int *height, int *baseline) {
*height = *baseline + pango_font_metrics_get_descent(metrics) / PANGO_SCALE;
pango_font_metrics_unref(metrics);
- pango_font_description_free(description);
g_object_unref(pango);
cairo_destroy(cairo);
}
diff --git a/include/pango.h b/include/pango.h
index 93affc23..2f14d2bb 100644
--- a/include/pango.h
+++ b/include/pango.h
@@ -17,7 +17,7 @@ PangoLayout *get_pango_layout(cairo_t *cairo, const char *font,
const char *text, double scale, bool markup);
void get_text_size(cairo_t *cairo, const char *font, int *width, int *height,
int *baseline, double scale, bool markup, const char *fmt, ...);
-void get_text_metrics(const char *font, int *height, int *baseline);
+void get_text_metrics(const PangoFontDescription *font, int *height, int *baseline);
void render_text(cairo_t *cairo, const char *font,
double scale, bool markup, const char *fmt, ...);
diff --git a/include/sway/config.h b/include/sway/config.h
index 05678c33..8939af00 100644
--- a/include/sway/config.h
+++ b/include/sway/config.h
@@ -17,6 +17,7 @@
#include "sway/input/tablet.h"
#include "sway/tree/root.h"
#include "wlr-layer-shell-unstable-v1-protocol.h"
+#include <pango/pangocairo.h>
// TODO: Refactor this shit
@@ -504,7 +505,8 @@ struct sway_config {
char *floating_scroll_right_cmd;
enum sway_container_layout default_orientation;
enum sway_container_layout default_layout;
- char *font;
+ char *font; // Use mostly for IPC.
+ PangoFontDescription *font_description; // Used internally for rendering and validating.
int font_height;
int font_baseline;
bool pango_markup;
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);
}
diff --git a/sway/config.c b/sway/config.c
index 8220ece0..b41dd871 100644
--- a/sway/config.c
+++ b/sway/config.c
@@ -243,6 +243,7 @@ static void config_defaults(struct sway_config *config) {
config->default_layout = L_NONE;
config->default_orientation = L_NONE;
if (!(config->font = strdup("monospace 10"))) goto cleanup;
+ config->font_description = pango_font_description_from_string(config->font);
config->urgent_timeout = 500;
config->focus_on_window_activation = FOWA_URGENT;
config->popup_during_fullscreen = POPUP_SMART;
@@ -1006,7 +1007,7 @@ int workspace_output_cmp_workspace(const void *a, const void *b) {
void config_update_font_height(void) {
int prev_max_height = config->font_height;
- get_text_metrics(config->font, &config->font_height, &config->font_baseline);
+ get_text_metrics(config->font_description, &config->font_height, &config->font_baseline);
if (config->font_height != prev_max_height) {
arrange_root();