summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Makefile_Elementary.am1
-rw-r--r--src/bin/elementary/test.c4
-rw-r--r--src/bin/elementary/test_events.c240
3 files changed, 245 insertions, 0 deletions
diff --git a/src/Makefile_Elementary.am b/src/Makefile_Elementary.am
index 829cb8a6f7..9685694199 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 fff22fec44..02d48c91ec 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 0000000000..5fdfd94df4
--- /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);
+}