jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=57b279cd569799e5d6c30567e5afdf3a40441954

commit 57b279cd569799e5d6c30567e5afdf3a40441954
Author: Jean-Philippe Andre <jp.an...@samsung.com>
Date:   Fri Jun 3 11:56:57 2016 +0900

    elm_test: Add test case for event refeed
    
    Not sure if this test case is really good, but it was
    necessary to prove that input event refeed can work from
    application side. This is a feature that should work
    but shouldn't be used :)
---
 src/Makefile_Elementary.am       |   1 +
 src/bin/elementary/test.c        |   4 +
 src/bin/elementary/test_events.c | 240 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 245 insertions(+)

diff --git a/src/Makefile_Elementary.am b/src/Makefile_Elementary.am
index 829cb8a..9685694 100644
--- a/src/Makefile_Elementary.am
+++ b/src/Makefile_Elementary.am
@@ -749,6 +749,7 @@ bin/elementary/test_entry.c \
 bin/elementary/test_entry_anchor.c \
 bin/elementary/test_entry_anchor2.c \
 bin/elementary/test_external.c \
+bin/elementary/test_events.c \
 bin/elementary/test_fileselector_button.c \
 bin/elementary/test_fileselector.c \
 bin/elementary/test_fileselector_entry.c \
diff --git a/src/bin/elementary/test.c b/src/bin/elementary/test.c
index fff22fe..02d48c9 100644
--- a/src/bin/elementary/test.c
+++ b/src/bin/elementary/test.c
@@ -29,6 +29,7 @@ void test_box_align(void *data, Evas_Object *obj, void 
*event_info);
 void test_ui_box(void *data, Evas_Object *obj, void *event_info);
 void test_button(void *data, Evas_Object *obj, void *event_info);
 void test_cnp(void *data, Evas_Object *obj, void *event_info);
+void test_events(void *data, Evas_Object *obj, void *event_info);
 void test_transit(void *data, Evas_Object *obj, void *event_info);
 void test_transit_blend(void *data, Evas_Object *obj, void *event_info);
 void test_transit_chain(void *data, Evas_Object *obj, void *event_info);
@@ -600,6 +601,9 @@ add_tests:
    ADD_TEST(NULL, "New Containers", "Ui.Grid Linear", test_ui_grid_linear);
 
    //------------------------------//
+   ADD_TEST(NULL, "New Events", "Event Refeed", test_events);
+
+   //------------------------------//
    ADD_TEST(NULL, "Entries", "Entry", test_entry);
    ADD_TEST(NULL, "Entries", "Entry Style Default", test_entry_style_default);
    ADD_TEST(NULL, "Entries", "Entry Style User", test_entry_style_user);
