/* callbacks - ecore */
static Eina_Bool _cb_ecore_key_down(void *data, int type, void *event);
static Eina_Bool _cb_ecore_key_up(void *data, int type, void *event);
+static Eina_Bool _cb_ecore_mouse_button_down(void *data, int type, void *event);
+static Eina_Bool _cb_ecore_mouse_button_up(void *data, int type, void *event);
+static Eina_Bool _cb_ecore_mouse_move(void *data, int type, void *event);
/* callbacks - evas */
static void _cb_evas_key_down(void * data, Evas * evas, Evas_Object * obj, void * event_info);
recv_item->result = EINA_TRUE;
return recv_item;
}
- else if (ev_type == E_TC_EVENT_TYPE_INPUT_ECORE_KEY)
+ else if ((ev_type == E_TC_EVENT_TYPE_INPUT_ECORE_KEY) ||
+ (ev_type == E_TC_EVENT_TYPE_INPUT_ECORE_MOUSE))
{
Ecore_Window ew = elm_win_window_id_get(win?win->elm_win:0);
if (recv_item->isSameWin(ew) &&
ev.key.ecore_state = EINA_FALSE;
+ eh = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, _cb_ecore_mouse_button_down, this);
+ EINA_SAFETY_ON_NULL_GOTO(eh, err);
+ ev.eh_list = eina_list_append(ev.eh_list, eh);
+
+ eh = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, _cb_ecore_mouse_button_up, this);
+ EINA_SAFETY_ON_NULL_GOTO(eh, err);
+ ev.eh_list = eina_list_append(ev.eh_list, eh);
+
+ eh = ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE, _cb_ecore_mouse_move, this);
+ EINA_SAFETY_ON_NULL_GOTO(eh, err);
+ ev.eh_list = eina_list_append(ev.eh_list, eh);
+
+ ev.mouse.ecore_state = EINA_FALSE;
+
return EINA_TRUE;
err:
return ECORE_CALLBACK_PASS_ON;
}
+static Eina_Bool
+_cb_ecore_mouse_button_down(void *data, int type, void *event)
+{
+ Ecore_Event_Mouse_Button *ev = (Ecore_Event_Mouse_Button *)event;
+ etRunner *runner = (etRunner *)data;
+
+ DBG("Mouse button DOWN cb");
+ if (runner->ev.mouse.buttons != ev->buttons) return ECORE_CALLBACK_PASS_ON;
+
+ if ((runner->ev.mouse.x == ev->x) &&
+ (runner->ev.mouse.y == ev->y))
+ {
+ if (runner->ev.mouse.ecore_state == EINA_FALSE &&
+ type == ECORE_EVENT_MOUSE_BUTTON_DOWN)
+ {
+ DBG("Mouse button DOWN cb. insert event");
+ runner->ev.mouse.ecore_state = EINA_TRUE;
+ runner->insertEventQueue(ev->window, E_TC_EVENT_TYPE_INPUT_ECORE_MOUSE);
+ }
+ }
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_cb_ecore_mouse_button_up(void *data, int type, void *event)
+{
+ Ecore_Event_Mouse_Button *ev = (Ecore_Event_Mouse_Button *)event;
+ etRunner *runner = (etRunner *)data;
+
+ DBG("Mouse button UP cb");
+ if (runner->ev.mouse.buttons != ev->buttons) return ECORE_CALLBACK_PASS_ON;
+
+ if ((runner->ev.mouse.x == ev->x) &&
+ (runner->ev.mouse.y == ev->y))
+ {
+ if (runner->ev.mouse.ecore_state == EINA_TRUE &&
+ type == ECORE_EVENT_MOUSE_BUTTON_UP)
+ {
+ DBG("Mouse button UP cb. insert event");
+ runner->ev.mouse.ecore_state = EINA_FALSE;
+ runner->insertEventQueue(ev->window, E_TC_EVENT_TYPE_INPUT_ECORE_MOUSE);
+ }
+ }
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_cb_ecore_mouse_move(void *data, int type, void *event)
+{
+ Ecore_Event_Mouse_Move *ev = (Ecore_Event_Mouse_Move *)event;
+ etRunner *runner = (etRunner *)data;
+
+ DBG("Mouse MOVE cb");
+ if ((runner->ev.mouse.x == ev->x) &&
+ (runner->ev.mouse.y == ev->y))
+ {
+ if (type == ECORE_EVENT_MOUSE_MOVE)
+ {
+ DBG("Mouse MOVE cb. insert event");
+ runner->insertEventQueue(ev->window, E_TC_EVENT_TYPE_INPUT_ECORE_MOUSE);
+ }
+ }
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+
/* callbacks - evas */
static void
_cb_evas_key_down(void *data, Evas * evas, Evas_Object * obj, void * event_info)
ASSERT_EQ(etRunner::get().verifyTC(testCaseName, testName), EINA_TRUE);
}
+TEST_F(etTestInput, pointer_event_robustness)
+{
+ int ret = EFL_UTIL_ERROR_NONE;
+
+ etWin *tw = initNormalWin("TCWin_PointerEventRobustness", EINA_FALSE);
+ ASSERT_TRUE(tw != NULL) << "failed to initiation window";
+
+ showTCWin(tw);
+ ASSERT_VIS_ON(tw);
+
+ InputGenHandler inputgen_h = std::make_shared<etInputGenHandler>(EFL_UTIL_INPUT_DEVTYPE_POINTER, true);
+ ret = inputgen_h->generatePointerMove(1, 0, 0);
+ ASSERT_TRUE(ret);
+
+ etRunner::get().ev.mouse.x = 50;
+ etRunner::get().ev.mouse.y = 50;
+
+ ret = inputgen_h->generatePointerMove(1, 50, 50);
+ ASSERT_TRUE(ret);
+ ev_result = etRunner::get().waitEvent(tw, E_TC_EVENT_TYPE_INPUT_ECORE_MOUSE);
+ ASSERT_NE(ev_result, nullptr);
+
+ etRunner::get().ev.mouse.buttons = 1;
+ etRunner::get().ev.mouse.x = 100;
+ etRunner::get().ev.mouse.y = 100;
+
+ inputgen_h->generatePointerMove(1, 100, 100);
+ ret = inputgen_h->generatePointerDown(1, 100, 100);
+ ASSERT_TRUE(ret);
+ ev_result = etRunner::get().waitEvent(tw, E_TC_EVENT_TYPE_INPUT_ECORE_MOUSE);
+ ASSERT_NE(ev_result, nullptr);
+
+ ret = inputgen_h->generatePointerUp(1, 100, 100);
+ ASSERT_TRUE(ret);
+ ev_result = etRunner::get().waitEvent(tw, E_TC_EVENT_TYPE_INPUT_ECORE_MOUSE);
+ ASSERT_NE(ev_result, nullptr);
+ etRunner::get().ev.elm_win = NULL;
+
+ ASSERT_EQ(etRunner::get().verifyTC(testCaseName, testName), EINA_TRUE);
+}
+
TEST_F(etTestInput, pointer_warp)
{
Ecore_Wl2_Window *wlwin = NULL;