From 511eb4de5bc1b3f5881400b7f6ee9c642ab686cf Mon Sep 17 00:00:00 2001 From: Victor Kareh Date: Mon, 6 Oct 2025 14:18:54 -0400 Subject: 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. --- mate-panel/button-widget.c | 38 ++++++++++++++++++++++++++++++++++---- 1 file 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); } @@ -235,6 +252,17 @@ button_widget_icon_theme_changed (ButtonWidget *button) button_widget_reload_surface (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) { @@ -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 -- cgit v1.2.1