edje: add new signals providing seat information
authorBruno Dilly <bdilly@profusion.mobi>
Tue, 8 Nov 2016 19:50:23 +0000 (17:50 -0200)
committerBruno Dilly <bdilly@profusion.mobi>
Mon, 19 Dec 2016 16:58:35 +0000 (14:58 -0200)
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
src/lib/edje/edje_private.h
src/lib/edje/edje_program.c

index b27049f..b367d0c 100644 (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;
index 9a0fd21..7dc1d59 100644 (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);
index 3edaca9..2a6e100 100644 (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 *))