55
62
gpointer user_data)
57
64
decor_frame_t *frame = (decor_frame_t *) value;
58
GdkDisplay *display = gdk_display_get_default ();
59
GdkScreen *screen = gdk_display_get_default_screen (display);
60
gdouble dpi = gdk_screen_get_resolution (screen);
65
GWDTheme *theme = GWD_THEME (user_data);
66
GWDThemePrivate *priv = gwd_theme_get_instance_private (theme);
62
68
if (frame->pango_context == NULL)
65
71
/* FIXME: PangoContext created by gtk_widget_create_pango_context is not
66
72
* automatically updated. Resolution is not only thing that can change...
68
pango_cairo_context_set_resolution (frame->pango_context, dpi);
74
pango_cairo_context_set_resolution (frame->pango_context,
75
priv->dpi * priv->scale);
72
79
style_updated_cb (GtkWidget *widget,
75
gwd_frames_foreach (frames_update_pango_contexts, NULL);
82
gwd_frames_foreach (frames_update_pango_contexts, theme);
77
84
GWD_THEME_GET_CLASS (theme)->style_updated (theme);
113
monitors_changed_cb (GdkScreen *screen,
116
GWDThemePrivate *priv = gwd_theme_get_instance_private (theme);
117
gint scale = gtk_widget_get_scale_factor (priv->style_window);
119
if (priv->scale == scale)
124
GWD_THEME_GET_CLASS (theme)->scale_changed (theme);
126
decorations_changed (wnck_screen_get_default ());
130
track_window_scale (GWDTheme *theme)
132
GdkScreen *screen = gdk_screen_get_default ();
133
GWDThemePrivate *priv = gwd_theme_get_instance_private (theme);
135
priv->monitors_changed_id = g_signal_connect (screen, "monitors-changed",
136
G_CALLBACK (monitors_changed_cb),
139
priv->fixed_scale = g_getenv ("GDK_SCALE") != NULL;
140
priv->scale = gtk_widget_get_scale_factor (priv->style_window);
144
get_unscaled_dpi (GWDTheme *theme)
146
GWDThemePrivate *priv = gwd_theme_get_instance_private (theme);
150
g_object_get (gtk_settings_get_default (), "gtk-xft-dpi", &xft_dpi, NULL);
153
const gchar *scale_env;
155
dpi = xft_dpi / 1024.0;
157
/* When using automatic scaling gtk-xft-dpi value is unscaled, but
158
* when it is disabled with GDK_SCALE or gdk_display_x11_set_scale then
159
* this value will be already scaled.
161
if (priv->fixed_scale) {
162
GdkScreen *screen = gdk_screen_get_default ();
163
GValue value = G_VALUE_INIT;
165
g_value_init (&value, G_TYPE_INT);
167
if (gdk_screen_get_setting (screen, "gdk-window-scaling-factor", &value))
168
dpi /= g_value_get_int (&value);
171
/* gtk-xft-dpi value is not scaled with GDK_DPI_SCALE, we need to do
172
* that manually if we want GDK_DPI_SCALE support in decorations.
174
scale_env = g_getenv ("GDK_DPI_SCALE");
176
gdouble scale = g_ascii_strtod (scale_env, NULL);
189
notify_gtk_xft_dpi_cb (GtkSettings *settings,
193
GWDThemePrivate *priv = gwd_theme_get_instance_private (theme);
194
gdouble dpi = get_unscaled_dpi (theme);
196
if (priv->dpi == dpi)
201
gwd_frames_foreach (frames_update_pango_contexts, theme);
203
GWD_THEME_GET_CLASS (theme)->dpi_changed (theme);
205
decorations_changed (wnck_screen_get_default ());
209
track_xft_dpi (GWDTheme *theme)
211
GtkSettings *settings = gtk_settings_get_default ();
212
GWDThemePrivate *priv = gwd_theme_get_instance_private (theme);
214
priv->gtk_xft_dpi_id = g_signal_connect (settings, "notify::gtk-xft-dpi",
215
G_CALLBACK (notify_gtk_xft_dpi_cb),
218
priv->dpi = get_unscaled_dpi (theme);
106
222
gwd_theme_constructed (GObject *object)
108
224
GWDTheme *theme = GWD_THEME (object);
126
244
g_clear_pointer (&priv->style_window, gtk_widget_destroy);
246
if (priv->monitors_changed_id != 0) {
247
GdkScreen *screen = gdk_screen_get_default ();
249
g_signal_handler_disconnect (screen, priv->monitors_changed_id);
250
priv->monitors_changed_id = 0;
253
if (priv->gtk_xft_dpi_id != 0) {
254
GtkSettings *settings = gtk_settings_get_default ();
256
g_signal_handler_disconnect (settings, priv->gtk_xft_dpi_id);
257
priv->gtk_xft_dpi_id = 0;
128
260
G_OBJECT_CLASS (gwd_theme_parent_class)->dispose (object);
260
402
object_class->get_property = gwd_theme_get_property;
261
403
object_class->set_property = gwd_theme_set_property;
405
theme_class->dpi_changed = gwd_theme_real_dpi_changed;
406
theme_class->scale_changed = gwd_theme_real_scale_changed;
263
407
theme_class->style_updated = gwd_theme_real_style_updated;
264
408
theme_class->get_shadow = gwd_theme_real_get_shadow;
265
409
theme_class->draw_window_decoration = gwd_theme_real_draw_window_decoration;