diff options
author | Sangyoon Jang <s89.jang@samsung.com> | 2015-05-20 17:19:50 +0900 |
---|---|---|
committer | Sangyoon Jang <s89.jang@samsung.com> | 2015-05-20 17:19:50 +0900 |
commit | 81c4e1bc97b3c68718172951da905a4d190f7df2 (patch) | |
tree | bcbce53ab1845cf9616e4f1387db864a177b4e33 /src | |
parent | b81d34d0f50edcc4aee7c4f4438f13ab8f9f29e8 (diff) | |
download | media-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.c | 247 |
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; |