From: Lukasz Wlazly Date: Thu, 31 Aug 2017 13:48:25 +0000 (+0200) Subject: Adding method and signals used by Universal-Switch X-Git-Tag: submit/tizen/20170915.074959^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F05%2F147205%2F4;p=platform%2Fcore%2Fuifw%2Fe-mod-tizen-screen-reader.git Adding method and signals used by Universal-Switch 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 --- diff --git a/src/e_dispatch_gesture_event.c b/src/e_dispatch_gesture_event.c index 7c3f00d..bf924a8 100644 --- a/src/e_dispatch_gesture_event.c +++ b/src/e_dispatch_gesture_event.c @@ -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; diff --git a/src/e_mod_main.c b/src/e_mod_main.c index c830819..855a5d6 100644 --- a/src/e_mod_main.c +++ b/src/e_mod_main.c @@ -14,6 +14,10 @@ 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