summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruno Dilly <bdilly@profusion.mobi>2016-11-08 17:50:23 -0200
committerBruno Dilly <bdilly@profusion.mobi>2016-12-14 18:17:28 -0200
commiteaf0114e63feb853f3addf9e0b9403bfcda414e1 (patch)
tree1131181f294ce1effcb906ed64d70aae69753d2a
parent40bd74d3052df6b5e04212efc4b98c0b93870a8a (diff)
downloadefl-eaf0114e63feb853f3addf9e0b9403bfcda414e1.tar.gz
edje: add new signals providing seat information
Add the following signals: * mouse,in,$SEAT * mouse,out,$SEAT * mouse,move,$SEAT * mouse,clicked,$BUTTON,$SEAT * hold,on,$SEAT * hold,off,$SEAT * drag,$SEAT * drag,start,$SEAT * drag,stop,$SEAT
-rw-r--r--src/lib/edje/edje_callbacks.c38
-rw-r--r--src/lib/edje/edje_private.h1
-rw-r--r--src/lib/edje/edje_program.c20
3 files changed, 43 insertions, 16 deletions
diff --git a/src/lib/edje/edje_callbacks.c b/src/lib/edje/edje_callbacks.c
index b27049fc83..b367d0c0a5 100644
--- a/src/lib/edje/edje_callbacks.c
+++ b/src/lib/edje/edje_callbacks.c
@@ -15,9 +15,11 @@ _edje_hold_signal_cb(void *data, const Efl_Event *event)
rp = evas_object_data_get(event->object, "real_part");
if (!rp) return;
if (efl_input_hold_get(ev))
- _edje_emit(ed, "hold,on", rp->part->name);
+ _edje_seat_emit(ed, efl_input_device_get(ev),
+ "hold,on", rp->part->name);
else
- _edje_emit(ed, "hold,off", rp->part->name);
+ _edje_seat_emit(ed, efl_input_device_get(ev),
+ "hold,off", rp->part->name);
}
static void
@@ -61,7 +63,7 @@ _edje_mouse_in_signal_cb(void *data, const Efl_Event *event)
if (rp)
{
if (!(ev->event_flags) || !(rp->part->ignore_flags & ev->event_flags))
- _edje_emit(ed, "mouse,in", rp->part->name);
+ _edje_seat_emit(ed, ev->device, "mouse,in", rp->part->name);
ev->event_flags |= rp->part->mask_flags;
}
@@ -80,7 +82,7 @@ _edje_mouse_out_signal_cb(void *data, const Efl_Event *event)
if (rp)
{
if (!(ev->event_flags) || !(rp->part->ignore_flags & ev->event_flags))
- _edje_emit(ed, "mouse,out", rp->part->name);
+ _edje_seat_emit(ed, ev->device, "mouse,out", rp->part->name);
ev->event_flags |= rp->part->mask_flags;
}
@@ -113,7 +115,7 @@ _edje_mouse_down_signal_cb(void *data, const Efl_Event *event)
snprintf(buf, sizeof(buf), "mouse,down,%i,double", ev->button);
else
snprintf(buf, sizeof(buf), "mouse,down,%i", ev->button);
- _edje_emit(ed, buf, rp->part->name);
+ _edje_seat_emit(ed, ev->device, buf, rp->part->name);
}
if (rp->part->dragable.event_id >= 0)
@@ -122,7 +124,7 @@ _edje_mouse_down_signal_cb(void *data, const Efl_Event *event)
if (!ignored)
{
snprintf(buf, sizeof(buf), "mouse,down,%i", ev->button);
- _edje_emit(ed, buf, rp->part->name);
+ _edje_seat_emit(ed, ev->device, buf, rp->part->name);
}
}
@@ -177,7 +179,7 @@ _edje_mouse_up_signal_cb(void *data, const Efl_Event *event)
if ((!ev->event_flags) || (!ignored))
{
snprintf(buf, sizeof(buf), "mouse,up,%i", ev->button);
- _edje_emit(ed, buf, rp->part->name);
+ _edje_seat_emit(ed, ev->device, buf, rp->part->name);
}
if (rp->part->dragable.event_id >= 0)
@@ -186,7 +188,7 @@ _edje_mouse_up_signal_cb(void *data, const Efl_Event *event)
if (!ignored)
{
snprintf(buf, sizeof(buf), "mouse,up,%i", ev->button);
- _edje_emit(ed, buf, rp->part->name);
+ _edje_seat_emit(ed, ev->device, buf, rp->part->name);
}
}
@@ -206,7 +208,8 @@ _edje_mouse_up_signal_cb(void *data, const Efl_Event *event)
rp->invalidate = EINA_TRUE;
#endif
if (!ignored && rp->drag->started)
- _edje_emit(ed, "drag,stop", rp->part->name);
+ _edje_seat_emit(ed, ev->device, "drag,stop",
+ rp->part->name);
rp->drag->started = EINA_FALSE;
_edje_recalc_do(ed);
}
@@ -216,7 +219,7 @@ _edje_mouse_up_signal_cb(void *data, const Efl_Event *event)
if ((rp->still_in) && (rp->clicked_button == ev->button) && (!ev->event_flags))
{
snprintf(buf, sizeof(buf), "mouse,clicked,%i", ev->button);
- _edje_emit(ed, buf, rp->part->name);
+ _edje_seat_emit(ed, ev->device, buf, rp->part->name);
}
rp->clicked_button = 0;
rp->still_in = EINA_FALSE;
@@ -249,7 +252,7 @@ _edje_mouse_move_signal_cb(void *data, const Efl_Event *event)
_edje_ref(ed);
if ((!ev->event_flags) || (!ignored))
- _edje_emit(ed, "mouse,move", rp->part->name);
+ _edje_seat_emit(ed, ev->device, "mouse,move", rp->part->name);
if (rp->still_in)
{
@@ -264,7 +267,8 @@ _edje_mouse_move_signal_cb(void *data, const Efl_Event *event)
(ev->cur.x >= (x + w)) || (ev->cur.y >= (y + h)))
{
if ((ev->pressed_buttons) && ((!ev->event_flags) || (!ignored)))
- _edje_emit(ed, "mouse,pressed,out", rp->part->name);
+ _edje_seat_emit(ed, ev->device, "mouse,pressed,out",
+ rp->part->name);
rp->still_in = EINA_FALSE;
}
@@ -281,7 +285,8 @@ _edje_mouse_move_signal_cb(void *data, const Efl_Event *event)
(ev->cur.x < (x + w)) && (ev->cur.y < (y + h)))
{
if ((ev->pressed_buttons) && ((!ev->event_flags) || (!ignored)))
- _edje_emit(ed, "mouse,pressed,in", rp->part->name);
+ _edje_seat_emit(ed, ev->device, "mouse,pressed,in",
+ rp->part->name);
rp->still_in = EINA_TRUE;
}
@@ -316,8 +321,9 @@ _edje_mouse_move_signal_cb(void *data, const Efl_Event *event)
if (!ignored)
{
if (!rp->drag->started)
- _edje_emit(ed, "drag,start", rp->part->name);
- _edje_emit(ed, "drag", rp->part->name);
+ _edje_seat_emit(ed, ev->device, "drag,start",
+ rp->part->name);
+ _edje_seat_emit(ed, ev->device, "drag", rp->part->name);
rp->drag->started = EINA_TRUE;
}
ed->recalc_call = EINA_TRUE;
@@ -353,7 +359,7 @@ _edje_mouse_wheel_signal_cb(void *data, const Efl_Event *event)
snprintf(buf, sizeof(buf), "mouse,wheel,%i,%i",
ev->wheel.dir == EFL_ORIENT_HORIZONTAL ? 1 : 0,
(ev->wheel.z < 0) ? (-1) : (1));
- _edje_emit(ed, buf, rp->part->name);
+ _edje_seat_emit(ed, ev->device, buf, rp->part->name);
}
ev->event_flags |= rp->part->mask_flags;
diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h
index 9a0fd21eb3..7dc1d59684 100644
--- a/src/lib/edje/edje_private.h
+++ b/src/lib/edje/edje_private.h
@@ -2467,6 +2467,7 @@ void _edje_program_run(Edje *ed, Edje_Program *pr, Eina_Bool force, const char
void _edje_programs_patterns_clean(Edje_Part_Collection *ed);
void _edje_programs_patterns_init(Edje_Part_Collection *ed);
void _edje_emit(Edje *ed, const char *sig, const char *src);
+void _edje_seat_emit(Edje *ed, Efl_Input_Device *dev, const char *sig, const char *src);
void _edje_emit_full(Edje *ed, const char *sig, const char *src, void *data, void (*free_func)(void *));
void _edje_emit_handle(Edje *ed, const char *sig, const char *src, Edje_Message_Signal_Data *data, Eina_Bool prop);
void _edje_signals_sources_patterns_clean(Edje_Signals_Sources_Patterns *ssp);
diff --git a/src/lib/edje/edje_program.c b/src/lib/edje/edje_program.c
index 3edaca98a9..2a6e100622 100644
--- a/src/lib/edje/edje_program.c
+++ b/src/lib/edje/edje_program.c
@@ -1209,6 +1209,26 @@ _edje_emit(Edje *ed, const char *sig, const char *src)
_edje_emit_full(ed, sig, src, NULL, NULL);
}
+void
+_edje_seat_emit(Edje *ed, Efl_Input_Device *dev, const char *sig, const char *src)
+{
+ Efl_Input_Device *seat;
+ char buf[128];
+
+ /* keep sending signals without seat information for legacy compatibility */
+ _edje_emit_full(ed, sig, src, NULL, NULL);
+
+ /* send extra signal with ",$SEAT" suffix if the input device originating
+ * the signal belongs to a seat */
+ if (!dev) return;
+
+ seat = efl_input_device_seat_get(dev);
+ if (!seat) return;
+
+ snprintf(buf, sizeof(buf), "%s,%s", sig, efl_input_device_name_get(seat));
+ _edje_emit_full(ed, buf, src, NULL, NULL);
+}
+
/* data should either be NULL or a malloc allocated data */
void
_edje_emit_full(Edje *ed, const char *sig, const char *src, void *data, void (*free_func)(void *))