diff options
author | Bram Moolenaar <Bram@vim.org> | 2018-08-07 20:01:40 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2018-08-07 20:01:40 +0200 |
commit | 7ebf4e1c346783b25624258e5bcc599130fd18f9 (patch) | |
tree | 628a9093edba8e80446676aa0d82cac8db41365d /src/gui_gtk_x11.c | |
parent | 8d8a65e389cef318ae661ff0fe7b1b00fd7cb25f (diff) |
patch 8.1.0249: GTK: when screen DPI changes Vim does not handle itv8.1.0249
Problem: GTK: when screen DPI changes Vim does not handle it.
Solution: Handle the gtk-xft-dpi signal. (Roel van de Kraats,
closes #2357)
Diffstat (limited to 'src/gui_gtk_x11.c')
-rw-r--r-- | src/gui_gtk_x11.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c index 9c7e8d5648..7541d79072 100644 --- a/src/gui_gtk_x11.c +++ b/src/gui_gtk_x11.c @@ -788,6 +788,29 @@ property_event(GtkWidget *widget, } #endif /* defined(FEAT_CLIENTSERVER) */ +/* + * Handle changes to the "Xft/DPI" setting + */ + static void +gtk_settings_xft_dpi_changed_cb(GtkSettings *gtk_settings UNUSED, + GParamSpec *pspec UNUSED, + gpointer data UNUSED) +{ + // Create a new PangoContext for this screen, and initialize it + // with the current font if necessary. + if (gui.text_context != NULL) + g_object_unref(gui.text_context); + + gui.text_context = gtk_widget_create_pango_context(gui.mainwin); + pango_context_set_base_dir(gui.text_context, PANGO_DIRECTION_LTR); + + if (gui.norm_font != NULL) + { + // force default font + gui_mch_init_font(*p_guifont == NUL ? NULL : p_guifont, FALSE); + gui_set_shellsize(TRUE, FALSE, RESIZE_BOTH); + } +} #if GTK_CHECK_VERSION(3,0,0) typedef gboolean timeout_cb_type; @@ -4383,6 +4406,15 @@ gui_mch_init(void) /* Pretend we don't have input focus, we will get an event if we do. */ gui.in_focus = FALSE; + // Handle changes to the "Xft/DPI" setting. + { + GtkSettings *gtk_settings = + gtk_settings_get_for_screen(gdk_screen_get_default()); + + g_signal_connect(gtk_settings, "notify::gtk-xft-dpi", + G_CALLBACK(gtk_settings_xft_dpi_changed_cb), NULL); + } + return OK; } |