From 24128ffcb182cef2f2e02b7dbeec022c2f229479 Mon Sep 17 00:00:00 2001 From: "minho.sun" Date: Wed, 7 Jun 2017 14:48:13 +0900 Subject: [PATCH] [Tizen] Add key grab list API This reverts commit b2e21e124b386f4a3c7b054dc58c639865d98356. Change-Id: I6d864b8b3ded3cc9cf1ecc388aa76badbf960d23 --- adaptors/ecore/wayland/key-grab-ecore-wl.cpp | 120 +++++++++++++++++++++++++++ adaptors/tizen/key-grab.h | 38 +++++++++ 2 files changed, 158 insertions(+) mode change 100644 => 100755 adaptors/ecore/wayland/key-grab-ecore-wl.cpp mode change 100644 => 100755 adaptors/tizen/key-grab.h 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..85f92c3 --- 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 43090f5..898779b --- 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 /** -- 2.7.4