summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVictor Kareh <[email protected]>2025-10-06 14:18:54 -0400
committerLuke from DC <[email protected]>2025-10-06 21:07:51 +0000
commit511eb4de5bc1b3f5881400b7f6ee9c642ab686cf (patch)
treed7032dd868ce0719eccced29413316ed2c8970ec
parentf5c64ffdd4c6f84de21ea9208d5baa14e1649b23 (diff)
downloadmate-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.c38
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