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
This commit is contained in:
Bruno Dilly 2016-11-08 17:50:23 -02:00
parent 2958aba23a
commit fecd59fe32
3 changed files with 43 additions and 16 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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 *))