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;
 | 
			
		||||
 | 
			
		||||
/* 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 {
 | 
			
		||||
    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;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user