};
-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);
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
{ "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
+ },
{ }
};
[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},
{ }
};
}
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");
}
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))
}
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))
}
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))
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)
{
#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
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)
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()
{
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)
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;
+}