Add filtering of events when US menu is shown 89/184089/4 accepted/tizen/unified/20180803.172630 submit/tizen/20180802.025248 submit/tizen/20180802.030818 submit/tizen/20180803.032352 submit/tizen/20180803.043714
authorLukasz Wlazly <l.wlazly@partner.samsung.com>
Fri, 13 Jul 2018 11:13:24 +0000 (13:13 +0200)
committerLukasz Wlazly <l.wlazly@partner.samsung.com>
Wed, 25 Jul 2018 09:28:42 +0000 (11:28 +0200)
Universal Switch needs information about mouse events
when its contextual menu is shown. Because it does not
receive any events directly e-mod sends them through DBus.

This patch also renames some functions.

Change-Id: I081043f10b3fa8c24d9a1dbb06a721013ae69f51

src/e_dispatch_gesture_event.c
src/e_mod_main.c
src/e_mod_main.h
src/e_mod_utils.h
src/e_universal_switch.c
src/e_universal_switch.h

index bba09969708eb7efb8791d9ea23406381092fcc5..e685d1f98378eeb821b28a6bcd9ec689a18d112e 100644 (file)
@@ -3,7 +3,6 @@
 #include "e_dispatch_gesture_event.h"
 #include "e_mod_utils.h"
 
-#define ERROR_BUFFER_SIZE 1024
 #define STEP_DURATION 0.01
 
 int device_number_shift;
index 1c62170143eb0fee54587af9b4a83c4aa68dbba9..11de28461816f4484b4d71aa51df9e6d56e549e0 100644 (file)
@@ -35,10 +35,10 @@ EAPI E_Module_Api e_modapi =
 };
 
 
