Update source from 2.3 40/39640/1 submit/tizen/20150601.084101
authorSangyoon Jang <s89.jang@samsung.com>
Wed, 20 May 2015 08:19:50 +0000 (17:19 +0900)
committerSangyoon Jang <s89.jang@samsung.com>
Wed, 20 May 2015 08:19:50 +0000 (17:19 +0900)
TODO:
wayland support

Change-Id: I4114f783e7da1e9ee9fa9f7bdac9ce5b10dc8379
Signed-off-by: Sangyoon Jang <s89.jang@samsung.com>
CMakeLists.txt
packaging/capi-system-media-key.spec
src/media_key.c

index 53e45d20dec9140e5bc61c8024082e42caaee142..6171666af0a97810ed26c6a754cb952f941af047 100644 (file)
@@ -10,13 +10,13 @@ SET(PREFIX ${CMAKE_INSTALL_PREFIX})
 SET(INC_DIR include)
 INCLUDE_DIRECTORIES(${INC_DIR})
 
-SET(requires "dlog capi-base-common aul")
+SET(requires "dlog capi-base-common ecore ecore-input evas")
 IF (WITH_WAYLAND)
        ADD_DEFINITIONS("-DWAYLAND")
 ENDIF (WITH_WAYLAND)
 IF (WITH_X11)
        ADD_DEFINITIONS("-DX11")
-       SET(requires "${requires} utilX")
+       SET(requires "${requires} ecore-x utilX")
 ENDIF (WITH_X11)
 
 SET(pc_requires "capi-base-common")
index a0ed681352a1d6ef15ff4c177603b0f9f5e0dcb5..17843c08aa3f2ed9697c8c6ab3b9936a5d69b3fa 100644 (file)
@@ -11,9 +11,11 @@ Source0:    %{name}-%{version}.tar.gz
 Source1001:    capi-system-media-key.manifest
 BuildRequires:  cmake
 BuildRequires:  pkgconfig(dlog)
-BuildRequires:  pkgconfig(vconf)
 BuildRequires:  pkgconfig(capi-base-common)
-BuildRequires:  pkgconfig(aul)
+BuildRequires:  pkgconfig(ecore)
+BuildRequires:  pkgconfig(ecore-input)
+BuildRequires:  pkgconfig(evas)
+
 %if %{with x}
 BuildRequires:  pkgconfig(x11)
 BuildRequires:  pkgconfig(utilX)
index 1afc54ebbc0eb23c81818182ef2b8a9fdc4376cc..a1de3a870e9068a01a735b3f95df80dec9f81cc8 100644 (file)
  * limitations under the License.
  */
 
-#include <aul.h>
-#include <media_key.h>
+#include <unistd.h>
 #include <string.h>
+
+#include <Evas.h>
+#include <Ecore.h>
+#include <Ecore_Input.h>
 #if X11
-#include <utilX.h>
+#include <Ecore_X.h>
 #endif
+
 #include <dlog.h>
 
+#include "media_key.h"
+
 #ifdef LOG_TAG
 #undef LOG_TAG
 #endif
 
 #define LOG_TAG "CAPI_SYSTEM_MEDIA_KEY"
 
-static void (*_media_key_event_cb)(media_key_e key, media_key_event_e status, void* user_data) = NULL;
-static void *_media_key_data = NULL;
-static int _media_key_initialized = 0;
+struct key_map {
+       char *key_str;
+       media_key_e key;
+};
+
+struct key_map media_keys[] = {
+       { "XF86AudioPlay", MEDIA_KEY_PLAY },
+       { "XF86AudioStop", MEDIA_KEY_STOP },
+       { "XF86AudioPause", MEDIA_KEY_PAUSE },
+       { "XF86AudioNext", MEDIA_KEY_NEXT },
+       { "XF86AudioPrev", MEDIA_KEY_PREVIOUS },
+       { "XF86AudioRewind", MEDIA_KEY_REWIND },
+       { "XF86AudioForward", MEDIA_KEY_FASTFORWARD },
+       { "XF86AudioPlayPause", MEDIA_KEY_PLAYPAUSE },
+       { "XF86AudioMedia", MEDIA_KEY_MEDIA },
+       { NULL, MEDIA_KEY_UNKNOWN },
+};
+
+static media_key_event_cb _media_key_event_cb;
+static void *_media_key_data;
+static int _media_key_initialized;
+
+static Ecore_Event_Handler *media_key_up;
+static Ecore_Event_Handler *media_key_down;
+
+#if X11
+static Ecore_X_Window win;
+#endif
+
+static int _media_key_init(void)
+{
+       if (_media_key_initialized)
+               return 0;
+#if X11
+       ecore_x_init(NULL);
+
+       win = ecore_x_window_input_new(ecore_x_window_root_first_get(), 0, 0, 1, 1);
+       if (!win) {
+               LOGE("failed to create input window");
+               return -1;
+       }
 
-extern int aul_key_reserve();
-extern int aul_key_release();
-extern int aul_key_init(int (*aul_handler) (bundle *, void *), void *data);
+       ecore_x_icccm_title_set(win, "media key receiver");
+       ecore_x_netwm_name_set(win, "media key receiver");
+       ecore_x_netwm_pid_set(win, getpid());
+#endif
+       _media_key_initialized = 1;
 
+       return 0;
+}
 
