#include "dependency_default_button.h"
+#include <chrono>
+
+using namespace std;
+
+#define EFL_BETA_API_SUPPORT
+
#include <dlog.h>
+#include <Ecore.h>
+#include <Ecore_Input.h>
+#include <Ecore_Wl2.h>
static mas_dependency_plugin_proxy_interface g_proxy_interface;
+static Ecore_Event_Handler* g_key_down_handler = NULL;
+static Ecore_Event_Handler* g_key_up_handler = NULL;
+
+static chrono::time_point<chrono::system_clock> g_last_time_point;
+static bool g_voice_key_pressed = false;
+
+#define VOICE_KEY "XF86AudioPlayPause"
+
+static Eina_Bool _key_down_cb(void* data, int type, void* event)
+{
+ Ecore_Event_Key *ev = (Ecore_Event_Key *) event;
+ if (ev) {
+ LOGD("KEY[%s], type[%d]", ev->keyname, type);
+
+ if (ev->keyname && strncmp(ev->keyname, VOICE_KEY, strlen(VOICE_KEY)) == 0 ) {
+ chrono::time_point<chrono::system_clock> current_time_point;
+ current_time_point = chrono::system_clock::now();
+ auto diff = current_time_point - g_last_time_point;
+ auto milliseconds = chrono::duration_cast<chrono::milliseconds>(diff).count();
+ /* If double click detected within 500 msec */
+ LOGD("milliseconds : %lld", milliseconds);
+ if (milliseconds < 500) {
+ if (g_proxy_interface.process_event) {
+ g_proxy_interface.process_event(MAS_PLUGIN_EVENT_VOICE_KEY_PRESSED, NULL, 0);
+ g_voice_key_pressed = true;
+ }
+ }
+ g_last_time_point = current_time_point;
+ }
+ }
+
+ return ECORE_CALLBACK_DONE;
+}
+
+static Eina_Bool _key_up_cb(void* data, int type, void* event)
+{
+ Ecore_Event_Key *ev = (Ecore_Event_Key *) event;
+ if (ev) {
+ LOGD("KEY[%s], type[%d]", ev->keyname, type);
+
+ if (g_voice_key_pressed &&
+ ev->keyname && strncmp(ev->keyname, VOICE_KEY, strlen(VOICE_KEY)) == 0) {
+ mas_plugin_event_e event = MAS_PLUGIN_EVENT_VOICE_KEY_RELEASED_AFTER_PUSH;
+ if (g_proxy_interface.process_event) {
+ g_proxy_interface.process_event(event, NULL, 0);
+ }
+ }
+ }
+ return ECORE_CALLBACK_DONE;
+}
+
+static bool _grab_voice_key(void)
+{
+ Eina_Bool ret = true;
+ ret = ecore_wl2_window_keygrab_set(NULL, VOICE_KEY, 0, 0, 0, ECORE_WL2_WINDOW_KEYGRAB_SHARED);
+ LOGD("ecore_wl2_window_keygrab_set ret[%d] [%s]", ret, VOICE_KEY);
+
+ return ret;
+}
+
+static bool _ungrab_voice_key(void)
+{
+ Eina_Bool ret = true;
+ ret = ecore_wl2_window_keygrab_unset(NULL, VOICE_KEY, 0, 0);
+ LOGD("ecore_wl2_window_keygrab_unset ret[%d] [%s]", ret, VOICE_KEY);
+
+ return ret;
+}
+
+static bool _add_key_cb()
+{
+ if (g_key_down_handler == NULL) {
+ LOGE("_key_down_handler");
+ g_key_down_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _key_down_cb, NULL);
+ if(g_key_down_handler == NULL) {
+ LOGE("_key_down_handler == NULL ");
+ }
+ }
+
+ if (g_key_up_handler == NULL) {
+ LOGE("_key_down_handler");
+ g_key_up_handler = ecore_event_handler_add(ECORE_EVENT_KEY_UP, _key_up_cb, NULL);
+ if(g_key_up_handler == NULL) {
+ LOGE("_key_up_handler == NULL ");
+ }
+ }
+ return true;
+}
+
+static bool _delete_key_cb(void)
+{
+ LOGE("start");
+ if (NULL != g_key_down_handler) {
+ ecore_event_handler_del(g_key_down_handler);
+ g_key_down_handler = NULL;
+ }
+
+ if (NULL != g_key_up_handler) {
+ ecore_event_handler_del(g_key_up_handler);
+ g_key_up_handler = NULL;
+ }
+ LOGE("end");
+ return true;
+}
+
void dependency_default_button_initialize(mas_dependency_plugin_proxy_interface interface)
{
g_proxy_interface = interface;
+
+ Ecore_Wl2_Display *_ecore_wl2_display = NULL;
+
+ Eina_Bool ret = ecore_wl2_init();
+ LOGD("ecore_wl2_init: %d", ret);
+
+ _ecore_wl2_display = ecore_wl2_display_connect(NULL);
+ LOGD("_ecore_wl2_display: %p", _ecore_wl2_display);
+
+ g_last_time_point = chrono::system_clock::now();
+ _grab_voice_key();
+ _add_key_cb();
}
void dependency_default_button_deinitialize()
{
-}
+ _delete_key_cb();
+ _ungrab_voice_key();
+}
\ No newline at end of file