navigator: remove global var sym_hash 05/238505/5
authorKamil Konieczny <k.konieczny@samsung.com>
Tue, 14 Jul 2020 13:23:12 +0000 (15:23 +0200)
committerKamil Konieczny <k.konieczny@samsung.com>
Mon, 20 Jul 2020 11:05:23 +0000 (13:05 +0200)
Move global var sym_hash inside function symbol_lookup
and replace uses of sym_hash by call to symbol_lookup.
As it is used also by app_tracker.c, move this into
separate file symbols.c

Change-Id: I0b55243262ca2fdc7d58c5a0bea8fd17e31526e5

CMakeLists.txt
include/navigator.h
include/symbols.h [new file with mode: 0644]
src/app_tracker.c
src/navigator.c
src/symbols.c [new file with mode: 0644]

index ebb7e4525e368c44d1c9f8e9cb5a23ae1dcb7c59..3034022f6760dbe5cd549a208384e63ed853ef2b 100755 (executable)
@@ -20,6 +20,7 @@ SET(SRCS ${CMAKE_SOURCE_DIR}/src/app_tracker.c
         ${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
 )
 
index 243cc8c3f291e4d362991942a6a8f1aff0699735..87778cd219805f4630ab9c9e81b75ad4555aa33f 100644 (file)
@@ -10,7 +10,6 @@
 
 extern bool read_description;
 extern bool haptic;
-extern GHashTable *sym_hash;
 
 /**
  * @brief Creates environment for navigation
diff --git a/include/symbols.h b/include/symbols.h
new file mode 100644 (file)
index 0000000..89f202e
--- /dev/null
@@ -0,0 +1,12 @@
+#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_ */
index 8e88565229318825a2083d219ae4f9fe995cc0c8..1ab80d9d676cf546ce7892fcab1a9b54cd927eef 100644 (file)
@@ -19,6 +19,7 @@
 #include <logger.h>
 #include <navigator.h>
 #include <screen_reader_tts.h>
+#include <symbols.h>
 #include <utils.h>
 #include <window_tracker.h>
 
@@ -544,7 +545,7 @@ static void _on_atspi_event_cb(AtspiEvent *event, void *user_data)
                        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);
@@ -586,7 +587,7 @@ static void _on_atspi_event_cb(AtspiEvent *event, void *user_data)
                                }
                                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);
index 0f70e599ed083e9b342d3d84beef8c61538d8d88..bcb37aed3cee9c6d6bc067b836b69ddebf19441c 100644 (file)
@@ -34,6 +34,7 @@
 #include "screen_reader_tts.h"
 #include "granularity_read.h"
 #include "utils.h"
+#include "symbols.h"
 
 #define QUICKPANEL_DOWN TRUE
 #define QUICKPANEL_UP FALSE
@@ -105,82 +106,6 @@ extern bool read_description;
 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) {
@@ -1810,7 +1735,7 @@ static void _caret_move_forward(Navigator_Data *nd)
                                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);
                                }
@@ -1859,7 +1784,7 @@ static void _caret_move_backward(Navigator_Data *nd)
                        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);
                        }
@@ -3320,9 +3245,6 @@ Navigator_Data *navigator_init()
        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;
 }
@@ -3359,9 +3281,6 @@ void navigator_shutdown(Navigator_Data *nd)
 
        app_tracker_shutdown(nd->app_tracker_data);
        smart_notification_shutdown();
-#ifndef SCREEN_READER_TV
-       symbol_text_hash_destroy();
-#endif
 
        free(nd);
 }
diff --git a/src/symbols.c b/src/symbols.c
new file mode 100644 (file)
index 0000000..0ded78e
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+ * 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
+}
+