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.
This commit is contained in:
parent
bed98f83e8
commit
e2c9769f38
53
termite.cc
53
termite.cc
|
@ -39,6 +39,34 @@
|
||||||
|
|
||||||
using namespace std::placeholders;
|
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<double> 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 {
|
enum class overlay_mode {
|
||||||
hidden,
|
hidden,
|
||||||
search,
|
search,
|
||||||
|
@ -640,9 +668,26 @@ void window_title_cb(VteTerminal *vte, gboolean *dynamic_title) {
|
||||||
title ? title : "termite");
|
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);
|
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) {
|
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);
|
overlay_show(&info->panel, overlay_mode::urlselect, nullptr);
|
||||||
break;
|
break;
|
||||||
case GDK_KEY_plus:
|
case GDK_KEY_plus:
|
||||||
update_font_scale(vte, 0.1);
|
increase_font_scale(vte);
|
||||||
break;
|
break;
|
||||||
case GDK_KEY_minus:
|
case GDK_KEY_minus:
|
||||||
update_font_scale(vte, -0.1);
|
decrease_font_scale(vte);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
Loading…
Reference in New Issue