${CMAKE_SOURCE_DIR}/src/flat_navi.c
${CMAKE_SOURCE_DIR}/src/main.c
${CMAKE_SOURCE_DIR}/src/utils.c
+ ${CMAKE_SOURCE_DIR}/src/reading_composer.c
${CMAKE_SOURCE_DIR}/src/screen_reader.c
${CMAKE_SOURCE_DIR}/src/screen_reader_haptic.c
${CMAKE_SOURCE_DIR}/src/screen_reader_spi.c
#define NAVIGATOR_H_
#include <atspi/atspi.h>
-#include "screen_reader.h"
-#include "utils.h"
-#include "flat_navi.h"
-#define TTS_MAX_TEXT_SIZE 2000
+#include <flat_navi.h>
+#include <screen_reader.h>
+#include <utils.h>
extern bool read_description;
extern bool haptic;
*/
/* void _widget_scroll(Gesture_Info *gi); */
-char *generate_what_to_read(AtspiAccessible *obj);
void generate_what_to_read_and_speak(Navigator_Data *nd, AtspiAccessible *obj, Eina_Bool associate_object);
-int get_accuracy(double val, int max_accuracy);
-
void navigator_focus_next_visible(Navigator_Data *nd);
void navigator_focus_prev_visible(Navigator_Data *nd);
-unsigned short int navigator_reading_attribute_get(AtspiAccessibleReadingMaterial *rm);
-void navigator_reading_material_free(AtspiAccessibleReadingMaterial *rm);
-
-#define ESAL(buf, txt)\
- eina_strbuf_append_length(buf, txt, strlen(txt))
-
void sound_n_vibration_feedback_generate(AtspiAccessible *obj);
/**
--- /dev/null
+#ifndef READING_COMPOSER_H_
+#define READING_COMPOSER_H_
+
+#include <atspi/atspi.h>
+
+#define TTS_MAX_TEXT_SIZE 2000
+
+unsigned short int reading_composer_reading_attribute_get(
+ AtspiAccessibleReadingMaterial *rm);
+
+void reading_composer_reading_material_free(AtspiAccessibleReadingMaterial *rm);
+
+/*
+ * @brief This function should return "physical" textual representation o UI element,
+ * that is, what is explicitly rendered in GUI as text, directly for the given
+ * object or for other object connected via relation LABELED_BY
+ */
+char* reading_composer_name_get(AtspiAccessible *obj);
+
+/*
+ * @brief Similar to reading_composer_name_get but enriches above definition with
+ * "static" metadata which is not rendered in GUI, such as role name, etc.
+ */
+char* reading_composer_description_get(AtspiAccessible *obj);
+
+/*
+ * @brief This function provides only "dynamic" metadata describing what
+ * user interactions are possible for given UI element. This mapps
+ * to A11Y "description" attribute.
+ */
+void reading_composer_extended_description_get(
+ AtspiAccessible *obj,
+ char **base_desc,
+ char **ext_desc);
+
+#endif
+
#define TEXT_DELETE_SIG "object:text-changed:delete"
#define STATE_CHECKED_SIG "object:state-changed:checked"
-#define SCREEN_READER_SAFE_FREE(_h, _fn) do { _fn((void*)_h); _h = NULL; } while (0)
-
typedef enum {
read_as_xml,
read_as_plain,
#include <Eldbus.h>
#include <atspi/atspi.h>
+#define ESAL(buf, txt)\
+ eina_strbuf_append_length(buf, txt, strlen(txt))
+
+#define SCREEN_READER_SAFE_FREE(_h, _fn) do { _fn((void*)_h); _h = NULL; } while (0)
+
+#define HOVERSEL_TRAIT_SIZE 200
+
/**
* @brief Accessibility gestures
*/
Eina_Bool object_has_defunct_state(AtspiAccessible *obj);
Eina_Bool object_has_highlighted_state(AtspiAccessible *obj);
+int get_accuracy(double val, int max_accuracy);
+
#endif /* UTILS_H_ */
+
#include <app_tracker.h>
#include <logger.h>
#include <navigator.h>
+#include <reading_composer.h>
#include <screen_reader_tts.h>
#include <symbols.h>
#include <utils.h>
}
if (window_tracker_subroot_get(atd->window_tracker_data)) {
char *text_to_speak = NULL;
- text_to_speak = generate_what_to_read(event->source);
+ text_to_speak = reading_composer_description_get(event->source);
DEBUG("SPEAK : %s", text_to_speak ? text_to_speak : "text_to_speak nil");
tts_speak_customized(text_to_speak, EINA_TRUE, EINA_TRUE, event->source, 0);
free(text_to_speak);
*/
#define _GNU_SOURCE
-#include <stdio.h>
+#include <atspi/atspi.h>
#include <Ecore.h>
#include <Elementary.h>
-#include <atspi/atspi.h>
-#include "utils.h"
-#include "logger.h"
-#include "navigator.h"
-#include "smart_notification.h"
-#include "screen_reader_tts.h"
-#include "granularity_read.h"
+#include <stdio.h>
+
+#include <granularity_read.h>
+#include <logger.h>
+#include <reading_composer.h>
+#include <screen_reader_tts.h>
+#include <smart_notification.h>
+#include <utils.h>
Ecore_Timer *granularity_read_popup_timer;
DEBUG("END");
}
-char *_current_object_accessible_name_get(AtspiAccessible *obj)
-{
- DEBUG("START");
- AtspiAccessibleReadingMaterial *rm;
- Eina_Strbuf *buf;
- char *name = NULL;
- char *name_from_relation = NULL;
- char *text = NULL;
- char *ret = NULL;
-
- if (!obj)
- return NULL;
- rm = atspi_accessible_get_reading_material(obj, NULL);
- if (!rm)
- return NULL;
- unsigned short reading_attribute = navigator_reading_attribute_get(rm);
-
- buf = eina_strbuf_new();
- if (reading_attribute & ACCESSIBLE_READING_INFO_TYPE_NAME) {
- DEBUG("START : ACCESSIBLE_READING_INFO_TYPE_NAME");
- name = rm->name;
- name_from_relation = rm->labeled_by_name;
- text = rm->text_interface_name;
-
- if (text && strlen(text))
- ESAL(buf, text);
- if (name && strlen(name) > 0) {
- if (eina_strbuf_length_get(buf))
- eina_strbuf_append_char(buf, ',');
- ESAL(buf, name);
- }
- if (name_from_relation && strlen(name_from_relation) > 0) {
- if (eina_strbuf_length_get(buf))
- eina_strbuf_append_char(buf, ',');
- ESAL(buf, name_from_relation);
- }
- DEBUG("END : ACCESSIBLE_READING_INFO_TYPE_NAME");
- }
-
- ret = eina_strbuf_string_steal(buf);
- eina_strbuf_free(buf);
- navigator_reading_material_free(rm);
- DEBUG("RESULT: %s", ret);
- DEBUG("END");
- return ret;
-}
-
char *granularity_read_text_get(AtspiAccessible *current_obj, Eina_Bool next)
{
DEBUG("START");
granularity_read_text_list_init();
grd->current_obj = current_obj;
- grd->current_text = _current_object_accessible_name_get(grd->current_obj);
+ grd->current_text = reading_composer_name_get(grd->current_obj);
if (grd->current_text)
_read_text_list_make(grd->current_text);
}
#include "granularity_read.h"
#include "utils.h"
#include "symbols.h"
-
-#define QUICKPANEL_DOWN TRUE
-#define QUICKPANEL_UP FALSE
-
-#define DISTANCE_NB 8
-#define MENU_ITEM_TAB_INDEX_SIZE 16
-#define HOVERSEL_TRAIT_SIZE 200
+#include "reading_composer.h"
#define HAPTIC_VIBRATE_DURATION 30
#define HAPTIC_VIBRATE_INTENSITY 50
#define DEBUG_MODE
-#define STATE_SET_CONTAINS(states, state)\
- ((states & ((gint64)1 << state)) ? (EINA_TRUE) : (EINA_FALSE))
-
static void _highlight_on_slider(Eina_Bool is_slider);
typedef struct {
static Eldbus_Connection *connection = NULL;
-extern bool read_description;
extern bool haptic;
extern bool sound_feedback;
}
-static void display_info_about_object(AtspiAccessibleReadingMaterial *rm)
-{
- DEBUG("START");
- DEBUG("------------------------");
- DEBUG("NAME:%s", rm->name);
- DEBUG("TEXT IFACE NAME:%s", rm->text_interface_name);
- DEBUG("DESCRIPTION:%s", rm->description);
- DEBUG("ROLE:%s", rm->localized_role_name);
- DEBUG("CHILDS:%d", rm->child_count);
- DEBUG("INDEX IN PARENT:%d", rm->index_in_parent);
- DEBUG("VALUE:%f", rm->value);
- DEBUG("VALUE MAX:%f", rm->upper);
- DEBUG("VALUE MIN:%f", rm->lower);
- DEBUG("STATES:");
- DEBUG("------------------------");
- DEBUG("END");
-}
-
static bool _widget_has_state(AtspiAccessible *obj, AtspiStateType type)
{
Eina_Bool ret = EINA_FALSE;
return ret;
}
-int get_accuracy(double val, int max_accuracy)
-{
- char val_str[HOVERSEL_TRAIT_SIZE] = "";
- int position;
- int accuracy;
-
- g_snprintf(val_str, HOVERSEL_TRAIT_SIZE, "%.*f", max_accuracy, val);
- accuracy = max_accuracy;
- position = strlen(val_str) - 1;
- while (position > 0 && val_str[position] == '0') {
- --position;
- --accuracy;
- }
- return accuracy;
-}
-
-void add_slider_description(Eina_Strbuf *buf, AtspiAccessibleReadingMaterial *rm)
-{
- char trait[HOVERSEL_TRAIT_SIZE] = "";
-
- int accuracy = get_accuracy(rm->increment, 3);
-
- double add_for_rounding = 0.5f;
- int mul_for_rounding = 1;
- int count = 0;
- for (count = 0; count < accuracy; count++) {
- add_for_rounding *= 0.1f;
- mul_for_rounding *= 10;
- }
-
- int val = (int)((rm->value + add_for_rounding) * mul_for_rounding);
- int max_val = (int)((rm->upper + add_for_rounding) * mul_for_rounding);
- int min_val = (int)((rm->lower + add_for_rounding) * mul_for_rounding);
-
- int percent = ((val - min_val) / (double)(abs(max_val - min_val))) * 100;
- char buf_percent[64] = "\0";
-
- g_snprintf(buf_percent, sizeof(buf_percent), "%d", percent);
- SUPPRESS_FORMAT_ERROR(g_snprintf(trait, sizeof(trait), _("IDS_GCTS_OPT_P1SS_PERCENT_TTS"), buf_percent));
-
- if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_ENABLED))
- g_snprintf(trait + strlen(trait), sizeof(trait) - strlen(trait), " , %s", _IGNORE_ON_TV("IDS_TPLATFORM_BODY_FLICK_UP_AND_DOWN_TO_ADJUST_THE_POSITION_T_TTS"));
- ESAL(buf, trait);
-}
-
-char *generate_role_trait(AtspiAccessibleReadingMaterial *rm)
-{
- AtspiRole role = rm->role;
- char ret[TTS_MAX_TEXT_SIZE] = { [TTS_MAX_TEXT_SIZE - 1] = 0 };
- switch (role) {
- case ATSPI_ROLE_ENTRY:
- case ATSPI_ROLE_PASSWORD_TEXT: {
- AtspiAccessible *parent = rm->parent;
- if (parent) {
- AtspiRole parent_role = rm->parent_role;
- if (parent_role == ATSPI_ROLE_SPIN_BUTTON && STATE_SET_CONTAINS(rm->states, ATSPI_STATE_FOCUSED))
- break;
- }
- g_snprintf(ret, sizeof(ret), "%s", _("IDS_TPLATFORM_BODY_EDIT_FIELD_M_NOUN_T_TTS"));
- break;
- }
- case ATSPI_ROLE_COMBO_BOX: {
- int children_count = rm->child_count;
- char buf[TTS_MAX_TEXT_SIZE] = "";
- g_snprintf(ret, sizeof(ret), "%s", _("IDS_ACCS_BODY_DROPDOWN_LIST_TTS"));
- SUPPRESS_FORMAT_ERROR(g_snprintf(buf, sizeof(buf), _("IDS_WEBVIEW_BODY_SHOWING_PD_ITEMS_TTS"), children_count));
- g_strlcat(ret, " ", sizeof(ret) - strlen(ret) - 1);
- g_strlcat(ret, buf, sizeof(ret) - strlen(ret) - 1);
- break;
- }
- case ATSPI_ROLE_GLASS_PANE: {
- AtspiAccessible *parent = rm->parent;
- if (parent) {
- int children_count = rm->parent_child_count;
- char buf[TTS_MAX_TEXT_SIZE] = "";
- g_snprintf(ret, sizeof(ret), "%s", _("IDS_ACCS_BODY_DROPDOWN_LIST_TTS"));
- SUPPRESS_FORMAT_ERROR(g_snprintf(buf, sizeof(buf), _("IDS_WEBVIEW_BODY_SHOWING_PD_ITEMS_TTS"), children_count));
- g_strlcat(ret, " ", sizeof(ret) - strlen(ret) - 1);
- g_strlcat(ret, buf, sizeof(ret) - strlen(ret) - 1);
- }
- break;
- }
- case ATSPI_ROLE_LIST_ITEM: {
- AtspiAccessible *parent = rm->parent;
- if (parent) {
- if (STATE_SET_CONTAINS(rm->parent_states, ATSPI_STATE_ANIMATED)) {
- g_strlcpy(ret, _("IDS_GALLERY_OPT_REORDER"), sizeof(ret) - 1);
- g_strlcat(ret, " , ", sizeof(ret) - strlen(ret) - 1);
- g_strlcat(ret, _("IDS_ACCS_BODY_BUTTON_TTS"), sizeof(ret) - strlen(ret) - 1);
- }
- }
- break;
- }
- case ATSPI_ROLE_PUSH_BUTTON: {
- g_strlcpy(ret, _("IDS_ACCS_BODY_BUTTON_TTS"), sizeof(ret) - 1);
- break;
- }
- case ATSPI_ROLE_PROGRESS_BAR: {
- double val = rm->value;
- if (val > 0) {
- char buf[255];
- g_snprintf(buf, sizeof(buf), "%.0f", val * 100);
- SUPPRESS_FORMAT_ERROR(g_snprintf(ret, sizeof(ret), _("IDS_GCTS_OPT_P1SS_PERCENT_TTS"), buf));
- }
- break;
- }
- case ATSPI_ROLE_SLIDER: {
- gchar *role_name = rm->localized_role_name;
- if (role_name)
- g_strlcat(ret, role_name, sizeof(ret) - strlen(ret) - 1);
- break;
- }
- case ATSPI_ROLE_SCROLL_BAR: {
- GHashTable *hash_table = rm->attributes;
- if (hash_table) {
- const char *style = g_hash_table_lookup(hash_table, "style");
- if (!g_strcmp0(style, "default"))
- g_snprintf(ret, sizeof(ret), "%s", _("IDS_ACCS_TBOPT_ALPHABETICAL_INDEX_BAR"));
- }
- break;
- }
- case ATSPI_ROLE_INVALID:
- case ATSPI_ROLE_TOGGLE_BUTTON:
- case ATSPI_ROLE_HEADING:
- case ATSPI_ROLE_PAGE_TAB:
- case ATSPI_ROLE_EDITBAR:
- case ATSPI_ROLE_CHECK_BOX:
- case ATSPI_ROLE_MENU_ITEM:
- case ATSPI_ROLE_RADIO_MENU_ITEM:
- case ATSPI_ROLE_RADIO_BUTTON:
- case ATSPI_ROLE_POPUP_MENU:
- case ATSPI_ROLE_DIALOG:
- case ATSPI_ROLE_UNKNOWN:
- case ATSPI_ROLE_GROUPING: {
- break;
- }
- default: {
- gchar *role_name = rm->localized_role_name;
- if (role_name)
- g_strlcpy(ret, role_name, sizeof(ret) - 1);
- }
- }
-
- return g_strdup(ret);
-}
-
-char *generate_description_trait(AtspiAccessibleReadingMaterial *rm)
-{
- DEBUG("START");
- AtspiRole role = rm->role;
- char *ret = NULL;
- Eina_Strbuf *buf;
-
- buf = eina_strbuf_new();
- switch (role) {
- case ATSPI_ROLE_ENTRY:
- case ATSPI_ROLE_PASSWORD_TEXT: {
- if (!STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EDITABLE)) break;
- if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_FOCUSED))
- ESAL(buf, _("IDS_ST_BODY_EDITING_T_TTS"));
- else
- ESAL(buf, _IGNORE_ON_TV("IDS_ST_BODY_DOUBLE_TAP_TO_ENTER_TEXT_T_TTS"));
- break;
- }
- case ATSPI_ROLE_MENU_ITEM: {
- AtspiAccessible *parent = rm->parent;
- if (!parent) break;
- AtspiRole parent_role = rm->parent_role;
- if (parent_role == ATSPI_ROLE_TOOL_BAR) {
- int children_count = rm->parent_child_count;
- int index = rm->index_in_parent;
- AtspiSelection *selection = atspi_accessible_get_selection_iface(parent);
- gboolean is_selected = rm->is_selected_in_parent;
- SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, _("IDS_ACCS_BODY_TAB_P1SD_OF_P2SD"), index + 1, children_count));
- if (!is_selected) {
- ESAL(buf, " , ");
- ESAL(buf, _IGNORE_ON_TV("IDS_ACCS_BODY_DOUBLE_TAP_TO_SELECT_TTS"));
- }
- g_object_unref(selection);
- }
- break;
- }
- case ATSPI_ROLE_LIST_ITEM: {
- AtspiAccessible *parent = rm->parent;
- if (!parent) break;
- AtspiRole parent_role = rm->parent_role;
- if (parent_role == ATSPI_ROLE_TREE_TABLE) {
- ESAL(buf, _("IDS_BR_BODY_IMAGE_T_TTS"));
-
- bool is_parent_multiselectable = STATE_SET_CONTAINS(rm->parent_states, ATSPI_STATE_MULTISELECTABLE);
-
- if (is_parent_multiselectable) {
- int selected_children_count = rm->parent_selected_child_count;
- SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, _("IDS_SCR_BODY_PD_SELECTED_IN_TOTAL_TTS"), selected_children_count));
- }
- } else if (!STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EXPANDABLE)
- && (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EXPANDED) || STATE_SET_CONTAINS(rm->states, ATSPI_STATE_COLLAPSED))) {
- //ELM_GENLIST_ITEM_GROUP
- ESAL(buf, _("IDS_AM_OPT_HEADER_TTS"));
- //Genlist group & tree item have checkbox
- int children_count = rm->child_count;
- if (children_count > 0) {
- if (rm->has_checkbox_child) {
- ESAL(buf, " , ");
- ESAL(buf, _("IDS_SCR_TBOPT_TICKBOX_FOR_ENTIRE_GROUP"));
- }
- }
- } else if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EXPANDABLE)) {
- //ELM_GENLIST_ITEM_TREE
- ESAL(buf, _("IDS_AM_OPT_HEADER_TTS"));
- ESAL(buf, " , ");
- ESAL(buf, _("IDS_TPLATFORM_BODY_EXPANDABLE_LIST"));
- if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EXPANDED)) {
- ESAL(buf, " , ");
- ESAL(buf, _IGNORE_ON_TV("IDS_ACCS_BODY_DOUBLE_TAP_TO_COLLAPSE_THE_LIST_T_TTS"));
- } else {
- ESAL(buf, " , ");
- ESAL(buf, _IGNORE_ON_TV("IDS_ACCS_BODY_DOUBLE_TAP_TO_EXPAND_THE_LIST_T_TTS"));
- }
- //ELM_GENLIST_ITEM_GROUP
- //Genlist group & tree item have checkbox
- int children_count = rm->child_count;
- if (children_count > 0) {
- if (rm->has_checkbox_child) {
- ESAL(buf, " , ");
- ESAL(buf, _("IDS_SCR_TBOPT_TICKBOX_FOR_ENTIRE_GROUP"));
- }
- }
- } else if (STATE_SET_CONTAINS(rm->parent_states, ATSPI_STATE_ANIMATED)) {
- ESAL(buf, _IGNORE_ON_TV("IDS_BR_BODY_DOUBLE_TAP_AND_HOLD_THEN_DRAG_TO_REORDER_TTS"));
- }
- break;
- }
- case ATSPI_ROLE_POPUP_MENU: {
- int children_count;
- AtspiAccessible *parent = rm->parent;
- if (!parent) break;
- AtspiRole parent_role = rm->parent_role;
- if (parent_role == ATSPI_ROLE_COMBO_BOX) break;
- children_count = rm->child_count;
- SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, _("IDS_WEBVIEW_BODY_SHOWING_PD_ITEMS_TTS"), children_count));
- break;
- }
- case ATSPI_ROLE_DIALOG: {
- int children_count = rm->list_children_count;
- if (children_count > 0)
- SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, _("IDS_WEBVIEW_BODY_SHOWING_PD_ITEMS_TTS"), children_count));
- break;
- }
- case ATSPI_ROLE_COMBO_BOX:
- case ATSPI_ROLE_GLASS_PANE: {
- ESAL(buf, _IGNORE_ON_TV("IDS_ST_BODY_DOUBLE_TAP_TO_OPEN_THE_MENU_T_TTS"));
- break;
- }
- case ATSPI_ROLE_CHECK_BOX:
- case ATSPI_ROLE_RADIO_BUTTON: {
- AtspiAccessible *parent;
- parent = rm->parent;
- if (!parent) break;
- if (!STATE_SET_CONTAINS(rm->states, ATSPI_STATE_CHECKED) && STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EDITABLE))
- ESAL(buf, _IGNORE_ON_TV("IDS_ACCS_BODY_DOUBLE_TAP_TO_EDIT_T_TTS"));
- //Role name should not be read for radio button, color selector, multibuttonentry items
- break;
- }
- case ATSPI_ROLE_PROGRESS_BAR: {
- ESAL(buf, _("IDS_ACCS_TBBODY_IN_PROGRESS"));
- break;
- }
- case ATSPI_ROLE_SLIDER: {
- add_slider_description(buf, rm);
- break;
- }
- case ATSPI_ROLE_SCROLL_BAR: {
- GHashTable *hash_table = rm->attributes;
- if (hash_table) {
- const char *style = g_hash_table_lookup(hash_table, "style");
- if (!g_strcmp0(style, "pagecontrol")) {
- int child_count = rm->child_count;
- int idx = rm->first_selected_child_index;
- SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, _("IDS_ACCS_POP_PAGE_P1SD_OF_P2SD_M_DESCRIPTIVE_FORM_TTS"), idx + 1, child_count));
- } else {
- ESAL(buf, _IGNORE_ON_TV("IDS_ACCS_TBBODY_SWIPE_RIGHT_OR_LEFT_WITH_ONE_FINGER_TO_SELECT_NEXT_OR_PREVIOUS_LETTER"));
- }
- }
- break;
- }
- default:
- break;
- }
-
- ret = eina_strbuf_string_steal(buf);
- eina_strbuf_free(buf);
- DEBUG("END");
- return ret;
-}
-
-char *generate_state_trait(AtspiAccessibleReadingMaterial *rm)
-{
- AtspiRole role = rm->role;
- char ret[TTS_MAX_TEXT_SIZE] = "\0";
- switch (role) {
- case ATSPI_ROLE_LIST_ITEM: {
- AtspiAccessible *parent = rm->parent;
- if (!parent) break;
- AtspiRole parent_role = rm->parent_role;
- if (parent_role == ATSPI_ROLE_TREE_TABLE) {
- gboolean is_selected = STATE_SET_CONTAINS(rm->states, ATSPI_STATE_SELECTED);
- if (is_selected)
- g_strlcpy(ret, _("IDS_ACCS_BODY_SELECTED_TTS"), sizeof(ret) - 1);
- }
- break;
- }
- case ATSPI_ROLE_CHECK_BOX:
- case ATSPI_ROLE_RADIO_BUTTON: {
- AtspiAccessible *parent;
- AtspiRole parent_role;
- parent = rm->parent;
- if (!parent) break;
- parent_role = rm->parent_role;
- if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_CHECKED))
- g_strlcpy(ret, _("IDS_ACCS_BODY_SELECTED_TTS"), sizeof(ret) - 1);
- else if (!STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EDITABLE) && (parent_role != ATSPI_ROLE_COLOR_CHOOSER))
- g_strlcpy(ret, _("IDS_ACCS_OPT_NOT_SELECTED_TTS"), sizeof(ret) - 1);
- //Role name should not be read for radio button, color selector, multibuttonentry items
- break;
- }
- case ATSPI_ROLE_TOGGLE_BUTTON: {
- if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_CHECKED))
- g_strlcpy(ret, _("IDS_MSG_BODY_ON_T_TTS"), sizeof(ret) - 1);
- else
- g_strlcpy(ret, _("IDS_STORYALBUM_BODY_OFF_T_TTS"), sizeof(ret) - 1);
- break;
- }
- case ATSPI_ROLE_RADIO_MENU_ITEM: {
- g_strlcpy(ret, _("IDS_ACCS_BODY_SELECTED_TTS"), sizeof(ret) - 1);
- break;
- }
- default:
- break;
- }
-
- return g_strdup(ret);
-}
-
-char *generate_text_for_relation_objects(AtspiAccessible *obj, AtspiRelationType search, char *(*text_generate_cb)(AtspiAccessible *obj))
-{
- GError *err = NULL;
- GArray *relations;
- AtspiRelation *relation;
- AtspiRelationType type;
- int i;
- char *ret = NULL;
-
- if (!obj || !text_generate_cb) return NULL;
-
- relations = atspi_accessible_get_relation_set(obj, &err);
- if (err || !relations) {
- if (err) g_error_free(err);
- return NULL;
- }
-
- for (i = 0; i < relations->len; i++) {
- relation = g_array_index(relations, AtspiRelation *, i);
- type = atspi_relation_get_relation_type(relation);
- if (type == search) {
- gint last_index = atspi_relation_get_n_targets(relation) - 1;
- AtspiAccessible *target = atspi_relation_get_target(relation, last_index);
- ret = text_generate_cb(target);
- g_object_unref(target);
- break;
- }
- g_object_unref(relation);
- }
- g_array_free(relations, TRUE);
-
- return ret;
-}
-
-static char *generate_description_from_relation_object(AtspiAccessibleReadingMaterial *rm)
-{
- char *trait = NULL;
- Eina_Strbuf *buf;
- char *role_name = generate_role_trait(rm);
- char *description_from_role = NULL;
- char *state_from_role = generate_state_trait(rm);
-
- buf = eina_strbuf_new();
- if (role_name && strlen(role_name) > 0)
- ESAL(buf, role_name);
-
- if (read_description)
- description_from_role = generate_description_trait(rm);
- if (description_from_role && strlen(description_from_role) > 0) {
- if (eina_strbuf_length_get(buf))
- ESAL(buf, " , ");
- ESAL(buf, description_from_role);
- }
-
- if (state_from_role && strlen(state_from_role) > 0) {
- if (eina_strbuf_length_get(buf))
- ESAL(buf, " , ");
- ESAL(buf, state_from_role);
- }
- SCREEN_READER_SAFE_FREE(role_name, free);
- SCREEN_READER_SAFE_FREE(description_from_role, free);
- SCREEN_READER_SAFE_FREE(state_from_role, free);
-
- if (rm->description && strlen(rm->description) > 0)
- eina_strbuf_prepend_printf(buf, "%s , ", rm->description);
-
- trait = eina_strbuf_string_steal(buf);
- eina_strbuf_free(buf);
- return trait;
-}
-
-unsigned short int navigator_reading_attribute_get(AtspiAccessibleReadingMaterial *rm)
-{
- unsigned short int attribute = 0;
- gchar *reading_info = NULL;
- GHashTable *hash_table = rm->attributes;
- if (hash_table) {
- reading_info = g_hash_table_lookup(hash_table, "reading_info_type");
- if (reading_info) {
- unsigned int n = 0;
- char **list = eina_str_split_full(reading_info, "|", 100, &n);
- if (list) {
- int i;
- for (i = 0; i < n; i++) {
- if (!g_strcmp0(list[i], "name"))
- attribute = attribute | (ACCESSIBLE_READING_INFO_TYPE_NAME);
- else if (!g_strcmp0(list[i], "role"))
- attribute = attribute | (ACCESSIBLE_READING_INFO_TYPE_ROLE);
- else if (!g_strcmp0(list[i], "description"))
- attribute = attribute | (ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
- else if (!g_strcmp0(list[i], "state"))
- attribute = attribute | (ACCESSIBLE_READING_INFO_TYPE_STATE);
- }
- g_free(list[0]);
- g_free(list);
- }
- }
- }
- if (!hash_table || !reading_info) {
- attribute = attribute | (ACCESSIBLE_READING_INFO_TYPE_NAME) |
- (ACCESSIBLE_READING_INFO_TYPE_ROLE) | (ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION) | (ACCESSIBLE_READING_INFO_TYPE_STATE);
- }
-
- return attribute;
-}
-
-void navigator_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);
-}
-
-void generate_what_to_read_impl(char **ret, char **description_ret, AtspiAccessible *obj)
-{
- if(ret)
- *ret = NULL;
- if(description_ret)
- *description_ret = NULL;
- DEBUG("START");
- char *name = NULL;
- char *description = NULL;
- char *role_name = NULL;
- Eina_Strbuf *buf = NULL, *buf2 = NULL;
- char *description_from_relation = NULL;
- char *name_from_relation = NULL;
- char *name_from_text_iface = NULL;
- char *description_from_role = NULL;
- char *state_from_role = NULL;
- AtspiAccessibleReadingMaterial *rm;
-
- if (!obj) return;
-
- rm = atspi_accessible_get_reading_material(obj, NULL);
- if (!rm) return;
-
- display_info_about_object(rm);
-
- unsigned short reading_attribute = navigator_reading_attribute_get(rm);
-
- buf = eina_strbuf_new();
- buf2 = description_ret ? eina_strbuf_new() : buf2;
- if (reading_attribute & ACCESSIBLE_READING_INFO_TYPE_NAME) {
- DEBUG("START : ACCESSIBLE_READING_INFO_TYPE_NAME");
- name = rm->name;
- name_from_relation = rm->labeled_by_name;
- name_from_text_iface = rm->text_interface_name;
-
- if (name && strlen(name) > 0)
- ESAL(buf, name);
- if (name_from_relation && strlen(name_from_relation) > 0) {
- if (eina_strbuf_length_get(buf))
- ESAL(buf, " , ");
- ESAL(buf, name_from_relation);
- }
- /* For text object on WEB page which does not have accessible name */
- /* And for password entry which does not have accessible name */
- if (eina_strbuf_length_get(buf) == 0 && name_from_text_iface) {
- unsigned int text_len = strlen(name_from_text_iface);
- if (text_len > 0) {
- DEBUG("Object has text interface value only");
- if (rm->role == ATSPI_ROLE_PASSWORD_TEXT) {
- SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf,
- ngettext("PLURAL_ZERO_ACCS_TBOPT_PD_CHARACTERS",
- "PLURAL_ZERO_ACCS_TBOPT_PD_CHARACTERS", text_len),
- text_len));
- } else {
- ESAL(buf, name_from_text_iface);
- }
- }
- }
- DEBUG("END : ACCESSIBLE_READING_INFO_TYPE_NAME");
- }
- if (reading_attribute & ACCESSIBLE_READING_INFO_TYPE_ROLE) {
- DEBUG("START : ACCESSIBLE_READING_INFO_TYPE_ROLE");
- role_name = generate_role_trait(rm);
- if (role_name && strlen(role_name) > 0) {
- if (eina_strbuf_length_get(buf))
- ESAL(buf, " , ");
- ESAL(buf, role_name);
- }
- SCREEN_READER_SAFE_FREE(role_name, free);
- DEBUG("END : ACCESSIBLE_READING_INFO_TYPE_ROLE");
- }
- /* read_description: if description reading is enabled */
- if (reading_attribute & ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION) {
- /* read_description is determined by vconf value for the 'read usage hints aloud' */
- DEBUG("START : ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION (read usage hints: %d)", read_description);
- description = rm->description;
- /* If description is set by application side, do not read other default information */
- if (read_description && description && strlen(description) > 0) {
- if (eina_strbuf_length_get(buf2))
- ESAL(buf2, " , ");
- ESAL(buf2, description);
- } else if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_ENABLED)) {
- if (read_description)
- description_from_role = generate_description_trait(rm);
-
- if (rm->described_by_accessible) {
- AtspiAccessibleReadingMaterial *_rm = atspi_accessible_get_reading_material(rm->described_by_accessible, NULL);
- if (_rm) {
- description_from_relation = generate_description_from_relation_object(_rm);
- navigator_reading_material_free(_rm);
- }
- }
-
- if (description_from_role && strlen(description_from_role) > 0) {
- if (eina_strbuf_length_get(buf2))
- ESAL(buf2, " , ");
- ESAL(buf2, description_from_role);
- }
- if (description_from_relation && strlen(description_from_relation)) {
- if (eina_strbuf_length_get(buf2))
- ESAL(buf2, " , ");
- ESAL(buf2, description_from_relation);
- }
- }
- SCREEN_READER_SAFE_FREE(description_from_relation, free);
- SCREEN_READER_SAFE_FREE(description_from_role, free);
- DEBUG("END : ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION");
- }
- if (reading_attribute & ACCESSIBLE_READING_INFO_TYPE_STATE) {
- DEBUG("START : ACCESSIBLE_READING_INFO_TYPE_STATE");
- state_from_role = generate_state_trait(rm);
- if (state_from_role && strlen(state_from_role) > 0) {
- if (eina_strbuf_length_get(buf))
- ESAL(buf, " , ");
- ESAL(buf, state_from_role);
- }
- if (!STATE_SET_CONTAINS(rm->states, ATSPI_STATE_ENABLED)) {
- if (eina_strbuf_length_get(buf))
- ESAL(buf, " , ");
- ESAL(buf, _("IDS_ACCS_BODY_DISABLED_TTS"));
- }
- SCREEN_READER_SAFE_FREE(state_from_role, free);
- DEBUG("END : ACCESSIBLE_READING_INFO_TYPE_STATE");
- }
-
- //ret = eina_strbuf_string_steal(buf);
- DEBUG("RESULT: %s", eina_strbuf_string_get(buf));
- DEBUG("RESULT description: %s", eina_strbuf_string_get(buf2));
- if(ret)
- *ret = eina_strbuf_string_steal(buf);
- if (description_ret)
- *description_ret = eina_strbuf_string_steal(buf2);
-
- eina_strbuf_free(buf);
- if (buf != buf2)
- eina_strbuf_free(buf2);
- navigator_reading_material_free(rm);
- DEBUG("END");
-}
-
void generate_what_to_read_and_speak(Navigator_Data *nd, AtspiAccessible *obj, Eina_Bool associate_object)
{
char *tmp1, *tmp2;
return;
}
- generate_what_to_read_impl(&tmp1, &tmp2, obj);
+ reading_composer_extended_description_get(obj, &tmp1, &tmp2);
DEBUG("reading %s", tmp1);
DEBUG("reading description %s", tmp2);
g_free(tmp2);
}
-char *generate_what_to_read(AtspiAccessible *obj)
-{
- char *tmp;
- generate_what_to_read_impl(&tmp, NULL, obj);
- return tmp;
-}
-
static Eina_Bool _do_action(AtspiAccessible *obj, char *expected_action)
{
AtspiAction *action;
--- /dev/null
+#include <atspi/atspi.h>
+#include <string.h>
+#include <tts.h>
+
+#include <reading_composer.h>
+#include <logger.h>
+#include <utils.h>
+
+#define STATE_SET_CONTAINS(states, state)\
+ ((states & ((gint64)1 << state)) ? (EINA_TRUE) : (EINA_FALSE))
+
+extern bool read_description;
+
+static void display_info_about_object(AtspiAccessibleReadingMaterial *rm)
+{
+ DEBUG("START");
+ DEBUG("------------------------");
+ DEBUG("NAME:%s", rm->name);
+ DEBUG("TEXT IFACE NAME:%s", rm->text_interface_name);
+ DEBUG("DESCRIPTION:%s", rm->description);
+ DEBUG("ROLE:%s", rm->localized_role_name);
+ DEBUG("CHILDS:%d", rm->child_count);
+ DEBUG("INDEX IN PARENT:%d", rm->index_in_parent);
+ DEBUG("VALUE:%f", rm->value);
+ DEBUG("VALUE MAX:%f", rm->upper);
+ DEBUG("VALUE MIN:%f", rm->lower);
+ DEBUG("STATES:");
+ DEBUG("------------------------");
+ DEBUG("END");
+}
+
+static void add_slider_description(Eina_Strbuf *buf, AtspiAccessibleReadingMaterial *rm)
+{
+ char trait[HOVERSEL_TRAIT_SIZE] = "";
+
+ int accuracy = get_accuracy(rm->increment, 3);
+
+ double add_for_rounding = 0.5f;
+ int mul_for_rounding = 1;
+ int count = 0;
+ for (count = 0; count < accuracy; count++) {
+ add_for_rounding *= 0.1f;
+ mul_for_rounding *= 10;
+ }
+
+ int val = (int)((rm->value + add_for_rounding) * mul_for_rounding);
+ int max_val = (int)((rm->upper + add_for_rounding) * mul_for_rounding);
+ int min_val = (int)((rm->lower + add_for_rounding) * mul_for_rounding);
+
+ int percent = ((val - min_val) / (double)(abs(max_val - min_val))) * 100;
+ char buf_percent[64] = "\0";
+
+ g_snprintf(buf_percent, sizeof(buf_percent), "%d", percent);
+ SUPPRESS_FORMAT_ERROR(g_snprintf(trait, sizeof(trait), _("IDS_GCTS_OPT_P1SS_PERCENT_TTS"), buf_percent));
+
+ if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_ENABLED))
+ g_snprintf(trait + strlen(trait), sizeof(trait) - strlen(trait), " , %s", _IGNORE_ON_TV("IDS_TPLATFORM_BODY_FLICK_UP_AND_DOWN_TO_ADJUST_THE_POSITION_T_TTS"));
+ ESAL(buf, trait);
+}
+
+static char *generate_role_trait(AtspiAccessibleReadingMaterial *rm)
+{
+ AtspiRole role = rm->role;
+ char ret[TTS_MAX_TEXT_SIZE] = { [TTS_MAX_TEXT_SIZE - 1] = 0 };
+ switch (role) {
+ case ATSPI_ROLE_ENTRY:
+ case ATSPI_ROLE_PASSWORD_TEXT: {
+ AtspiAccessible *parent = rm->parent;
+ if (parent) {
+ AtspiRole parent_role = rm->parent_role;
+ if (parent_role == ATSPI_ROLE_SPIN_BUTTON && STATE_SET_CONTAINS(rm->states, ATSPI_STATE_FOCUSED))
+ break;
+ }
+ g_snprintf(ret, sizeof(ret), "%s", _("IDS_TPLATFORM_BODY_EDIT_FIELD_M_NOUN_T_TTS"));
+ break;
+ }
+ case ATSPI_ROLE_COMBO_BOX: {
+ int children_count = rm->child_count;
+ char buf[TTS_MAX_TEXT_SIZE] = "";
+ g_snprintf(ret, sizeof(ret), "%s", _("IDS_ACCS_BODY_DROPDOWN_LIST_TTS"));
+ SUPPRESS_FORMAT_ERROR(g_snprintf(buf, sizeof(buf), _("IDS_WEBVIEW_BODY_SHOWING_PD_ITEMS_TTS"), children_count));
+ g_strlcat(ret, " ", sizeof(ret) - strlen(ret) - 1);
+ g_strlcat(ret, buf, sizeof(ret) - strlen(ret) - 1);
+ break;
+ }
+ case ATSPI_ROLE_GLASS_PANE: {
+ AtspiAccessible *parent = rm->parent;
+ if (parent) {
+ int children_count = rm->parent_child_count;
+ char buf[TTS_MAX_TEXT_SIZE] = "";
+ g_snprintf(ret, sizeof(ret), "%s", _("IDS_ACCS_BODY_DROPDOWN_LIST_TTS"));
+ SUPPRESS_FORMAT_ERROR(g_snprintf(buf, sizeof(buf), _("IDS_WEBVIEW_BODY_SHOWING_PD_ITEMS_TTS"), children_count));
+ g_strlcat(ret, " ", sizeof(ret) - strlen(ret) - 1);
+ g_strlcat(ret, buf, sizeof(ret) - strlen(ret) - 1);
+ }
+ break;
+ }
+ case ATSPI_ROLE_LIST_ITEM: {
+ AtspiAccessible *parent = rm->parent;
+ if (parent) {
+ if (STATE_SET_CONTAINS(rm->parent_states, ATSPI_STATE_ANIMATED)) {
+ g_strlcpy(ret, _("IDS_GALLERY_OPT_REORDER"), sizeof(ret) - 1);
+ g_strlcat(ret, " , ", sizeof(ret) - strlen(ret) - 1);
+ g_strlcat(ret, _("IDS_ACCS_BODY_BUTTON_TTS"), sizeof(ret) - strlen(ret) - 1);
+ }
+ }
+ break;
+ }
+ case ATSPI_ROLE_PUSH_BUTTON: {
+ g_strlcpy(ret, _("IDS_ACCS_BODY_BUTTON_TTS"), sizeof(ret) - 1);
+ break;
+ }
+ case ATSPI_ROLE_PROGRESS_BAR: {
+ double val = rm->value;
+ if (val > 0) {
+ char buf[255];
+ g_snprintf(buf, sizeof(buf), "%.0f", val * 100);
+ SUPPRESS_FORMAT_ERROR(g_snprintf(ret, sizeof(ret), _("IDS_GCTS_OPT_P1SS_PERCENT_TTS"), buf));
+ }
+ break;
+ }
+ case ATSPI_ROLE_SLIDER: {
+ gchar *role_name = rm->localized_role_name;
+ if (role_name)
+ g_strlcat(ret, role_name, sizeof(ret) - strlen(ret) - 1);
+ break;
+ }
+ case ATSPI_ROLE_SCROLL_BAR: {
+ GHashTable *hash_table = rm->attributes;
+ if (hash_table) {
+ const char *style = g_hash_table_lookup(hash_table, "style");
+ if (!g_strcmp0(style, "default"))
+ g_snprintf(ret, sizeof(ret), "%s", _("IDS_ACCS_TBOPT_ALPHABETICAL_INDEX_BAR"));
+ }
+ break;
+ }
+ case ATSPI_ROLE_INVALID:
+ case ATSPI_ROLE_TOGGLE_BUTTON:
+ case ATSPI_ROLE_HEADING:
+ case ATSPI_ROLE_PAGE_TAB:
+ case ATSPI_ROLE_EDITBAR:
+ case ATSPI_ROLE_CHECK_BOX:
+ case ATSPI_ROLE_MENU_ITEM:
+ case ATSPI_ROLE_RADIO_MENU_ITEM:
+ case ATSPI_ROLE_RADIO_BUTTON:
+ case ATSPI_ROLE_POPUP_MENU:
+ case ATSPI_ROLE_DIALOG:
+ case ATSPI_ROLE_UNKNOWN:
+ case ATSPI_ROLE_GROUPING: {
+ break;
+ }
+ default: {
+ gchar *role_name = rm->localized_role_name;
+ if (role_name)
+ g_strlcpy(ret, role_name, sizeof(ret) - 1);
+ }
+ }
+
+ return g_strdup(ret);
+}
+
+static char *generate_state_trait(AtspiAccessibleReadingMaterial *rm)
+{
+ AtspiRole role = rm->role;
+ char ret[TTS_MAX_TEXT_SIZE] = "\0";
+ switch (role) {
+ case ATSPI_ROLE_LIST_ITEM: {
+ AtspiAccessible *parent = rm->parent;
+ if (!parent) break;
+ AtspiRole parent_role = rm->parent_role;
+ if (parent_role == ATSPI_ROLE_TREE_TABLE) {
+ gboolean is_selected = STATE_SET_CONTAINS(rm->states, ATSPI_STATE_SELECTED);
+ if (is_selected)
+ g_strlcpy(ret, _("IDS_ACCS_BODY_SELECTED_TTS"), sizeof(ret) - 1);
+ }
+ break;
+ }
+ case ATSPI_ROLE_CHECK_BOX:
+ case ATSPI_ROLE_RADIO_BUTTON: {
+ AtspiAccessible *parent;
+ AtspiRole parent_role;
+ parent = rm->parent;
+ if (!parent) break;
+ parent_role = rm->parent_role;
+ if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_CHECKED))
+ g_strlcpy(ret, _("IDS_ACCS_BODY_SELECTED_TTS"), sizeof(ret) - 1);
+ else if (!STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EDITABLE) && (parent_role != ATSPI_ROLE_COLOR_CHOOSER))
+ g_strlcpy(ret, _("IDS_ACCS_OPT_NOT_SELECTED_TTS"), sizeof(ret) - 1);
+ //Role name should not be read for radio button, color selector, multibuttonentry items
+ break;
+ }
+ case ATSPI_ROLE_TOGGLE_BUTTON: {
+ if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_CHECKED))
+ g_strlcpy(ret, _("IDS_MSG_BODY_ON_T_TTS"), sizeof(ret) - 1);
+ else
+ g_strlcpy(ret, _("IDS_STORYALBUM_BODY_OFF_T_TTS"), sizeof(ret) - 1);
+ break;
+ }
+ case ATSPI_ROLE_RADIO_MENU_ITEM: {
+ g_strlcpy(ret, _("IDS_ACCS_BODY_SELECTED_TTS"), sizeof(ret) - 1);
+ break;
+ }
+ default:
+ break;
+ }
+
+ return g_strdup(ret);
+}
+
+static char *generate_description_trait(AtspiAccessibleReadingMaterial *rm)
+{
+ DEBUG("START");
+ AtspiRole role = rm->role;
+ char *ret = NULL;
+ Eina_Strbuf *buf;
+
+ buf = eina_strbuf_new();
+ switch (role) {
+ case ATSPI_ROLE_ENTRY:
+ case ATSPI_ROLE_PASSWORD_TEXT: {
+ if (!STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EDITABLE)) break;
+ if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_FOCUSED))
+ ESAL(buf, _("IDS_ST_BODY_EDITING_T_TTS"));
+ else
+ ESAL(buf, _IGNORE_ON_TV("IDS_ST_BODY_DOUBLE_TAP_TO_ENTER_TEXT_T_TTS"));
+ break;
+ }
+ case ATSPI_ROLE_MENU_ITEM: {
+ AtspiAccessible *parent = rm->parent;
+ if (!parent) break;
+ AtspiRole parent_role = rm->parent_role;
+ if (parent_role == ATSPI_ROLE_TOOL_BAR) {
+ int children_count = rm->parent_child_count;
+ int index = rm->index_in_parent;
+ AtspiSelection *selection = atspi_accessible_get_selection_iface(parent);
+ gboolean is_selected = rm->is_selected_in_parent;
+ SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, _("IDS_ACCS_BODY_TAB_P1SD_OF_P2SD"), index + 1, children_count));
+ if (!is_selected) {
+ ESAL(buf, " , ");
+ ESAL(buf, _IGNORE_ON_TV("IDS_ACCS_BODY_DOUBLE_TAP_TO_SELECT_TTS"));
+ }
+ g_object_unref(selection);
+ }
+ break;
+ }
+ case ATSPI_ROLE_LIST_ITEM: {
+ AtspiAccessible *parent = rm->parent;
+ if (!parent) break;
+ AtspiRole parent_role = rm->parent_role;
+ if (parent_role == ATSPI_ROLE_TREE_TABLE) {
+ ESAL(buf, _("IDS_BR_BODY_IMAGE_T_TTS"));
+
+ bool is_parent_multiselectable = STATE_SET_CONTAINS(rm->parent_states, ATSPI_STATE_MULTISELECTABLE);
+
+ if (is_parent_multiselectable) {
+ int selected_children_count = rm->parent_selected_child_count;
+ SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, _("IDS_SCR_BODY_PD_SELECTED_IN_TOTAL_TTS"), selected_children_count));
+ }
+ } else if (!STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EXPANDABLE)
+ && (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EXPANDED) || STATE_SET_CONTAINS(rm->states, ATSPI_STATE_COLLAPSED))) {
+ //ELM_GENLIST_ITEM_GROUP
+ ESAL(buf, _("IDS_AM_OPT_HEADER_TTS"));
+ //Genlist group & tree item have checkbox
+ int children_count = rm->child_count;
+ if (children_count > 0) {
+ if (rm->has_checkbox_child) {
+ ESAL(buf, " , ");
+ ESAL(buf, _("IDS_SCR_TBOPT_TICKBOX_FOR_ENTIRE_GROUP"));
+ }
+ }
+ } else if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EXPANDABLE)) {
+ //ELM_GENLIST_ITEM_TREE
+ ESAL(buf, _("IDS_AM_OPT_HEADER_TTS"));
+ ESAL(buf, " , ");
+ ESAL(buf, _("IDS_TPLATFORM_BODY_EXPANDABLE_LIST"));
+ if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EXPANDED)) {
+ ESAL(buf, " , ");
+ ESAL(buf, _IGNORE_ON_TV("IDS_ACCS_BODY_DOUBLE_TAP_TO_COLLAPSE_THE_LIST_T_TTS"));
+ } else {
+ ESAL(buf, " , ");
+ ESAL(buf, _IGNORE_ON_TV("IDS_ACCS_BODY_DOUBLE_TAP_TO_EXPAND_THE_LIST_T_TTS"));
+ }
+ //ELM_GENLIST_ITEM_GROUP
+ //Genlist group & tree item have checkbox
+ int children_count = rm->child_count;
+ if (children_count > 0) {
+ if (rm->has_checkbox_child) {
+ ESAL(buf, " , ");
+ ESAL(buf, _("IDS_SCR_TBOPT_TICKBOX_FOR_ENTIRE_GROUP"));
+ }
+ }
+ } else if (STATE_SET_CONTAINS(rm->parent_states, ATSPI_STATE_ANIMATED)) {
+ ESAL(buf, _IGNORE_ON_TV("IDS_BR_BODY_DOUBLE_TAP_AND_HOLD_THEN_DRAG_TO_REORDER_TTS"));
+ }
+ break;
+ }
+ case ATSPI_ROLE_POPUP_MENU: {
+ int children_count;
+ AtspiAccessible *parent = rm->parent;
+ if (!parent) break;
+ AtspiRole parent_role = rm->parent_role;
+ if (parent_role == ATSPI_ROLE_COMBO_BOX) break;
+ children_count = rm->child_count;
+ SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, _("IDS_WEBVIEW_BODY_SHOWING_PD_ITEMS_TTS"), children_count));
+ break;
+ }
+ case ATSPI_ROLE_DIALOG: {
+ int children_count = rm->list_children_count;
+ if (children_count > 0)
+ SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, _("IDS_WEBVIEW_BODY_SHOWING_PD_ITEMS_TTS"), children_count));
+ break;
+ }
+ case ATSPI_ROLE_COMBO_BOX:
+ case ATSPI_ROLE_GLASS_PANE: {
+ ESAL(buf, _IGNORE_ON_TV("IDS_ST_BODY_DOUBLE_TAP_TO_OPEN_THE_MENU_T_TTS"));
+ break;
+ }
+ case ATSPI_ROLE_CHECK_BOX:
+ case ATSPI_ROLE_RADIO_BUTTON: {
+ AtspiAccessible *parent;
+ parent = rm->parent;
+ if (!parent) break;
+ if (!STATE_SET_CONTAINS(rm->states, ATSPI_STATE_CHECKED) && STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EDITABLE))
+ ESAL(buf, _IGNORE_ON_TV("IDS_ACCS_BODY_DOUBLE_TAP_TO_EDIT_T_TTS"));
+ //Role name should not be read for radio button, color selector, multibuttonentry items
+ break;
+ }
+ case ATSPI_ROLE_PROGRESS_BAR: {
+ ESAL(buf, _("IDS_ACCS_TBBODY_IN_PROGRESS"));
+ break;
+ }
+ case ATSPI_ROLE_SLIDER: {
+ add_slider_description(buf, rm);
+ break;
+ }
+ case ATSPI_ROLE_SCROLL_BAR: {
+ GHashTable *hash_table = rm->attributes;
+ if (hash_table) {
+ const char *style = g_hash_table_lookup(hash_table, "style");
+ if (!g_strcmp0(style, "pagecontrol")) {
+ int child_count = rm->child_count;
+ int idx = rm->first_selected_child_index;
+ SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, _("IDS_ACCS_POP_PAGE_P1SD_OF_P2SD_M_DESCRIPTIVE_FORM_TTS"), idx + 1, child_count));
+ } else {
+ ESAL(buf, _IGNORE_ON_TV("IDS_ACCS_TBBODY_SWIPE_RIGHT_OR_LEFT_WITH_ONE_FINGER_TO_SELECT_NEXT_OR_PREVIOUS_LETTER"));
+ }
+ }
+ break;
+ }
+ default:
+ break;
+ }
+
+ ret = eina_strbuf_string_steal(buf);
+ eina_strbuf_free(buf);
+ DEBUG("END");
+ return ret;
+}
+
+static char *generate_description_from_relation_object(AtspiAccessibleReadingMaterial *rm)
+{
+ char *trait = NULL;
+ Eina_Strbuf *buf;
+ char *role_name = generate_role_trait(rm);
+ char *description_from_role = NULL;
+ char *state_from_role = generate_state_trait(rm);
+
+ buf = eina_strbuf_new();
+ if (role_name && strlen(role_name) > 0)
+ ESAL(buf, role_name);
+
+ if (read_description)
+ description_from_role = generate_description_trait(rm);
+ if (description_from_role && strlen(description_from_role) > 0) {
+ if (eina_strbuf_length_get(buf))
+ ESAL(buf, " , ");
+ ESAL(buf, description_from_role);
+ }
+
+ if (state_from_role && strlen(state_from_role) > 0) {
+ if (eina_strbuf_length_get(buf))
+ ESAL(buf, " , ");
+ ESAL(buf, state_from_role);
+ }
+ SCREEN_READER_SAFE_FREE(role_name, free);
+ SCREEN_READER_SAFE_FREE(description_from_role, free);
+ SCREEN_READER_SAFE_FREE(state_from_role, free);
+
+ if (rm->description && strlen(rm->description) > 0)
+ eina_strbuf_prepend_printf(buf, "%s , ", rm->description);
+
+ trait = eina_strbuf_string_steal(buf);
+ eina_strbuf_free(buf);
+ return trait;
+}
+
+unsigned short int reading_composer_reading_attribute_get(AtspiAccessibleReadingMaterial *rm)
+{
+ unsigned short int attribute = 0;
+ gchar *reading_info = NULL;
+ GHashTable *hash_table = rm->attributes;
+ if (hash_table) {
+ reading_info = g_hash_table_lookup(hash_table, "reading_info_type");
+ if (reading_info) {
+ unsigned int n = 0;
+ char **list = eina_str_split_full(reading_info, "|", 100, &n);
+ if (list) {
+ int i;
+ for (i = 0; i < n; i++) {
+ if (!g_strcmp0(list[i], "name"))
+ attribute = attribute | (ACCESSIBLE_READING_INFO_TYPE_NAME);
+ else if (!g_strcmp0(list[i], "role"))
+ attribute = attribute | (ACCESSIBLE_READING_INFO_TYPE_ROLE);
+ else if (!g_strcmp0(list[i], "description"))
+ attribute = attribute | (ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
+ else if (!g_strcmp0(list[i], "state"))
+ attribute = attribute | (ACCESSIBLE_READING_INFO_TYPE_STATE);
+ }
+ g_free(list[0]);
+ g_free(list);
+ }
+ }
+ }
+ if (!hash_table || !reading_info) {
+ attribute = attribute | (ACCESSIBLE_READING_INFO_TYPE_NAME) |
+ (ACCESSIBLE_READING_INFO_TYPE_ROLE) | (ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION) | (ACCESSIBLE_READING_INFO_TYPE_STATE);
+ }
+
+ return attribute;
+}
+
+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");
+ AtspiAccessibleReadingMaterial *rm;
+ Eina_Strbuf *buf;
+ char *name = NULL;
+ char *name_from_relation = NULL;
+ char *text = NULL;
+ char *ret = NULL;
+
+ if (!obj)
+ return NULL;
+ rm = atspi_accessible_get_reading_material(obj, NULL);
+ if (!rm)
+ return NULL;
+ unsigned short reading_attribute = reading_composer_reading_attribute_get(rm);
+
+ buf = eina_strbuf_new();
+ if (reading_attribute & ACCESSIBLE_READING_INFO_TYPE_NAME) {
+ DEBUG("START : ACCESSIBLE_READING_INFO_TYPE_NAME");
+ name = rm->name;
+ name_from_relation = rm->labeled_by_name;
+ text = rm->text_interface_name;
+
+ if (text && strlen(text))
+ ESAL(buf, text);
+ if (name && strlen(name) > 0) {
+ if (eina_strbuf_length_get(buf))
+ eina_strbuf_append_char(buf, ',');
+ ESAL(buf, name);
+ }
+ if (name_from_relation && strlen(name_from_relation) > 0) {
+ if (eina_strbuf_length_get(buf))
+ eina_strbuf_append_char(buf, ',');
+ ESAL(buf, name_from_relation);
+ }
+ DEBUG("END : ACCESSIBLE_READING_INFO_TYPE_NAME");
+ }
+
+ ret = eina_strbuf_string_steal(buf);
+ eina_strbuf_free(buf);
+ reading_composer_reading_material_free(rm);
+ DEBUG("RESULT: %s", ret);
+ DEBUG("END");
+ return ret;
+}
+
+char* reading_composer_description_get(AtspiAccessible *obj)
+{
+ char *result;
+ reading_composer_extended_description_get(obj, &result, NULL);
+ return result;
+}
+
+void reading_composer_extended_description_get(
+ AtspiAccessible *obj,
+ char **base_desc,
+ char **ext_desc)
+{
+ if(base_desc)
+ *base_desc = NULL;
+ if(ext_desc)
+ *ext_desc = NULL;
+
+ DEBUG("START");
+ char *name = NULL;
+ char *description = NULL;
+ char *role_name = NULL;
+ Eina_Strbuf *buf = NULL, *buf2 = NULL;
+ char *description_from_relation = NULL;
+ char *name_from_relation = NULL;
+ char *name_from_text_iface = NULL;
+ char *description_from_role = NULL;
+ char *state_from_role = NULL;
+ AtspiAccessibleReadingMaterial *rm;
+
+ if (!obj) return;
+
+ rm = atspi_accessible_get_reading_material(obj, NULL);
+ if (!rm) return;
+
+ display_info_about_object(rm);
+
+ unsigned short reading_attribute = reading_composer_reading_attribute_get(rm);
+
+ buf = eina_strbuf_new();
+ buf2 = ext_desc ? eina_strbuf_new() : buf2;
+ if (reading_attribute & ACCESSIBLE_READING_INFO_TYPE_NAME) {
+ DEBUG("START : ACCESSIBLE_READING_INFO_TYPE_NAME");
+ name = rm->name;
+ name_from_relation = rm->labeled_by_name;
+ name_from_text_iface = rm->text_interface_name;
+
+ if (name && strlen(name) > 0)
+ ESAL(buf, name);
+ if (name_from_relation && strlen(name_from_relation) > 0) {
+ if (eina_strbuf_length_get(buf))
+ ESAL(buf, " , ");
+ ESAL(buf, name_from_relation);
+ }
+ /* For text object on WEB page which does not have accessible name */
+ /* And for password entry which does not have accessible name */
+ if (eina_strbuf_length_get(buf) == 0 && name_from_text_iface) {
+ unsigned int text_len = strlen(name_from_text_iface);
+ if (text_len > 0) {
+ DEBUG("Object has text interface value only");
+ if (rm->role == ATSPI_ROLE_PASSWORD_TEXT) {
+ SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf,
+ ngettext("PLURAL_ZERO_ACCS_TBOPT_PD_CHARACTERS",
+ "PLURAL_ZERO_ACCS_TBOPT_PD_CHARACTERS", text_len),
+ text_len));
+ } else {
+ ESAL(buf, name_from_text_iface);
+ }
+ }
+ }
+ DEBUG("END : ACCESSIBLE_READING_INFO_TYPE_NAME");
+ }
+ if (reading_attribute & ACCESSIBLE_READING_INFO_TYPE_ROLE) {
+ DEBUG("START : ACCESSIBLE_READING_INFO_TYPE_ROLE");
+ role_name = generate_role_trait(rm);
+ if (role_name && strlen(role_name) > 0) {
+ if (eina_strbuf_length_get(buf))
+ ESAL(buf, " , ");
+ ESAL(buf, role_name);
+ }
+ SCREEN_READER_SAFE_FREE(role_name, free);
+ DEBUG("END : ACCESSIBLE_READING_INFO_TYPE_ROLE");
+ }
+ /* read_description: if description reading is enabled */
+ if (reading_attribute & ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION) {
+ /* read_description is determined by vconf value for the 'read usage hints aloud' */
+ DEBUG("START : ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION (read usage hints: %d)", read_description);
+ description = rm->description;
+ /* If description is set by application side, do not read other default information */
+ if (read_description && description && strlen(description) > 0) {
+ if (eina_strbuf_length_get(buf2))
+ ESAL(buf2, " , ");
+ ESAL(buf2, description);
+ } else if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_ENABLED)) {
+ if (read_description)
+ description_from_role = generate_description_trait(rm);
+
+ if (rm->described_by_accessible) {
+ AtspiAccessibleReadingMaterial *_rm = atspi_accessible_get_reading_material(rm->described_by_accessible, NULL);
+ if (_rm) {
+ description_from_relation = generate_description_from_relation_object(_rm);
+ reading_composer_reading_material_free(_rm);
+ }
+ }
+
+ if (description_from_role && strlen(description_from_role) > 0) {
+ if (eina_strbuf_length_get(buf2))
+ ESAL(buf2, " , ");
+ ESAL(buf2, description_from_role);
+ }
+ if (description_from_relation && strlen(description_from_relation)) {
+ if (eina_strbuf_length_get(buf2))
+ ESAL(buf2, " , ");
+ ESAL(buf2, description_from_relation);
+ }
+ }
+ SCREEN_READER_SAFE_FREE(description_from_relation, free);
+ SCREEN_READER_SAFE_FREE(description_from_role, free);
+ DEBUG("END : ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION");
+ }
+ if (reading_attribute & ACCESSIBLE_READING_INFO_TYPE_STATE) {
+ DEBUG("START : ACCESSIBLE_READING_INFO_TYPE_STATE");
+ state_from_role = generate_state_trait(rm);
+ if (state_from_role && strlen(state_from_role) > 0) {
+ if (eina_strbuf_length_get(buf))
+ ESAL(buf, " , ");
+ ESAL(buf, state_from_role);
+ }
+ if (!STATE_SET_CONTAINS(rm->states, ATSPI_STATE_ENABLED)) {
+ if (eina_strbuf_length_get(buf))
+ ESAL(buf, " , ");
+ ESAL(buf, _("IDS_ACCS_BODY_DISABLED_TTS"));
+ }
+ SCREEN_READER_SAFE_FREE(state_from_role, free);
+ DEBUG("END : ACCESSIBLE_READING_INFO_TYPE_STATE");
+ }
+
+ DEBUG("RESULT: %s", eina_strbuf_string_get(buf));
+ DEBUG("RESULT description: %s", eina_strbuf_string_get(buf2));
+ if(base_desc)
+ *base_desc = eina_strbuf_string_steal(buf);
+ if (ext_desc)
+ *ext_desc = eina_strbuf_string_steal(buf2);
+
+ eina_strbuf_free(buf);
+ if (buf != buf2)
+ eina_strbuf_free(buf2);
+ reading_composer_reading_material_free(rm);
+ DEBUG("END");
+}
+
#include <logger.h>
#include <navigator.h>
+#include <reading_composer.h>
#include <screen_reader_spi.h>
#include <screen_reader_tts.h>
return g_strdup(ret);
}
-void generate_what_to_read_impl(char **ret, char **description_ret, AtspiAccessible *obj);
-
void spi_event_get_text_to_read(
SpiData *spi,
char **text_to_read,
if (!g_strcmp0(event->type, spi->tracking_signal_name)) {
/* tracking singal "focused" */
if (event->detail1 == 1) {
- generate_what_to_read_impl(text_to_read, descr_to_read, event->source);
+ reading_composer_extended_description_get(event->source, text_to_read, descr_to_read);
}
} else if (!g_strcmp0(event->type, CARET_MOVED_SIG)) {
* limitations under the License.
*/
-#include "logger.h"
-#include "utils.h"
-#include <glib.h>
#include <atspi/atspi.h>
+#include <glib.h>
+#include <string.h>
+
+#include <logger.h>
+#include <utils.h>
static Eldbus_Connection *a11y_bus_conn = NULL; /* a11y_bus */
void utils_a11y_bus_connection_set(Eldbus_Connection *conn)
g_object_unref(ss);
return ret;
}
+
+int get_accuracy(double val, int max_accuracy)
+{
+ char val_str[HOVERSEL_TRAIT_SIZE] = "";
+ int position;
+ int accuracy;
+
+ g_snprintf(val_str, HOVERSEL_TRAIT_SIZE, "%.*f", max_accuracy, val);
+ accuracy = max_accuracy;
+ position = strlen(val_str) - 1;
+ while (position > 0 && val_str[position] == '0') {
+ --position;
+ --accuracy;
+ }
+ return accuracy;
+}
+