Adding method and signals used by Universal-Switch 05/147205/4 accepted/tizen/unified/20170921.072245 submit/tizen/20170915.074959 submit/tizen/20170920.082902
authorLukasz Wlazly <l.wlazly@partner.samsung.com>
Thu, 31 Aug 2017 13:48:25 +0000 (15:48 +0200)
committerLukasz Wlazly <l.wlazly@partner.samsung.com>
Tue, 12 Sep 2017 13:27:39 +0000 (15:27 +0200)
This patch adds ScreenSwitchProviderEnabled method to eldbus API provided by the module.
The method enables/disables ecore event filter capturing mouse events from user.
Information about captured event is sent by eldbus signals to universal-switch.

Because of added filter particular device id is set in gestures created by module itself.

Change-Id: I7fa8389a9604b64f0f9068a508d74a4f33aed249

src/e_dispatch_gesture_event.c
src/e_mod_main.c

index 7c3f00d..bf924a8 100644 (file)
@@ -15,6 +15,8 @@ enum
    ZOOM_OUT,
 };
 
+int device_number_shift;
+
 typedef struct _TouchInputSequence {
    double delay;
    void (*dispatch_func)(int type, int x, int y, int device);
@@ -229,7 +231,7 @@ static void _dispatch_mouse_move_event(int type, int x, int y, int device)
    ev->multi.y = y;
    ev->multi.root.x = x;
    ev->multi.root.y = y;
-   ev->multi.device = device;
+   ev->multi.device = device + device_number_shift;
    ev->window = e_comp->win;
    ev->event_window = ev->window;
    ev->root_window = e_comp->root;
@@ -319,7 +321,7 @@ static void _dispatch_mouse_down_event(int type, int x, int y, int device)
    ev->multi.y = y;
    ev->multi.root.x = x;
    ev->multi.root.y = y;
-   ev->multi.device = device;
+   ev->multi.device = device + device_number_shift;
    ev->window = e_comp->win;
    ev->event_window = ev->window;
    ev->root_window = e_comp->root;
@@ -409,7 +411,7 @@ static void _dispatch_mouse_up_event(int type, int x, int y, int device)
    ev->multi.y = y;
    ev->multi.root.x = x;
    ev->multi.root.y = y;
-   ev->multi.device = device;
+   ev->multi.device = device + device_number_shift;
    ev->window = e_comp->win;
    ev->event_window = ev->window;
    ev->root_window = e_comp->root;
index c830819..855a5d6 100644 (file)
 int _eina_log_dom = 0;
 #define DBG(...)  do EINA_LOG_DOM_DBG(_eina_log_dom, __VA_ARGS__); while(0)
 
+// constant below allows to distinguish the origin of mouse events between one created in this module and the one created by user
+#define MAGIC_DEVICE_NUMBER 2048
+
+
 static Eina_Bool g_gesture_navi;
 static Eina_List *handlers;
 Eldbus_Connection *conn = NULL;
@@ -23,6 +27,8 @@ Eina_Bool is_screen_reader_support;
 int highlighted_object_x, highlighted_object_y;
 Eina_Bool is_selection_mode;
 int object_needs_scroll_from_x, object_needs_scroll_from_y;
+Ecore_Event_Filter *ssp_ef = NULL;
+extern int device_number_shift;
 
 EAPI E_Module_Api e_modapi =
 {
@@ -30,8 +36,15 @@ EAPI E_Module_Api e_modapi =
    "Screen Reader Module of Window Manager"
 };
 
-#define GESTURE_DETECTED_SIGNAL 0
+typedef enum signal_type_ {
+       GESTURE_DETECTED_SIGNAL,
+       MOUSE_DOWN_SIGNAL,
+       MOUSE_UP_SIGNAL
+} signal_type;
+
+
 static Eldbus_Message *_sc_enable(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg);
+static Eldbus_Message *_ssp_enable(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg);
 static Eldbus_Message *_is_slider(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg);
 static Eldbus_Message *_highlighted_object_info(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg);
 static Eldbus_Message *_is_screen_reader_support(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg);
@@ -43,6 +56,9 @@ static const Eldbus_Method methods[] = {
       { "ScreenReaderEnabled", ELDBUS_ARGS({"b", "bool"}), ELDBUS_ARGS({"b", "bool"}),
         _sc_enable
       },
+      { "ScreenSwitchProviderEnabled", ELDBUS_ARGS({"b", "bool"}), NULL,
+        _ssp_enable
+      },
       { "IsSlider", ELDBUS_ARGS({"b", "bool"}), NULL,
         _is_slider
       },
@@ -72,6 +88,8 @@ static const Eldbus_Signal signals[] = {
                                             {"i", "x_end"}, {"i", "y_end"},
                                             {"i", "state"}, {"u", "event_time"}),
                                             0},
+   [MOUSE_DOWN_SIGNAL] = {"MouseDown", ELDBUS_ARGS({"i", "deviceId"}), 0},
+   [MOUSE_UP_SIGNAL] = {"MouseUp", ELDBUS_ARGS({"i", "deviceId"}), 0},
    { }
 };
 
