diff options
| author | Victor Kareh <[email protected]> | 2025-10-06 14:18:54 -0400 |
|---|---|---|
| committer | Luke from DC <[email protected]> | 2025-10-06 21:07:51 +0000 |
| commit | 511eb4de5bc1b3f5881400b7f6ee9c642ab686cf (patch) | |
| tree | d7032dd868ce0719eccced29413316ed2c8970ec | |
| parent | f5c64ffdd4c6f84de21ea9208d5baa14e1649b23 (diff) | |
| download | mate-panel-511eb4de5bc1b3f5881400b7f6ee9c642ab686cf.tar.bz2 mate-panel-511eb4de5bc1b3f5881400b7f6ee9c642ab686cf.tar.xz | |
button-widget: Add dynamic HiDPI scale change support
Launcher buttons now respond to HiDPI scale factor changes to ensure
icons are reloaded at the new scale when settings change without having
to restart.
| -rw-r--r-- | mate-panel/button-widget.c | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/mate-panel/button-widget.c b/mate-panel/button-widget.c index 00753b99..d306e494 100644 --- a/mate-panel/button-widget.c +++ b/mate-panel/button-widget.c @@ -34,10 +34,13 @@ struct _ButtonWidgetPrivate { guint arrow : 1; guint dnd_highlight : 1; gboolean needs_move; + + gulong scale_changed_handler; }; static void button_widget_icon_theme_changed (ButtonWidget *button); static void button_widget_reload_surface (ButtonWidget *button); +static void button_widget_on_scale_changed (GtkWidget *widget, GParamSpec *pspec, gpointer user_data); enum { PROP_0, @@ -118,29 +121,43 @@ make_hc_surface (cairo_surface_t *surface) static void button_widget_realize(GtkWidget *widget) { + ButtonWidget *button = BUTTON_WIDGET (widget); + gtk_widget_add_events (widget, GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_KEY_PRESS_MASK); GTK_WIDGET_CLASS (button_widget_parent_class)->realize (widget); - BUTTON_WIDGET (widget)->priv->icon_theme = gtk_icon_theme_get_for_screen (gtk_widget_get_screen (widget)); - g_signal_connect_object (BUTTON_WIDGET (widget)->priv->icon_theme, + button->priv->icon_theme = gtk_icon_theme_get_for_screen (gtk_widget_get_screen (widget)); + g_signal_connect_object (button->priv->icon_theme, "changed", G_CALLBACK (button_widget_icon_theme_changed), widget, G_CONNECT_SWAPPED); - button_widget_reload_surface (BUTTON_WIDGET (widget)); + button->priv->scale_changed_handler = g_signal_connect (widget, + "notify::scale-factor", + G_CALLBACK (button_widget_on_scale_changed), + NULL); + + button_widget_reload_surface (button); } static void button_widget_unrealize (GtkWidget *widget) { - g_signal_handlers_disconnect_by_func (BUTTON_WIDGET (widget)->priv->icon_theme, + ButtonWidget *button = BUTTON_WIDGET (widget); + + g_signal_handlers_disconnect_by_func (button->priv->icon_theme, G_CALLBACK (button_widget_icon_theme_changed), widget); + if (button->priv->scale_changed_handler) { + g_signal_handler_disconnect (widget, button->priv->scale_changed_handler); + button->priv->scale_changed_handler = 0; + } + GTK_WIDGET_CLASS (button_widget_parent_class)->unrealize (widget); } @@ -236,6 +253,17 @@ button_widget_icon_theme_changed (ButtonWidget *button) } static void +button_widget_on_scale_changed (GtkWidget *widget, + GParamSpec *pspec, + gpointer user_data) +{ + ButtonWidget *button = BUTTON_WIDGET (widget); + + /* Reload surfaces at the new scale factor */ + button_widget_reload_surface (button); +} + +static void button_widget_finalize (GObject *object) { ButtonWidget *button = (ButtonWidget *) object; @@ -656,6 +684,8 @@ button_widget_init (ButtonWidget *button) button->priv->ignore_leave = FALSE; button->priv->arrow = FALSE; button->priv->dnd_highlight = FALSE; + + button->priv->scale_changed_handler = 0; } static void |
