summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYoungbok Shin <youngb.shin@samsung.com>2016-04-08 11:17:51 +0100
committerTom Hacohen <tom@stosb.com>2016-04-08 11:24:32 +0100
commitf4f9753c201c569b1a31f0b394d9352c80a7d9d0 (patch)
tree8a097bab49da040019d0dd52c7a9ae720a72ee23
parentf7a4a2b2a04d3135f874bc0760db90a247b8f270 (diff)
downloadefl-f4f9753c201c569b1a31f0b394d9352c80a7d9d0.tar.gz
Evas: Add API to reinit the language and use it in elementary.
Summary: evas_common_language_from_locale_* functions kept static pointers inside of its functions. Once these function was called, it was never reset. It made big problems for harfbuzz and hyphenation. Also, Elementary provides elm_language_set() API. Then we need to support it fully. @fix Test Plan: Test case for hyphenation is included in Evas test suite. Reviewers: raster, tasn, herdsman, woohyun, z-wony, Blackmole, minudf Subscribers: cedric, jpeg Differential Revision: https://phab.enlightenment.org/D3864
-rw-r--r--src/lib/elementary/elm_main.c1
-rw-r--r--src/lib/evas/Evas_Common.h10
-rw-r--r--src/lib/evas/canvas/evas_main.c6
-rw-r--r--src/lib/evas/common/language/evas_language_utils.c19
-rw-r--r--src/lib/evas/common/language/evas_language_utils.h3
-rw-r--r--src/tests/evas/evas_test_textblock.c25
6 files changed, 56 insertions, 8 deletions
diff --git a/src/lib/elementary/elm_main.c b/src/lib/elementary/elm_main.c
index eaafac4ca0..528604cd18 100644
--- a/src/lib/elementary/elm_main.c
+++ b/src/lib/elementary/elm_main.c
@@ -1180,6 +1180,7 @@ EAPI void
elm_language_set(const char *lang)
{
setlocale(LC_ALL, lang);
+ evas_language_reinit();
_elm_win_translate();
edje_language_set(lang);
}
diff --git a/src/lib/evas/Evas_Common.h b/src/lib/evas/Evas_Common.h
index cf6fb1bbf9..d44644b92f 100644
--- a/src/lib/evas/Evas_Common.h
+++ b/src/lib/evas/Evas_Common.h
@@ -5116,6 +5116,16 @@ EAPI int evas_string_char_prev_get(const char *str, int pos, int *decoded) EINA
EAPI int evas_string_char_len_get(const char *str) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1);
/**
+ * Reinitialize language from the environment.
+ *
+ * The locale can change while a process is running. This call tells evas to
+ * reload the locale from the environment like it does on start.
+ * @ingroup Evas_Utils
+ * @since 1.18
+ */
+EAPI void evas_language_reinit(void);
+
+/**
* @defgroup Evas_Keys Key Input Functions
*
* Functions which feed key events to the canvas.
diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_main.c
index 38e901a957..87061b6be2 100644
--- a/src/lib/evas/canvas/evas_main.c
+++ b/src/lib/evas/canvas/evas_main.c
@@ -705,4 +705,10 @@ evas_ector_get(Evas_Public_Data *e)
return e->engine.ector;
}
+EAPI void
+evas_language_reinit(void)
+{
+ evas_common_language_reinit();
+}
+
#include "canvas/evas_canvas.eo.c"
diff --git a/src/lib/evas/common/language/evas_language_utils.c b/src/lib/evas/common/language/evas_language_utils.c
index 19638d528d..f8b38b6abd 100644
--- a/src/lib/evas/common/language/evas_language_utils.c
+++ b/src/lib/evas/common/language/evas_language_utils.c
@@ -45,6 +45,9 @@
#define EXPLICIT_SCRIPT(script) \
(((script) != EVAS_SCRIPT_UNKNOWN) && ((script) > EVAS_SCRIPT_INHERITED))
+static char lang[6]; /* FIXME: Maximum length I know about */
+static char lang_full[32];
+
static Evas_Script_Type
_evas_common_language_char_script_search(Eina_Unicode unicode)
{
@@ -135,7 +138,6 @@ evas_common_language_script_type_get(const Eina_Unicode *str, size_t len)
const char *
evas_common_language_from_locale_get(void)
{
- static char lang[6]; /* FIXME: Maximum length I know about */
if (*lang) return lang;
const char *locale;
@@ -163,8 +165,7 @@ evas_common_language_from_locale_get(void)
const char *
evas_common_language_from_locale_full_get(void)
{
- static char lang[32];
- if (*lang) return lang;
+ if (*lang_full) return lang_full;
const char *locale;
locale = setlocale(LC_MESSAGES, NULL);
@@ -177,14 +178,20 @@ evas_common_language_from_locale_full_get(void)
if ((c == '.') || (c == '@') || (c == ' ')) /* Looks like en_US.UTF8 or de_DE@euro or aa_ER UTF-8*/
break;
}
- strncpy(lang, locale, i);
- lang[i] = '\0';
- return lang;
+ strncpy(lang_full, locale, i);
+ lang_full[i] = '\0';
+ return lang_full;
}
return "";
}
+void
+evas_common_language_reinit(void)
+{
+ *lang = *lang_full = '\0';
+}
+
/*
* @}
*/
diff --git a/src/lib/evas/common/language/evas_language_utils.h b/src/lib/evas/common/language/evas_language_utils.h
index 5e249121fd..8c7529a572 100644
--- a/src/lib/evas/common/language/evas_language_utils.h
+++ b/src/lib/evas/common/language/evas_language_utils.h
@@ -131,5 +131,8 @@ evas_common_language_from_locale_get(void);
const char *
evas_common_language_from_locale_full_get(void);
+
+void
+evas_common_language_reinit(void);
#endif
diff --git a/src/tests/evas/evas_test_textblock.c b/src/tests/evas/evas_test_textblock.c
index 1473f99354..9120b228da 100644
--- a/src/tests/evas/evas_test_textblock.c
+++ b/src/tests/evas/evas_test_textblock.c
@@ -3911,11 +3911,31 @@ _hyphenation_width_stress(Evas_Object *tb, Evas_Textblock_Cursor *cur)
START_TEST(evas_textblock_hyphenation)
{
START_TB_TEST();
+ Evas_Coord w, fw;
+
+ const char *buf = "Automati-";
+ evas_object_textblock_text_markup_set(tb, buf);
+ evas_object_textblock_size_formatted_get(tb, &w, NULL);
+ evas_object_resize(tb, w, 100);
+
+ setlocale(LC_MESSAGES, "en_US.UTF-8");
+ /* Language should be reinitialized after calling setlocale(). */
+ evas_language_reinit();
+
+ buf = "Automatically";
+ evas_object_textblock_text_markup_set(tb, buf);
+ evas_textblock_cursor_format_prepend(cur, "<wrap=hyphenation>");
+ evas_object_textblock_size_formatted_get(tb, &fw, NULL);
+ ck_assert_int_eq(w, fw);
+
+ /* Restore locale */
+ setlocale(LC_MESSAGES, "C");
+ evas_language_reinit();
/* SHY-HYPHEN (&shy;) */
/* Note: placing &shy; in a ligature is errornuos, so for the sake
* of this test, it was removed from the "officia" word */
- const char *buf =
+ buf =
"Lorem ipsum dolor sit amet, cons&shy;ectetur adipisicing elit,"
" sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
" Ut enim ad minim veniam, quis nostrud exer&shy;citation ullamco"
@@ -3928,7 +3948,8 @@ START_TEST(evas_textblock_hyphenation)
evas_object_textblock_text_markup_set(tb, buf);
/* Dictionary + locale fallback (en_US) */
- setlocale(LC_MESSAGES, "en_US.UTF8");
+ setlocale(LC_MESSAGES, "en_US.UTF-8");
+ evas_language_reinit();
/* Mixture of Dictionary with SHY-HYPHEN */
_hyphenation_width_stress(tb, cur);