-static int __aul_key_handler(bundle *b, void *data)
+static void _media_key_fini(void)
 {
-       int ret = MEDIA_KEY_ERROR_NONE;
-       char *key_str;
-       char *event_str;
+#if X11
+       ecore_x_window_free(win);
+       ecore_x_shutdown();
+#endif
+       _media_key_initialized = 0;
+}
+
+static void _media_key_handler(const char *key_str, media_key_e event)
+{
+       int i;
        media_key_e key = MEDIA_KEY_UNKNOWN;
-       media_key_event_e event = MEDIA_KEY_STATUS_UNKNOWN;
 
-       key_str = (char *)bundle_get_val(b, AUL_K_MULTI_KEY);
-       event_str = (char *)bundle_get_val(b, AUL_K_MULTI_KEY_EVENT);
+       for (i = 0; media_keys[i].key_str; i++) {
+               if (!strcmp(key_str, media_keys[i].key_str)) {
+                       key = media_keys[i].key;
+                       break;
+               }
+       }
 
-#if X11
-       if (!strcmp(key_str, KEY_PLAYCD)) {
-               key = MEDIA_KEY_PLAY;
-       } else if (!strcmp(key_str, KEY_STOPCD)) {
-               key = MEDIA_KEY_STOP;
-       } else if (!strcmp(key_str, KEY_PAUSECD)) {
-               key = MEDIA_KEY_PAUSE;
-       } else if (!strcmp(key_str, KEY_NEXTSONG)) {
-               key = MEDIA_KEY_NEXT;
-       } else if (!strcmp(key_str, KEY_PREVIOUSSONG)) {
-               key = MEDIA_KEY_PREVIOUS;
-       } else if (!strcmp(key_str, KEY_REWIND)) {
-               key = MEDIA_KEY_REWIND;
-       } else if (!strcmp(key_str, KEY_FASTFORWARD)) {
-               key = MEDIA_KEY_FASTFORWARD;
+       if (_media_key_event_cb && key != MEDIA_KEY_UNKNOWN)
+               _media_key_event_cb(key, event, _media_key_data);
+}
+
+static Eina_Bool _media_key_press_cb(void *data, int type, void *event)
+{
+       Evas_Event_Key_Down *ev;
+
+       ev = event;
+       if (!ev) {
+               LOGE("Invalid event object");
+               return ECORE_CALLBACK_RENEW;
        }
-#else
-       LOGE("[%s] not implemented for wayland", __FUNCTION__);
-#endif
 
-       if (!strcmp(event_str, AUL_V_KEY_RELEASED)) {
-               event = MEDIA_KEY_STATUS_RELEASED;
-       } else if (!strcmp(event_str, AUL_V_KEY_PRESSED)) {
-               event = MEDIA_KEY_STATUS_PRESSED;
+       _media_key_handler(ev->keyname, MEDIA_KEY_STATUS_PRESSED);
+
+       return ECORE_CALLBACK_RENEW;
+}
+
+static Eina_Bool _media_key_release_cb(void *data, int type, void *event)
+{
+       Evas_Event_Key_Up *ev;
+
+       ev = event;
+       if (!ev) {
+               LOGE("Invalid event object");
+               return ECORE_CALLBACK_RENEW;
        }
 
-       LOGD("[%s] media_key [%s][%d]", __FUNCTION__, key_str, key);
-       LOGD("[%s] media_key_event [%s][%d]", __FUNCTION__, event_str, event);
+       _media_key_handler(ev->keyname, MEDIA_KEY_STATUS_RELEASED);
 
-       if(_media_key_event_cb)
-               _media_key_event_cb(key, event, _media_key_data);
+       return ECORE_CALLBACK_RENEW;
+}
 
-       return ret;
+#if X11
+static int _grab_media_key(void)
+{
+       int i;
+       int ret;
+
+       for (i = 0; media_keys[i].key_str; i++) {
+               ret = utilx_grab_key(ecore_x_display_get(), win,
+                               media_keys[i].key_str, OR_EXCLUSIVE_GRAB);
+               if (ret < 0) {
+                       LOGE("failed to grab key: %s", media_keys[i].key_str);
+                       for (i = i - 1; i >= 0; i--)
+                               utilx_ungrab_key(ecore_x_display_get(), win,
+                                               media_keys[i].key_str);
+
+                       return ret;
+               }
+       }
+
+       return 0;
 }
 
-int media_key_reserve(media_key_event_cb callback, void* user_data)
+static int _ungrab_media_key(void)
 {
+       int i;
        int ret;
 
-       if(!_media_key_initialized) {
-               aul_key_init(__aul_key_handler, NULL);
-               _media_key_initialized = 1;
+       for (i = 0; media_keys[i].key_str; i++) {
+               ret = utilx_ungrab_key(ecore_x_display_get(), win,
+                               media_keys[i].key_str);
+               if (ret)
+                       LOGE("failed to ungrab key: %s", media_keys[i].key_str);
        }
 
-       _media_key_event_cb = callback;
-       _media_key_data = user_data;
+       return 0;
+}
+#endif
 
-       ret = aul_key_reserve();
-       if(ret < 0) {
-               LOGE("[%s] aul_key_set_event error [%d]", __FUNCTION__, ret);
+int media_key_reserve(media_key_event_cb callback, void *user_data)
+{
+       int ret;
+
+       if (callback == NULL) {
+               LOGE("[%s] media_key_event_cb callback is NULL", __FUNCTION__);
                return MEDIA_KEY_ERROR_INVALID_PARAMETER;
        }
 
+       if (!_media_key_initialized) {
+               if (_media_key_init())
+                       return MEDIA_KEY_ERROR_OPERATION_FAILED;
+       }
+
+#if X11
+       ret = _grab_media_key();
+#else
+       ret = 0;
+#endif
+       if (ret) {
+               LOGE("reserve media key error [%d]", ret);
+               return MEDIA_KEY_ERROR_OPERATION_FAILED;
+       }
+
+       media_key_down = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _media_key_press_cb, NULL);
+       if (!media_key_down)
+               LOGE("failed to register key down event handler");
+
+
+       media_key_up = ecore_event_handler_add(ECORE_EVENT_KEY_UP, _media_key_release_cb, NULL);
+       if (!media_key_down)
+               LOGE("failed to register key up event handler");
+
+       _media_key_event_cb = callback;
+       _media_key_data = user_data;
+
        return MEDIA_KEY_ERROR_NONE;
 }
 
-int media_key_release()
+int media_key_release(void)
 {
        int ret;
 
-       ret = aul_key_release();
-       if(ret < 0) {
-               LOGE("[%s] aul_key_unset_event error [%d]", __FUNCTION__, ret);
-               return MEDIA_KEY_ERROR_INVALID_PARAMETER;
+       if (!_media_key_initialized) {
+               LOGI("media key is not reserved");
+               return MEDIA_KEY_ERROR_NONE;
+       }
+#if X11
+       ret = _ungrab_media_key();
+#else
+       ret = 0;
+#endif
+       if (ret) {
+               LOGE("release media key error [%d]", ret);
+               return MEDIA_KEY_ERROR_OPERATION_FAILED;
+       }
+
+       _media_key_fini();
+
+       if (media_key_down) {
+               ecore_event_handler_del(media_key_down);
+               media_key_down = NULL;
+       }
+
+       if (media_key_up) {
+               ecore_event_handler_del(media_key_up);
+               media_key_up = NULL;
        }
 
        _media_key_event_cb = NULL;