[gdl] Replace deprecated GRelation API
- From: Johannes Schmid <jhs src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gdl] Replace deprecated GRelation API
- Date: Sun, 26 Feb 2012 11:36:52 +0000 (UTC)
commit ff89f1899e68bf16e333d06d7856a1a361de3c45
Author: Alex Valavanis <a valavanis leeds ac uk>
Date: Sat Feb 25 16:42:12 2012 +0000
Replace deprecated GRelation API
gdl/gdl-dock-object.c | 119 +++++++++++++++++++++++++++++++++++--------------
1 files changed, 86 insertions(+), 33 deletions(-)
---
diff --git a/gdl/gdl-dock-object.c b/gdl/gdl-dock-object.c
index 53f53a4..6e67583 100644
--- a/gdl/gdl-dock-object.c
+++ b/gdl/gdl-dock-object.c
@@ -92,6 +92,13 @@ enum {
static guint gdl_dock_object_signals [LAST_SIGNAL] = { 0 };
+struct DockRegisterItem {
+ gchar* nick;
+ gpointer type;
+};
+
+static GArray *dock_register = NULL;
+
/* ----- Private interface ----- */
G_DEFINE_TYPE (GdlDockObject, gdl_dock_object, GTK_TYPE_CONTAINER);
@@ -885,65 +892,93 @@ gdl_dock_param_get_type (void)
/* -------------- nick <-> type conversion functions --------------- */
-static GRelation *dock_register = NULL;
-
-enum {
- INDEX_NICK = 0,
- INDEX_TYPE
-};
-
static void
gdl_dock_object_register_init (void)
{
+ const size_t n_default = 5;
+ guint i = 0;
+ struct DockRegisterItem default_items[n_default];
+
if (dock_register)
return;
-
- /* FIXME: i don't know if GRelation is efficient */
- dock_register = g_relation_new (2);
- g_relation_index (dock_register, INDEX_NICK, g_str_hash, g_str_equal);
- g_relation_index (dock_register, INDEX_TYPE, g_direct_hash, g_direct_equal);
+ dock_register
+ = g_array_new (FALSE, FALSE, sizeof (struct DockRegisterItem));
+
/* add known types */
- g_relation_insert (dock_register, "dock", (gpointer) GDL_TYPE_DOCK);
- g_relation_insert (dock_register, "item", (gpointer) GDL_TYPE_DOCK_ITEM);
- g_relation_insert (dock_register, "paned", (gpointer) GDL_TYPE_DOCK_PANED);
- g_relation_insert (dock_register, "notebook", (gpointer) GDL_TYPE_DOCK_NOTEBOOK);
- g_relation_insert (dock_register, "placeholder", (gpointer) GDL_TYPE_DOCK_PLACEHOLDER);
+ default_items[0].nick = "dock";
+ default_items[0].type = (gpointer) GDL_TYPE_DOCK;
+ default_items[1].nick = "item";
+ default_items[1].type = (gpointer) GDL_TYPE_DOCK_ITEM;
+ default_items[2].nick = "paned";
+ default_items[2].type = (gpointer) GDL_TYPE_DOCK_PANED;
+ default_items[3].nick = "notebook";
+ default_items[3].type = (gpointer) GDL_TYPE_DOCK_NOTEBOOK;
+ default_items[4].nick = "placeholder";
+ default_items[4].type = (gpointer) GDL_TYPE_DOCK_PLACEHOLDER;
+
+ for (i = 0; i < n_default; i++)
+ g_array_append_val (dock_register, default_items[i]);
}
+/**
+ * gdl_dock_object_nick_from_type:
+ * @type: The type for which to find the nickname
+ *
+ * Finds the nickname for a given type
+ *
+ * Returns: If the object has a nickname, then it is returned.
+ * Otherwise, the type name.
+ */
const gchar *
gdl_dock_object_nick_from_type (GType type)
{
- GTuples *tuples;
gchar *nick = NULL;
+ guint i = 0;
if (!dock_register)
gdl_dock_object_register_init ();
- if (g_relation_count (dock_register, (gpointer) type, INDEX_TYPE) > 0) {
- tuples = g_relation_select (dock_register, (gpointer) type, INDEX_TYPE);
- nick = (gchar *) g_tuples_index (tuples, 0, INDEX_NICK);
- g_tuples_destroy (tuples);
+ for (i=0; i < dock_register->len; i++) {
+ struct DockRegisterItem item
+ = g_array_index (dock_register, struct DockRegisterItem, i);
+
+ if (g_direct_equal (item.type, (gpointer) type))
+ nick = g_strdup (item.nick);
}
return nick ? nick : g_type_name (type);
}
+/**
+ * gdl_dock_object_type_from_nick:
+ * @nick: The nickname for the object type
+ *
+ * Finds the object type assigned to a given nickname.
+ *
+ * Returns: If the nickname has previously been assigned, then the corresponding
+ * object type is returned. Otherwise, %G_TYPE_NONE.
+ */
GType
gdl_dock_object_type_from_nick (const gchar *nick)
{
- GTuples *tuples;
GType type = G_TYPE_NONE;
+ gboolean nick_is_in_register = FALSE;
+ guint i = 0;
if (!dock_register)
gdl_dock_object_register_init ();
- if (g_relation_count (dock_register, (gpointer) nick, INDEX_NICK) > 0) {
- tuples = g_relation_select (dock_register, (gpointer) nick, INDEX_NICK);
- type = (GType) g_tuples_index (tuples, 0, INDEX_TYPE);
- g_tuples_destroy (tuples);
+ for (i = 0; i < dock_register->len; i++) {
+ struct DockRegisterItem item
+ = g_array_index (dock_register, struct DockRegisterItem, i);
+
+ if (!g_strcmp0 (nick, item.nick)) {
+ nick_is_in_register = TRUE;
+ type = (GType) item.type;
+ }
}
- else {
+ if (!nick_is_in_register) {
/* try searching in the glib type system */
type = g_type_from_name (nick);
}
@@ -951,23 +986,41 @@ gdl_dock_object_type_from_nick (const gchar *nick)
return type;
}
+/**
+ * gdl_dock_object_set_type_for_nick:
+ * @nick: The nickname for the object type
+ * @type: The object type
+ *
+ * Assigns an object type to a given nickname. If the nickname already exists,
+ * then it reassigns it to a new object type.
+ *
+ * Returns: If the nick was previously assigned, the old type is returned.
+ * Otherwise, %G_TYPE_NONE.
+ */
GType
gdl_dock_object_set_type_for_nick (const gchar *nick,
GType type)
{
GType old_type = G_TYPE_NONE;
+ guint i = 0;
+ struct DockRegisterItem new_item;
+ new_item.nick = g_strdup(nick);
+ new_item.type = (gpointer) type;
if (!dock_register)
gdl_dock_object_register_init ();
g_return_val_if_fail (g_type_is_a (type, GDL_TYPE_DOCK_OBJECT), G_TYPE_NONE);
- if (g_relation_count (dock_register, (gpointer) nick, INDEX_NICK) > 0) {
- old_type = gdl_dock_object_type_from_nick (nick);
- g_relation_delete (dock_register, (gpointer) nick, INDEX_NICK);
+ for (i = 0; i < dock_register->len; i++) {
+ struct DockRegisterItem item
+ = g_array_index (dock_register, struct DockRegisterItem, i);
+
+ if (!g_strcmp0 (nick, item.nick)) {
+ old_type = (GType) item.type;
+ g_array_insert_val (dock_register, i, new_item);
+ }
}
-
- g_relation_insert (dock_register, nick, type);
return old_type;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]