Allows recursive composition of state and role traits through the controlled objects 81/280481/3
authorLukasz Oleksak <l.oleksak@samsung.com>
Tue, 30 Aug 2022 16:13:30 +0000 (18:13 +0200)
committerLukasz Oleksak <l.oleksak@samsung.com>
Wed, 31 Aug 2022 14:32:43 +0000 (16:32 +0200)
Change-Id: I2f3577dd906a927e88aa5623f8bbb3cdf98389f9

src/reading_composer.c

index f8f00d39412214b1dc51777e6058e8172ebaa945..779d2601cc19ca0ccbfc2fc4bfa238370cc8eebb 100644 (file)
@@ -46,7 +46,25 @@ TIZEN_PROD_STATIC void add_slider_state(Eina_Strbuf *buf, AtspiAccessibleReading
        add_percent_value_string(buf, get_percent_value_from_rm(rm));
 }
 
-TIZEN_PROD_STATIC char *generate_role_trait(AtspiAccessibleReadingMaterial *rm)
+TIZEN_PROD_STATIC
+void reading_composer_reading_material_free(AtspiAccessibleReadingMaterial *rm)
+{
+       if (rm->parent)
+               g_object_unref(rm->parent);
+
+       if (rm->described_by_accessible)
+               g_object_unref(rm->described_by_accessible);
+
+       g_hash_table_unref(rm->attributes);
+       g_free(rm->name);
+       g_free(rm->labeled_by_name);
+       g_free(rm->text_interface_name);
+       g_free(rm->localized_role_name);
+       g_free(rm->description);
+       g_free(rm);
+}
+
+TIZEN_PROD_STATIC char *generate_role_trait_from_role(AtspiAccessibleReadingMaterial *rm)
 {
        AtspiRole role = rm->role;
        char *ret = NULL;
@@ -144,7 +162,51 @@ TIZEN_PROD_STATIC char *generate_role_trait(AtspiAccessibleReadingMaterial *rm)
        return ret;
 }
 
-TIZEN_PROD_STATIC char *generate_state_trait(AtspiAccessibleReadingMaterial *rm)
+TIZEN_PROD_STATIC char *generate_role_trait_recursive(AtspiAccessibleReadingMaterial *rm, int nest_level, int max_nest_level)
+{
+       if (!rm || nest_level > max_nest_level)
+               return NULL;
+
+       display_info_about_object(rm);
+
+       char *role_trait_from_relation = NULL;
+       char *role_trait_from_role = NULL;
+
+       if (rm->described_by_accessible) {
+               AtspiAccessibleReadingMaterial *_rm = atspi_accessible_get_reading_material(rm->described_by_accessible, NULL);
+               if (_rm) {
+                       role_trait_from_relation = generate_role_trait_recursive(_rm, ++nest_level, max_nest_level);
+                       reading_composer_reading_material_free(_rm);
+               }
+       }
+
+       Eina_Strbuf *buf;
+       buf = eina_strbuf_new();
+
+       if (role_trait_from_relation && strlen(role_trait_from_relation)) {
+               ESAL(buf, role_trait_from_relation);
+       } else {
+               role_trait_from_role = generate_role_trait_from_role(rm);
+               if (role_trait_from_role && strlen(role_trait_from_role) > 0) {
+                       ESAL(buf, role_trait_from_role);
+               }
+       }
+
+       SCREEN_READER_SAFE_FREE(role_trait_from_relation, free);
+       SCREEN_READER_SAFE_FREE(role_trait_from_role, free);
+
+       char *role_trait = eina_strbuf_string_steal(buf);
+       eina_strbuf_free(buf);
+       DEBUG("END");
+       return role_trait;
+}
+
+TIZEN_PROD_STATIC char *generate_role_trait(AtspiAccessibleReadingMaterial *rm)
+{
+       return generate_role_trait_recursive(rm, 0, 1);
+}
+
+TIZEN_PROD_STATIC char *generate_state_trait_from_role(AtspiAccessibleReadingMaterial *rm)
 {
        AtspiRole role = rm->role;
        char* ret = NULL;
@@ -216,6 +278,50 @@ TIZEN_PROD_STATIC char *generate_state_trait(AtspiAccessibleReadingMaterial *rm)
        return ret;
 }
 
+TIZEN_PROD_STATIC char *generate_state_trait_recursive(AtspiAccessibleReadingMaterial *rm, int nest_level, int max_nest_level)
+{
+       if (!rm || nest_level > max_nest_level)
+               return NULL;
+
+       display_info_about_object(rm);
+
+       char *state_trait_from_relation = NULL;
+       char *state_trait_from_role = NULL;
+
+       if (rm->described_by_accessible) {
+               AtspiAccessibleReadingMaterial *_rm = atspi_accessible_get_reading_material(rm->described_by_accessible, NULL);
+               if (_rm) {
+                       state_trait_from_relation = generate_state_trait_recursive(_rm, ++nest_level, max_nest_level);
+                       reading_composer_reading_material_free(_rm);
+               }
+       }
+
+       Eina_Strbuf *buf;
+       buf = eina_strbuf_new();
+
+       if (state_trait_from_relation && strlen(state_trait_from_relation)) {
+               ESAL(buf, state_trait_from_relation);
+       } else {
+               state_trait_from_role = generate_state_trait_from_role(rm);
+               if (state_trait_from_role && strlen(state_trait_from_role) > 0) {
+                       ESAL(buf, state_trait_from_role);
+               }
+       }
+
+       SCREEN_READER_SAFE_FREE(state_trait_from_relation, free);
+       SCREEN_READER_SAFE_FREE(state_trait_from_role, free);
+
+       char *state_trait = eina_strbuf_string_steal(buf);
+       eina_strbuf_free(buf);
+       DEBUG("END");
+       return state_trait;
+}
+
+TIZEN_PROD_STATIC char *generate_state_trait(AtspiAccessibleReadingMaterial *rm)
+{
+       return generate_state_trait_recursive(rm, 0, 1);
+}
+
 TIZEN_PROD_STATIC char *generate_description_trait(AtspiAccessibleReadingMaterial *rm)
 {
        DEBUG("START");
@@ -392,24 +498,6 @@ unsigned short int reading_composer_reading_attribute_get(AtspiAccessibleReading
        return attribute;
 }
 
-TIZEN_PROD_STATIC
-void reading_composer_reading_material_free(AtspiAccessibleReadingMaterial *rm)
-{
-       if (rm->parent)
-               g_object_unref(rm->parent);
-
-       if (rm->described_by_accessible)
-               g_object_unref(rm->described_by_accessible);
-
-       g_hash_table_unref(rm->attributes);
-       g_free(rm->name);
-       g_free(rm->labeled_by_name);
-       g_free(rm->text_interface_name);
-       g_free(rm->localized_role_name);
-       g_free(rm->description);
-       g_free(rm);
-}
-
 char* reading_composer_name_get(AtspiAccessible *obj)
 {
        DEBUG("START");