static void _cb_signal_win_rot_changed(void *data, const Eldbus_Message *msg);
static void _cb_signal_focus_changed(void *data, const Eldbus_Message *msg);
+/* callbacks - ecore */
+static Eina_Bool _cb_ecore_key(void *data, int type, void *event);
+static Eina_Bool _cb_key_delay_timer(void *data);
+
+/* callbacks - evas */
+static void _cb_evas_key_down(void * data, Evas * evas, Evas_Object * obj, void * event_info);
+static void _cb_evas_key_up(void * data, Evas * evas, Evas_Object * obj, void * event_info);
+
/* callbacks - timer */
static Eina_Bool _cb_work_timeout(void *data);
static Eina_Bool _ev_wait_timeout(void *data);
EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EINA_FALSE);
// init input generator
- inputGenerator = efl_util_input_initialize_generator(EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN);
+ inputGenerator = efl_util_input_initialize_generator(EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN | EFL_UTIL_INPUT_DEVTYPE_KEYBOARD);
return EINA_TRUE;
}
}
Eina_Bool
+etRunner::generateKeyPress(const char *keyname)
+{
+ // Using efl_util_input_generate instead of generate event by eldbus
+ int ret = EFL_UTIL_ERROR_NONE;
+
+ if (inputGenerator == NULL)
+ {
+ inputGenerator = efl_util_input_initialize_generator(EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN);
+ work();
+ }
+
+ ret = efl_util_input_generate_key(inputGenerator,
+ keyname,
+ 1);
+ if (ret != EFL_UTIL_ERROR_NONE)
+ {
+ efl_util_input_deinitialize_generator(inputGenerator);
+ inputGenerator = NULL;
+ return EINA_FALSE;
+ }
+
+ return EINA_TRUE;
+}
+
+Eina_Bool
+etRunner::generateKeyRelease(const char *keyname)
+{
+ // Using efl_util_input_generate instead of generate event by eldbus
+ int ret = EFL_UTIL_ERROR_NONE;
+
+ if (inputGenerator == NULL)
+ {
+ inputGenerator = efl_util_input_initialize_generator(EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN);
+ work();
+ }
+
+ ret = efl_util_input_generate_key(inputGenerator,
+ keyname,
+ 0);
+ if (ret != EFL_UTIL_ERROR_NONE)
+ {
+ efl_util_input_deinitialize_generator(inputGenerator);
+ inputGenerator = NULL;
+ return EINA_FALSE;
+ }
+
+ return EINA_TRUE;
+}
+
+void
+etRunner::generateKeyEvent(const char *keyname, double delay)
+{
+ this->ev.key.timer = ecore_timer_add(delay,
+ _cb_key_delay_timer,
+ this);
+}
+
+
+Eina_Bool
etRunner::freezeEvent()
{
Eldbus_Pending *p = NULL;
Eina_Bool
etRunner::waitEvent(E_TC_Event_Type ev_type)
{
- Eldbus_Signal_Handler *sh;
+ Eldbus_Signal_Handler *sh = NULL;
+ Ecore_Event_Handler *eh = NULL, *eh2 = NULL;
Eina_Bool res = EINA_FALSE;
EINA_SAFETY_ON_FALSE_RETURN_VAL((E_TC_EVENT_TYPE_NONE < ev_type), res);
EINA_SAFETY_ON_NULL_GOTO(sh, finish);
break;
+ case E_TC_EVENT_TYPE_INPUT_ECORE_KEY:
+ eh = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _cb_ecore_key, this);
+ EINA_SAFETY_ON_NULL_GOTO(eh, finish);
+ eh2 = ecore_event_handler_add(ECORE_EVENT_KEY_UP, _cb_ecore_key, this);
+ EINA_SAFETY_ON_NULL_GOTO(eh, finish);
+
+ this->ev.key.state = EINA_FALSE;
+ this->generateKeyEvent(this->ev.key.name, 1.0);
+ break;
+
+ case E_TC_EVENT_TYPE_INPUT_EVAS_KEY:
+ evas_object_event_callback_add(this->ev.key.win, EVAS_CALLBACK_KEY_DOWN, _cb_evas_key_down, this);
+ evas_object_event_callback_add(this->ev.key.win, EVAS_CALLBACK_KEY_UP, _cb_evas_key_up, this);
+
+ this->ev.key.state = EINA_FALSE;
+ this->generateKeyEvent(this->ev.key.name, 1.0);
+ break;
+
default:
goto finish;
break;
ev.expire_timer = NULL;
}
- eldbus_signal_handler_del(sh);
+ if (sh) eldbus_signal_handler_del(sh);
+ if (eh) ecore_event_handler_del(eh);
+ if (eh2) ecore_event_handler_del(eh2);
+ evas_object_event_callback_del(this->ev.key.win, EVAS_CALLBACK_KEY_DOWN, _cb_evas_key_down);
+ evas_object_event_callback_del(this->ev.key.win, EVAS_CALLBACK_KEY_UP, _cb_evas_key_up);
res = (ev.response == ev.request);
EINA_SAFETY_ON_FALSE_GOTO(res, finish);
return ECORE_CALLBACK_DONE;
}
+
+static Eina_Bool
+_cb_ecore_key(void *data, int type, void *event)
+{
+ Ecore_Event_Key *ev = (Ecore_Event_Key *)event;
+ etRunner *runner = (etRunner *)data;
+
+ if (!strncmp(runner->ev.key.name, ev->keyname, strlen(ev->keyname)))
+ {
+ if (runner->ev.key.state == EINA_FALSE &&
+ type == ECORE_EVENT_KEY_DOWN)
+ {
+ runner->ev.key.state = EINA_TRUE;
+ }
+ else if (runner->ev.key.state == EINA_TRUE &&
+ type == ECORE_EVENT_KEY_UP)
+ {
+ runner->ev.response = runner->ev.request;
+ runner->ev.key.state = EINA_FALSE;
+ elm_exit();
+ }
+ }
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+static void
+_cb_evas_key_down(void *data, Evas * evas, Evas_Object * obj, void * event_info)
+{
+ Evas_Event_Key_Down *ev;
+ etRunner *runner = (etRunner *)data;
+
+ ev = (Evas_Event_Key_Down *)event_info;
+
+ if (!strncmp(runner->ev.key.name, ev->keyname, strlen(ev->keyname)))
+ {
+ if (runner->ev.key.state == EINA_FALSE &&
+ runner->ev.key.win == obj)
+ {
+ runner->ev.key.state = EINA_TRUE;
+ }
+ }
+}
+
+static void
+_cb_evas_key_up(void * data, Evas * evas, Evas_Object * obj, void * event_info)
+{
+ Evas_Event_Key_Up *ev;
+ etRunner *runner = (etRunner *)data;
+
+ ev = (Evas_Event_Key_Up *)event_info;
+
+ if (!strncmp(runner->ev.key.name, ev->keyname, strlen(ev->keyname)))
+ {
+ if (runner->ev.key.state == EINA_TRUE &&
+ runner->ev.key.win == obj)
+ {
+ runner->ev.response = runner->ev.request;
+ runner->ev.key.state = EINA_FALSE;
+ runner->ev.key.win = NULL;
+ elm_exit();
+ }
+ }
+}
+
+static Eina_Bool
+_cb_key_delay_timer(void *data)
+{
+ etRunner *runner = (etRunner *)data;
+
+ runner->generateKeyPress(runner->ev.key.name);
+ runner->generateKeyRelease(runner->ev.key.name);
+
+ runner->ev.key.timer = NULL;
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
--- /dev/null
+#include "e_test_event.h"
+#include "e_test_base.h"
+#include <Ecore_Wl2.h>
+
+class etTestInput : public ::etTCBase
+{
+public:
+ etTestInput() { };
+ ~etTestInput() { };
+
+protected:
+ etWin *tw_shared = NULL;
+ etWin *tw_topposition = NULL;
+ etWin *tw_orexcl = NULL;
+ etWin *tw_excl = NULL;
+};
+
+TEST_F(etTestInput, keygrab_nowin_shared)
+{
+ Eina_Bool ret = EINA_FALSE;
+ ret = ecore_wl2_window_keygrab_set(NULL, "XF86Menu", 0, 0, 0, ECORE_WL2_WINDOW_KEYGRAB_SHARED);
+ ASSERT_TRUE(ret);
+
+ etRunner::get().ev.key.name = eina_stringshare_add("XF86Menu");
+ ret = etRunner::get().waitEvent(E_TC_EVENT_TYPE_INPUT_ECORE_KEY);
+ ASSERT_TRUE(ret);
+
+ eina_stringshare_del(etRunner::get().ev.key.name);
+ etRunner::get().ev.key.name = NULL;
+
+ ret = ecore_wl2_window_keygrab_unset(NULL, "XF86Menu", 0, 0);
+ ASSERT_TRUE(ret);
+}
+
+TEST_F(etTestInput, keygrab_nowin_orexcl)
+{
+ Eina_Bool ret = EINA_FALSE;
+ ret = ecore_wl2_window_keygrab_set(NULL, "XF86Menu", 0, 0, 0, ECORE_WL2_WINDOW_KEYGRAB_OVERRIDE_EXCLUSIVE);
+ ASSERT_TRUE(ret);
+
+ etRunner::get().ev.key.name = eina_stringshare_add("XF86Menu");
+ ret = etRunner::get().waitEvent(E_TC_EVENT_TYPE_INPUT_ECORE_KEY);
+ ASSERT_TRUE(ret);
+
+ eina_stringshare_del(etRunner::get().ev.key.name);
+ etRunner::get().ev.key.name = NULL;
+
+ ret = ecore_wl2_window_keygrab_unset(NULL, "XF86Menu", 0, 0);
+ ASSERT_TRUE(ret);
+}
+
+TEST_F(etTestInput, keygrab_nowin_excl)
+{
+ Eina_Bool ret = EINA_FALSE;
+ ret = ecore_wl2_window_keygrab_set(NULL, "XF86Menu", 0, 0, 0, ECORE_WL2_WINDOW_KEYGRAB_EXCLUSIVE);
+ ASSERT_TRUE(ret);
+
+ etRunner::get().ev.key.name = eina_stringshare_add("XF86Menu");
+ ret = etRunner::get().waitEvent(E_TC_EVENT_TYPE_INPUT_ECORE_KEY);
+ ASSERT_TRUE(ret);
+
+ eina_stringshare_del(etRunner::get().ev.key.name);
+ etRunner::get().ev.key.name = NULL;
+
+ ret = ecore_wl2_window_keygrab_unset(NULL, "XF86Menu", 0, 0);
+ ASSERT_TRUE(ret);
+}
+
+TEST_F(etTestInput, keygrab_win_shared)
+{
+ Eina_Bool ret = EINA_FALSE;
+
+ tw_shared = initNormalWin("TCWin_SharedGrab", EINA_TRUE, EINA_FALSE);
+ ASSERT_TRUE(tw_shared != NULL) << "failed to initiation window";
+
+ ret = elm_win_keygrab_set(tw_shared->elm_win, "XF86Menu", 0, 0, 0, ELM_WIN_KEYGRAB_SHARED);
+ ASSERT_TRUE(ret);
+ ret = evas_object_key_grab(tw_shared->elm_win, "XF86Menu", 0, 0, EINA_FALSE);
+ ASSERT_TRUE(ret);
+
+ etRunner::get().ev.key.win = tw_shared->elm_win;
+ etRunner::get().ev.key.name = eina_stringshare_add("XF86Menu");
+ ret = etRunner::get().setWinStack(tw_shared, NULL, EINA_FALSE);
+ etRunner::get().waitEvent(E_TC_EVENT_TYPE_FOCUS_CHANGED);
+ ASSERT_TRUE(ret);
+
+ ret = etRunner::get().waitEvent(E_TC_EVENT_TYPE_INPUT_EVAS_KEY);
+ ASSERT_TRUE(ret);
+
+ eina_stringshare_del(etRunner::get().ev.key.name);
+ etRunner::get().ev.key.name = NULL;
+ etRunner::get().ev.key.win = NULL;
+
+ evas_object_key_ungrab(tw_shared->elm_win, "XF86Menu", 0, 0);
+ ret = elm_win_keygrab_unset(tw_shared->elm_win, "XF86Menu", 0, 0);
+ ASSERT_TRUE(ret);
+}
+
+TEST_F(etTestInput, keygrab_win_orexcl)
+{
+ Eina_Bool ret = EINA_FALSE;
+
+ tw_orexcl = initNormalWin("TCWin_OrexclGrab", EINA_TRUE, EINA_FALSE);
+ ASSERT_TRUE(tw_orexcl != NULL) << "failed to initiation window";
+
+ ret = elm_win_keygrab_set(tw_orexcl->elm_win, "XF86Menu", 0, 0, 0, ELM_WIN_KEYGRAB_OVERRIDE_EXCLUSIVE);
+ ASSERT_TRUE(ret);
+ ret = evas_object_key_grab(tw_orexcl->elm_win, "XF86Menu", 0, 0, EINA_TRUE);
+ ASSERT_TRUE(ret);
+
+ etRunner::get().ev.key.win = tw_orexcl->elm_win;
+ etRunner::get().ev.key.name = eina_stringshare_add("XF86Menu");
+ ret = etRunner::get().setWinStack(tw_orexcl, NULL, EINA_FALSE);
+ etRunner::get().waitEvent(E_TC_EVENT_TYPE_FOCUS_CHANGED);
+ ASSERT_TRUE(ret);
+
+ ret = etRunner::get().waitEvent(E_TC_EVENT_TYPE_INPUT_EVAS_KEY);
+ ASSERT_TRUE(ret);
+
+ eina_stringshare_del(etRunner::get().ev.key.name);
+ etRunner::get().ev.key.name = NULL;
+ etRunner::get().ev.key.win = NULL;
+
+ evas_object_key_ungrab(tw_orexcl->elm_win, "XF86Menu", 0, 0);
+ ret = elm_win_keygrab_unset(tw_orexcl->elm_win, "XF86Menu", 0, 0);
+ ASSERT_TRUE(ret);
+}
+
+TEST_F(etTestInput, keygrab_win_excl)
+{
+ Eina_Bool ret = EINA_FALSE;
+
+ tw_excl = initNormalWin("TCWin_ExclGrab", EINA_TRUE, EINA_FALSE);
+ ASSERT_TRUE(tw_excl != NULL) << "failed to initiation window";
+
+ ret = elm_win_keygrab_set(tw_excl->elm_win, "XF86Menu", 0, 0, 0, ELM_WIN_KEYGRAB_EXCLUSIVE);
+ ASSERT_TRUE(ret);
+ ret = evas_object_key_grab(tw_excl->elm_win, "XF86Menu", 0, 0, EINA_TRUE);
+ ASSERT_TRUE(ret);
+
+ etRunner::get().ev.key.win = tw_excl->elm_win;
+ etRunner::get().ev.key.name = eina_stringshare_add("XF86Menu");
+ ret = etRunner::get().setWinStack(tw_excl, NULL, EINA_FALSE);
+ etRunner::get().waitEvent(E_TC_EVENT_TYPE_FOCUS_CHANGED);
+ ASSERT_TRUE(ret);
+
+ ret = etRunner::get().waitEvent(E_TC_EVENT_TYPE_INPUT_EVAS_KEY);
+ ASSERT_TRUE(ret);
+
+ eina_stringshare_del(etRunner::get().ev.key.name);
+ etRunner::get().ev.key.name = NULL;
+ etRunner::get().ev.key.win = NULL;
+
+ evas_object_key_ungrab(tw_excl->elm_win, "XF86Menu", 0, 0);
+ ret = elm_win_keygrab_unset(tw_excl->elm_win, "XF86Menu", 0, 0);
+ ASSERT_TRUE(ret);
+}
+
+TEST_F(etTestInput, keygrab_win_topposition)
+{
+ Eina_Bool ret = EINA_FALSE;
+
+ tw_topposition = initNormalWin("TCWin_ToppositionGrab", EINA_TRUE, EINA_TRUE);
+ ASSERT_TRUE(tw_topposition != NULL) << "failed to initiation window";
+
+ ecore_evas_focus_skip_set(ecore_evas_ecore_evas_get(evas_object_evas_get(tw_topposition->elm_win)), EINA_TRUE);
+
+ ret = elm_win_keygrab_set(tw_topposition->elm_win, "XF86Menu", 0, 0, 0, ELM_WIN_KEYGRAB_TOPMOST);
+ ASSERT_TRUE(ret);
+ ret = evas_object_key_grab(tw_topposition->elm_win, "XF86Menu", 0, 0, EINA_FALSE);
+ ASSERT_TRUE(ret);
+
+ etRunner::get().ev.key.win = tw_topposition->elm_win;
+ etRunner::get().ev.key.name = eina_stringshare_add("XF86Menu");
+
+ ret = etRunner::get().waitEvent(E_TC_EVENT_TYPE_INPUT_EVAS_KEY);
+ ASSERT_TRUE(ret);
+
+ eina_stringshare_del(etRunner::get().ev.key.name);
+ etRunner::get().ev.key.name = NULL;
+ etRunner::get().ev.key.win = NULL;
+
+ evas_object_key_ungrab(tw_topposition->elm_win, "XF86Menu", 0, 0);
+ ret = elm_win_keygrab_unset(tw_topposition->elm_win, "XF86Menu", 0, 0);
+ ASSERT_TRUE(ret);
+}
+
+TEST_F(etTestInput, keygrab_win)
+{
+ Eina_Bool ret = EINA_FALSE;
+
+ tw_shared = initNormalWin("TCWin_SharedGrab", EINA_TRUE, EINA_FALSE);
+ ASSERT_TRUE(tw_shared != NULL) << "failed to initiation window";
+
+ tw_orexcl = initNormalWin("TCWin_OrexclGrab", EINA_TRUE, EINA_FALSE);
+ ASSERT_TRUE(tw_orexcl != NULL) << "failed to initiation window";
+
+ tw_excl = initNormalWin("TCWin_ExclGrab", EINA_TRUE, EINA_FALSE);
+ ASSERT_TRUE(tw_excl != NULL) << "failed to initiation window";
+
+ tw_topposition = initNormalWin("TCWin_ToppositionGrab", EINA_TRUE, EINA_TRUE);
+ ASSERT_TRUE(tw_topposition != NULL) << "failed to initiation window";
+
+ ecore_evas_focus_skip_set(ecore_evas_ecore_evas_get(evas_object_evas_get(tw_topposition->elm_win)), EINA_TRUE);
+
+ ret = elm_win_keygrab_set(tw_excl->elm_win, "XF86Menu", 0, 0, 0, ELM_WIN_KEYGRAB_EXCLUSIVE);
+ ASSERT_TRUE(ret);
+ ret = evas_object_key_grab(tw_excl->elm_win, "XF86Menu", 0, 0, EINA_TRUE);
+ ASSERT_TRUE(ret);
+
+ ret = elm_win_keygrab_set(tw_orexcl->elm_win, "XF86Menu", 0, 0, 0, ELM_WIN_KEYGRAB_OVERRIDE_EXCLUSIVE);
+ ASSERT_TRUE(ret);
+ ret = evas_object_key_grab(tw_orexcl->elm_win, "XF86Menu", 0, 0, EINA_TRUE);
+ ASSERT_TRUE(ret);
+
+ ret = elm_win_keygrab_set(tw_topposition->elm_win, "XF86Menu", 0, 0, 0, ELM_WIN_KEYGRAB_TOPMOST);
+ ASSERT_TRUE(ret);
+ ret = evas_object_key_grab(tw_topposition->elm_win, "XF86Menu", 0, 0, EINA_FALSE);
+ ASSERT_TRUE(ret);
+
+ ret = elm_win_keygrab_set(tw_shared->elm_win, "XF86Menu", 0, 0, 0, ELM_WIN_KEYGRAB_SHARED);
+ ASSERT_TRUE(ret);
+ ret = evas_object_key_grab(tw_shared->elm_win, "XF86Menu", 0, 0, EINA_FALSE);
+ ASSERT_TRUE(ret);
+
+ ret = etRunner::get().setWinStack(tw_excl, NULL, EINA_FALSE);
+ etRunner::get().waitEvent(E_TC_EVENT_TYPE_FOCUS_CHANGED);
+ ASSERT_TRUE(ret);
+
+ ret = etRunner::get().setWinStack(tw_orexcl, NULL, EINA_FALSE);
+ etRunner::get().waitEvent(E_TC_EVENT_TYPE_FOCUS_CHANGED);
+ ASSERT_TRUE(ret);
+
+ ret = etRunner::get().setWinStack(tw_shared, NULL, EINA_FALSE);
+ etRunner::get().waitEvent(E_TC_EVENT_TYPE_FOCUS_CHANGED);
+ ASSERT_TRUE(ret);
+
+ // test exclusive grab
+ etRunner::get().ev.key.win = tw_excl->elm_win;
+ etRunner::get().ev.key.name = eina_stringshare_add("XF86Menu");
+
+ ret = etRunner::get().waitEvent(E_TC_EVENT_TYPE_INPUT_EVAS_KEY);
+ ASSERT_TRUE(ret);
+
+ eina_stringshare_del(etRunner::get().ev.key.name);
+
+ evas_object_key_ungrab(tw_excl->elm_win, "XF86Menu", 0, 0);
+ ret = elm_win_keygrab_unset(tw_excl->elm_win, "XF86Menu", 0, 0);
+ ASSERT_TRUE(ret);
+
+ // test override exclusive grab
+ etRunner::get().ev.key.win = tw_orexcl->elm_win;
+ etRunner::get().ev.key.name = eina_stringshare_add("XF86Menu");
+
+ ret = etRunner::get().waitEvent(E_TC_EVENT_TYPE_INPUT_EVAS_KEY);
+ ASSERT_TRUE(ret);
+
+ eina_stringshare_del(etRunner::get().ev.key.name);
+
+ evas_object_key_ungrab(tw_orexcl->elm_win, "XF86Menu", 0, 0);
+ ret = elm_win_keygrab_unset(tw_orexcl->elm_win, "XF86Menu", 0, 0);
+ ASSERT_TRUE(ret);
+
+ // test top position grab
+ etRunner::get().ev.key.win = tw_topposition->elm_win;
+ etRunner::get().ev.key.name = eina_stringshare_add("XF86Menu");
+
+ ret = etRunner::get().waitEvent(E_TC_EVENT_TYPE_INPUT_EVAS_KEY);
+ ASSERT_TRUE(ret);
+
+ eina_stringshare_del(etRunner::get().ev.key.name);
+
+ evas_object_key_ungrab(tw_topposition->elm_win, "XF86Menu", 0, 0);
+ ret = elm_win_keygrab_unset(tw_topposition->elm_win, "XF86Menu", 0, 0);
+ ASSERT_TRUE(ret);
+
+ // test shared grab
+ etRunner::get().ev.key.win = tw_shared->elm_win;
+ etRunner::get().ev.key.name = eina_stringshare_add("XF86Menu");
+
+ ret = etRunner::get().waitEvent(E_TC_EVENT_TYPE_INPUT_EVAS_KEY);
+ ASSERT_TRUE(ret);
+
+ eina_stringshare_del(etRunner::get().ev.key.name);
+
+ evas_object_key_ungrab(tw_shared->elm_win, "XF86Menu", 0, 0);
+ ret = elm_win_keygrab_unset(tw_shared->elm_win, "XF86Menu", 0, 0);
+ ASSERT_TRUE(ret);
+
+ etRunner::get().ev.key.name = NULL;
+ etRunner::get().ev.key.win = NULL;
+}