summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSangyoon Jang <s89.jang@samsung.com>2015-05-20 17:19:50 +0900
committerSangyoon Jang <s89.jang@samsung.com>2015-05-20 17:19:50 +0900
commit81c4e1bc97b3c68718172951da905a4d190f7df2 (patch)
treebcbce53ab1845cf9616e4f1387db864a177b4e33 /src
parentb81d34d0f50edcc4aee7c4f4438f13ab8f9f29e8 (diff)
downloadmedia-key-81c4e1bc97b3c68718172951da905a4d190f7df2.tar.gz
media-key-81c4e1bc97b3c68718172951da905a4d190f7df2.tar.bz2
media-key-81c4e1bc97b3c68718172951da905a4d190f7df2.zip
Update source from 2.3submit/tizen/20150601.084101
TODO: wayland support Change-Id: I4114f783e7da1e9ee9fa9f7bdac9ce5b10dc8379 Signed-off-by: Sangyoon Jang <s89.jang@samsung.com>
Diffstat (limited to 'src')
-rw-r--r--src/media_key.c247
1 files changed, 190 insertions, 57 deletions
diff --git a/src/media_key.c b/src/media_key.c
index 1afc54e..a1de3a8 100644
--- a/src/media_key.c
+++ b/src/media_key.c
@@ -15,104 +15,237 @@
* 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;