From 33fb640e5aa6c37216fa93f94a1ef087a1841b19 Mon Sep 17 00:00:00 2001 From: "taeyoon0.lee" Date: Mon, 28 Aug 2017 23:39:53 +0900 Subject: [PATCH] Added layout direction change by system language Change-Id: Ia48f37a873655013d7fa23ba65a98a5ca1af58ef --- adaptors/common/adaptor-impl.cpp | 15 ++ adaptors/common/adaptor-impl.h | 11 ++ adaptors/common/locale-utils.cpp | 211 ++++++++++----------- adaptors/common/locale-utils.h | 11 +- adaptors/ecore/common/ecore-virtual-keyboard.cpp | 2 +- .../ecore/wayland/imf-manager-impl-ecore-wl.cpp | 2 +- adaptors/tizen/adaptor-impl-tizen.cpp | 48 +++++ adaptors/ubuntu/adaptor-impl-ubuntu.cpp | 4 + adaptors/x11/imf-manager-impl-x.cpp | 2 +- packaging/dali-adaptor.spec | 1 + 10 files changed, 193 insertions(+), 114 deletions(-) diff --git a/adaptors/common/adaptor-impl.cpp b/adaptors/common/adaptor-impl.cpp index 08fe0e0..6201c5c 100644 --- a/adaptors/common/adaptor-impl.cpp +++ b/adaptors/common/adaptor-impl.cpp @@ -20,6 +20,9 @@ // EXTERNAL INCLUDES #include +#include +#include +#include #include #include #include @@ -55,6 +58,8 @@ #include #include +#include + using Dali::TextAbstraction::FontClient; namespace Dali @@ -190,6 +195,8 @@ void Adaptor::Initialize( Dali::Configuration::ContextLoss configuration ) { Dali::SetMaxTextureSize( mEnvironmentOptions->GetMaxTextureSize() ); } + + SetupSystemInformation(); } Adaptor::~Adaptor() @@ -824,6 +831,14 @@ float Adaptor::GetStereoBase() const return mCore->GetStereoBase(); } +void Adaptor::SetRootLayoutDirection( std::string locale ) +{ + Dali::Stage stage = Dali::Stage::GetCurrent(); + + stage.GetRootLayer().SetProperty( DevelActor::Property::LAYOUT_DIRECTION, + static_cast< DevelActor::LayoutDirection::Type >( Internal::Adaptor::Locale::GetDirection( std::string( locale ) ) ) ); +} + } // namespace Adaptor } // namespace Internal diff --git a/adaptors/common/adaptor-impl.h b/adaptors/common/adaptor-impl.h index f48f29e..5920b85 100644 --- a/adaptors/common/adaptor-impl.h +++ b/adaptors/common/adaptor-impl.h @@ -345,6 +345,12 @@ public: */ void SurfaceResizeComplete( Dali::Adaptor::SurfaceSize surfaceSize ); + /** + * Sets layout direction of root by system language + * @param[in] locale System locale + */ + void SetRootLayoutDirection( std::string locale ); + public: //AdaptorInternalServices /** @@ -516,6 +522,11 @@ private: */ void GetDataStoragePath(std::string& path); + /** + * Sets up system information if needs + */ + void SetupSystemInformation(); + private: /** diff --git a/adaptors/common/locale-utils.cpp b/adaptors/common/locale-utils.cpp index d14856b..a036736 100644 --- a/adaptors/common/locale-utils.cpp +++ b/adaptors/common/locale-utils.cpp @@ -33,128 +33,125 @@ namespace Locale namespace { -struct LocaleDirection +struct LocaleDirectionInfo { const char * locale; const char * name; - Dali::ImfManager::TextDirection direction; + Locale::Direction direction; }; -const LocaleDirection LOCALE_DIRECTION_LOOKUP_TABLE[] = +const LocaleDirectionInfo LOCALE_DIRECTION_LOOKUP_TABLE[] = { - { "af", "Afrikaans", Dali::ImfManager::LeftToRight }, - { "am", "Amharic", Dali::ImfManager::LeftToRight }, - { "ar", "Arabic", Dali::ImfManager::RightToLeft }, - { "as", "Assamese", Dali::ImfManager::LeftToRight }, - { "az", "Azeri", Dali::ImfManager::LeftToRight }, - { "be", "Belarusian", Dali::ImfManager::LeftToRight }, - { "bg", "Bulgarian", Dali::ImfManager::LeftToRight }, - { "bn", "Bengali", Dali::ImfManager::LeftToRight }, - { "bo", "Tibetan", Dali::ImfManager::LeftToRight }, - { "bs", "Bosnian", Dali::ImfManager::LeftToRight }, - { "ca", "Catalan", Dali::ImfManager::LeftToRight }, - { "cs", "Czech", Dali::ImfManager::LeftToRight }, - { "cy", "Welsh", Dali::ImfManager::LeftToRight }, - { "da", "Danish", Dali::ImfManager::LeftToRight }, - { "de", "German", Dali::ImfManager::LeftToRight }, - { "dv", "Divehi", Dali::ImfManager::RightToLeft }, - { "el", "Greek", Dali::ImfManager::LeftToRight }, - { "en", "English", Dali::ImfManager::LeftToRight }, - { "es", "Spanish", Dali::ImfManager::LeftToRight }, - { "et", "Estonian", Dali::ImfManager::LeftToRight }, - { "eu", "Basque", Dali::ImfManager::LeftToRight }, - { "fa", "Farsi", Dali::ImfManager::RightToLeft }, - { "fi", "Finnish", Dali::ImfManager::LeftToRight }, - { "fo", "Faroese", Dali::ImfManager::LeftToRight }, - { "fr", "French", Dali::ImfManager::LeftToRight }, - { "gd", "Gaelic", Dali::ImfManager::LeftToRight }, - { "gl", "Galician", Dali::ImfManager::LeftToRight }, - { "gn", "Guarani", Dali::ImfManager::LeftToRight }, - { "gu", "Gujarati", Dali::ImfManager::LeftToRight }, - { "he", "Hebrew", Dali::ImfManager::RightToLeft }, - { "hi", "Hindi", Dali::ImfManager::LeftToRight }, - { "hr", "Croatian", Dali::ImfManager::LeftToRight }, - { "hu", "Hungarian", Dali::ImfManager::LeftToRight }, - { "hy", "Armenian", Dali::ImfManager::LeftToRight }, - { "id", "Indonesian", Dali::ImfManager::LeftToRight }, - { "is", "Icelandic", Dali::ImfManager::LeftToRight }, - { "it", "Italian", Dali::ImfManager::LeftToRight }, - { "ja", "Japanese", Dali::ImfManager::LeftToRight }, - { "ka", "Georgian", Dali::ImfManager::LeftToRight }, - { "kk", "Kazakh", Dali::ImfManager::RightToLeft }, - { "km", "Khmer", Dali::ImfManager::LeftToRight }, - { "kn", "Kannada", Dali::ImfManager::LeftToRight }, - { "ko", "Korean", Dali::ImfManager::LeftToRight }, - { "ks", "Kashmiri", Dali::ImfManager::RightToLeft }, - { "la", "Latin", Dali::ImfManager::LeftToRight }, - { "lo", "Lao", Dali::ImfManager::LeftToRight }, - { "lt", "Lithuanian", Dali::ImfManager::LeftToRight }, - { "lv", "Latvian", Dali::ImfManager::LeftToRight }, - { "mi", "Maori", Dali::ImfManager::LeftToRight }, - { "mk", "FYRO Macedonia", Dali::ImfManager::LeftToRight }, - { "ml", "Malayalam", Dali::ImfManager::LeftToRight }, - { "mn", "Mongolian", Dali::ImfManager::LeftToRight }, - { "mr", "Marathi", Dali::ImfManager::LeftToRight }, - { "ms", "Malay", Dali::ImfManager::LeftToRight }, - { "mt", "Maltese", Dali::ImfManager::LeftToRight }, - { "my", "Burmese", Dali::ImfManager::LeftToRight }, - { "nb", "Norwegian: Bokml", Dali::ImfManager::LeftToRight }, - { "ne", "Nepali", Dali::ImfManager::LeftToRight }, - { "nl", "Dutch", Dali::ImfManager::LeftToRight }, - { "nn", "Norwegian: Nynorsk", Dali::ImfManager::LeftToRight }, - { "or", "Oriya", Dali::ImfManager::LeftToRight }, - { "pa", "Punjabi", Dali::ImfManager::LeftToRight }, - { "pl", "Polish", Dali::ImfManager::LeftToRight }, - { "pt", "Portuguese", Dali::ImfManager::LeftToRight }, - { "rm", "Raeto-Romance", Dali::ImfManager::LeftToRight }, - { "ro", "Romanian", Dali::ImfManager::LeftToRight }, - { "ru", "Russian", Dali::ImfManager::LeftToRight }, - { "sa", "Sanskrit", Dali::ImfManager::LeftToRight }, - { "sb", "Sorbian", Dali::ImfManager::LeftToRight }, - { "sd", "Sindhi", Dali::ImfManager::LeftToRight }, - { "si", "Sinhala", Dali::ImfManager::LeftToRight }, - { "sk", "Slovak", Dali::ImfManager::LeftToRight }, - { "sl", "Slovenian", Dali::ImfManager::LeftToRight }, - { "so", "Somali", Dali::ImfManager::LeftToRight }, - { "sq", "Albanian", Dali::ImfManager::LeftToRight }, - { "sr", "Serbian", Dali::ImfManager::LeftToRight }, - { "sv", "Swedish", Dali::ImfManager::LeftToRight }, - { "sw", "Swahili", Dali::ImfManager::LeftToRight }, - { "ta", "Tamil", Dali::ImfManager::LeftToRight }, - { "te", "Telugu", Dali::ImfManager::LeftToRight }, - { "tg", "Tajik", Dali::ImfManager::RightToLeft }, - { "th", "Thai", Dali::ImfManager::LeftToRight }, - { "tk", "Turkmen", Dali::ImfManager::LeftToRight }, - { "tn", "Setsuana", Dali::ImfManager::LeftToRight }, - { "tr", "Turkish", Dali::ImfManager::LeftToRight }, - { "ts", "Tsonga", Dali::ImfManager::LeftToRight }, - { "tt", "Tatar", Dali::ImfManager::LeftToRight }, - { "uk", "Ukrainian", Dali::ImfManager::LeftToRight }, - { "ur", "Urdu", Dali::ImfManager::RightToLeft }, - { "uz", "Uzbek", Dali::ImfManager::LeftToRight }, - { "vi", "Vietnamese", Dali::ImfManager::LeftToRight }, - { "xh", "Xhosa", Dali::ImfManager::LeftToRight }, - { "yi", "Yiddish", Dali::ImfManager::RightToLeft }, - { "zh", "Chinese", Dali::ImfManager::LeftToRight }, - { "zu", "Zulu", Dali::ImfManager::LeftToRight }, - - { NULL, NULL, Dali::ImfManager::LeftToRight } + { "af", "Afrikaans", Locale::LeftToRight }, + { "am", "Amharic", Locale::LeftToRight }, + { "ar", "Arabic", Locale::RightToLeft }, + { "as", "Assamese", Locale::LeftToRight }, + { "az", "Azerbaijani", Locale::RightToLeft }, + { "be", "Belarusian", Locale::LeftToRight }, + { "bg", "Bulgarian", Locale::LeftToRight }, + { "bn", "Bengali", Locale::LeftToRight }, + { "bo", "Tibetan", Locale::LeftToRight }, + { "bs", "Bosnian", Locale::LeftToRight }, + { "ca", "Catalan", Locale::LeftToRight }, + { "cs", "Czech", Locale::LeftToRight }, + { "cy", "Welsh", Locale::LeftToRight }, + { "da", "Danish", Locale::LeftToRight }, + { "de", "German", Locale::LeftToRight }, + { "dv", "Divehi", Locale::RightToLeft }, + { "el", "Greek", Locale::LeftToRight }, + { "en", "English", Locale::LeftToRight }, + { "es", "Spanish", Locale::LeftToRight }, + { "et", "Estonian", Locale::LeftToRight }, + { "eu", "Basque", Locale::LeftToRight }, + { "fa", "Farsi", Locale::RightToLeft }, + { "fi", "Finnish", Locale::LeftToRight }, + { "fo", "Faroese", Locale::LeftToRight }, + { "fr", "French", Locale::LeftToRight }, + { "gd", "Gaelic", Locale::LeftToRight }, + { "gl", "Galician", Locale::LeftToRight }, + { "gn", "Guarani", Locale::LeftToRight }, + { "gu", "Gujarati", Locale::LeftToRight }, + { "he", "Hebrew", Locale::RightToLeft }, + { "hi", "Hindi", Locale::LeftToRight }, + { "hr", "Croatian", Locale::LeftToRight }, + { "hu", "Hungarian", Locale::LeftToRight }, + { "hy", "Armenian", Locale::LeftToRight }, + { "id", "Indonesian", Locale::LeftToRight }, + { "is", "Icelandic", Locale::LeftToRight }, + { "it", "Italian", Locale::LeftToRight }, + { "ja", "Japanese", Locale::LeftToRight }, + { "ka", "Georgian", Locale::LeftToRight }, + { "kk", "Kazakh", Locale::RightToLeft }, + { "km", "Khmer", Locale::LeftToRight }, + { "kn", "Kannada", Locale::LeftToRight }, + { "ko", "Korean", Locale::LeftToRight }, + { "ks", "Kashmiri", Locale::RightToLeft }, + { "la", "Latin", Locale::LeftToRight }, + { "lo", "Lao", Locale::LeftToRight }, + { "lt", "Lithuanian", Locale::LeftToRight }, + { "lv", "Latvian", Locale::LeftToRight }, + { "mi", "Maori", Locale::LeftToRight }, + { "mk", "FYRO Macedonia", Locale::LeftToRight }, + { "ml", "Malayalam", Locale::LeftToRight }, + { "mn", "Mongolian", Locale::LeftToRight }, + { "mr", "Marathi", Locale::LeftToRight }, + { "ms", "Malay", Locale::LeftToRight }, + { "mt", "Maltese", Locale::LeftToRight }, + { "my", "Burmese", Locale::LeftToRight }, + { "nb", "Norwegian: Bokml", Locale::LeftToRight }, + { "ne", "Nepali", Locale::LeftToRight }, + { "nl", "Dutch", Locale::LeftToRight }, + { "nn", "Norwegian: Nynorsk", Locale::LeftToRight }, + { "or", "Oriya", Locale::LeftToRight }, + { "pa", "Punjabi", Locale::LeftToRight }, + { "pl", "Polish", Locale::LeftToRight }, + { "pt", "Portuguese", Locale::LeftToRight }, + { "rm", "Raeto-Romance", Locale::LeftToRight }, + { "ro", "Romanian", Locale::LeftToRight }, + { "ru", "Russian", Locale::LeftToRight }, + { "sa", "Sanskrit", Locale::LeftToRight }, + { "sb", "Sorbian", Locale::LeftToRight }, + { "sd", "Sindhi", Locale::LeftToRight }, + { "si", "Sinhala", Locale::LeftToRight }, + { "sk", "Slovak", Locale::LeftToRight }, + { "sl", "Slovenian", Locale::LeftToRight }, + { "so", "Somali", Locale::LeftToRight }, + { "sq", "Albanian", Locale::LeftToRight }, + { "sr", "Serbian", Locale::LeftToRight }, + { "sv", "Swedish", Locale::LeftToRight }, + { "sw", "Swahili", Locale::LeftToRight }, + { "ta", "Tamil", Locale::LeftToRight }, + { "te", "Telugu", Locale::LeftToRight }, + { "tg", "Tajik", Locale::RightToLeft }, + { "th", "Thai", Locale::LeftToRight }, + { "tk", "Turkmen", Locale::LeftToRight }, + { "tn", "Setsuana", Locale::LeftToRight }, + { "tr", "Turkish", Locale::LeftToRight }, + { "ts", "Tsonga", Locale::LeftToRight }, + { "tt", "Tatar", Locale::LeftToRight }, + { "uk", "Ukrainian", Locale::LeftToRight }, + { "ur", "Urdu", Locale::RightToLeft }, + { "uz", "Uzbek", Locale::LeftToRight }, + { "vi", "Vietnamese", Locale::LeftToRight }, + { "xh", "Xhosa", Locale::LeftToRight }, + { "yi", "Yiddish", Locale::RightToLeft }, + { "zh", "Chinese", Locale::LeftToRight }, + { "zu", "Zulu", Locale::LeftToRight }, + + { NULL, NULL, Locale::LeftToRight } }; } // unnamed namespace -Dali::ImfManager::TextDirection GetTextDirection( std::string locale ) +Locale::Direction GetDirection( const std::string& locale ) { - Dali::ImfManager::TextDirection direction( Dali::ImfManager::LeftToRight ); + Locale::Direction direction( Locale::LeftToRight ); if ( !locale.empty() && locale.size() > 2 ) { - // We're only interested in the first two characters - locale.resize(2); - - for ( const LocaleDirection* iter = &LOCALE_DIRECTION_LOOKUP_TABLE[0]; iter->locale; ++iter ) + for ( const LocaleDirectionInfo* iter = &LOCALE_DIRECTION_LOOKUP_TABLE[0]; iter->locale; ++iter ) { - if ( !locale.compare( iter->locale ) ) + if ( !locale.compare( 0, 2, iter->locale ) ) { direction = iter->direction; break; diff --git a/adaptors/common/locale-utils.h b/adaptors/common/locale-utils.h index b04182b..ecb251a 100644 --- a/adaptors/common/locale-utils.h +++ b/adaptors/common/locale-utils.h @@ -21,9 +21,6 @@ // EXTERNAL INCLUDES #include -// INTERNAL INCLUDES -#include - namespace Dali { @@ -36,7 +33,13 @@ namespace Adaptor namespace Locale { -Dali::ImfManager::TextDirection GetTextDirection( std::string locale ); +enum Direction +{ + LeftToRight, + RightToLeft, +}; + +Locale::Direction GetDirection( const std::string& locale ); } // namespace Locale diff --git a/adaptors/ecore/common/ecore-virtual-keyboard.cpp b/adaptors/ecore/common/ecore-virtual-keyboard.cpp index 7747cd3..affbda2 100644 --- a/adaptors/ecore/common/ecore-virtual-keyboard.cpp +++ b/adaptors/ecore/common/ecore-virtual-keyboard.cpp @@ -325,7 +325,7 @@ Dali::VirtualKeyboard::TextDirection GetTextDirection() if ( locale ) { - direction = (Dali::VirtualKeyboard::TextDirection)Locale::GetTextDirection( std::string( locale ) ); + direction = static_cast< Dali::VirtualKeyboard::TextDirection >( Locale::GetDirection( std::string( locale ) ) ); free( locale ); } } diff --git a/adaptors/ecore/wayland/imf-manager-impl-ecore-wl.cpp b/adaptors/ecore/wayland/imf-manager-impl-ecore-wl.cpp index 5764c3a..edd8899 100644 --- a/adaptors/ecore/wayland/imf-manager-impl-ecore-wl.cpp +++ b/adaptors/ecore/wayland/imf-manager-impl-ecore-wl.cpp @@ -699,7 +699,7 @@ Dali::ImfManager::TextDirection ImfManager::GetTextDirection() if ( locale ) { - direction = Locale::GetTextDirection( std::string( locale ) ); + direction = static_cast< Dali::ImfManager::TextDirection >( Locale::GetDirection( std::string( locale ) ) ); free( locale ); } } diff --git a/adaptors/tizen/adaptor-impl-tizen.cpp b/adaptors/tizen/adaptor-impl-tizen.cpp index 1619139..67afe39 100644 --- a/adaptors/tizen/adaptor-impl-tizen.cpp +++ b/adaptors/tizen/adaptor-impl-tizen.cpp @@ -25,6 +25,8 @@ #include #endif +#include + namespace Dali { @@ -34,6 +36,30 @@ namespace Internal namespace Adaptor { +namespace +{ + +static void OnSystemLanguageChanged( system_settings_key_e key, void* data ) +{ + char* locale = NULL; + if( system_settings_get_value_string( SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &locale ) != SYSTEM_SETTINGS_ERROR_NONE || + locale == NULL ) + { + DALI_LOG_ERROR( "DALI OnSystemLanguageChanged failed " ); + return; + } + + Adaptor* adaptor = static_cast< Adaptor* >( data ); + if( adaptor != NULL ) + { + adaptor->SetRootLayoutDirection( locale ); + } + + free( locale ); +} + +} // namesapce + void Adaptor::GetDataStoragePath( std::string& path) { #ifdef USE_APPFW @@ -82,6 +108,28 @@ void Adaptor::SurfaceInitialized() #endif } +void Adaptor::SetupSystemInformation() +{ + if( system_settings_set_changed_cb( SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, OnSystemLanguageChanged, this ) != SYSTEM_SETTINGS_ERROR_NONE ) + { + DALI_LOG_ERROR( "DALI system_settings_set_changed_cb failed.\n" ); + return; + } + + char* locale = NULL; + if( system_settings_get_value_string( SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &locale ) != SYSTEM_SETTINGS_ERROR_NONE || + locale == NULL ) + { + DALI_LOG_ERROR( "DALI OnSystemLanguageChanged failed " ); + return; + } + + SetRootLayoutDirection( locale ); + + free( locale ); + +} + } // namespace Adaptor } // namespace Internal diff --git a/adaptors/ubuntu/adaptor-impl-ubuntu.cpp b/adaptors/ubuntu/adaptor-impl-ubuntu.cpp index be25b7b..4f1201c 100644 --- a/adaptors/ubuntu/adaptor-impl-ubuntu.cpp +++ b/adaptors/ubuntu/adaptor-impl-ubuntu.cpp @@ -41,6 +41,10 @@ void Adaptor::SurfaceInitialized() { } +void Adaptor::SetupSystemInformation() +{ +} + } // namespace Adaptor } // namespace Internal diff --git a/adaptors/x11/imf-manager-impl-x.cpp b/adaptors/x11/imf-manager-impl-x.cpp index e0fa762..c9bef9c 100644 --- a/adaptors/x11/imf-manager-impl-x.cpp +++ b/adaptors/x11/imf-manager-impl-x.cpp @@ -538,7 +538,7 @@ Dali::ImfManager::TextDirection ImfManager::GetTextDirection() if ( locale ) { - direction = Locale::GetTextDirection( std::string( locale ) ); + direction = static_cast< Dali::ImfManager::TextDirection >( Locale::GetDirection( std::string( locale ) ) ); free( locale ); } } diff --git a/packaging/dali-adaptor.spec b/packaging/dali-adaptor.spec index a467049..393f4f3 100644 --- a/packaging/dali-adaptor.spec +++ b/packaging/dali-adaptor.spec @@ -114,6 +114,7 @@ BuildRequires: pkgconfig(capi-appfw-app-common) BuildRequires: pkgconfig(capi-appfw-app-control) BuildRequires: pkgconfig(ecore-imf) %endif + BuildRequires: pkgconfig(capi-system-system-settings) # for feedback plugin -- 2.7.4