From e2c9769f381b0cefa76a8f5cce50e0f3010ebc3c Mon Sep 17 00:00:00 2001 From: Simon Gomizelj Date: Mon, 10 Nov 2014 20:45:02 -0500 Subject: [PATCH] Match gnome-terminal with its font scaling logic Gnome terminal jumps between a predefined set of font scales. libvte seems to break if we try to jump in between them. This behaviour is an exact match from what you get in gnome-terminal (and certainly looks considerably better). Relevant to issue #195. Closes #194 since it no longer crashes. Probably a proper fix (finally) for #47. --- termite.cc | 53 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/termite.cc b/termite.cc index 8908e6f..0870928 100644 --- a/termite.cc +++ b/termite.cc @@ -39,6 +39,34 @@ using namespace std::placeholders; +/* Allow scales a bit smaller and a bit larger than the usual pango ranges */ +#define TERMINAL_SCALE_XXX_SMALL (PANGO_SCALE_XX_SMALL/1.2) +#define TERMINAL_SCALE_XXXX_SMALL (TERMINAL_SCALE_XXX_SMALL/1.2) +#define TERMINAL_SCALE_XXXXX_SMALL (TERMINAL_SCALE_XXXX_SMALL/1.2) +#define TERMINAL_SCALE_XXX_LARGE (PANGO_SCALE_XX_LARGE*1.2) +#define TERMINAL_SCALE_XXXX_LARGE (TERMINAL_SCALE_XXX_LARGE*1.2) +#define TERMINAL_SCALE_XXXXX_LARGE (TERMINAL_SCALE_XXXX_LARGE*1.2) +#define TERMINAL_SCALE_MINIMUM (TERMINAL_SCALE_XXXXX_SMALL/1.2) +#define TERMINAL_SCALE_MAXIMUM (TERMINAL_SCALE_XXXXX_LARGE*1.2) + +static const std::vector zoom_factors = { + TERMINAL_SCALE_MINIMUM, + TERMINAL_SCALE_XXXXX_SMALL, + TERMINAL_SCALE_XXXX_SMALL, + TERMINAL_SCALE_XXX_SMALL, + PANGO_SCALE_XX_SMALL, + PANGO_SCALE_X_SMALL, + PANGO_SCALE_SMALL, + PANGO_SCALE_MEDIUM, + PANGO_SCALE_LARGE, + PANGO_SCALE_X_LARGE, + PANGO_SCALE_XX_LARGE, + TERMINAL_SCALE_XXX_LARGE, + TERMINAL_SCALE_XXXX_LARGE, + TERMINAL_SCALE_XXXXX_LARGE, + TERMINAL_SCALE_MAXIMUM +}; + enum class overlay_mode { hidden, search, @@ -640,9 +668,26 @@ void window_title_cb(VteTerminal *vte, gboolean *dynamic_title) { title ? title : "termite"); } -static void update_font_scale(VteTerminal *vte, gdouble update) { +static void increase_font_scale(VteTerminal *vte) { gdouble scale = vte_terminal_get_font_scale(vte); - vte_terminal_set_font_scale(vte, scale + update); + + for (auto factor : zoom_factors) { + if ((factor - scale) > 1e-6) { + vte_terminal_set_font_scale(vte, factor); + return; + } + } +} + +static void decrease_font_scale(VteTerminal *vte) { + gdouble scale = vte_terminal_get_font_scale(vte); + + for (auto factor : zoom_factors) { + if ((scale - factor) > 1e-6) { + vte_terminal_set_font_scale(vte, factor); + return; + } + } } gboolean window_state_cb(GtkWindow *, GdkEventWindowState *event, keybind_info *info) { @@ -797,10 +842,10 @@ gboolean key_press_cb(VteTerminal *vte, GdkEventKey *event, keybind_info *info) overlay_show(&info->panel, overlay_mode::urlselect, nullptr); break; case GDK_KEY_plus: - update_font_scale(vte, 0.1); + increase_font_scale(vte); break; case GDK_KEY_minus: - update_font_scale(vte, -0.1); + decrease_font_scale(vte); break; } return TRUE;