From 3fd7095f05960e65f57e4e96ac05696639b7fa39 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Tue, 22 May 2012 12:13:18 +0000 Subject: [PATCH] add access module - bare bones, but intercepts all mouse events and handles gestures and passes on commands to the focused app or maybe fakes a tap event on the screen location - depending. things that could be done here: 1. config to select which actions happen as a result of which events/gestures 2. config to determine which zones get this access setup and whihc don't. SVN revision: 71323 --- src/modules/Makefile.am | 4 + src/modules/access/Makefile.am | 29 ++ src/modules/access/e-module-access.edj | Bin 0 -> 12522 bytes src/modules/access/e_mod_config.c | 80 +++++ src/modules/access/e_mod_main.c | 404 +++++++++++++++++++++++++ src/modules/access/e_mod_main.h | 10 + src/modules/access/module.desktop.in | 6 + 7 files changed, 533 insertions(+) create mode 100644 src/modules/access/Makefile.am create mode 100644 src/modules/access/e-module-access.edj create mode 100644 src/modules/access/e_mod_config.c create mode 100644 src/modules/access/e_mod_main.c create mode 100644 src/modules/access/e_mod_main.h create mode 100644 src/modules/access/module.desktop.in diff --git a/src/modules/Makefile.am b/src/modules/Makefile.am index 83bf77018..0701b45b8 100644 --- a/src/modules/Makefile.am +++ b/src/modules/Makefile.am @@ -199,6 +199,10 @@ if USE_MODULE_TILING SUBDIRS += tiling endif +if USE_MODULE_ACCESS +SUBDIRS += access +endif + #if HAVE_WAYLAND_DRM # SUBDIRS += wl_drm #endif diff --git a/src/modules/access/Makefile.am b/src/modules/access/Makefile.am new file mode 100644 index 000000000..e2c08dd3a --- /dev/null +++ b/src/modules/access/Makefile.am @@ -0,0 +1,29 @@ +MAINTAINERCLEANFILES = Makefile.in +MODULE = access + +# data files for the module +filesdir = $(libdir)/enlightenment/modules/$(MODULE) +files_DATA = \ +e-module-$(MODULE).edj module.desktop + +EXTRA_DIST = $(files_DATA) + +# the module .so file +INCLUDES = -I. \ + -I$(top_srcdir) \ + -I$(top_srcdir)/src/modules/$(MODULE) \ + -I$(top_srcdir)/src/bin \ + -I$(top_builddir)/src/bin \ + -I$(top_srcdir)/src/modules \ + @e_cflags@ +pkgdir = $(libdir)/enlightenment/modules/$(MODULE)/$(MODULE_ARCH) +pkg_LTLIBRARIES = module.la +module_la_SOURCES = e_mod_main.c \ + e_mod_main.h \ + e_mod_config.c +module_la_LIBADD = @e_libs@ @dlopen_libs@ +module_la_LDFLAGS = -module -avoid-version +module_la_DEPENDENCIES = $(top_builddir)/config.h + +uninstall: + rm -rf $(DESTDIR)$(libdir)/enlightenment/modules/$(MODULE) diff --git a/src/modules/access/e-module-access.edj b/src/modules/access/e-module-access.edj new file mode 100644 index 0000000000000000000000000000000000000000..75aa3dc0b66368d2cd5a9ae7af26f77a3a033af3 GIT binary patch literal 12522 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 = _create_data; + v->free_cfdata = _free_data; + v->basic.create_widgets = _basic_create; + v->basic.apply_cfdata = _basic_apply; + + con = e_container_current_get(e_manager_current_get()); + cfd = e_config_dialog_new(con, _("Access Settings"), "E", + "_e_mod_access_config_dialog", + "preferences-desktop-access", 0, v, NULL); +} + +/* local function prototypes */ +static void * +_create_data(E_Config_Dialog *cfd __UNUSED__) +{ + E_Config_Dialog_Data *cfdata; + + cfdata = E_NEW(E_Config_Dialog_Data, 1); + _fill_data(cfdata); + return cfdata; +} + +static void +_fill_data(E_Config_Dialog_Data *cfdata) +{ + cfdata->dummy = 1; +} + +static void +_free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) +{ + E_FREE(cfdata); +} + +static Evas_Object * +_basic_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata) +{ + Evas_Object *ol, *of; + + ol = e_widget_list_add(evas, 0, 0); + + of = e_widget_framelist_add(evas, _("General"), 0); + e_widget_list_object_append(ol, of, 1, 0, 0.5); + + return ol; +} + +static int +_basic_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) +{ + e_config_save_queue(); + return 1; +} diff --git a/src/modules/access/e_mod_main.c b/src/modules/access/e_mod_main.c new file mode 100644 index 000000000..5f58d3005 --- /dev/null +++ b/src/modules/access/e_mod_main.c @@ -0,0 +1,404 @@ +#include "e.h" +#include "e_mod_main.h" + +typedef struct +{ + E_Zone *zone; + Ecore_X_Window win; + Ecore_Timer *timer; + int x, y, dx, dy; + unsigned int dt; + Eina_Bool down : 1; +} Cover; + +static Eina_List *covers = NULL; +static Eina_List *handlers = NULL; + +static Ecore_X_Window +_mouse_win_in_get(Cover *cov, int x, int y) +{ + Eina_List *l; + Ecore_X_Window *skip, inwin; + Cover *cov2; + int i; + + skip = alloca(sizeof(Ecore_X_Window) * eina_list_count(covers)); + i = 0; + EINA_LIST_FOREACH(covers, l, cov2) + { + skip[i] = cov2->win; + i++; + } + inwin = ecore_x_window_shadow_tree_at_xy_with_skip_get + (cov->zone->container->manager->root, x, y, skip, i); + return inwin; +} + +static void +_mouse_win_fake_tap(Cover *cov, Ecore_Event_Mouse_Button *ev) +{ + Ecore_X_Window inwin; + int x, y; + + inwin = _mouse_win_in_get(cov, ev->root.x, ev->root.y); + ecore_x_pointer_xy_get(inwin, &x, &y); + ecore_x_mouse_in_send(inwin, x, y); + ecore_x_mouse_move_send(inwin, x, y); + ecore_x_mouse_down_send(inwin, x, y, 1); + ecore_x_mouse_up_send(inwin, x, y, 1); + ecore_x_mouse_out_send(inwin, x, y); +} + +static Eina_Bool +_mouse_longpress(void *data) +{ + Cover *cov = data; + int distance = 40; + int dx, dy; + + cov->timer = NULL; + dx = cov->x - cov->dx; + dy = cov->y - cov->dy; + if (((dx * dx) + (dy * dy)) < (distance * distance)) + { + E_Border *bd = e_border_focused_get(); + + cov->down = EINA_FALSE; + printf("longpress\n"); + if (bd) + ecore_x_e_illume_access_action_read_send(bd->client.win); + } + return EINA_FALSE; +} + +static void +_mouse_down(Cover *cov, Ecore_Event_Mouse_Button *ev) +{ + double longtime = 0.5; + + cov->dx = ev->x; + cov->dy = ev->y; + cov->x = ev->x; + cov->y = ev->y; + cov->dt = ev->timestamp; + cov->down = EINA_TRUE; + cov->timer = ecore_timer_add(longtime, _mouse_longpress, cov); +} + +static void +_mouse_up(Cover *cov, Ecore_Event_Mouse_Button *ev) +{ + double timeout = 0.15; + int distance = 40; + int dx, dy; + E_Border *bd = e_border_focused_get(); + + if (cov->timer) + { + ecore_timer_del(cov->timer); + cov->timer = NULL; + } + if (!cov->down) return; + dx = ev->x - cov->dx; + dy = ev->y - cov->dy; + if (((dx * dx) + (dy * dy)) < (distance * distance)) + { + if ((ev->timestamp - cov->dt) > (timeout * 1000)) + { + printf("tap\n"); + _mouse_win_fake_tap(cov, ev); + } + else if (ev->double_click) + { + printf("double click\n"); + if (bd) + ecore_x_e_illume_access_action_activate_send(bd->client.win); + } + } + else + { + if (abs(dx) > abs(dy)) // left or right + { + if (dx > 0) // right + { + printf("right\n"); + if (bd) + ecore_x_e_illume_access_action_read_next_send(bd->client.win); + } + else // left + { + printf("left\n"); + if (bd) + ecore_x_e_illume_access_action_read_prev_send(bd->client.win); + } + } + else // up or down + { + if (dy > 0) // down + { + printf("down\n"); + if (bd) + ecore_x_e_illume_access_action_next_send(bd->client.win); + } + else // up + { + printf("up\n"); + if (bd) + ecore_x_e_illume_access_action_prev_send(bd->client.win); + } + } + } + cov->down = EINA_FALSE; +} + +static void +_mouse_move(Cover *cov, Ecore_Event_Mouse_Move *ev) +{ + if (!cov->down) return; + cov->x = ev->x; + cov->y = ev->y; +} + +static void +_mouse_wheel(Cover *cov __UNUSED__, Ecore_Event_Mouse_Wheel *ev __UNUSED__) +{ + // XXX: fake wheel? +} + +static Eina_Bool +_cb_mouse_down(void *data __UNUSED__, + int type __UNUSED__, + void *event) +{ + Ecore_Event_Mouse_Button *ev = event; + Eina_List *l; + Cover *cov; + + EINA_LIST_FOREACH(covers, l, cov) + { + if (ev->window == cov->win) + { + if ((ev->buttons == 1) && (ev->multi.device == 0)) + _mouse_down(cov, ev); + return ECORE_CALLBACK_PASS_ON; + } + } + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +_cb_mouse_up(void *data __UNUSED__, + int type __UNUSED__, + void *event) +{ + Ecore_Event_Mouse_Button *ev = event; + Eina_List *l; + Cover *cov; + + EINA_LIST_FOREACH(covers, l, cov) + { + if (ev->window == cov->win) + { + if ((ev->buttons == 1) && (ev->multi.device == 0)) + _mouse_up(cov, ev); + return ECORE_CALLBACK_PASS_ON; + } + } + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +_cb_mouse_move(void *data __UNUSED__, + int type __UNUSED__, + void *event) +{ + Ecore_Event_Mouse_Move *ev = event; + Eina_List *l; + Cover *cov; + + EINA_LIST_FOREACH(covers, l, cov) + { + if (ev->window == cov->win) + { + if (ev->multi.device == 0) + _mouse_move(cov, ev); + return ECORE_CALLBACK_PASS_ON; + } + } + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +_cb_mouse_wheel(void *data __UNUSED__, + int type __UNUSED__, + void *event) +{ + Ecore_Event_Mouse_Wheel *ev = event; + Eina_List *l; + Cover *cov; + + EINA_LIST_FOREACH(covers, l, cov) + { + if (ev->window == cov->win) + { + _mouse_wheel(cov, ev); + return ECORE_CALLBACK_PASS_ON; + } + } + return ECORE_CALLBACK_PASS_ON; +} + +static Cover * +_cover_new(E_Zone *zone) +{ + Cover *cov; + + cov = E_NEW(Cover, 1); + if (!cov) return NULL; + cov->zone = zone; + cov->win = ecore_x_window_input_new(zone->container->manager->root, + zone->container->x + zone->x, + zone->container->y + zone->y, + zone->w, zone->h); + ecore_x_window_ignore_set(cov->win, 1); + ecore_x_window_configure(cov->win, + ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING | + ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE, + 0, 0, 0, 0, 0, + zone->container->layers[8].win, + ECORE_X_WINDOW_STACK_ABOVE); + ecore_x_window_show(cov->win); + return cov; +} + +static void +_covers_init(void) +{ + Eina_List *l, *l2, *l3; + E_Manager *man; + + EINA_LIST_FOREACH(e_manager_list(), l, man) + { + E_Container *con; + + EINA_LIST_FOREACH(man->containers, l2, con) + { + E_Zone *zone; + + EINA_LIST_FOREACH(con->zones, l3, zone) + { + Cover *cov = _cover_new(zone); + if (cov) covers = eina_list_append(covers, cov); + } + } + } +} + +static void +_covers_shutdown(void) +{ + Cover *cov; + + EINA_LIST_FREE(covers, cov) + { + ecore_x_window_ignore_set(cov->win, 0); + ecore_x_window_free(cov->win); + if (cov->timer) + { + ecore_timer_del(cov->timer); + cov->timer = NULL; + } + free(cov); + } +} + +static Eina_Bool +_cb_zone_add(void *data __UNUSED__, + int type __UNUSED__, + void *event __UNUSED__) +{ + _covers_init(); + _covers_shutdown(); + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +_cb_zone_del(void *data __UNUSED__, + int type __UNUSED__, + void *event __UNUSED__) +{ + _covers_init(); + _covers_shutdown(); + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +_cb_zone_move_resize(void *data __UNUSED__, + int type __UNUSED__, + void *event __UNUSED__) +{ + _covers_init(); + _covers_shutdown(); + return ECORE_CALLBACK_PASS_ON; +} + +static void +_events_init(void) +{ + handlers = eina_list_append + (handlers, ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, + _cb_mouse_down, NULL)); + handlers = eina_list_append + (handlers, ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, + _cb_mouse_up, NULL)); + handlers = eina_list_append + (handlers, ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE, + _cb_mouse_move, NULL)); + handlers = eina_list_append + (handlers, ecore_event_handler_add(ECORE_EVENT_MOUSE_WHEEL, + _cb_mouse_wheel, NULL)); + handlers = eina_list_append + (handlers, ecore_event_handler_add(E_EVENT_ZONE_ADD, + _cb_zone_add, NULL)); + handlers = eina_list_append + (handlers, ecore_event_handler_add(E_EVENT_ZONE_DEL, + _cb_zone_del, NULL)); + handlers = eina_list_append + (handlers, ecore_event_handler_add(E_EVENT_ZONE_MOVE_RESIZE, + _cb_zone_move_resize, NULL)); +} + +static void +_events_shutdown(void) +{ + E_FREE_LIST(handlers, ecore_event_handler_del); +} + +/***************************************************************************/ +/* module setup */ +EAPI E_Module_Api e_modapi = +{ + E_MODULE_API_VERSION, "Access" +}; + +EAPI void * +e_modapi_init(E_Module *m) +{ + _events_init(); + _covers_init(); + return m; +} + +EAPI int +e_modapi_shutdown(E_Module *m __UNUSED__) +{ + _covers_shutdown(); + _events_shutdown(); + return 1; +} + +EAPI int +e_modapi_save(E_Module *m __UNUSED__) +{ + return 1; +} diff --git a/src/modules/access/e_mod_main.h b/src/modules/access/e_mod_main.h new file mode 100644 index 000000000..f884cc0aa --- /dev/null +++ b/src/modules/access/e_mod_main.h @@ -0,0 +1,10 @@ +#ifndef E_MOD_MAIN_H +#define E_MOD_MAIN_H + +EAPI extern E_Module_Api e_modapi; + +EAPI void *e_modapi_init(E_Module *m); +EAPI int e_modapi_shutdown(E_Module *m); +EAPI int e_modapi_save(E_Module *m); + +#endif diff --git a/src/modules/access/module.desktop.in b/src/modules/access/module.desktop.in new file mode 100644 index 000000000..fd83f3c00 --- /dev/null +++ b/src/modules/access/module.desktop.in @@ -0,0 +1,6 @@ +[Desktop Entry] +Type=Link +Name=Access +Icon=e-module-access +X-Enlightenment-ModuleType=utils +Comment=Accessibility module designed to improve ease of use for the vision impaired and the blind.