@@ -181,6 +199,7 @@ int _e_mod_atspi_dbus_broadcast(Gesture_Info *gi)
 
    INFO("GestureDetected %s %d (%d %d %d %d %d %u)", _gesture_enum_to_string(gi->type),
         (int)gi->type, gi->x_beg, gi->y_beg, gi->x_end, gi->y_end, gi->state, gi->event_time);
+
    return 0;
 }
 
@@ -287,6 +306,71 @@ _sc_enable(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg)
    return NULL;
 }
 
+static Eina_Bool
+_ssp_filter(void *data, void *loop_data, int type, void *event)
+{
+   if (type == ECORE_EVENT_MOUSE_BUTTON_DOWN || type == ECORE_EVENT_MOUSE_BUTTON_UP)
+      {
+         Ecore_Event_Mouse_Button *ev = event;
+
+         if (ev->multi.device >= MAGIC_DEVICE_NUMBER)
+            {
+               ev->multi.device = ev->multi.device - MAGIC_DEVICE_NUMBER;
+               return EINA_TRUE;
+            }
+
+         if (type == ECORE_EVENT_MOUSE_BUTTON_DOWN)
+            eldbus_service_signal_emit(iface, MOUSE_DOWN_SIGNAL, ev->multi.device);
+         else
+            eldbus_service_signal_emit(iface, MOUSE_UP_SIGNAL, ev->multi.device);
+
+         return EINA_FALSE;
+      }
+
+   if (type == ECORE_EVENT_MOUSE_MOVE)
+      {
+         Ecore_Event_Mouse_Move *ev = event;
+
+         if (ev->multi.device >= MAGIC_DEVICE_NUMBER)
+            {
+               ev->multi.device = ev->multi.device - MAGIC_DEVICE_NUMBER;
+               return EINA_TRUE;
+            }
+         else
+            {
+               return EINA_FALSE;
+            }
+      }
+
+   return EINA_TRUE;
+}
+
+static Eldbus_Message *
+_ssp_enable(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg)
+{
+   Eina_Bool enabled = EINA_FALSE;
+   if (!eldbus_message_arguments_get(msg, "b", &enabled))
+      {
+         ERROR("eldbus_message_arguments_get() error\n");
+         return NULL;
+      }
+
+   if (enabled && !ssp_ef)
+      {
+         ssp_ef = ecore_event_filter_add(NULL, _ssp_filter, NULL, NULL);
+         device_number_shift = MAGIC_DEVICE_NUMBER;
+      }
+   else if (!enabled)
+      {
+         ecore_event_filter_del(ssp_ef);
+         ssp_ef = NULL;
+         device_number_shift = 0;
+      }
+
+   return eldbus_message_method_return_new(msg);
+}
+
+
 static Eldbus_Message *
 _is_slider(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg)
 {
@@ -344,7 +428,7 @@ _dispatch_gesture_event(const Eldbus_Service_Interface *iface, const Eldbus_Mess
    else
      ERROR("eldbus_message_arguments_get() error\n");
 
-   return NULL;
+   return eldbus_message_method_return_new(msg);
 }
 
 static int