-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 *_asp_enable(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg);
-static Eldbus_Message *_bbi_enable(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg);
+static Eldbus_Message *_screen_reader_enabled(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg);
+static Eldbus_Message *_screen_switch_provider_enabled(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg);
+static Eldbus_Message *_accessories_switch_provider_enabled(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg);
+static Eldbus_Message *_back_button_interception_enabled(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);
@@ -48,19 +48,20 @@ static Eldbus_Message *_dispatch_drag_event(const Eldbus_Service_Interface *ifac
 static Eldbus_Message *_dispatch_pinch_event(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg);
 static Eldbus_Message *_dispatch_rotation_event(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg);
 static Eldbus_Message *_dispatch_key_event(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg);
+static Eldbus_Message *_menu_is_shown(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg);
 
 static const Eldbus_Method methods[] = {
       { "ScreenReaderEnabled", ELDBUS_ARGS({"b", "bool"}), ELDBUS_ARGS({"b", "bool"}),
-        _sc_enable
+        _screen_reader_enabled
       },
       { "ScreenSwitchProviderEnabled", ELDBUS_ARGS({"b", "bool"}), NULL,
-        _ssp_enable
+        _screen_switch_provider_enabled
       },
       { "AccessoriesSwitchProviderEnabled", ELDBUS_ARGS({"b", "bool"}), NULL,
-        _asp_enable
+        _accessories_switch_provider_enabled
       },
       { "BackButtonInterceptionEnabled", ELDBUS_ARGS({"b", "bool"}), NULL,
-        _bbi_enable
+        _back_button_interception_enabled
       },
       { "IsSlider", ELDBUS_ARGS({"b", "bool"}), NULL,
         _is_slider
@@ -89,6 +90,9 @@ static const Eldbus_Method methods[] = {
       { "DispatchKeyEvent", ELDBUS_ARGS({"s", "string"}, {"i", "int"}, {"d", "double"}), NULL,
         _dispatch_key_event
       },
+      { "MenuIsShown", ELDBUS_ARGS({"b", "bool"}, {"i", "int"}, {"i", "int"}, {"i", "int"}, {"i", "int"}), NULL,
+        _menu_is_shown
+      },
       { }
 };
 
@@ -106,6 +110,8 @@ static const Eldbus_Signal signals[] = {
    [KEY_UP_SIGNAL] = {"KeyUp", ELDBUS_ARGS({"s", "keyId"}), 0},
    [BACK_BUTTON_DOWN_SIGNAL] = {"BackButtonDown", 0, 0},
    [BACK_BUTTON_UP_SIGNAL] = {"BackButtonUp", 0, 0},
+   [MENU_MOUSE_DOWN_SIGNAL] = {"MenuMouseDown", ELDBUS_ARGS({"i", "x"}, {"i", "y"}), 0},
+   [MENU_MOUSE_UP_SIGNAL] = {"MenuMouseUp", ELDBUS_ARGS({"i", "x"}, {"i", "y"}), 0},
    { }
 };
 
@@ -302,10 +308,10 @@ _e_mod_submodules_shutdown(void)
 }
 
 static Eldbus_Message *
-_sc_enable(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg)
+_screen_reader_enabled(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg)
 {
    INFO("iface=%p.", iface);
-   INFO("_sc_enable Method called");
+   INFO("_screen_reader_enabled Method called");
    Eina_Bool bool_val = EINA_FALSE;
    if (!eldbus_message_arguments_get(msg, "b", &bool_val))
      ERROR("eldbus_message_arguments_get() error\n");
@@ -323,7 +329,7 @@ _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)
+_screen_switch_provider_enabled(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg)
 {
    Eina_Bool enabled = EINA_FALSE;
    if (!eldbus_message_arguments_get(msg, "b", &enabled))
@@ -341,7 +347,7 @@ _ssp_enable(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg)
 }
 
 static Eldbus_Message *
-_asp_enable(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg)
+_accessories_switch_provider_enabled(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg)
 {
    Eina_Bool enabled = EINA_FALSE;
    if (!eldbus_message_arguments_get(msg, "b", &enabled))
@@ -359,7 +365,7 @@ _asp_enable(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg)
 }
 
 static Eldbus_Message *
-_bbi_enable(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg)
+_back_button_interception_enabled(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg)
 {
    Eina_Bool enabled = EINA_FALSE;
    if (!eldbus_message_arguments_get(msg, "b", &enabled))
@@ -474,6 +480,27 @@ _dispatch_key_event(const Eldbus_Service_Interface *iface, const Eldbus_Message
    return eldbus_message_method_return_new(msg);
 }
 
+static Eldbus_Message *
+_menu_is_shown(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg)
+{
+   Eina_Bool enabled = EINA_FALSE;
+   int x, y, w, h;
+   if (eldbus_message_arguments_get(msg, "biiii", &enabled, &x, &y, &w, &h))
+     {
+        if (enabled && !_is_screen_switch_provider_enabledd())
+          {
+            Rectangle r = {.x_tl = x, .y_tl = y, .x_br = x + w, .y_br = y + h};
+            return _context_menu_submodule_init(r, conn, msg);
+          }
+
+        _context_menu_submodule_shutdown();
+     }
+   else
+     ERROR("eldbus_message_arguments_get() error\n");
+
+   return eldbus_message_method_return_new(msg);
+}
+
 static int
 _fetch_a11y_bus_address(void)
 {
index 027db6cddb59deab50f7e2495db7430e4164828d..057a108dc12e2223d4bef7db22946026dae609b1 100644 (file)
@@ -17,7 +17,9 @@ typedef enum signal_type_ {
        KEY_DOWN_SIGNAL,
        KEY_UP_SIGNAL,
        BACK_BUTTON_DOWN_SIGNAL,
-       BACK_BUTTON_UP_SIGNAL
+       BACK_BUTTON_UP_SIGNAL,
+       MENU_MOUSE_DOWN_SIGNAL,
+       MENU_MOUSE_UP_SIGNAL
 } signal_type;
 
 #endif//__E_MOD_MAIN_H__
index 26b5f593ac660e911b36b68fc6fa5d527b12ce43..709dcdb76c05fbe088b9f70029463396f244492a 100644 (file)
@@ -3,6 +3,8 @@
 
 #include "e.h"
 
+#define ERROR_BUFFER_SIZE 1024
+
 int _get_window_angle(void);
 void _transform_coordinates(int *ax, int *ay);
 Ecore_Device * _get_device();
index 00cd2a9332deb5d7228bdeaac6d62e921297bd95..a93c415538846c1875854062a6419bdf7e9767a4 100644 (file)
@@ -1,5 +1,7 @@
 #include "e_universal_switch.h"
 #include "e_mod_main.h"
+#include "e_screen_reader_private.h"
+#include "e_mod_utils.h"
 
 // constant below allows to distinguish the origin of mouse events between one created in this module and the one created by user
 #define DEVICE_NUMBER_OFFSET 2048
@@ -10,10 +12,13 @@ extern int device_number_shift;
 static Ecore_Event_Filter *screen_switch_provider_filter = NULL;
 static Ecore_Event_Filter *accessories_switch_provider_filter = NULL;
 static Ecore_Event_Filter *back_button_filter = NULL;
+static Ecore_Event_Filter *context_menu_filter = NULL;
 
 static const char* uncaught_keys[] = {"XF86Back", "XF86Menu", "XF86AudioRaiseVolume", "XF86AudioLowerVolume"};
 static const char* back_button_code = "XF86Back";
 
+static Rectangle context_menu_rectangle;
+
 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)
@@ -98,6 +103,36 @@ static Eina_Bool _bbi_filter(void *data, void *loop_data, int type, void *event)
 
    return EINA_FALSE;
 }
+static Eina_Bool _cm_filter(void *data, void *loop_data, int type, void *event)
+{
+   if (type != ECORE_EVENT_MOUSE_BUTTON_DOWN && type != ECORE_EVENT_MOUSE_BUTTON_UP)
+     return EINA_TRUE;
+
+   Ecore_Event_Mouse_Button *ev = event;
+   if (ev->multi.device >= DEVICE_NUMBER_OFFSET)
+      {
+         ev->multi.device = ev->multi.device - DEVICE_NUMBER_OFFSET;
+         return EINA_TRUE;
+      }
+
+   if (type == ECORE_EVENT_MOUSE_BUTTON_DOWN
+           && ev->root.x >= context_menu_rectangle.x_tl
+           && ev->root.x <= context_menu_rectangle.x_br
+           && ev->root.y >= context_menu_rectangle.y_tl
+           && ev->root.y <= context_menu_rectangle.y_br)
+     {
+       eldbus_service_signal_emit(iface, MENU_MOUSE_DOWN_SIGNAL, ev->root.x, ev->root.y);
+       return EINA_FALSE;
+     }
+
+   if (type == ECORE_EVENT_MOUSE_BUTTON_UP)
+     {
+       eldbus_service_signal_emit(iface, MENU_MOUSE_UP_SIGNAL, ev->root.x, ev->root.y);
+       return EINA_TRUE;
+     }
+
+   return EINA_TRUE;
+}
 
 void _ssp_submodule_init()
 {
@@ -118,6 +153,11 @@ void _ssp_submodule_shutdown()
    device_number_shift = 0;
 }
 
+Eina_Bool _is_screen_switch_provider_enabledd()
+{
+   return screen_switch_provider_filter ? EINA_TRUE : EINA_FALSE;
+}
+
 void _asp_submodule_init()
 {
    if (accessories_switch_provider_filter)
@@ -151,3 +191,50 @@ void _bbi_submodule_shutdown()
    ecore_event_filter_del(back_button_filter);
    back_button_filter = NULL;
 }
+
+Eldbus_Message* _context_menu_submodule_init(Rectangle r, Eldbus_Connection *conn, const Eldbus_Message *msg)
+{
+   if (context_menu_filter)
+     _context_menu_submodule_shutdown();
+
+   E_Zone *zone = e_zone_current_get();
+   if (!zone)
+     return eldbus_message_error_new(msg, "org.freedesktop.DBus.Error.Failed", "Fail to find zone.");
+
+   _transform_coordinates(&r.x_tl, &r.y_tl);
+   _transform_coordinates(&r.x_br, &r.y_br);
+
+   if (r.x_tl < r.x_br)
+     {
+       context_menu_rectangle.x_tl = r.x_tl;
+       context_menu_rectangle.x_br = r.x_br;
+     }
+   else
+     {
+       context_menu_rectangle.x_tl = r.x_br;
+       context_menu_rectangle.x_br = r.x_tl;
+     }
+
+   if (r.y_tl < r.y_br)
+     {
+       context_menu_rectangle.y_tl = r.y_tl;
+       context_menu_rectangle.y_br = r.y_br;
+       }
+   else
+     {
+       context_menu_rectangle.y_tl = r.y_br;
+       context_menu_rectangle.y_br = r.y_tl;
+     }
+
+   context_menu_filter = ecore_event_filter_add(NULL, _cm_filter, NULL, NULL);
+   return eldbus_message_method_return_new(msg);
+}
+
+void _context_menu_submodule_shutdown()
+{
+   if (!context_menu_filter)
+     return;
+
+   ecore_event_filter_del(context_menu_filter);
+   context_menu_filter = NULL;
+}
index 1ff359feda0d20b59206bbd7693caabdb317fd20..d985e8b3c6ab9ec188679c51820dde50ef6bdf2b 100644 (file)
@@ -1,8 +1,18 @@
 #ifndef E_UNIVERSAL_SWITCH_H_
 #define E_UNIVERSAL_SWITCH_H_
 
+#include "e_mod_utils.h"
+
+typedef struct _Rectangle {
+    int x_tl; //top left
+    int y_tl; //top left
+    int x_br; //bottom right
+    int y_br; //bottom right
+} Rectangle;
+
 void _ssp_submodule_init();
 void _ssp_submodule_shutdown();
+Eina_Bool _is_screen_switch_provider_enabledd();
 
 void _asp_submodule_init();
 void _asp_submodule_shutdown();
@@ -10,4 +20,7 @@ void _asp_submodule_shutdown();
 void _bbi_submodule_init();
 void _bbi_submodule_shutdown();
 
+Eldbus_Message* _context_menu_submodule_init(Rectangle r, Eldbus_Connection *conn, const Eldbus_Message *msg);
+void _context_menu_submodule_shutdown();
+
 #endif