${CMAKE_SOURCE_DIR}/src/dbus_direct_reading_adapter.c
${CMAKE_SOURCE_DIR}/src/navigator.c
${CMAKE_SOURCE_DIR}/src/granularity_read.c
+ ${CMAKE_SOURCE_DIR}/src/symbols.c
${CMAKE_SOURCE_DIR}/src/window_tracker.c
)
extern bool read_description;
extern bool haptic;
-extern GHashTable *sym_hash;
/**
* @brief Creates environment for navigation
--- /dev/null
+#ifndef SYMBOLS_H_
+#define SYMBOLS_H_
+
+#define _GNU_SOURCE
+#include <glib.h>
+
+/**
+ * @brief Gets descriptive value of text symbol
+ */
+extern const gchar *symbol_lookup(const gchar *text);
+
+#endif /* SYMBOLS_H_ */
#include <logger.h>
#include <navigator.h>
#include <screen_reader_tts.h>
+#include <symbols.h>
#include <utils.h>
#include <window_tracker.h>
if ((event->detail2 == 1) && isupper((int)*text)) {
SUPPRESS_FORMAT_ERROR(g_snprintf(buf, sizeof(buf), _("IDS_ACCS_OPT_CAPITAL_PS_TTS"), text));
g_strlcat(buf, " ", sizeof(buf) - strlen(buf) - 1);
- } else if ((symtext = g_hash_table_lookup(sym_hash, text))) {
+ } else if ((symtext = symbol_lookup(text))) {
g_strlcat(buf, _(symtext), sizeof(buf));
} else {
g_strlcat(buf, text, sizeof(buf) - strlen(buf) - 1);
}
if ((event->detail2 == 1) && isupper((int)*text))
SUPPRESS_FORMAT_ERROR(g_snprintf(buf, sizeof(buf), _("IDS_ACCS_OPT_CAPITAL_PS_TTS"), text));
- else if ((symtext = g_hash_table_lookup(sym_hash, text)))
+ else if ((symtext = symbol_lookup(text)))
g_strlcat(buf, _(symtext), sizeof(buf));
else
g_strlcat(buf, text, sizeof(buf) - strlen(buf) - 1);
#include "screen_reader_tts.h"
#include "granularity_read.h"
#include "utils.h"
+#include "symbols.h"
#define QUICKPANEL_DOWN TRUE
#define QUICKPANEL_UP FALSE
extern bool haptic;
extern bool sound_feedback;
-typedef struct _symbol_mapping_table Sym_Table;
-struct _symbol_mapping_table
-{
- const gchar *symbol;
- const gchar *reading;
-};
-GHashTable *sym_hash = NULL;
-
-#ifndef SCREEN_READER_TV
-static Sym_Table _mapping_table[] = {
- { ".", "IDS_IME_BODY_DOT_M_KEYBOARD_SYMBOL" },
- { ",", "IDS_IME_BODY_COMMA_M_KEYBOARD_SYMBOL" },
- { "?", "IDS_IME_BODY_QUESTION_MARK_M_KEYBOARD_SYMBOL" },
- { "!", "IDS_IME_BODY_EXCLAMATION_MARK_M_KEYBOARD_SYMBOL" },
- { "\'", "IDS_IME_BODY_SINGLE_QUOTE_M_KEYBOARD_SYMBOL" },
- { "@", "IDS_IME_BODY_AT_M_KEYBOARD_SYMBOL" },
- { "&", "IDS_IME_BODY_AND_M_KEYBOARD_SYMBOL" },
- { "/", "IDS_IME_BODY_SLASH_M_KEYBOARD_SYMBOL" },
- { ":", "IDS_IME_BODY_COLON_M_KEYBOARD_SYMBOL" },
- { ";", "IDS_IME_BODY_SEMICOLON_M_KEYBOARD_SYMBOL" },
- { "\"", "IDS_IME_BODY_QUOTES_M_KEYBOARD_SYMBOL" },
- { "_", "IDS_IME_BODY_UNDERSCORE_M_KEYBOARD_SYMBOL" },
- { "-", "IDS_IME_BODY_DASH_M_KEYBOARD_SYMBOL" },
- { "#", "IDS_IME_BODY_HASH_M_KEYBOARD_SYMBOL" },
- { "^", "IDS_IME_BODY_CIRCUMFLEX_M_KEYBOARD_SYMBOL" },
- { "(", "IDS_IME_BODY_OPENING_PARENTHESIS_M_KEYBOARD_SYMBOL" },
- { ")", "IDS_IME_BODY_CLOSING_PARENTHESIS_M_KEYBOARD_SYMBOL" },
- { "+", "IDS_IME_BODY_PLUS_M_KEYBOARD_SYMBOL" },
- { "*", "IDS_IME_BODY_ASTERISK_M_KEYBOARD_SYMBOL" },
- { "÷", "IDS_IME_BODY_DIVIDED_BY_M_KEYBOARD_SYMBOL" },
- { "=", "IDS_IME_BODY_EQUALS_M_KEYBOARD_SYMBOL" },
- { "%", "IDS_IME_BODY_PERCENT_M_KEYBOARD_SYMBOL" },
- { "$", "IDS_IME_BODY_DOLLAR_M_KEYBOARD_SYMBOL" },
- { "€", "IDS_IME_BODY_EURO_M_KEYBOARD_SYMBOL" },
- { "£", "IDS_IME_BODY_POUND_M_KEYBOARD_SYMBOL" },
- { "₩", "IDS_IME_BODY_WON_M_KEYBOARD_SYMBOL" },
- { "¥", "IDS_IME_BODY_YEN_M_KEYBOARD_SYMBOL" },
- { "<", "IDS_IME_BODY_LESS_THAN_M_KEYBOARD_SYMBOL" },
- { ">", "IDS_IME_BODY_GREATER_THAN_M_KEYBOARD_SYMBOL" },
- { "[", "IDS_IME_BODY_OPENING_BRACKET_M_KEYBOARD_SYMBOL" },
- { "]", "IDS_IME_BODY_CLOSING_BRACKET_M_KEYBOARD_SYMBOL" },
- { "{", "IDS_IME_BODY_OPENING_BRACE_M_KEYBOARD_SYMBOL" },
- { "}", "IDS_IME_BODY_CLOSING_BRACE_M_KEYBOARD_SYMBOL" },
- { "♡", "IDS_IME_BODY_WHITE_HEART_M_KEYBOARD_SYMBOL" },
- { "☆", "IDS_IME_BODY_WHITE_STAR_M_KEYBOARD_SYMBOL" },
- { "~", "IDS_IME_BODY_TILDE_M_KEYBOARD_SYMBOL" },
- { "《", "IDS_IME_BODY_LEFT_ANGLE_QUOTES_M_KEYBOARD_SYMBOL" },
- { "》", "IDS_IME_BODY_RIGHT_ANGLE_QUOTES_M_KEYBOARD_SYMBOL" },
- { "¡", "IDS_IME_BODY_INVERTED_EXCLAMATION_MARK_M_KEYBOARD_SYMBOL" },
- { "¿", "IDS_IME_BODY_INVERTED_QUESTION_MARK_M_KEYBOARD_SYMBOL" },
- { "\\", "IDS_IME_BODY_BACKSLASH_M_KEYBOARD_SYMBOL" },
- { "`", "IDS_IME_BODY_GRAVE_ACCENT_M_KEYBOARD_SYMBOL" },
- { "•", "IDS_IME_BODY_BULLET_POINT_M_KEYBOARD_SYMBOL" },
- { "|", "IDS_IME_BODY_PIPE_M_KEYBOARD_SYMBOL" },
- { "¤", "IDS_IME_BODY_CURRENCY_SIGN_M_KEYBOARD_SYMBOL" },
- { " ", "IDS_IME_BODY_SPACE" },
- { "ㆍ", "아래아" },
- { NULL, NULL }
-};
-
-static void symbol_text_hash_init()
-{
- sym_hash = g_hash_table_new(g_str_hash, g_str_equal);
- for (int i = 0; _mapping_table[i].symbol != NULL; i++) {
- {
- g_hash_table_insert(sym_hash, (gpointer)_mapping_table[i].symbol, (gpointer)_mapping_table[i].reading);
- }
- }
-}
-
-static void symbol_text_hash_destroy()
-{
- g_hash_table_destroy(sym_hash);
-}
-#endif
-
char *state_to_char(AtspiStateType state)
{
switch (state) {
tts_speak_customized(_("IDS_TEXT_END"), EINA_FALSE, EINA_TRUE, current_obj);*/
} else {
DEBUG("SPEAK:%s", text ? text : "text nil");
- const gchar *symtext = g_hash_table_lookup(sym_hash, text);
+ const gchar *symtext = symbol_lookup(text);
if (symtext) {
tts_speak_customized(_(symtext), EINA_TRUE, EINA_TRUE, nd->current_obj, 0);
}
DEBUG("Caret position decrement done");
DEBUG("Current caret position:%d", offset_pos);
DEBUG("SPEAK:%s", text ? text : "text nil");
- const gchar *symtext = g_hash_table_lookup(sym_hash, text);
+ const gchar *symtext = symbol_lookup(text);
if (symtext) {
tts_speak_customized(_(symtext), EINA_TRUE, EINA_TRUE, nd->current_obj, 0);
}
nd->keyboard_tracker_data = keyboard_tracker_init();
keyboard_tracker_register_top_window_info_get(nd->keyboard_tracker_data, app_tracker_top_window_info_get_opaque, nd->app_tracker_data);
smart_notification_init();
-#ifndef SCREEN_READER_TV
- symbol_text_hash_init();
-#endif
return nd;
}
app_tracker_shutdown(nd->app_tracker_data);
smart_notification_shutdown();
-#ifndef SCREEN_READER_TV
- symbol_text_hash_destroy();
-#endif
free(nd);
}
--- /dev/null
+/*
+ * Copyright (c) 2020 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define _GNU_SOURCE
+#include <glib.h>
+
+#include <logger.h>
+
+typedef struct _symbol_mapping_table Sym_Table;
+struct _symbol_mapping_table
+{
+ const gchar *symbol;
+ const gchar *reading;
+};
+
+const gchar * symbol_lookup(const gchar *text) {
+#ifdef SCREEN_READER_TV
+ return NULL;
+#else
+ static GHashTable *sym_hash = NULL;
+ static int init = 0;
+
+ static Sym_Table _mapping_table[] = {
+ { ".", "IDS_IME_BODY_DOT_M_KEYBOARD_SYMBOL" },
+ { ",", "IDS_IME_BODY_COMMA_M_KEYBOARD_SYMBOL" },
+ { "?", "IDS_IME_BODY_QUESTION_MARK_M_KEYBOARD_SYMBOL" },
+ { "!", "IDS_IME_BODY_EXCLAMATION_MARK_M_KEYBOARD_SYMBOL" },
+ { "\'", "IDS_IME_BODY_SINGLE_QUOTE_M_KEYBOARD_SYMBOL" },
+ { "@", "IDS_IME_BODY_AT_M_KEYBOARD_SYMBOL" },
+ { "&", "IDS_IME_BODY_AND_M_KEYBOARD_SYMBOL" },
+ { "/", "IDS_IME_BODY_SLASH_M_KEYBOARD_SYMBOL" },
+ { ":", "IDS_IME_BODY_COLON_M_KEYBOARD_SYMBOL" },
+ { ";", "IDS_IME_BODY_SEMICOLON_M_KEYBOARD_SYMBOL" },
+ { "\"", "IDS_IME_BODY_QUOTES_M_KEYBOARD_SYMBOL" },
+ { "_", "IDS_IME_BODY_UNDERSCORE_M_KEYBOARD_SYMBOL" },
+ { "-", "IDS_IME_BODY_DASH_M_KEYBOARD_SYMBOL" },
+ { "#", "IDS_IME_BODY_HASH_M_KEYBOARD_SYMBOL" },
+ { "^", "IDS_IME_BODY_CIRCUMFLEX_M_KEYBOARD_SYMBOL" },
+ { "(", "IDS_IME_BODY_OPENING_PARENTHESIS_M_KEYBOARD_SYMBOL" },
+ { ")", "IDS_IME_BODY_CLOSING_PARENTHESIS_M_KEYBOARD_SYMBOL" },
+ { "+", "IDS_IME_BODY_PLUS_M_KEYBOARD_SYMBOL" },
+ { "*", "IDS_IME_BODY_ASTERISK_M_KEYBOARD_SYMBOL" },
+ { "÷", "IDS_IME_BODY_DIVIDED_BY_M_KEYBOARD_SYMBOL" },
+ { "=", "IDS_IME_BODY_EQUALS_M_KEYBOARD_SYMBOL" },
+ { "%", "IDS_IME_BODY_PERCENT_M_KEYBOARD_SYMBOL" },
+ { "$", "IDS_IME_BODY_DOLLAR_M_KEYBOARD_SYMBOL" },
+ { "€", "IDS_IME_BODY_EURO_M_KEYBOARD_SYMBOL" },
+ { "£", "IDS_IME_BODY_POUND_M_KEYBOARD_SYMBOL" },
+ { "₩", "IDS_IME_BODY_WON_M_KEYBOARD_SYMBOL" },
+ { "¥", "IDS_IME_BODY_YEN_M_KEYBOARD_SYMBOL" },
+ { "<", "IDS_IME_BODY_LESS_THAN_M_KEYBOARD_SYMBOL" },
+ { ">", "IDS_IME_BODY_GREATER_THAN_M_KEYBOARD_SYMBOL" },
+ { "[", "IDS_IME_BODY_OPENING_BRACKET_M_KEYBOARD_SYMBOL" },
+ { "]", "IDS_IME_BODY_CLOSING_BRACKET_M_KEYBOARD_SYMBOL" },
+ { "{", "IDS_IME_BODY_OPENING_BRACE_M_KEYBOARD_SYMBOL" },
+ { "}", "IDS_IME_BODY_CLOSING_BRACE_M_KEYBOARD_SYMBOL" },
+ { "♡", "IDS_IME_BODY_WHITE_HEART_M_KEYBOARD_SYMBOL" },
+ { "☆", "IDS_IME_BODY_WHITE_STAR_M_KEYBOARD_SYMBOL" },
+ { "~", "IDS_IME_BODY_TILDE_M_KEYBOARD_SYMBOL" },
+ { "《", "IDS_IME_BODY_LEFT_ANGLE_QUOTES_M_KEYBOARD_SYMBOL" },
+ { "》", "IDS_IME_BODY_RIGHT_ANGLE_QUOTES_M_KEYBOARD_SYMBOL" },
+ { "¡", "IDS_IME_BODY_INVERTED_EXCLAMATION_MARK_M_KEYBOARD_SYMBOL" },
+ { "¿", "IDS_IME_BODY_INVERTED_QUESTION_MARK_M_KEYBOARD_SYMBOL" },
+ { "\\", "IDS_IME_BODY_BACKSLASH_M_KEYBOARD_SYMBOL" },
+ { "`", "IDS_IME_BODY_GRAVE_ACCENT_M_KEYBOARD_SYMBOL" },
+ { "•", "IDS_IME_BODY_BULLET_POINT_M_KEYBOARD_SYMBOL" },
+ { "|", "IDS_IME_BODY_PIPE_M_KEYBOARD_SYMBOL" },
+ { "¤", "IDS_IME_BODY_CURRENCY_SIGN_M_KEYBOARD_SYMBOL" },
+ { " ", "IDS_IME_BODY_SPACE" },
+ { "ㆍ", "아래아" },
+ { NULL, NULL }
+ };
+
+ // fast path
+ if (sym_hash)
+ return g_hash_table_lookup(sym_hash, text);
+
+ if (!init) {
+ sym_hash = g_hash_table_new(g_str_hash, g_str_equal);
+ if (!sym_hash) {
+ ERROR("hash table alloc failed");
+ return NULL;
+ }
+
+ for (int i = 0; _mapping_table[i].symbol != NULL; i++) {
+ {
+ g_hash_table_insert(sym_hash, (gpointer)_mapping_table[i].symbol, (gpointer)_mapping_table[i].reading);
+ }
+ }
+
+ init = 1;
+ }
+
+ if (!sym_hash)
+ return NULL;
+
+ return g_hash_table_lookup(sym_hash, text);
+#endif
+}
+