From 35057d7f01b8d0a4f732afccd8a37cd5f474413f Mon Sep 17 00:00:00 2001 From: Tomasz Olszak Date: Fri, 10 Jul 2015 11:58:40 +0200 Subject: [PATCH] Fixed handling of language changes Change-Id: I6cbf2f9f17e2852b84b8d015ce56c4b35ffdbcfa --- include/logger.h | 8 +- include/screen_reader.h | 7 +- include/screen_reader_vconf.h | 1 + src/screen_reader.c | 4 - src/screen_reader_tts.c | 6 +- src/screen_reader_vconf.c | 193 ++++++------------------------------------ tests/smart_navi_suite.c | 3 - 7 files changed, 43 insertions(+), 179 deletions(-) diff --git a/include/logger.h b/include/logger.h index 4ba4830..4f69c89 100644 --- a/include/logger.h +++ b/include/logger.h @@ -11,8 +11,14 @@ void logger_shutdown(void); #define INFO(...) EINA_LOG_DOM_INFO(_eina_log_dom, __VA_ARGS__); #define DEBUG(...) EINA_LOG_DOM_DBG(_eina_log_dom, __VA_ARGS__); #define ERROR(...) EINA_LOG_DOM_ERR(_eina_log_dom, __VA_ARGS__); -#define WARNING(...) EINA_LOG_DOM_WRN(_eina_log_dom, __VA_ARGS__); +#define WARNING(...) EINA_LOG_DOM_WARN(_eina_log_dom, __VA_ARGS__); #define MEMORY_ERROR "Memory allocation error" +#ifdef _ +#undef _ +#endif + +#define _(str) gettext(str) + #endif /* end of include guard: LOGGER_H_ */ diff --git a/include/screen_reader.h b/include/screen_reader.h index d2535d4..76396ea 100644 --- a/include/screen_reader.h +++ b/include/screen_reader.h @@ -5,7 +5,7 @@ #include #include -#define LAN_NAME 6 +#define LANGUAGE_NAME_SIZE 6 #define MAX_REACHED ", maximum value reached" #define MIN_REACHED ", minimum value reached" @@ -33,11 +33,8 @@ typedef enum typedef struct _Service_Data { //Set by vconf - int information_level; bool run_service; - char language[LAN_NAME]; - int voice_type; - int reading_speed; + char display_language[LANGUAGE_NAME_SIZE]; char *tracking_signal_name; //Set by tts diff --git a/include/screen_reader_vconf.h b/include/screen_reader_vconf.h index f276adc..0affa51 100644 --- a/include/screen_reader_vconf.h +++ b/include/screen_reader_vconf.h @@ -5,5 +5,6 @@ #include "logger.h" bool vconf_init(Service_Data *service_data); +void screen_reader_vconf_update_tts_language(Service_Data *service_data); #endif /* SCREEN_READER_VCONF_H_ */ diff --git a/src/screen_reader.c b/src/screen_reader.c index 31d17c9..0f63eeb 100644 --- a/src/screen_reader.c +++ b/src/screen_reader.c @@ -14,11 +14,7 @@ Service_Data service_data = { //Set by vconf - .information_level = 1, .run_service = 1, - .language = "en_US", - .voice_type = TTS_VOICE_TYPE_FEMALE, - .reading_speed = 2, .tracking_signal_name = HIGHLIGHT_CHANGED_SIG, diff --git a/src/screen_reader_tts.c b/src/screen_reader_tts.c index d263367..c9c3271 100644 --- a/src/screen_reader_tts.c +++ b/src/screen_reader_tts.c @@ -2,6 +2,7 @@ #include #include "screen_reader_tts.h" +#include "screen_reader_vconf.h" #include "logger.h" // ---------------------------- DEBUG HELPERS ------------------------------ @@ -228,7 +229,7 @@ void tts_speak(char *text_to_speak, Eina_Bool flush_switch) if ( !text_to_speak ) return; if ( !text_to_speak[0] ) return; - if(tts_add_text( sd->tts, text_to_speak, sd->language, TTS_VOICE_TYPE_AUTO, TTS_SPEED_AUTO, &speak_id)) + if(tts_add_text( sd->tts, text_to_speak, NULL, TTS_VOICE_TYPE_AUTO, TTS_SPEED_AUTO, &speak_id)) return; DEBUG("added id to:%d\n", speak_id); @@ -277,6 +278,9 @@ void state_changed_cb(tts_h tts, tts_state_e previous, tts_state_e current, void if (TTS_STATE_CREATED == previous && TTS_STATE_READY == current) { + + update_supported_voices(sd); + char *txt; if (!txt_keep_buff) return; diff --git a/src/screen_reader_vconf.c b/src/screen_reader_vconf.c index d6818ad..4e1d9c8 100644 --- a/src/screen_reader_vconf.c +++ b/src/screen_reader_vconf.c @@ -16,63 +16,8 @@ keylist_t *keys = NULL; -bool set_langauge(Service_Data *sd, const char *new_language, int new_voice) -{ - DEBUG("START"); - - Eina_List *l; - Voice_Info *vi; - - if (!new_language) - return false; - - if(strncmp(sd->language, new_language, LAN_NAME - 1) == 0 && sd->voice_type == new_voice) - { - DEBUG("No need to change accessibility language: %s(%d) -> %s(%d)", - sd->language, sd->voice_type, new_language, new_voice); - - return true; - } - - EINA_LIST_FOREACH(sd->available_languages, l, vi) - { - DEBUG("foreach %s <- %s", vi->language, new_language); - if(strncmp(vi->language, new_language, LAN_NAME - 1) == 0 && - vi->voice_type == new_voice) - { - DEBUG("str_cpy %s (%d) -> %s (%d)", sd->language, sd->voice_type, vi->language, vi->voice_type); - snprintf(sd->language, LAN_NAME, "%s", vi->language); - sd->voice_type = vi->voice_type; - DEBUG("after_str_cpy"); - - DEBUG("ACCESSIBILITY LANGUAGE CHANGED"); - DEBUG("END"); - return true; - } - } - - DEBUG("ACCESSIBILITY LANGUAGE FAILED TO CHANGED"); - - vconf_set_str("db/setting/accessibility/language", sd->language); - vconf_set_int("db/setting/accessibility/voice", sd->voice_type); - - DEBUG("END"); - return false; -} - // ------------------------------ vconf callbacks---------------------- -void information_level_cb(keynode_t *node, void *user_data) -{ - DEBUG("START"); - DEBUG("Information level set: %d", node->value.i); - - Service_Data *service_data = user_data; - service_data->information_level = node->value.i; - - DEBUG("END"); -} - void app_termination_cb(keynode_t *node, void *user_data) { DEBUG("START"); @@ -89,47 +34,15 @@ void app_termination_cb(keynode_t *node, void *user_data) DEBUG("END"); } -void language_cb(keynode_t *node, void *user_data) -{ - DEBUG("START"); - DEBUG("Trying to set language to: %s", node->value.s); - - Service_Data *sd = user_data; - - int voice_type; - - /* FIXME: this is a callback of 'db/setting/accessibility/language' */ - vconf_get_int("db/setting/accessibility/voice", (int*)(&voice_type)); - set_langauge(sd, node->value.s, voice_type); - - DEBUG("END"); -} - -void voice_cb(keynode_t *node, void *user_data) +void display_language_cb(keynode_t *node, void *user_data) { DEBUG("START"); - DEBUG("Voice set to: %d", node->value.i); + DEBUG("Trying to set LC_MESSAGES to: %s", node->value.s); Service_Data *sd = user_data; - - /* FIXME: this is a callback of 'db/setting/accessibility/voice' */ - const char *lang = vconf_get_str("db/setting/accessibility/language"); - if(!lang) - { - DEBUG("FAILED TO GET LANGUAGE"); - } - set_langauge(sd, lang, (int)node->value.i); - - DEBUG("END"); -} - -void reading_speed_cb(keynode_t *node, void *user_data) -{ - DEBUG("START"); - DEBUG("Reading speed set to: %d", node->value.i); - - Service_Data *service_data = user_data; - service_data->reading_speed = node->value.i; + snprintf(sd->display_language, LANGUAGE_NAME_SIZE, "%s", node->value.s); + //to make gettext work + setenv("LC_MESSAGES", sd->display_language, 1); DEBUG("END"); } @@ -139,51 +52,36 @@ void reading_speed_cb(keynode_t *node, void *user_data) int get_key_values(Service_Data *sd) { DEBUG("START"); - - char *language = vconf_get_str("db/setting/accessibility/language"); - - if(!language) - { - /*FIXME: need to handle to_ret from here */ - DEBUG("FAILED TO GET LANGUAGE"); - } - - int ret = -1; int to_ret = 0; + char *display_language = vconf_get_str("db/menu_widget/language"); + if (display_language) + { + snprintf(sd->display_language, LANGUAGE_NAME_SIZE, "%s", display_language); + //to make gettext work + setenv("LC_MESSAGES", sd->display_language, 1); + free(display_language); + } + else + WARNING("Can't get db/menu_widget/language value"); - int voice; - ret = vconf_get_int("db/setting/accessibility/voice", &voice); - if(ret != 0) - { - to_ret -= -1; - DEBUG("FAILED TO SET VOICE TYPE: %d", ret); - } - - if(language) - set_langauge(sd, language, voice); - - ret = vconf_get_int("db/setting/accessibility/speech_rate", &sd->reading_speed); - if(ret != 0) - { - to_ret -= -2; - DEBUG("FAILED TO SET READING SPEED: %d", ret); - } - - ret = vconf_get_int("db/setting/accessibility/information_level", &sd->information_level); - if(ret != 0) - { - to_ret -= -4; - DEBUG("FAILED TO SET INFORMATION LEVEL: %d", ret); - } - - DEBUG("SCREEN READER DATA SET TO: Language: %s; Voice: %d, Reading_Speed: %d, Information_Level: %d, Tracking signal: %s;", - sd->language, sd->voice_type, sd->reading_speed, sd->information_level, sd->tracking_signal_name); + DEBUG("SCREEN READER DATA SET TO: Display_Language: %s, Tracking signal: %s;", + sd->display_language, sd->tracking_signal_name); DEBUG("END"); return to_ret; } +int _set_vconf_callback_and_print_message_on_error_and_return_error_code(const char *in_key, vconf_callback_fn cb, + void *user_data) +{ + int ret = vconf_notify_key_changed(in_key, cb, user_data); + if(ret != 0) + DEBUG("Could not add notify callback to %s key", in_key); + + return ret; +} + bool vconf_init(Service_Data *service_data) { DEBUG( "--------------------- VCONF_init START ---------------------"); @@ -207,42 +105,7 @@ bool vconf_init(Service_Data *service_data) DEBUG("Could not set data from vconf: %d", ret); } - ret = vconf_notify_key_changed("db/setting/accessibility/information_level", information_level_cb, service_data); - if(ret != 0) - { - DEBUG("Could not add information level callback"); - return false; - } - - ret = vconf_notify_key_changed("db/menu_widget/language", language_cb, service_data); - if(ret != 0) - { - DEBUG("Could not add language callback"); - return false; - } - - ret = vconf_notify_key_changed("db/setting/accessibility/language", language_cb, service_data); - if(ret != 0) - { - DEBUG("Could not add language callback"); - return false; - } - - ret = vconf_notify_key_changed("db/setting/accessibility/voice", voice_cb, service_data); - if(ret != 0) - { - DEBUG("Could not add voice callback"); - return false; - } - - ret = vconf_notify_key_changed("db/setting/accessibility/speech_rate", reading_speed_cb, service_data); - if(ret != 0) - { - DEBUG("Could not add reading speed callback callback"); - return false; - } - - DEBUG("ALL CALBACKS ADDED"); + _set_vconf_callback_and_print_message_on_error_and_return_error_code("db/menu_widget/language", display_language_cb, service_data); DEBUG( "---------------------- VCONF_init END ----------------------\n\n"); return true; diff --git a/tests/smart_navi_suite.c b/tests/smart_navi_suite.c index df3a45f..5930b17 100644 --- a/tests/smart_navi_suite.c +++ b/tests/smart_navi_suite.c @@ -16,10 +16,7 @@ static FlatNaviContext *ctx; void setup(void) { Service_Data *data = get_pointer_to_service_data_struct(); - data->information_level = 1; data->run_service = 1; - data->voice_type = TTS_VOICE_TYPE_FEMALE; - data->reading_speed = 2; data->tracking_signal_name = HIGHLIGHT_CHANGED_SIG; //Set by tts -- 2.7.4