summaryrefslogtreecommitdiff
path: root/gtk/gtkcsslookup.c
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2011-12-28 22:59:55 +0100
committerBenjamin Otte <otte@redhat.com>2012-01-09 18:37:50 +0100
commitba5e7012b1c4cec7f3cfcee662273d4b960e497d (patch)
tree1b7b5829f2b5711a7c1dd657fcc530c2122a8e6a /gtk/gtkcsslookup.c
parent38a9b28a0edfdf8fd6749815bfc3c8edf457e3ec (diff)
downloadgtk+-ba5e7012b1c4cec7f3cfcee662273d4b960e497d.tar.gz
css: Redo StyleProvider interface
We now use the GtkStleProviderPrivate interface, which hopefully is faster and more conformant to CSS. Long term, it definitely should be both. I would have liked to split this up into multiple commits, but couldn't find a way.
Diffstat (limited to 'gtk/gtkcsslookup.c')
-rw-r--r--gtk/gtkcsslookup.c107
1 files changed, 107 insertions, 0 deletions
diff --git a/gtk/gtkcsslookup.c b/gtk/gtkcsslookup.c
new file mode 100644
index 0000000000..a1e4247283
--- /dev/null
+++ b/gtk/gtkcsslookup.c
@@ -0,0 +1,107 @@
+/* GTK - The GIMP Toolkit
+ * Copyright (C) 2011 Benjamin Otte <otte@gnome.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "gtkcsslookupprivate.h"
+
+#include "gtkstylepropertyprivate.h"
+#include "gtkstylepropertiesprivate.h"
+
+struct _GtkCssLookup {
+ GtkBitmask *missing;
+ const GValue *values[1];
+};
+
+GtkCssLookup *
+_gtk_css_lookup_new (void)
+{
+ GtkCssLookup *lookup;
+ guint n = _gtk_style_property_get_count ();
+
+ lookup = g_malloc0 (sizeof (GtkCssLookup) + sizeof (const GValue *) * n);
+ lookup->missing = _gtk_bitmask_new ();
+ _gtk_bitmask_invert_range (lookup->missing, 0, n);
+
+ return lookup;
+}
+
+void
+_gtk_css_lookup_free (GtkCssLookup *lookup)
+{
+ g_return_if_fail (lookup != NULL);
+
+ _gtk_bitmask_free (lookup->missing);
+ g_free (lookup);
+}
+
+const GtkBitmask *
+_gtk_css_lookup_get_missing (const GtkCssLookup *lookup)
+{
+ g_return_val_if_fail (lookup != NULL, NULL);
+
+ return lookup->missing;
+}
+
+gboolean
+_gtk_css_lookup_is_missing (const GtkCssLookup *lookup,
+ guint id)
+{
+ g_return_val_if_fail (lookup != NULL, FALSE);
+
+ return lookup->values[id] == NULL;
+}
+
+void
+_gtk_css_lookup_set (GtkCssLookup *lookup,
+ guint id,
+ const GValue *value)
+{
+ g_return_if_fail (lookup != NULL);
+ g_return_if_fail (_gtk_bitmask_get (lookup->missing, id));
+ g_return_if_fail (value != NULL);
+
+ _gtk_bitmask_set (lookup->missing, id, FALSE);
+ lookup->values[id] = value;
+}
+
+GtkStyleProperties *
+_gtk_css_lookup_resolve (GtkCssLookup *lookup)
+{
+ GtkStyleProperties *props;
+ guint i, n;
+
+ g_return_val_if_fail (lookup != NULL, NULL);
+
+ n = _gtk_style_property_get_count ();
+ props = gtk_style_properties_new ();
+
+ for (i = 0; i < n; i++)
+ {
+ if (lookup->values[i] == NULL)
+ continue;
+
+ _gtk_style_properties_set_property_by_property (props,
+ _gtk_style_property_get (i),
+ 0,
+ lookup->values[i]);
+ }
+
+ return props;
+}