From cecce1cf6a6be8eb707462a5b2c80124fc84e7c7 Mon Sep 17 00:00:00 2001 From: Padraig O'Briain Date: Tue, 4 Dec 2001 17:12:48 +0000 Subject: [PATCH] Update atk_role_register() to allow extra roles to be defined Update * atk/atkobject.c: Update atk_role_register() to allow extra roles to be defined Update atk_role_get_name() and atk_role_for_name() for newly defined roles * tests/testrelation.c: Add tests for roles --- ChangeLog | 10 ++++++++ atk/atkobject.c | 47 +++++++++++++++++++++++++++-------- tests/testrelation.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 115 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index a4493f0..39ee883 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2001-12-04 Padraig O'Briain + + * atk/atkobject.c: + Update atk_role_register() to allow extra roles to be defined + Update atk_role_get_name() and atk_role_for_name() for newly defined + roles + + * tests/testrelation.c: + Add tests for roles + 2001-12-03 Padraig O'Briain * atk/atkrelation.c: diff --git a/atk/atkobject.c b/atk/atkobject.c index 81ac0e1..c762db7 100755 --- a/atk/atkobject.c +++ b/atk/atkobject.c @@ -25,6 +25,8 @@ #include "atkmarshal.h" #include "atk-enum-types.h" +GPtrArray *extra_roles = NULL; + enum { PROP_0, /* gobject convention */ @@ -521,9 +523,11 @@ atk_object_ref_relation_set (AtkObject *accessible) AtkRole atk_role_register (const gchar *name) { - /* TODO: associate name with new type */ - static guint type = ATK_ROLE_LAST_DEFINED; - return (++type); + if (!extra_roles) + extra_roles = g_ptr_array_new (); + + g_ptr_array_add (extra_roles, g_strdup (name)); + return extra_roles->len + ATK_ROLE_LAST_DEFINED; } /** @@ -1082,7 +1086,7 @@ atk_role_get_name (AtkRole role) { GTypeClass *type_class; GEnumValue *value; - gchar *name; + gchar *name = NULL; type_class = g_type_class_ref (ATK_TYPE_ROLE); g_return_val_if_fail (G_IS_ENUM_CLASS (type_class), NULL); @@ -1091,12 +1095,19 @@ atk_role_get_name (AtkRole role) if (value) { - name = value->value_name; + name = value->value_nick; } else { - value = g_enum_get_value (G_ENUM_CLASS (type_class), ATK_ROLE_INVALID); - name = value->value_name; + if (extra_roles) + { + gint n = role; + + n -= ATK_ROLE_LAST_DEFINED + 1; + + if (n < extra_roles->len) + name = g_ptr_array_index (extra_roles, n); + } } g_type_class_unref (type_class); return name; @@ -1117,14 +1128,14 @@ atk_role_for_name (const gchar *name) { GTypeClass *type_class; GEnumValue *value; - AtkRole role; + AtkRole role = ATK_ROLE_INVALID; g_return_val_if_fail (name, ATK_ROLE_INVALID); type_class = g_type_class_ref (ATK_TYPE_ROLE); g_return_val_if_fail (G_IS_ENUM_CLASS (type_class), ATK_ROLE_INVALID); - value = g_enum_get_value_by_name (G_ENUM_CLASS (type_class), name); + value = g_enum_get_value_by_nick (G_ENUM_CLASS (type_class), name); if (value) { @@ -1132,7 +1143,23 @@ atk_role_for_name (const gchar *name) } else { - role = ATK_ROLE_INVALID; + gint i; + + if (extra_roles) + { + for (i = 0; i < extra_roles->len; i++) + { + gchar *extra_role = (gchar *)g_ptr_array_index (extra_roles, i); + + g_return_val_if_fail (extra_role, ATK_ROLE_INVALID); + + if (strcmp (name, extra_role) == 0) + { + role = i + 1 + ATK_ROLE_LAST_DEFINED; + break; + } + } + } } g_type_class_unref (type_class); diff --git a/tests/testrelation.c b/tests/testrelation.c index 26907fa..6ea90ac 100644 --- a/tests/testrelation.c +++ b/tests/testrelation.c @@ -22,6 +22,7 @@ #include static gboolean test_relation (void); +static gboolean test_role (void); static gboolean test_relation (void) @@ -41,7 +42,7 @@ test_relation (void) g_return_val_if_fail (name, FALSE); if (strcmp (name, "node-child-of") != 0) { - g_print ("Unexpected name for ATK_STATE_MODAL %s\n", name); + g_print ("Unexpected name for ATK_RELATION_NODE_CHILD_OF %s\n", name); return FALSE; } @@ -84,6 +85,67 @@ test_relation (void) return TRUE; } +static gboolean +test_role (void) +{ + AtkRole role1, role2; + G_CONST_RETURN gchar *name; + + name = atk_role_get_name (ATK_ROLE_PAGE_TAB); + g_return_val_if_fail (name, FALSE); + if (strcmp (name, "page-tab") != 0) + { + g_print ("Unexpected name for ATK_ROLE_PAGE_TAB %s\n", name); + return FALSE; + } + + name = atk_role_get_name (ATK_ROLE_LAYERED_PANE); + g_return_val_if_fail (name, FALSE); + if (strcmp (name, "layered-pane") != 0) + { + g_print ("Unexpected name for ATK_ROLE_LAYERED_PANE %s\n", name); + return FALSE; + } + + role1 = atk_role_for_name ("list-item"); + if (role1 != ATK_ROLE_LIST_ITEM) + { + g_print ("Unexpected role for list_item\n"); + return FALSE; + } + + role1 = atk_role_register ("test-role"); + name = atk_role_get_name (role1); + g_return_val_if_fail (name, FALSE); + if (strcmp (name, "test-role") != 0) + { + g_print ("Unexpected name for test-role %s\n", name); + return FALSE; + } + role2 = atk_role_for_name ("test-role"); + if (role1 != role2) + { + g_print ("Unexpected role for test-role\n"); + return FALSE; + } + role2 = atk_role_for_name ("TEST_ROLE"); + if (role2 != 0) + { + g_print ("Unexpected role for TEST_ROLE\n"); + return FALSE; + } + /* + * Check that a non-existent type returns NULL + */ + name = atk_role_get_name (ATK_ROLE_LAST_DEFINED + 2); + if (name) + { + g_print ("Unexpected name for undefined role %s\n", name); + return FALSE; + } + return TRUE; +} + int gtk_module_init (gint argc, char* argv[]) @@ -97,5 +159,10 @@ gtk_module_init (gint argc, g_print ("Relation tests succeeded\n"); else g_print ("Relation tests failed\n"); + b_ret = test_role (); + if (b_ret) + g_print ("Role tests succeeded\n"); + else + g_print ("Role tests failed\n"); return 0; } -- 2.11.4.GIT