[gnome-builder] css: queue style reloading until end of main loop
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] css: queue style reloading until end of main loop
- Date: Thu, 12 May 2016 15:08:49 +0000 (UTC)
commit e592e42c3f07e7fd3a90ca54a2125633a833b387
Author: Christian Hergert <chergert redhat com>
Date: Thu May 12 18:08:36 2016 +0300
css: queue style reloading until end of main loop
This actually turns out to be spinning a bit lately, at least under
valgrind, due to spurious notify or something.
libide/ide-css-provider.c | 40 +++++++++++++++++++++++++++++++---------
1 files changed, 31 insertions(+), 9 deletions(-)
---
diff --git a/libide/ide-css-provider.c b/libide/ide-css-provider.c
index add98be..33f1a8b 100644
--- a/libide/ide-css-provider.c
+++ b/libide/ide-css-provider.c
@@ -26,8 +26,8 @@
struct _IdeCssProvider
{
GtkCssProvider parent_instance;
- GtkSettings *settings;
gchar *base_path;
+ guint queued_update;
};
G_DEFINE_TYPE (IdeCssProvider, ide_css_provider, GTK_TYPE_CSS_PROVIDER)
@@ -53,12 +53,12 @@ ide_css_provider_update (IdeCssProvider *self)
{
g_autofree gchar *theme_name = NULL;
g_autofree gchar *resource_path = NULL;
+ GtkSettings *settings = gtk_settings_get_default ();
gboolean prefer_dark_theme = FALSE;
gsize len = 0;
guint32 flags = 0;
g_assert (IDE_IS_CSS_PROVIDER (self));
- g_assert (GTK_IS_SETTINGS (self->settings));
if ((theme_name = g_strdup(g_getenv ("GTK_THEME"))))
{
@@ -75,7 +75,7 @@ ide_css_provider_update (IdeCssProvider *self)
}
else
{
- g_object_get (self->settings,
+ g_object_get (settings,
"gtk-theme-name", &theme_name,
"gtk-application-prefer-dark-theme", &prefer_dark_theme,
NULL);
@@ -100,6 +100,28 @@ ide_css_provider_update (IdeCssProvider *self)
gtk_css_provider_load_from_resource (GTK_CSS_PROVIDER (self), resource_path);
}
+static gboolean
+ide_css_provider_do_update (gpointer user_data)
+{
+ IdeCssProvider *self = user_data;
+
+ g_assert (IDE_IS_CSS_PROVIDER (self));
+
+ self->queued_update = 0;
+ ide_css_provider_update (self);
+
+ return G_SOURCE_REMOVE;
+}
+
+static void
+ide_css_provider_queue_update (IdeCssProvider *self)
+{
+ g_assert (IDE_IS_CSS_PROVIDER (self));
+
+ if (self->queued_update == 0)
+ self->queued_update = g_timeout_add (0, ide_css_provider_do_update, self);
+}
+
static void
ide_css_provider__settings_notify_gtk_theme_name (IdeCssProvider *self,
GParamSpec *pspec,
@@ -107,7 +129,7 @@ ide_css_provider__settings_notify_gtk_theme_name (IdeCssProvider *self,
{
g_assert (IDE_IS_CSS_PROVIDER (self));
- ide_css_provider_update (self);
+ ide_css_provider_queue_update (self);
}
static void
@@ -117,7 +139,7 @@ ide_css_provider__settings_notify_gtk_application_prefer_dark_theme (IdeCssProvi
{
g_assert (IDE_IS_CSS_PROVIDER (self));
- ide_css_provider_update (self);
+ ide_css_provider_queue_update (self);
}
static void
@@ -151,18 +173,19 @@ static void
ide_css_provider_constructed (GObject *object)
{
IdeCssProvider *self = (IdeCssProvider *)object;
+ GtkSettings *settings;
G_OBJECT_CLASS (ide_css_provider_parent_class)->constructed (object);
- self->settings = g_object_ref (gtk_settings_get_default ());
+ settings = gtk_settings_get_default ();
- g_signal_connect_object (self->settings,
+ g_signal_connect_object (settings,
"notify::gtk-theme-name",
G_CALLBACK (ide_css_provider__settings_notify_gtk_theme_name),
self,
G_CONNECT_SWAPPED);
- g_signal_connect_object (self->settings,
+ g_signal_connect_object (settings,
"notify::gtk-application-prefer-dark-theme",
G_CALLBACK (ide_css_provider__settings_notify_gtk_application_prefer_dark_theme),
self,
@@ -176,7 +199,6 @@ ide_css_provider_finalize (GObject *object)
{
IdeCssProvider *self = (IdeCssProvider *)object;
- g_clear_object (&self->settings);
g_clear_pointer (&self->base_path, g_free);
G_OBJECT_CLASS (ide_css_provider_parent_class)->finalize (object);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]