[nautilus/wip/antoniof/gnome-42: 40/72] Revert "pathbar: Stop overriding GtkWidget.style_updated() and .screen_changed()"
- From: António Fernandes <antoniof src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [nautilus/wip/antoniof/gnome-42: 40/72] Revert "pathbar: Stop overriding GtkWidget.style_updated() and .screen_changed()"
- Date: Fri, 11 Feb 2022 19:28:00 +0000 (UTC)
commit 2e2a3931f355db1e0c4a8ba1356005c73c30efff
Author: António Fernandes <antoniof gnome org>
Date: Fri Feb 11 19:01:49 2022 +0000
Revert "pathbar: Stop overriding GtkWidget.style_updated() and .screen_changed()"
This reverts commit 21a7835915955fb66044a5edd20fbd39bb8fdee7.
src/nautilus-pathbar.c | 102 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 102 insertions(+)
---
diff --git a/src/nautilus-pathbar.c b/src/nautilus-pathbar.c
index 9c95f67de..93842c5eb 100644
--- a/src/nautilus-pathbar.c
+++ b/src/nautilus-pathbar.c
@@ -95,6 +95,7 @@ struct _NautilusPathBar
gpointer current_button_data;
GList *button_list;
+ gulong settings_signal_id;
GActionGroup *action_group;
@@ -110,6 +111,9 @@ struct _NautilusPathBar
G_DEFINE_TYPE (NautilusPathBar, nautilus_path_bar, GTK_TYPE_BOX);
+static void nautilus_path_bar_check_icon_theme (NautilusPathBar *self);
+static void nautilus_path_bar_update_button_appearance (ButtonData *button_data,
+ gboolean current_dir);
static void nautilus_path_bar_update_button_state (ButtonData *button_data,
gboolean current_dir);
static void nautilus_path_bar_update_path (NautilusPathBar *self,
@@ -318,9 +322,27 @@ nautilus_path_bar_finalize (GObject *object)
G_OBJECT_CLASS (nautilus_path_bar_parent_class)->finalize (object);
}
+/* Removes the settings signal handler. It's safe to call multiple times */
+static void
+remove_settings_signal (NautilusPathBar *self,
+ GdkScreen *screen)
+{
+ GtkSettings *settings;
+
+ settings = gtk_settings_get_for_screen (screen);
+
+ g_clear_signal_handler (&self->settings_signal_id, settings);
+}
+
static void
nautilus_path_bar_dispose (GObject *object)
{
+ NautilusPathBar *self;
+
+ self = NAUTILUS_PATH_BAR (object);
+
+ remove_settings_signal (self, gtk_widget_get_screen (GTK_WIDGET (object)));
+
G_OBJECT_CLASS (nautilus_path_bar_parent_class)->dispose (object);
}
@@ -365,6 +387,30 @@ get_dir_name (ButtonData *button_data)
}
}
+static void
+nautilus_path_bar_style_updated (GtkWidget *widget)
+{
+ GTK_WIDGET_CLASS (nautilus_path_bar_parent_class)->style_updated (widget);
+
+ nautilus_path_bar_check_icon_theme (NAUTILUS_PATH_BAR (widget));
+}
+
+static void
+nautilus_path_bar_screen_changed (GtkWidget *widget,
+ GdkScreen *previous_screen)
+{
+ if (GTK_WIDGET_CLASS (nautilus_path_bar_parent_class)->screen_changed)
+ {
+ GTK_WIDGET_CLASS (nautilus_path_bar_parent_class)->screen_changed (widget, previous_screen);
+ }
+ /* We might nave a new settings, so we remove the old one */
+ if (previous_screen)
+ {
+ remove_settings_signal (NAUTILUS_PATH_BAR (widget), previous_screen);
+ }
+ nautilus_path_bar_check_icon_theme (NAUTILUS_PATH_BAR (widget));
+}
+
static void
button_data_free (ButtonData *button_data)
{
@@ -387,12 +433,17 @@ static void
nautilus_path_bar_class_init (NautilusPathBarClass *path_bar_class)
{
GObjectClass *gobject_class;
+ GtkWidgetClass *widget_class;
gobject_class = (GObjectClass *) path_bar_class;
+ widget_class = (GtkWidgetClass *) path_bar_class;
gobject_class->finalize = nautilus_path_bar_finalize;
gobject_class->dispose = nautilus_path_bar_dispose;
+ widget_class->style_updated = nautilus_path_bar_style_updated;
+ widget_class->screen_changed = nautilus_path_bar_screen_changed;
+
path_bar_signals [OPEN_LOCATION] =
g_signal_new ("open-location",
G_OBJECT_CLASS_TYPE (path_bar_class),
@@ -432,6 +483,57 @@ nautilus_path_bar_set_templates_menu (NautilusPathBar *self,
g_idle_add ((GSourceFunc) bind_current_view_menu_model_to_popover, self);
}
+/* Changes the icons wherever it is needed */
+static void
+reload_icons (NautilusPathBar *self)
+{
+ GList *list;
+
+ for (list = self->button_list; list; list = list->next)
+ {
+ ButtonData *button_data;
+
+ button_data = BUTTON_DATA (list->data);
+ if (button_data->type != NORMAL_BUTTON || button_data->is_root)
+ {
+ nautilus_path_bar_update_button_appearance (button_data,
+ list->next == NULL);
+ }
+ }
+}
+
+/* Callback used when a GtkSettings value changes */
+static void
+settings_notify_cb (GObject *object,
+ GParamSpec *pspec,
+ NautilusPathBar *self)
+{
+ const char *name;
+
+ name = g_param_spec_get_name (pspec);
+
+ if (!strcmp (name, "gtk-icon-theme-name") || !strcmp (name, "gtk-icon-sizes"))
+ {
+ reload_icons (self);
+ }
+}
+
+static void
+nautilus_path_bar_check_icon_theme (NautilusPathBar *self)
+{
+ GtkSettings *settings;
+
+ if (self->settings_signal_id)
+ {
+ return;
+ }
+
+ settings = gtk_settings_get_for_screen (gtk_widget_get_screen (GTK_WIDGET (self)));
+ self->settings_signal_id = g_signal_connect (settings, "notify", G_CALLBACK (settings_notify_cb), self);
+
+ reload_icons (self);
+}
+
/* Public functions and their helpers */
static void
nautilus_path_bar_clear_buttons (NautilusPathBar *self)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]