raster pushed a commit to branch master. http://git.enlightenment.org/core/elementary.git/commit/?id=824a9d52c636b7f4887de5eea3065f6903282288
commit 824a9d52c636b7f4887de5eea3065f6903282288 Author: Lukasz Stanislawski <[email protected]> Date: Mon Jun 16 15:16:39 2014 +0900 atspi: notify registry daemon about keyboard events. Test Plan: elemeentary_test with Orca Screen reader 3.10.1 Reviewers: raster, z.kosinski Reviewed By: raster Differential Revision: https://phab.enlightenment.org/D1025 --- src/lib/elm_atspi_bridge.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/lib/elm_priv.h | 1 + src/lib/elm_widget.c | 3 +++ 3 files changed, 48 insertions(+) diff --git a/src/lib/elm_atspi_bridge.c b/src/lib/elm_atspi_bridge.c index 83f7415..3ddacf3 100644 --- a/src/lib/elm_atspi_bridge.c +++ b/src/lib/elm_atspi_bridge.c @@ -3305,3 +3305,47 @@ _elm_atspi_bridge_shutdown(void) _root = NULL; } } + +static void +_iter_marshall_key_event(Eldbus_Message_Iter *iter, Evas_Callback_Type type, void *event) +{ + Eldbus_Message_Iter *struct_iter; + + EINA_SAFETY_ON_NULL_RETURN(event); + + struct_iter = eldbus_message_iter_container_new(iter, 'r', NULL); + + if (type == EVAS_CALLBACK_KEY_DOWN) + { + Evas_Event_Key_Down *kde = event; + const char *str = kde->string ? kde->string : ""; + int is_text = kde->string ? 1 : 0; + eldbus_message_iter_arguments_append(struct_iter, "uiiiisb", ATSPI_KEY_PRESSED_EVENT, 0, kde->keycode, 0, kde->timestamp, str, is_text); + } + else if (type == EVAS_CALLBACK_KEY_UP) + { + Evas_Event_Key_Up *kue = event; + const char *str = kue->string ? kue->string : ""; + int is_text = kue->string ? 1 : 0; + eldbus_message_iter_arguments_append(struct_iter, "uiiiisb", ATSPI_KEY_RELEASED_EVENT, 0, kue->keycode, 0, kue->timestamp, str, is_text); + } + + eldbus_message_iter_container_close(iter, struct_iter); +} + +EAPI void +_elm_atspi_bridge_key_event_notify(Evas_Callback_Type type, void *event) +{ + Eldbus_Message *msg; + Eldbus_Message_Iter *iter; + + if (!_init_count) return; + if ((type != EVAS_CALLBACK_KEY_DOWN) && (type != EVAS_CALLBACK_KEY_UP)) return; + + msg = eldbus_message_method_call_new(ATSPI_DBUS_NAME_REGISTRY, ATSPI_DBUS_PATH_DEC, + ATSPI_DBUS_INTERFACE_DEC, "NotifyListenersSync"); + iter = eldbus_message_iter_get(msg); + _iter_marshall_key_event(iter, type, event); + + eldbus_connection_send(_a11y_bus, msg, NULL, NULL, -1); +} diff --git a/src/lib/elm_priv.h b/src/lib/elm_priv.h index c9994df..d76843d 100644 --- a/src/lib/elm_priv.h +++ b/src/lib/elm_priv.h @@ -348,6 +348,7 @@ Eo *_elm_atspi_root_get(void); void _elm_atspi_bridge_init(void); void _elm_atspi_bridge_shutdown(void); +void _elm_atspi_bridge_key_event_notify(Evas_Callback_Type type, void *event); void _elm_prefs_init(void); void _elm_prefs_shutdown(void); diff --git a/src/lib/elm_widget.c b/src/lib/elm_widget.c index 0263c25..6d24f0a 100644 --- a/src/lib/elm_widget.c +++ b/src/lib/elm_widget.c @@ -615,6 +615,9 @@ _propagate_event(void *data, default: break; } + if (_elm_config->atspi_mode) + _elm_atspi_bridge_key_event_notify(type, event_info); + elm_widget_event_propagate(obj, type, event_info, event_flags); } --