diff --git a/src/bin/elementary/test_events.c b/src/bin/elementary/test_events.c
new file mode 100644
index 0000000..5fdfd94
--- /dev/null
+++ b/src/bin/elementary/test_events.c
@@ -0,0 +1,240 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+#define EFL_INTERNAL_UNSTABLE
+#include "interfaces/efl_common_internal.h"
+
+#define DEFAULT_TEXT "Click the white rectangle to get started"
+
+typedef struct {
+   int down;
+   Eo *evdown, *evup, *evmove, *evkeydown, *evkeyup;
+   Eo *win, *button, *text;
+   int id;
+   Eina_Promise *p;
+   Eo *timer;
+} testdata;
+
+static Eina_Bool
+_pointer_down(void *data, const Eo_Event *ev)
+{
+   testdata *td = data;
+   td->down = 1;
+   eo_del(td->evdown);
+   td->evdown = efl_event_dup(ev->info);
+   return 1;
+}
+
+static Eina_Bool
+_pointer_move(void *data, const Eo_Event *ev)
+{
+   testdata *td = data;
+   eo_del(td->evmove);
+   td->evmove = efl_event_dup(ev->info);
+   return 1;
+}
+
+static Eina_Bool
+_pointer_up(void *data, const Eo_Event *ev)
+{
+   testdata *td = data;
+   td->down = 0;
+   eo_del(td->evup);
+   td->evup = efl_event_dup(ev->info);
+   return 1;
+}
+
+static Eina_Bool
+_key_down(void *data, const Eo_Event *ev)
+{
+   testdata *td = data;
+   char str[1024];
+
+   // FIXME: By default the elm_win object is the focussed object
+   // this means that evas callbacks will transfer the KEY_UP/KEY_DOWN events
+   // to the elm_win. So, we get two key_down & two key_up events:
+   // 1. ecore_evas -> evas -> elm_win forward -> here
+   // 2. ecore_evas -> evas -> focussed obj (elm_win) -> here
+
+   sprintf(str, "key=%s keyname=%s string=%s compose=%s",
+           efl_event_key_get(ev->info),
+           efl_event_key_name_get(ev->info),
+           efl_event_key_string_get(ev->info),
+           efl_event_key_compose_get(ev->info));
+   elm_object_text_set(td->text, str);
+
+   eo_del(td->evkeydown);
+   td->evkeydown = efl_event_dup(ev->info);
+
+   return 1;
+}
+
+#if 0
+static void
+_timeout_cb(void *data, void *value EINA_UNUSED, Eina_Promise *promise 
EINA_UNUSED)
+{
+   testdata *td = data;
+   elm_object_text_set(td->text, NULL);
+   td->p = NULL;
+}
+#else
+static Eina_Bool
+_ecore_timeout_cb(void *data)
+{
+   testdata *td = data;
+
+   elm_object_text_set(td->text, DEFAULT_TEXT);
+   td->timer = NULL;
+
+   return ECORE_CALLBACK_CANCEL;
+}
+
+#endif
+
+static Eina_Bool
+_key_up(void *data, const Eo_Event *ev)
+{
+   testdata *td = data;
+
+   eo_del(td->evkeyup);
+   td->evkeyup = efl_event_dup(ev->info);
+
+   // FIXME: how to use efl_loop_timeout?
+   // 1. I can't cancel it (it crashes)
+   // 2. I can't get a handle on the loop without calling ecore_main_loop_get()
+   // 2bis I need to pass the loop object itself rather than a provider
+   // 3. All calls to eina_promise crash if the promise is null
+
+   if (td->timer) eo_del(td->timer);
+   td->timer = ecore_timer_add(0.5, _ecore_timeout_cb, td);
+
+   return 1;
+}
+
+static Eina_Bool
+_clicked_button1(void *data, const Eo_Event *ev EINA_UNUSED)
+{
+   testdata *td = data;
+   Eo *txt = td->text;
+   char buf[256];
+
+   // Note: can't do efl_event_fake_get(ev->info) because this is a click evt
+
+   td->id++;
+   sprintf(buf, "Button was clicked %d time%s", td->id, td->id > 1 ? "s" : "");
+   elm_object_text_set(txt, buf);
+
+   return 1;
+}
+
+static Eina_Bool
+_clicked_button2(void *data, const Eo_Event *ev EINA_UNUSED)
+{
+   testdata *td = data;
+   Eo *bt = td->button;
+   int x, y, w, h;
+
+   if (!td->evkeyup)
+     {
+        efl_gfx_position_get(bt, &x, &y);
+        efl_gfx_size_get(bt, &w, &h);
+
+        x = x + w / 2;
+        y = y + h / 2;
+        efl_event_pointer_position_set(td->evmove, x, y);
+        efl_event_pointer_position_set(td->evdown, x, y);
+        efl_event_pointer_position_set(td->evup, x, y);
+
+        eo_event_callback_call(td->win, EFL_EVENT_POINTER_MOVE, td->evmove);
+        eo_event_callback_call(td->win, EFL_EVENT_POINTER_DOWN, td->evdown);
+        eo_event_callback_call(td->win, EFL_EVENT_POINTER_UP, td->evup);
+     }
+   else
+     {
+        eo_event_callback_call(td->win, EFL_EVENT_KEY_DOWN, td->evkeydown);
+        eo_event_callback_call(td->win, EFL_EVENT_KEY_UP, td->evkeyup);
+        eo_del(td->evkeydown);
+        eo_del(td->evkeyup);
+        td->evkeydown = NULL;
+        td->evkeyup = NULL;
+     }
+
+   return 1;
+}
+
+static Eina_Bool
+_win_del(void *data, const Eo_Event *ev EINA_UNUSED)
+{
+   testdata *td = data;
+   free(td);
+   return 1;
+}
+
+EO_CALLBACKS_ARRAY_DEFINE(rect_pointer_callbacks,
+{ EFL_EVENT_POINTER_DOWN, _pointer_down },
+{ EFL_EVENT_POINTER_MOVE, _pointer_move },
+{ EFL_EVENT_POINTER_UP, _pointer_up })
+
+EO_CALLBACKS_ARRAY_DEFINE(win_key_callbacks,
+{ EFL_EVENT_KEY_DOWN, _key_down },
+{ EFL_EVENT_KEY_UP, _key_up })
+
+void
+test_events(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void 
*event_info EINA_UNUSED)
+{
+   /* test fake POINTER and KEY events */
+
+   Evas_Object *bx, *bt, *txt, *o, *win;
+   testdata *td = calloc(1, sizeof(*td));
+
+   win = elm_win_util_standard_add("buttons", "Buttons");
+   elm_win_autodel_set(win, EINA_TRUE);
+
+   // FIXME: should be efl_orientation_set
+   bx = eo_add(EFL_UI_BOX_CLASS, win, efl_pack_direction_set(eo_self, 
EFL_ORIENT_VERTICAL));
+   evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(bx, -1, -1);
+   efl_pack(win, bx);
+   evas_object_show(bx);
+   td->win = win;
+
+   txt = elm_label_add(win);
+   evas_object_size_hint_weight_set(txt, EVAS_HINT_EXPAND, 0);
+   evas_object_size_hint_align_set(txt, -1, -1);
+   efl_pack(bx, txt);
+   elm_object_text_set(txt, DEFAULT_TEXT);
+   evas_object_show(txt);
+   td->text = txt;
+
+   bt = elm_button_add(win);
+   evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0);
+   evas_object_size_hint_align_set(bt, -1, -1);
+   elm_object_text_set(bt, "Click me!");
+   efl_pack(bx, bt);
+   evas_object_show(bt);
+   td->button = bt;
+
+   bt = elm_button_add(win);
+   evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0);
+   evas_object_size_hint_align_set(bt, -1, -1);
+   elm_object_text_set(bt, "Send fake event");
+   efl_pack(bx, bt);
+   evas_object_show(bt);
+
+   o = eo_add(EFL_CANVAS_RECTANGLE_CLASS, win);
+   evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(o, -1, -1);
+   efl_pack(bx, o);
+   evas_object_show(o);
+
+   eo_event_callback_add(td->button, EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, 
_clicked_button1, td);
+   eo_event_callback_add(bt, EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, 
_clicked_button2, td);
+   eo_event_callback_add(win, EO_EVENT_DEL, _win_del, td);
+   eo_event_callback_array_add(o, rect_pointer_callbacks(), td);
+   eo_event_callback_array_add(win, win_key_callbacks(), td);
+
+   evas_object_resize(td->win, 200, 100);
+   evas_object_show(td->win);
+}

-- 


Reply via email to