[gtk+/gtk-style-context: 71/191] GtkWidgetPath: Add API for named regions.
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/gtk-style-context: 71/191] GtkWidgetPath: Add API for named regions.
- Date: Tue, 17 Aug 2010 13:54:10 +0000 (UTC)
commit 8af0a1d20041dc40e521bcf45bb53b3c88e47dca
Author: Carlos Garnacho <carlosg gnome org>
Date: Wed Apr 21 01:35:54 2010 +0200
GtkWidgetPath: Add API for named regions.
gtk/gtkwidgetpath.c | 130 +++++++++++++++++++++++++++++++++++++++++++++++++++
gtk/gtkwidgetpath.h | 18 +++++++
2 files changed, 148 insertions(+), 0 deletions(-)
---
diff --git a/gtk/gtkwidgetpath.c b/gtk/gtkwidgetpath.c
index a6cfccc..2573273 100644
--- a/gtk/gtkwidgetpath.c
+++ b/gtk/gtkwidgetpath.c
@@ -30,6 +30,7 @@ struct GtkPathElement
{
GType type;
gchar *name;
+ GHashTable *regions;
};
struct GtkWidgetPath
@@ -67,6 +68,23 @@ gtk_widget_path_copy (const GtkWidgetPath *path)
new.type = elem->type;
new.name = g_strdup (elem->name);
+ if (elem->regions)
+ {
+ GHashTableIter iter;
+ gpointer key, value;
+
+ g_hash_table_iter_init (&iter, elem->regions);
+ new.regions = g_hash_table_new_full (g_str_hash,
+ g_str_equal,
+ (GDestroyNotify) g_free,
+ NULL);
+
+ while (g_hash_table_iter_next (&iter, &key, &value))
+ g_hash_table_insert (new.regions,
+ g_strdup ((const gchar *) key),
+ value);
+ }
+
g_array_append_val (new_path->elems, new);
}
@@ -86,6 +104,9 @@ gtk_widget_path_free (GtkWidgetPath *path)
elem = &g_array_index (path->elems, GtkPathElement, i);
g_free (elem->name);
+
+ if (elem->regions)
+ g_hash_table_destroy (elem->regions);
}
g_array_free (path->elems, TRUE);
@@ -175,6 +196,115 @@ gtk_widget_path_set_element_name (GtkWidgetPath *path,
elem->name = g_strdup (name);
}
+void
+gtk_widget_path_iter_add_region (GtkWidgetPath *path,
+ guint pos,
+ const gchar *name,
+ GtkChildClassFlags flags)
+{
+ GtkPathElement *elem;
+
+ g_return_if_fail (path != NULL);
+ g_return_if_fail (pos < path->elems->len);
+ g_return_if_fail (name != NULL);
+
+ elem = &g_array_index (path->elems, GtkPathElement, pos);
+
+ if (!elem->regions)
+ elem->regions = g_hash_table_new_full (g_str_hash,
+ g_str_equal,
+ (GDestroyNotify) g_free,
+ NULL);
+
+ g_hash_table_insert (elem->regions,
+ g_strdup (name),
+ GUINT_TO_POINTER (flags));
+}
+
+void
+gtk_widget_path_iter_remove_region (GtkWidgetPath *path,
+ guint pos,
+ const gchar *name)
+{
+ GtkPathElement *elem;
+
+ g_return_if_fail (path != NULL);
+ g_return_if_fail (pos < path->elems->len);
+ g_return_if_fail (name != NULL);
+
+ elem = &g_array_index (path->elems, GtkPathElement, pos);
+
+ if (elem->regions)
+ g_hash_table_remove (elem->regions, name);
+}
+
+void
+gtk_widget_path_iter_clear_regions (GtkWidgetPath *path,
+ guint pos)
+{
+ GtkPathElement *elem;
+
+ g_return_if_fail (path != NULL);
+ g_return_if_fail (pos < path->elems->len);
+
+ elem = &g_array_index (path->elems, GtkPathElement, pos);
+
+ if (elem->regions)
+ g_hash_table_remove_all (elem->regions);
+}
+
+GSList *
+gtk_widget_path_iter_list_regions (GtkWidgetPath *path,
+ guint pos)
+{
+ GtkPathElement *elem;
+ GHashTableIter iter;
+ GSList *list = NULL;
+ gpointer key;
+
+ g_return_val_if_fail (path != NULL, NULL);
+ g_return_val_if_fail (pos < path->elems->len, NULL);
+
+ elem = &g_array_index (path->elems, GtkPathElement, pos);
+
+ if (!elem->regions)
+ return NULL;
+
+ g_hash_table_iter_init (&iter, elem->regions);
+
+ while (g_hash_table_iter_next (&iter, &key, NULL))
+ list = g_slist_prepend (list, key);
+
+ return list;
+}
+
+gboolean
+gtk_widget_path_iter_has_region (GtkWidgetPath *path,
+ guint pos,
+ const gchar *name,
+ GtkChildClassFlags *flags)
+{
+ GtkPathElement *elem;
+ gpointer value;
+
+ g_return_val_if_fail (path != NULL, FALSE);
+ g_return_val_if_fail (pos < path->elems->len, FALSE);
+ g_return_val_if_fail (name != NULL, FALSE);
+
+ elem = &g_array_index (path->elems, GtkPathElement, pos);
+
+ if (!elem->regions)
+ return FALSE;
+
+ if (!g_hash_table_lookup_extended (elem->regions, name, NULL, &value))
+ return FALSE;
+
+ if (flags)
+ *flags = GPOINTER_TO_UINT (value);
+
+ return TRUE;
+}
+
gboolean
gtk_widget_path_has_parent (const GtkWidgetPath *path,
GType type)
diff --git a/gtk/gtkwidgetpath.h b/gtk/gtkwidgetpath.h
index 3846988..7020c82 100644
--- a/gtk/gtkwidgetpath.h
+++ b/gtk/gtkwidgetpath.h
@@ -50,6 +50,24 @@ void gtk_widget_path_set_element_name (GtkWidgetPath *path,
guint pos,
const gchar *name);
+void gtk_widget_path_iter_add_region (GtkWidgetPath *path,
+ guint pos,
+ const gchar *name,
+ GtkChildClassFlags flags);
+void gtk_widget_path_iter_remove_region (GtkWidgetPath *path,
+ guint pos,
+ const gchar *name);
+void gtk_widget_path_iter_clear_regions (GtkWidgetPath *path,
+ guint pos);
+
+GSList * gtk_widget_path_iter_list_regions (GtkWidgetPath *path,
+ guint pos);
+
+gboolean gtk_widget_path_iter_has_region (GtkWidgetPath *path,
+ guint pos,
+ const gchar *name,
+ GtkChildClassFlags *flags);
+
gboolean gtk_widget_path_has_parent (const GtkWidgetPath *path,
GType type);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]