From: minho.sun Date: Thu, 9 Feb 2017 02:05:19 +0000 (+0900) Subject: [Tizen] Add key grab list API X-Git-Tag: accepted/tizen/common/20170223.182725~3 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ca3ca13319ef946c33a531709c9937d79c2ac031;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git [Tizen] Add key grab list API This reverts commit 7d7282c438c832db1de9c00a25def0d68a6d7fe1. Change-Id: I1f14e669e5b0ee308f675a85aea8759a49a4616f --- diff --git a/adaptors/ecore/wayland/key-grab-ecore-wl.cpp b/adaptors/ecore/wayland/key-grab-ecore-wl.cpp old mode 100644 new mode 100755 index afe3859..12ad210 --- a/adaptors/ecore/wayland/key-grab-ecore-wl.cpp +++ b/adaptors/ecore/wayland/key-grab-ecore-wl.cpp @@ -27,6 +27,7 @@ #include #include +#include using namespace std; namespace Dali @@ -81,6 +82,125 @@ bool UngrabKey( Window window, Dali::KEY daliKey ) 0, 0 ); } +Dali::Vector GrabKeyList( Window window, const Dali::Vector daliKeyVector, const Dali::Vector grabModeVector) +{ + Dali::Vector resultVector; + Eina_List *keyList = NULL, *grabList = NULL, *l = NULL, *m = NULL; + void *listData = NULL, *data = NULL; + Dali::Vector::SizeType keyCount = daliKeyVector.Count(); + Dali::Vector::SizeType keyGrabModeCount = grabModeVector.Count(); + + + if(keyCount != keyGrabModeCount || keyCount == 0) + return resultVector; + + eina_init(); + + for( Dali::Vector::SizeType index = 0; index < keyCount; ++index ) + { + Ecore_Wl_Window_Keygrab_Info *info = (Ecore_Wl_Window_Keygrab_Info*)malloc(sizeof(Ecore_Wl_Window_Keygrab_Info)); + info->key = (char*)Dali::Internal::Adaptor::KeyLookup::GetKeyName( daliKeyVector[index] ); + + switch(grabModeVector[index]) + { + case TOPMOST: + info->mode = ECORE_WL_WINDOW_KEYGRAB_TOPMOST; + break; + case SHARED: + info->mode = ECORE_WL_WINDOW_KEYGRAB_SHARED; + break; + case OVERRIDE_EXCLUSIVE: + info->mode = ECORE_WL_WINDOW_KEYGRAB_EXCLUSIVE; + break; + case EXCLUSIVE: + info->mode = ECORE_WL_WINDOW_KEYGRAB_OVERRIDE_EXCLUSIVE; + break; + default: + info->mode = ECORE_WL_WINDOW_KEYGRAB_UNKNOWN; + break; + } + + keyList = eina_list_append(keyList, info); + } + + grabList = ecore_wl_window_keygrab_list_set(AnyCast( window.GetNativeHandle() ), keyList); + + for( Dali::Vector::SizeType index = 0; index < keyCount; ++index ) + { + resultVector.PushBack(true); + } + + if( grabList != NULL) + { + EINA_LIST_FOREACH(grabList, m, data) + { + Dali::Vector::SizeType index = 0; + EINA_LIST_FOREACH(keyList, l, listData) + { + if(strcmp((char*)data, ((Ecore_Wl_Window_Keygrab_Info*)listData)->key) == 0) + resultVector[index] = false; + + ++index; + } + } + } + + eina_list_free(keyList); + eina_list_free(grabList); + eina_shutdown(); + + return resultVector; +} + +Dali::Vector UngrabKeyList( Window window, const Dali::Vector daliKeyVector ) +{ + Dali::Vector resultVector; + Eina_List *keyList = NULL, *ungrabList = NULL, *l = NULL, *m = NULL; + void *listData = NULL, *data = NULL; + Dali::Vector::SizeType keyCount = daliKeyVector.Count(); + + + if(keyCount == 0) + return resultVector; + + eina_init(); + + for( Dali::Vector::SizeType index = 0; index < keyCount; ++index ) + { + Ecore_Wl_Window_Keygrab_Info *info = (Ecore_Wl_Window_Keygrab_Info*)malloc(sizeof(Ecore_Wl_Window_Keygrab_Info)); + info->key = (char*)Dali::Internal::Adaptor::KeyLookup::GetKeyName( daliKeyVector[index] ); + keyList = eina_list_append(keyList, info); + } + + ungrabList = ecore_wl_window_keygrab_list_unset(AnyCast( window.GetNativeHandle() ), keyList); + + for( Dali::Vector::SizeType index = 0; index < keyCount; ++index ) + { + resultVector.PushBack(true); + } + + if( ungrabList != NULL) + { + EINA_LIST_FOREACH(ungrabList, m, data) + { + Dali::Vector::SizeType index = 0; + EINA_LIST_FOREACH(keyList, l, listData) + { + if(strcmp((char*)data, ((Ecore_Wl_Window_Keygrab_Info*)listData)->key) == 0) + resultVector[index] = false; + + ++index; + } + } + } + + eina_list_free(keyList); + eina_list_free(ungrabList); + eina_shutdown(); + + return resultVector; +} + } // namespace KeyGrab } // namespace Dali diff --git a/adaptors/tizen/key-grab.h b/adaptors/tizen/key-grab.h old mode 100644 new mode 100755 index 4d083cc..931f9aa --- a/adaptors/tizen/key-grab.h +++ b/adaptors/tizen/key-grab.h @@ -20,6 +20,7 @@ // INTERNAL INCLUDES #include +#include #include "key.h" namespace Dali @@ -109,6 +110,43 @@ DALI_IMPORT_API bool GrabKey( Window window, Dali::KEY daliKey, KeyGrabMode grab */ DALI_IMPORT_API bool UngrabKey( Window window, Dali::KEY daliKey ); + +/** + * @PLATFORM + * @brief Grabs the list of keys specfied by @Dali::Vector of keys for @a window in @Vector of grabModes. + * + * @details This function can be used for following example scenarios: + * - TV - A user might want to change the volume or channel of the background TV contents while focusing on the foregrund app. + * - Mobile - When a user presses Home key, the homescreen appears regardless of current foreground app. + * - Mobile - Using volume up/down as zoom up/down in camera apps. + * + * @SINCE_1_2.0 + * @PRIVLEVEL_PLATFORM + * @PRIVILEGE_KEYGRAB + * @param[in] window The window to set + * @param[in] daliKeyVector The Dali::Vector of key codes to grab (defined in key.h) + * @param[in] grabModeVector The Dali::Vector of grab modes for the keys + * @return Dali::Vector Size is zero when error occurs, true/false if the grab succeeds/fails. + */ +DALI_IMPORT_API Dali::Vector GrabKeyList( Window window, const Dali::Vector daliKeyVector, const Dali::Vector grabModeVector); + + +/** + * @PLATFORM + * @brief Ungrabs the list of keys specfied by @Dali::Vector of keys for @a window. + * + * @SINCE_1_2.0 + * @PRIVLEVEL_PLATFORM + * @PRIVILEGE_KEYGRAB + * @param[in] window The window to set + * @param[in] daliKeyVector The Dali::Vector of key codes to ungrab (defined in key.h) + * @return Dali::Vector Size is zero when error occurs, true/false if the ungrab succeeds/fails. + * @note If this function is called between key down and up events of a grabbed key, + * an application doesn't receive the key up event. + */ +DALI_IMPORT_API Dali::Vector UngrabKeyList( Window window, const Dali::Vector daliKeyVector ); + + } // namespace KeyGrab /**