From fecd59fe3237d930d86e8b166b57271b16c5df43 Mon Sep 17 00:00:00 2001 From: Bruno Dilly Date: Tue, 8 Nov 2016 17:50:23 -0200 Subject: [PATCH] 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 --- src/lib/edje/edje_callbacks.c | 38 ++++++++++++++++++++++---------------- src/lib/edje/edje_private.h | 1 + src/lib/edje/edje_program.c | 20 ++++++++++++++++++++ 3 files changed, 43 insertions(+), 16 deletions(-) diff --git a/src/lib/edje/edje_callbacks.c b/src/lib/edje/edje_callbacks.c index b27049f..b367d0c 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 9a0fd21..7dc1d59 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 3edaca9..2a6e100 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 *)) -- 2.7.4