aboutsummaryrefslogtreecommitdiffstats
path: root/legacy/elementary
diff options
context:
space:
mode:
authorLukasz Stanislawski <l.stanislaws@samsung.com>2015-09-03 14:07:23 +0200
committerLukasz Stanislawski <l.stanislaws@samsung.com>2015-10-01 16:00:28 +0200
commitf15796036e8f128207b68c045acaa6561d947e1f (patch)
tree3d6b3cb22c9c6475ff75a3bb4f71b410aaa5f27b /legacy/elementary
parentatspi: use eldbus fallback interface (diff)
downloadefl-f15796036e8f128207b68c045acaa6561d947e1f.tar.gz
atspi: add global event emitter
Introduce global event emitter for accessibility events. With such emitter there is no need to register array of callbacks on every accessibility object.
Diffstat (limited to 'legacy/elementary')
-rw-r--r--legacy/elementary/src/lib/Makefile.am1
-rw-r--r--legacy/elementary/src/lib/elm_atspi_bridge.c249
-rw-r--r--legacy/elementary/src/lib/elm_entry.c10
-rw-r--r--legacy/elementary/src/lib/elm_genlist.c21
-rw-r--r--legacy/elementary/src/lib/elm_interface_atspi_accessible.c55
-rw-r--r--legacy/elementary/src/lib/elm_interface_atspi_accessible.eo23
-rw-r--r--legacy/elementary/src/lib/elm_interface_atspi_accessible.h46
-rw-r--r--legacy/elementary/src/lib/elm_interface_atspi_window.h56
-rw-r--r--legacy/elementary/src/lib/elm_interfaces.h3
-rw-r--r--legacy/elementary/src/lib/elm_widget.c38
-rw-r--r--legacy/elementary/src/lib/elm_win.c36
-rw-r--r--legacy/elementary/src/tests/elm_test_genlist.c11
12 files changed, 364 insertions, 185 deletions
diff --git a/legacy/elementary/src/lib/Makefile.am b/legacy/elementary/src/lib/Makefile.am
index 09225879d6..3b61532725 100644
--- a/legacy/elementary/src/lib/Makefile.am
+++ b/legacy/elementary/src/lib/Makefile.am
@@ -39,6 +39,7 @@ elm_atspi_bridge.h \
elm_interface_atspi_accessible.h \
elm_interface_atspi_text.h \
elm_interface_atspi_widget_action.h \
+elm_interface_atspi_window.h \
elm_interface_fileselector.h \
elm_interface_scrollable.h \
elm_interfaces.h \
diff --git a/legacy/elementary/src/lib/elm_atspi_bridge.c b/legacy/elementary/src/lib/elm_atspi_bridge.c
index 5df00851ac..345ab6b9a6 100644
--- a/legacy/elementary/src/lib/elm_atspi_bridge.c
+++ b/legacy/elementary/src/lib/elm_atspi_bridge.c
@@ -93,14 +93,11 @@ typedef struct _Elm_Atspi_Bridge_Data
Eldbus_Service_Interface *text;
Eldbus_Service_Interface *value;
} interfaces;
+ Elm_Atspi_Event_Handler *event_hdlr;
+ Eina_Hash *event_hash;
Eina_Bool connected : 1;
} Elm_Atspi_Bridge_Data;
-struct cache_closure {
- Eo *bridge;
- Eldbus_Message_Iter *iter;
-};
-
static Eo *_instance;
static int _init_count = 0;
@@ -109,6 +106,8 @@ static Eina_Bool _state_changed_signal_send(void *data, Eo *obj, const Eo_Event_
static Eina_Bool _property_changed_signal_send(void *data, Eo *obj, const Eo_Event_Description *desc EINA_UNUSED, void *event_info);
static Eina_Bool _children_changed_signal_send(void *data, Eo *obj, const Eo_Event_Description *desc EINA_UNUSED, void *event_info);
static Eina_Bool _window_signal_send(void *data, Eo *obj, const Eo_Event_Description *desc, void *event_info);
+static Eina_Bool _visible_data_changed_signal_send(void *data, Eo *obj, const Eo_Event_Description *desc, void *event_info);
+static Eina_Bool _active_descendant_changed_signal_send(void *data, Eo *obj, const Eo_Event_Description *desc, void *event_info);
static Eina_Bool _selection_signal_send(void *data, Eo *obj, const Eo_Event_Description *desc, void *event_info);
static Eina_Bool _text_text_inserted_send(void *data, Eo *obj, const Eo_Event_Description *desc, void *event_info);
static Eina_Bool _text_text_removed_send(void *data, Eo *obj, const Eo_Event_Description *desc, void *event_info);
@@ -116,7 +115,6 @@ static Eina_Bool _text_caret_moved_send(void *data, Eo *obj, const Eo_Event_Desc
static Eina_Bool _text_selection_changed_send(void *data, Eo *obj, const Eo_Event_Description *desc, void *event_info EINA_UNUSED);
// bridge private methods
-static void _bridge_cache_build(Eo *bridge, void *obj);
static void _bridge_object_register(Eo *bridge, Eo *obj);
static void _bridge_object_unregister(Eo *bridge, Eo *obj);
static const char * _bridge_path_from_object(Eo *bridge, const Eo *eo);
@@ -127,37 +125,36 @@ static void _bridge_iter_object_reference_append(Eo *bridge, Eldbus_Message_Iter
// utility functions
static void _iter_interfaces_append(Eldbus_Message_Iter *iter, const Eo *obj);
static Eina_Bool _elm_atspi_bridge_key_filter(void *data, void *loop, int type, void *event);
-static void _object_unregister(Eo *obj, void *data);
static void _object_desktop_reference_append(Eldbus_Message_Iter *iter);
+static Eina_Bool _on_object_add(void *data, Eo *obj, const Eo_Event_Description *event EINA_UNUSED, void *event_info EINA_UNUSED);
static Eina_Bool _on_object_del(void *data, Eo *obj, const Eo_Event_Description *event EINA_UNUSED, void *event_info EINA_UNUSED);
-EO_CALLBACKS_ARRAY_DEFINE(_events_cb,
- { EO_EV_DEL, _on_object_del},
- { ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_PROPERTY_CHANGED, _property_changed_signal_send},
- { ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_CHILDREN_CHANGED, _children_changed_signal_send},
- { ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_STATE_CHANGED, _state_changed_signal_send}
-);
+typedef struct {
+ const Eo_Event_Description *desc;
+ const Eo_Event_Cb callback;
+} Elm_Atspi_Bridge_Event_Handler;
-EO_CALLBACKS_ARRAY_DEFINE(_window_cb,
+static const Elm_Atspi_Bridge_Event_Handler event_handlers[] = {
+ { ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_CHILDREN_CHANGED, _children_changed_signal_send},
+ { ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_PROPERTY_CHANGED, _property_changed_signal_send},
+ { ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_STATE_CHANGED, _state_changed_signal_send},
+ { ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_VISIBLE_DATA_CHANGED, _visible_data_changed_signal_send},
+ { ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_ACTIVE_DESCENDANTS_CHANGED, _active_descendant_changed_signal_send},
+ { ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_ADDED, _on_object_add},
+ { ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_REMOVED, _on_object_del},
{ ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_CREATED, _window_signal_send},
{ ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_DESTROYED, _window_signal_send},
{ ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_ACTIVATED, _window_signal_send},
{ ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_DEACTIVATED, _window_signal_send},
{ ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_MAXIMIZED, _window_signal_send},
{ ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_MINIMIZED, _window_signal_send},
- { ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_RESTORED, _window_signal_send}
-);
-
-EO_CALLBACKS_ARRAY_DEFINE(_selection_cb,
- { ELM_INTERFACE_ATSPI_SELECTION_EVENT_SELECTION_CHANGED, _selection_signal_send}
-);
-
-EO_CALLBACKS_ARRAY_DEFINE(_text_cb,
+ { ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_RESTORED, _window_signal_send},
+ { ELM_INTERFACE_ATSPI_SELECTION_EVENT_SELECTION_CHANGED, _selection_signal_send},
{ ELM_INTERFACE_ATSPI_TEXT_EVENT_ACCESS_TEXT_CARET_MOVED, _text_caret_moved_send },
{ ELM_INTERFACE_ATSPI_TEXT_EVENT_ACCESS_TEXT_INSERTED, _text_text_inserted_send },
{ ELM_INTERFACE_ATSPI_TEXT_EVENT_ACCESS_TEXT_REMOVED, _text_text_removed_send },
{ ELM_INTERFACE_ATSPI_TEXT_EVENT_ACCESS_TEXT_SELECTION_CHANGED, _text_selection_changed_send }
-);
+};
enum _Atspi_Object_Child_Event_Type
{
@@ -659,6 +656,18 @@ _elm_atspi_state_hash_build(void)
return ret;
}
+static Eina_Hash*
+_elm_atspi_event_hash_build(void)
+{
+ Eina_Hash *ret = eina_hash_pointer_new(NULL);
+ unsigned int i = 0;
+
+ for (i = 0; i < SIZE(event_handlers); i++)
+ eina_hash_add(ret, &(event_handlers[i].desc), event_handlers[i].callback);
+
+ return ret;
+}
+
static Eldbus_Message *
_accessible_get_state(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg)
{
@@ -2407,17 +2416,15 @@ _iter_interfaces_append(Eldbus_Message_Iter *iter, const Eo *obj)
}
static Eina_Bool
-_cache_item_reference_append_cb(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED, void *data, void *fdata)
+_cache_item_reference_append_cb(Eo *bridge, Eo *data, Eldbus_Message_Iter *iter_array)
{
if (!eo_ref_get(data) || eo_destructed_is(data))
return EINA_TRUE;
- struct cache_closure *cl = fdata;
Eldbus_Message_Iter *iter_struct, *iter_sub_array;
- Eldbus_Message_Iter *iter_array = cl->iter;
Elm_Atspi_State_Set states;
Elm_Atspi_Role role;
- Eo *root = elm_atspi_bridge_root_get(cl->bridge);
+ Eo *root = elm_atspi_bridge_root_get(bridge);
eo_do(data, role = elm_interface_atspi_accessible_role_get());
@@ -2425,10 +2432,10 @@ _cache_item_reference_append_cb(const Eina_Hash *hash EINA_UNUSED, const void *k
EINA_SAFETY_ON_NULL_RETURN_VAL(iter_struct, EINA_TRUE);
/* Marshall object path */
- _bridge_iter_object_reference_append(cl->bridge, iter_struct, data);
+ _bridge_iter_object_reference_append(bridge, iter_struct, data);
/* Marshall application */
- _bridge_iter_object_reference_append(cl->bridge, iter_struct, root);
+ _bridge_iter_object_reference_append(bridge, iter_struct, root);
Eo *parent = NULL;
eo_do(data, parent = elm_interface_atspi_accessible_parent_get());
@@ -2436,7 +2443,7 @@ _cache_item_reference_append_cb(const Eina_Hash *hash EINA_UNUSED, const void *k
if ((!parent) && (ELM_ATSPI_ROLE_APPLICATION == role))
_object_desktop_reference_append(iter_struct);
else
- _bridge_iter_object_reference_append(cl->bridge, iter_struct, parent);
+ _bridge_iter_object_reference_append(bridge, iter_struct, parent);
/* Marshall children */
Eina_List *children_list = NULL, *l;
@@ -2447,7 +2454,7 @@ _cache_item_reference_append_cb(const Eina_Hash *hash EINA_UNUSED, const void *k
EINA_SAFETY_ON_NULL_GOTO(iter_sub_array, fail);
EINA_LIST_FOREACH(children_list, l, child)
- _bridge_iter_object_reference_append(cl->bridge, iter_sub_array, child);
+ _bridge_iter_object_reference_append(bridge, iter_sub_array, child);
eldbus_message_iter_container_close(iter_struct, iter_sub_array);
eina_list_free(children_list);
@@ -2498,9 +2505,10 @@ fail:
static Eldbus_Message *
_cache_get_items(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg)
{
- Eldbus_Message_Iter *iter;
+ Eldbus_Message_Iter *iter, *iter_array;
Eldbus_Message *ret;
- struct cache_closure cl;
+ Eina_List *to_process;
+ Eo *root;
Eo *bridge = eldbus_service_object_data_get(iface, ELM_ATSPI_BRIDGE_CLASS_NAME);
if (!bridge) return NULL;
@@ -2511,13 +2519,25 @@ _cache_get_items(const Eldbus_Service_Interface *iface, const Eldbus_Message *ms
EINA_SAFETY_ON_NULL_RETURN_VAL(ret, NULL);
iter = eldbus_message_iter_get(ret);
- cl.iter = eldbus_message_iter_container_new(iter, 'a', CACHE_ITEM_SIGNATURE);
- EINA_SAFETY_ON_NULL_GOTO(cl.iter, fail);
+ iter_array = eldbus_message_iter_container_new(iter, 'a', CACHE_ITEM_SIGNATURE);
+ EINA_SAFETY_ON_NULL_GOTO(iter_array, fail);
+
+ eo_do(bridge, root = elm_obj_atspi_bridge_root_get());
+ to_process = eina_list_append(NULL, root);
+
+ while (to_process)
+ {
+ Eo *obj = eina_list_data_get(to_process);
+ to_process = eina_list_remove_list(to_process, to_process);
+ _cache_item_reference_append_cb(bridge, obj, iter_array);
+ _bridge_object_register(bridge, obj);
- cl.bridge = bridge;
+ Eina_List *children;
+ eo_do(obj, children = elm_interface_atspi_accessible_children_get());
+ to_process = eina_list_merge(to_process, children);
+ }
- eina_hash_foreach(pd->cache, _cache_item_reference_append_cb, &cl);
- eldbus_message_iter_container_close(iter, cl.iter);
+ eldbus_message_iter_container_close(iter, iter_array);
return ret;
fail:
@@ -2913,7 +2933,7 @@ _elm_atspi_bridge_app_unregister(Eo *bridge)
static void
_cache_register(Eo *obj)
{
- Elm_Atspi_Bridge_Data *pd = eo_data_scope_get(obj, ELM_ATSPI_BRIDGE_CLASS);
+ ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN(obj, pd);
pd->cache_interface = eldbus_service_interface_register(pd->a11y_bus, CACHE_INTERFACE_PATH, &cache_iface_desc);
eldbus_service_object_data_set(pd->cache_interface, ELM_ATSPI_BRIDGE_CLASS_NAME, obj);
}
@@ -2922,7 +2942,7 @@ static void
_set_broadcast_flag(const char *event, Eo *bridge)
{
char **tokens;
- Elm_Atspi_Bridge_Data *pd = eo_data_scope_get(bridge, ELM_ATSPI_BRIDGE_CLASS);
+ ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN(bridge, pd);
tokens = eina_str_split(event, ":", 3);
@@ -2974,6 +2994,10 @@ _set_broadcast_flag(const char *event, Eo *bridge)
STATE_TYPE_SET(pd->object_broadcast_mask, ATSPI_OBJECT_EVENT_TEXT_SELECTION_CHANGED);
else if (!strcmp(tokens[1], "TextAttributesChanged"))
STATE_TYPE_SET(pd->object_broadcast_mask, ATSPI_OBJECT_EVENT_TEXT_ATTRIBUTES_CHANGED);
+ else if (!strcmp(tokens[1], "VisibleDataChanged"))
+ STATE_TYPE_SET(pd->object_broadcast_mask, ATSPI_OBJECT_EVENT_VISIBLE_DATA_CHANGED);
+ else if (!strcmp(tokens[1], "ActiveDescendantsChanged"))
+ STATE_TYPE_SET(pd->object_broadcast_mask, ATSPI_OBJECT_EVENT_ACTIVE_DESCENDANT_CHANGED);
}
else if (!strcmp(tokens[0], "Window"))
{
@@ -3005,7 +3029,7 @@ static void
_registered_listeners_get(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending)
{
const char *event, *bus;
- Elm_Atspi_Bridge_Data *pd = eo_data_scope_get(data, ELM_ATSPI_BRIDGE_CLASS);
+ ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN(data, pd);
pd->pending_requests = eina_list_remove(pd->pending_requests, pending);
DBG("Updating registered ATSPI signals list.");
@@ -3041,7 +3065,7 @@ static void
_registered_events_list_update(Eo *bridge)
{
Eldbus_Message *msg;
- Elm_Atspi_Bridge_Data *pd = eo_data_scope_get(bridge, ELM_ATSPI_BRIDGE_CLASS);
+ ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN(bridge, pd);
Eldbus_Pending *p;
msg = eldbus_message_method_call_new(ATSPI_DBUS_NAME_REGISTRY, ATSPI_DBUS_PATH_REGISTRY, ATSPI_DBUS_INTERFACE_REGISTRY, "GetRegisteredEvents");
@@ -3127,6 +3151,40 @@ _property_changed_signal_send(void *data, Eo *obj EINA_UNUSED, const Eo_Event_De
}
static Eina_Bool
+_visible_data_changed_signal_send(void *data, Eo *obj, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN_VAL(data, pd, EINA_FALSE);
+
+ if (!STATE_TYPE_GET(pd->object_children_broadcast_mask, ATSPI_OBJECT_EVENT_VISIBLE_DATA_CHANGED))
+ return EINA_FALSE;
+
+ _bridge_signal_send(data, obj, ATSPI_DBUS_INTERFACE_EVENT_OBJECT,
+ &_event_obj_signals[ATSPI_OBJECT_EVENT_VISIBLE_DATA_CHANGED], "",
+ 0, 0, NULL, NULL);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_active_descendant_changed_signal_send(void *data, Eo *obj, const Eo_Event_Description *desc EINA_UNUSED, void *event_info)
+{
+ Eo *child = event_info;
+ int idx;
+
+ ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN_VAL(data, pd, EINA_FALSE);
+
+ if (!STATE_TYPE_GET(pd->object_children_broadcast_mask, ATSPI_OBJECT_EVENT_ACTIVE_DESCENDANT_CHANGED))
+ return EINA_FALSE;
+
+ eo_do(child, idx = elm_interface_atspi_accessible_index_in_parent_get());
+
+ _bridge_signal_send(data, obj, ATSPI_DBUS_INTERFACE_EVENT_OBJECT,
+ &_event_obj_signals[ATSPI_OBJECT_EVENT_ACTIVE_DESCENDANT_CHANGED], "",
+ idx, 0, "(so)", eldbus_connection_unique_name_get(pd->a11y_bus), child);
+ return EINA_TRUE;
+}
+
+static Eina_Bool
_children_changed_signal_send(void *data, Eo *obj, const Eo_Event_Description *desc EINA_UNUSED, void *event_info)
{
const char *atspi_desc = NULL;
@@ -3138,10 +3196,6 @@ _children_changed_signal_send(void *data, Eo *obj, const Eo_Event_Description *d
type = ev_data->is_added ? ATSPI_OBJECT_CHILD_ADDED : ATSPI_OBJECT_CHILD_REMOVED;
- // update cached objects
- if (ev_data->is_added)
- _bridge_cache_build(data, ev_data->child);
-
if (!STATE_TYPE_GET(pd->object_children_broadcast_mask, type))
return EINA_FALSE;
@@ -3366,7 +3420,7 @@ _text_selection_changed_send(void *data, Eo *obj, const Eo_Event_Description *de
static void
_event_handlers_register(Eo *bridge)
{
- Elm_Atspi_Bridge_Data *pd = eo_data_scope_get(bridge, ELM_ATSPI_BRIDGE_CLASS);
+ ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN(bridge, pd);
_registered_events_list_update(bridge);
@@ -3384,8 +3438,6 @@ _bridge_object_unregister(Eo *bridge, Eo *obj)
ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN(bridge, pd);
- _object_unregister(obj, bridge);
-
sig = eldbus_service_signal_new(pd->cache_interface, ATSPI_OBJECT_CHILD_REMOVED);
Eldbus_Message_Iter *iter = eldbus_message_iter_get(sig);
_bridge_iter_object_reference_append(bridge, iter, obj);
@@ -3395,36 +3447,20 @@ _bridge_object_unregister(Eo *bridge, Eo *obj)
}
static Eina_Bool
-_on_object_del(void *data, Eo *obj, const Eo_Event_Description *event EINA_UNUSED, void *event_info EINA_UNUSED)
+_on_object_add(void *data, Eo *obj, const Eo_Event_Description *event EINA_UNUSED, void *event_info EINA_UNUSED)
{
Eo *bridge = data;
-
- _bridge_object_unregister(bridge, obj);
+ _bridge_object_register(bridge, obj);
return EINA_TRUE;
}
-static void
-_bridge_cache_build(Eo *bridge, void *obj)
+static Eina_Bool
+_on_object_del(void *data, Eo *obj, const Eo_Event_Description *event EINA_UNUSED, void *event_info EINA_UNUSED)
{
- Eina_List *children;
- Eo *child;
-
- ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN(bridge, pd);
-
- if (!eo_isa(obj, ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN))
- return;
-
- _bridge_object_register(bridge, obj);
-
- eo_do(obj, children = elm_interface_atspi_accessible_children_get());
- EINA_LIST_FREE(children, child)
- _bridge_cache_build(bridge, child);
-}
+ Eo *bridge = data;
+ _bridge_object_unregister(bridge, obj);
-static Eina_Bool _unregister_cb(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED, void *data, void *fdata)
-{
- _object_unregister(data, fdata);
return EINA_TRUE;
}
@@ -3452,17 +3488,14 @@ _interfaces_unregister(Eo *bridge)
static void
_a11y_connection_shutdown(Eo *bridge)
{
- Elm_Atspi_Bridge_Data *pd = eo_data_scope_get(bridge, ELM_ATSPI_BRIDGE_CLASS);
+ ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN(bridge, pd);
Eldbus_Pending *pending;
if (pd->connected)
_elm_atspi_bridge_app_unregister(bridge);
if (pd->cache)
- {
- eina_hash_foreach(pd->cache, _unregister_cb, bridge);
- eina_hash_free(pd->cache);
- }
+ eina_hash_free(pd->cache);
pd->cache = NULL;
if (pd->cache_interface)
@@ -3490,6 +3523,12 @@ _a11y_connection_shutdown(Eo *bridge)
if (pd->state_hash) eina_hash_free(pd->state_hash);
pd->state_hash = NULL;
+ if (pd->event_hash) eina_hash_free(pd->event_hash);
+ pd->event_hash = NULL;
+
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_handler_del(pd->event_hdlr));
+ pd->event_hdlr = NULL;
+
eo_do(bridge, eo_event_callback_call(ELM_ATSPI_BRIDGE_EVENT_DISCONNECTED, NULL));
pd->connected = EINA_FALSE;
}
@@ -3541,11 +3580,19 @@ _interfaces_register(Eo *bridge)
eldbus_service_object_data_set(pd->interfaces.value, ELM_ATSPI_BRIDGE_CLASS_NAME, bridge);
}
+static Eina_Bool
+_bridge_accessible_event_dispatch(void *data, Eo *accessible, const Eo_Event_Description *desc, void *event_info)
+{
+ ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN_VAL(data, pd, EINA_TRUE);
+
+ Eo_Event_Cb cb = eina_hash_find(pd->event_hash, &desc);
+ return cb ? cb(data, accessible, desc, event_info) : EINA_TRUE;
+}
+
static void
_a11y_bus_initialize(Eo *obj, const char *socket_addr)
{
- Elm_Atspi_Bridge_Data *pd = eo_data_scope_get(obj, ELM_ATSPI_BRIDGE_CLASS);
- Eo *root;
+ ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN(obj, pd);
pd->a11y_bus = eldbus_private_address_connection_get(socket_addr);
if (!pd->a11y_bus)
@@ -3556,6 +3603,7 @@ _a11y_bus_initialize(Eo *obj, const char *socket_addr)
// init data structures
pd->cache = eina_hash_pointer_new(NULL);
pd->state_hash = _elm_atspi_state_hash_build();
+ pd->event_hash = _elm_atspi_event_hash_build();
// dbus init
_cache_register(obj);
@@ -3563,16 +3611,15 @@ _a11y_bus_initialize(Eo *obj, const char *socket_addr)
_event_handlers_register(obj);
_elm_atspi_bridge_app_register(obj);
- // buid cache
- eo_do(obj, root = elm_obj_atspi_bridge_root_get());
- _bridge_cache_build(obj, root);
+ // register accesible object event listener
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, pd->event_hdlr = elm_interface_atspi_accessible_event_handler_add(_bridge_accessible_event_dispatch, obj));
}
static void
_a11y_bus_address_get(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending)
{
const char *errname, *errmsg, *sock_addr = NULL;
- Elm_Atspi_Bridge_Data *pd = eo_data_scope_get(data, ELM_ATSPI_BRIDGE_CLASS);
+ ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN(data, pd);
pd->pending_requests = eina_list_remove(pd->pending_requests, pending);
@@ -3593,7 +3640,7 @@ _a11y_bus_address_get(void *data, const Eldbus_Message *msg, Eldbus_Pending *pen
static void _a11y_connection_init(Eo *bridge)
{
- Elm_Atspi_Bridge_Data *pd = eo_data_scope_get(bridge, ELM_ATSPI_BRIDGE_CLASS);
+ ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN(bridge, pd);
Eina_Bool is_connected;
eo_do(bridge, is_connected = elm_obj_atspi_bridge_connected_get());
@@ -3610,7 +3657,7 @@ static void _a11y_connection_init(Eo *bridge)
static void
_screen_reader_enabled_get(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending)
{
- Elm_Atspi_Bridge_Data *pd = eo_data_scope_get(data, ELM_ATSPI_BRIDGE_CLASS);
+ ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN(data, pd);
const char *errname, *errmsg;
Eina_Bool is_enabled;
Eldbus_Message_Iter *variant;
@@ -3641,8 +3688,8 @@ _screen_reader_enabled_get(void *data, const Eldbus_Message *msg, Eldbus_Pending
static void _bridge_object_register(Eo *bridge, Eo *obj)
{
- struct cache_closure cc;
Eldbus_Message *sig;
+ Eldbus_Message_Iter *iter;
ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN(bridge, pd);
@@ -3660,36 +3707,13 @@ static void _bridge_object_register(Eo *bridge, Eo *obj)
eina_hash_add(pd->cache, &obj, obj);
- eo_do(obj, eo_event_callback_array_add(_events_cb(), bridge));
-
- if (eo_isa(obj, ELM_INTERFACE_ATSPI_SELECTION_INTERFACE))
- eo_do(obj, eo_event_callback_array_add(_selection_cb(), bridge));
-
- if (eo_isa(obj, ELM_INTERFACE_ATSPI_TEXT_INTERFACE))
- eo_do(obj, eo_event_callback_array_add(_text_cb(), bridge));
-
- if (eo_isa(obj, ELM_INTERFACE_ATSPI_WINDOW_INTERFACE))
- eo_do(obj, eo_event_callback_array_add(_window_cb(), bridge));
-
sig = eldbus_service_signal_new(pd->cache_interface, ATSPI_OBJECT_CHILD_ADDED);
- cc.iter = eldbus_message_iter_get(sig);
- cc.bridge = bridge;
- _cache_item_reference_append_cb(NULL, NULL, obj, &cc);
+ iter = eldbus_message_iter_get(sig);
+ _cache_item_reference_append_cb(bridge, obj, iter);
eldbus_service_signal_send(pd->cache_interface, sig);
}
-static void _object_unregister(Eo *obj, void *data)
-{
- eo_do(obj, eo_event_callback_array_del(_events_cb(), data));
- if (eo_isa(obj, ELM_INTERFACE_ATSPI_WINDOW_INTERFACE))
- eo_do(obj, eo_event_callback_array_del(_window_cb(), data));
- if (eo_isa(obj, ELM_INTERFACE_ATSPI_SELECTION_INTERFACE))
- eo_do(obj, eo_event_callback_array_del(_selection_cb(), data));
- if (eo_isa(obj, ELM_INTERFACE_ATSPI_TEXT_INTERFACE))
- eo_do(obj, eo_event_callback_array_del(_text_cb(), data));
-}
-
void
_elm_atspi_bridge_init(void)
{
@@ -3853,7 +3877,10 @@ EOLIAN Eo*
_elm_atspi_bridge_root_get(Eo *obj EINA_UNUSED, Elm_Atspi_Bridge_Data *pd)
{
if (!pd->root)
- pd->root = eo_add(ELM_ATSPI_APP_OBJECT_CLASS, NULL);
+ {
+ pd->root = eo_add(ELM_ATSPI_APP_OBJECT_CLASS, NULL);
+ elm_interface_atspi_accessible_added(pd->root);
+ }
return pd->root;
}
diff --git a/legacy/elementary/src/lib/elm_entry.c b/legacy/elementary/src/lib/elm_entry.c
index 6243501eba..3f0ab0f99a 100644
--- a/legacy/elementary/src/lib/elm_entry.c
+++ b/legacy/elementary/src/lib/elm_entry.c
@@ -2019,14 +2019,14 @@ _entry_changed_user_signal_cb(void *data,
atspi_info.content = edje_info->change.insert.content;
atspi_info.pos = edje_info->change.insert.pos;
atspi_info.len = edje_info->change.insert.plain_length;
- eo_do(data, eo_event_callback_call(ELM_INTERFACE_ATSPI_TEXT_EVENT_ACCESS_TEXT_INSERTED, &atspi_info));
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(data, ELM_INTERFACE_ATSPI_TEXT_EVENT_ACCESS_TEXT_INSERTED, &atspi_info));
}
else if (edje_info && !edje_info->insert)
{
atspi_info.content = edje_info->change.del.content;
atspi_info.pos = MIN(edje_info->change.del.start, edje_info->change.del.end);
atspi_info.len = MAX(edje_info->change.del.start, edje_info->change.del.end) - atspi_info.pos;
- eo_do(data, eo_event_callback_call(ELM_INTERFACE_ATSPI_TEXT_EVENT_ACCESS_TEXT_REMOVED, &atspi_info));
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(data, ELM_INTERFACE_ATSPI_TEXT_EVENT_ACCESS_TEXT_REMOVED, &atspi_info));
}
}
}
@@ -2118,7 +2118,7 @@ _entry_selection_changed_signal_cb(void *data,
_selection_store(ELM_SEL_TYPE_PRIMARY, data);
_update_selection_handler(data);
if (_elm_config->atspi_mode)
- eo_do(data, eo_event_callback_call(ELM_INTERFACE_ATSPI_TEXT_EVENT_ACCESS_TEXT_SELECTION_CHANGED, NULL));
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(data, ELM_INTERFACE_ATSPI_TEXT_EVENT_ACCESS_TEXT_SELECTION_CHANGED, NULL));
}
static void
@@ -2215,7 +2215,7 @@ _entry_cursor_changed_signal_cb(void *data,
edje_object_signal_emit(sd->entry_edje, "elm,action,show,cursor", "elm");
_cursor_geometry_recalc(data);
if (_elm_config->atspi_mode)
- eo_do(data, eo_event_callback_call(ELM_INTERFACE_ATSPI_TEXT_EVENT_ACCESS_TEXT_CARET_MOVED, NULL));
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(data, ELM_INTERFACE_ATSPI_TEXT_EVENT_ACCESS_TEXT_CARET_MOVED, NULL));
}
static void
@@ -2227,7 +2227,7 @@ _entry_cursor_changed_manual_signal_cb(void *data,
eo_do(data, eo_event_callback_call
(ELM_ENTRY_EVENT_CURSOR_CHANGED_MANUAL, NULL));
if (_elm_config->atspi_mode)
- eo_do(data, eo_event_callback_call(ELM_INTERFACE_ATSPI_TEXT_EVENT_ACCESS_TEXT_CARET_MOVED, NULL));
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(data, ELM_INTERFACE_ATSPI_TEXT_EVENT_ACCESS_TEXT_CARET_MOVED, NULL));
}
static void
diff --git a/legacy/elementary/src/lib/elm_genlist.c b/legacy/elementary/src/lib/elm_genlist.c
index a0d5cd7b27..d76352f66a 100644
--- a/legacy/elementary/src/lib/elm_genlist.c
+++ b/legacy/elementary/src/lib/elm_genlist.c
@@ -4633,6 +4633,12 @@ _item_queue(Elm_Genlist_Data *sd,
// evas_event_thaw_eval(evas_object_evas_get(sd->obj));
evas_object_geometry_get(sd->obj, NULL, NULL, &w, NULL);
if (w > 0) _requeue_idle_enterer(sd);
+
+ if (_elm_config->atspi_mode)
+ {
+ elm_interface_atspi_accessible_added(EO_OBJ(it));
+ elm_interface_atspi_accessible_children_changed_added_signal_emit(sd->obj, EO_OBJ(it));
+ }
}
/* If the application wants to know the relative item, use
@@ -6117,9 +6123,6 @@ _elm_genlist_item_append(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd, const Elm_Ge
it->item->before = EINA_FALSE;
_item_queue(sd, it, NULL);
- if (_elm_config->atspi_mode)
- elm_interface_atspi_accessible_children_changed_added_signal_emit(sd->obj, EO_OBJ(it));
-
return EO_OBJ(it);
}
@@ -6167,9 +6170,6 @@ _elm_genlist_item_prepend(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd, const Elm_G
it->item->before = EINA_TRUE;
_item_queue(sd, it, NULL);
- if (_elm_config->atspi_mode)
- elm_interface_atspi_accessible_children_changed_added_signal_emit(sd->obj, EO_OBJ(it));
-
return EO_OBJ(it);
}
@@ -6217,9 +6217,6 @@ _elm_genlist_item_insert_after(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd, const
it->item->before = EINA_FALSE;
_item_queue(sd, it, NULL);
- if (_elm_config->atspi_mode)
- elm_interface_atspi_accessible_children_changed_added_signal_emit(sd->obj, EO_OBJ(it));
-
return EO_OBJ(it);
}
@@ -6267,9 +6264,6 @@ _elm_genlist_item_insert_before(Eo *obj, Elm_Genlist_Data *sd, const Elm_Genlist
it->item->before = EINA_TRUE;
_item_queue(sd, it, NULL);
- if (_elm_config->atspi_mode)
- elm_interface_atspi_accessible_children_changed_added_signal_emit(sd->obj, EO_OBJ(it));
-
return EO_OBJ(it);
}
@@ -6373,9 +6367,6 @@ _elm_genlist_item_sorted_insert(Eo *obj, Elm_Genlist_Data *sd, const Elm_Genlist
_item_queue(sd, it, _elm_genlist_item_list_compare);
- if (_elm_config->atspi_mode)
- elm_interface_atspi_accessible_children_changed_added_signal_emit(sd->obj, eo_it);
-
return eo_it;
}
diff --git a/legacy/elementary/src/lib/elm_interface_atspi_accessible.c b/legacy/elementary/src/lib/elm_interface_atspi_accessible.c
index 36e0cc042a..3524008951 100644
--- a/legacy/elementary/src/lib/elm_interface_atspi_accessible.c
+++ b/legacy/elementary/src/lib/elm_interface_atspi_accessible.c
@@ -115,6 +115,13 @@ const char* Atspi_Name[] = {
"last defined"
};
+struct _Elm_Atspi_Event_Handler
+{
+ Eo_Event_Cb cb;
+ void *data;
+};
+
+static Eina_List *global_callbacks;
EOLIAN static int
_elm_interface_atspi_accessible_index_in_parent_get(Eo *obj, void *pd EINA_UNUSED)
@@ -281,4 +288,52 @@ EAPI void elm_atspi_attributes_list_free(Eina_List *list)
}
}
+EOLIAN void
+_elm_interface_atspi_accessible_event_emit(Eo *class EINA_UNUSED, void *pd EINA_UNUSED, Eo *accessible, const Eo_Event_Description *event, void *event_info)
+{
+ Eina_List *l;
+ Elm_Atspi_Event_Handler *hdl;
+
+ if (!accessible || !event || !eo_isa(accessible, ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN))
+ {
+ CRI("Invalid accessibility event emit parameters");
+ return;
+ }
+
+ EINA_LIST_FOREACH(global_callbacks, l, hdl)
+ {
+ if (hdl->cb)
+ hdl->cb(hdl->data, accessible, event, event_info);
+ }
+}
+
+EOLIAN Elm_Atspi_Event_Handler *
+_elm_interface_atspi_accessible_event_handler_add(Eo *class EINA_UNUSED, void *pd EINA_UNUSED, Eo_Event_Cb cb, void *data)
+{
+ Elm_Atspi_Event_Handler *ret = calloc(sizeof(Elm_Atspi_Event_Handler), 1);
+
+ ret->cb = cb;
+ ret->data = data;
+
+ global_callbacks = eina_list_append(global_callbacks, ret);
+
+ return ret;
+}
+
+EOLIAN void
+_elm_interface_atspi_accessible_event_handler_del(Eo *class EINA_UNUSED, void *pd EINA_UNUSED, Elm_Atspi_Event_Handler *handler)
+{
+ Eina_List *l, *l2;
+ Elm_Atspi_Event_Handler *hdl;
+ EINA_LIST_FOREACH_SAFE(global_callbacks, l, l2, hdl)
+ {
+ if (hdl == handler)
+ {
+ global_callbacks = eina_list_remove_list(global_callbacks, l);
+ free(hdl);
+ break;
+ }
+ }
+}
+
#include "elm_interface_atspi_accessible.eo.c"
diff --git a/legacy/elementary/src/lib/elm_interface_atspi_accessible.eo b/legacy/elementary/src/lib/elm_interface_atspi_accessible.eo
index 0110e506b3..3672b02b74 100644
--- a/legacy/elementary/src/lib/elm_interface_atspi_accessible.eo
+++ b/legacy/elementary/src/lib/elm_interface_atspi_accessible.eo
@@ -102,6 +102,27 @@ mixin Elm_Interface_Atspi_Accessible ()
states: Elm_Atspi_State_Set;
}
}
+ event_handler_add @class @protected {
+ [[Register accessibility event listener]]
+ params {
+ @in cb: Eo_Event_Cb; [[callback]]
+ @in data: void*; [[data]]
+ }
+ return: Elm_Atspi_Event_Handler*; [[Event handler]]
+ }
+ event_handler_del @class @protected {
+ [[Deregister accessibility event listener]]
+ params {
+ @in handler: Elm_Atspi_Event_Handler *; [[Event handler]]
+ }
+ }
+ event_emit @class @protected {
+ params {
+ @in accessible: Eo*; [[Accessibility object.]]
+ @in event: const(Eo_Event_Description)*; [[Accessibility event type.]]
+ @in event_info: void*; [[Accessibility event details.]]
+ }
+ }
}
events {
property,changed: const(char)*;
@@ -109,5 +130,7 @@ mixin Elm_Interface_Atspi_Accessible ()
state,changed: Elm_Atspi_Event_State_Changed_Data;
visible,data,changed;
active,descendants,changed;
+ added;
+ removed;
}
}
diff --git a/legacy/elementary/src/lib/elm_interface_atspi_accessible.h b/legacy/elementary/src/lib/elm_interface_atspi_accessible.h
index 7ce9d80bd6..9b147c9782 100644
--- a/legacy/elementary/src/lib/elm_interface_atspi_accessible.h
+++ b/legacy/elementary/src/lib/elm_interface_atspi_accessible.h
@@ -3,6 +3,12 @@
#ifdef EFL_BETA_API_SUPPORT
+
+/**
+ * ATSPI event listener
+ */
+typedef struct _Elm_Atspi_Event_Handler Elm_Atspi_Event_Handler;
+
/**
* ATSPI object state set.
*/
@@ -266,38 +272,38 @@ EAPI void elm_atspi_attributes_list_free(Eina_List *list);
Elm_Atspi_Event_State_Changed_Data evinfo; \
evinfo.type = (tp); \
evinfo.new_value = (nvl); \
- eo_do(obj, eo_event_callback_call(ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_STATE_CHANGED, (void*)&evinfo)); \
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(obj, ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_STATE_CHANGED, (void*)&evinfo)); \
} while(0); }
/**
* Emits ATSPI 'PropertyChanged' dbus signal for 'Name' property.
*/
#define elm_interface_atspi_accessible_name_changed_signal_emit(obj) \
- eo_do(obj, eo_event_callback_call(ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_PROPERTY_CHANGED, "name"));
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(obj, ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_PROPERTY_CHANGED, "name"));
/**
* Emits ATSPI 'PropertyChanged' dbus signal for 'Description' property.
*/
#define elm_interface_atspi_accessible_description_changed_signal_emit(obj) \
- eo_do(obj, eo_event_callback_call(ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_PROPERTY_CHANGED, "description"));
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(obj, ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_PROPERTY_CHANGED, "description"));
/**
* Emits ATSPI 'PropertyChanged' dbus signal for 'Parent' property.
*/
#define elm_interface_atspi_accessible_parent_changed_signal_emit(obj) \
- eo_do(obj, eo_event_callback_call(ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_PROPERTY_CHANGED, "parent"));
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(obj, ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_PROPERTY_CHANGED, "parent"));
/**
* Emits ATSPI 'PropertyChanged' dbus signal for 'Role' property.
*/
#define elm_interface_atspi_accessible_role_changed_signal_emit(obj) \
- eo_do(obj, eo_event_callback_call(ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_PROPERTY_CHANGED, "role"));
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(obj, ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_PROPERTY_CHANGED, "role"));
/**
* Emits ATSPI 'PropertyChanged' dbus signal for 'Value' property.
*/
#define elm_interface_atspi_accessible_value_changed_signal_emit(obj) \
- eo_do(obj, eo_event_callback_call(ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_PROPERTY_CHANGED, "value"));
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(obj, ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_PROPERTY_CHANGED, "value"));
/**
* Emits ATSPI 'ChildrenChanged' dbus signal with added child as argument.
@@ -305,7 +311,7 @@ EAPI void elm_atspi_attributes_list_free(Eina_List *list);
#define elm_interface_atspi_accessible_children_changed_added_signal_emit(obj, child) \
do { \
Elm_Atspi_Event_Children_Changed_Data atspi_data = { EINA_TRUE, child }; \
- eo_do(obj, eo_event_callback_call(ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_CHILDREN_CHANGED, &atspi_data)); \
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(obj, ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_CHILDREN_CHANGED, &atspi_data)); \
} while(0);
/**
@@ -314,14 +320,32 @@ EAPI void elm_atspi_attributes_list_free(Eina_List *list);
#define elm_interface_atspi_accessible_children_changed_del_signal_emit(obj, child) \
do { \
Elm_Atspi_Event_Children_Changed_Data atspi_data = { EINA_FALSE, child }; \
- eo_do(obj, eo_event_callback_call(ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_CHILDREN_CHANGED, &atspi_data)); \
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(obj, ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_CHILDREN_CHANGED, &atspi_data)); \
} while(0);
/**
- * Emits ATSPI 'ActiveDescendantsChanged' dbus signal with deleted child as argument.
+ * Emits ATSPI 'ActiveDescendantsChanged' dbus signal.
+ */
+#define elm_interface_atspi_accessible_active_descendants_changed_signal_emit(obj, child) \
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(obj, ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_ACTIVE_DESCENDANT_CHANGED, child));
+
+/**
+ * Emits ATSPI 'VisibleDataChanged' dbus signal.
+ */
+#define elm_interface_atspi_accessible_visible_data_changed_signal_emit(obj) \
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(obj, ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_VISIBLE_DATA_CHANGED, NULL));
+
+/**
+ * Emits ATSPI 'AddAccessible' dbus signal.
+ */
+#define elm_interface_atspi_accessible_added(obj) \
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(obj, ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_ADDED, NULL));
+
+/**
+ * Emits ATSPI 'RemoveAccessible' dbus signal.
*/
-#define elm_interface_atspi_accessible_active_descendants_changed_signal_emit(obj, desc) \
- eo_do(obj, eo_event_callback_call(ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_ACTIVE_DESCENDANT_CHANGED, desc));
+#define elm_interface_atspi_accessible_removed(obj) \
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(obj, ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_REMOVED, NULL));
#include "elm_interface_atspi_accessible.eo.h"
#endif
diff --git a/legacy/elementary/src/lib/elm_interface_atspi_window.h b/legacy/elementary/src/lib/elm_interface_atspi_window.h
new file mode 100644
index 0000000000..0b148b382c
--- /dev/null
+++ b/legacy/elementary/src/lib/elm_interface_atspi_window.h
@@ -0,0 +1,56 @@
+#ifndef ELM_INTERFACE_ATSPI_WINDOW_H
+#define ELM_INTERFACE_ATSPI_WINDOW_H
+
+#ifdef EFL_BETA_API_SUPPORT
+#ifdef EFL_EO_API_SUPPORT
+
+/**
+ * Emits ATSPI 'Window:Activated' dbus signal.
+ */
+#define elm_interface_atspi_window_activated_signal_emit(obj) \
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(obj, ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_ACTIVATED, NULL));
+
+/**
+ * Emits ATSPI 'Window:Deactivated' dbus signal.
+ */
+#define elm_interface_atspi_window_deactivated_signal_emit(obj) \
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(obj, ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_DEACTIVATED, NULL));
+
+/**
+ * Emits ATSPI 'Window:Created' dbus signal.
+ */
+#define elm_interface_atspi_window_created_signal_emit(obj) \
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(obj, ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_CREATED, NULL));
+
+/**
+ * Emits ATSPI 'Window:Destroyed' dbus signal.
+ */
+#define elm_interface_atspi_window_destroyed_signal_emit(obj) \
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(obj, ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_DESTROYED, NULL));
+
+/**
+ * Emits ATSPI 'Window:Maximized' dbus signal.
+ */
+#define elm_interface_atspi_window_maximized_signal_emit(obj) \
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(obj, ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_MAXIMIZED, NULL));
+
+/**
+ * Emits ATSPI 'Window:Minimized' dbus signal.
+ */
+#define elm_interface_atspi_window_minimized_signal_emit(obj) \
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(obj, ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_MINIMIZED, NULL));
+
+/**
+ * Emits ATSPI 'Window:Restored' dbus signal.
+ */
+#define elm_interface_atspi_window_restored_signal_emit(obj) \
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(obj, ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_RESTORED, NULL));
+
+#include "elm_interface_atspi_window.eo.h"
+#endif
+#ifndef EFL_NOLEGACY_API_SUPPORT
+#include "elm_interface_atspi_window.eo.legacy.h"
+#endif
+
+#endif
+#endif
diff --git a/legacy/elementary/src/lib/elm_interfaces.h b/legacy/elementary/src/lib/elm_interfaces.h
index 61a359ef97..78e262f092 100644
--- a/legacy/elementary/src/lib/elm_interfaces.h
+++ b/legacy/elementary/src/lib/elm_interfaces.h
@@ -1,6 +1,7 @@
#include "elm_interface_atspi_accessible.h"
#include "elm_interface_atspi_text.h"
#include "elm_interface_atspi_widget_action.h"
+#include "elm_interface_atspi_window.h"
#ifdef EFL_EO_API_SUPPORT
#include "elm_interface_scrollable.h"
@@ -11,7 +12,6 @@
#include "elm_interface_atspi_image.eo.h"
#include "elm_interface_atspi_selection.eo.h"
#include "elm_interface_atspi_value.eo.h"
-#include "elm_interface_atspi_window.eo.h"
#endif
#endif
#ifndef EFL_NOLEGACY_API_SUPPORT
@@ -22,6 +22,5 @@
#include "elm_interface_atspi_image.eo.legacy.h"
#include "elm_interface_atspi_selection.eo.legacy.h"
#include "elm_interface_atspi_value.eo.legacy.h"
-#include "elm_interface_atspi_window.eo.legacy.h"
#endif
#endif
diff --git a/legacy/elementary/src/lib/elm_widget.c b/legacy/elementary/src/lib/elm_widget.c
index 5a1f6fa07a..6bc1ccbe3e 100644
--- a/legacy/elementary/src/lib/elm_widget.c
+++ b/legacy/elementary/src/lib/elm_widget.c
@@ -529,15 +529,6 @@ _elm_widget_evas_object_smart_show(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUS
Eina_Iterator *it;
Evas_Object *o;
- if (_elm_config->atspi_mode)
- {
- Eo *parent;
- eo_do(obj, parent = elm_interface_atspi_accessible_parent_get());
- elm_interface_atspi_accessible_children_changed_added_signal_emit(parent, obj);
- if (_elm_widget_onscreen_is(obj))
- elm_interface_atspi_accessible_state_changed_signal_emit(obj, ELM_ATSPI_STATE_SHOWING, EINA_TRUE);
- }
-
it = evas_object_smart_iterator_new(obj);
EINA_ITERATOR_FOREACH(it, o)
{
@@ -545,6 +536,16 @@ _elm_widget_evas_object_smart_show(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUS
evas_object_show(o);
}
eina_iterator_free(it);
+
+ if (_elm_config->atspi_mode)
+ {
+ elm_interface_atspi_accessible_added(obj);
+ Eo *parent;
+ eo_do(obj, parent = elm_interface_atspi_accessible_parent_get());
+ if (parent) elm_interface_atspi_accessible_children_changed_added_signal_emit(parent, obj);
+ if (_elm_widget_onscreen_is(obj))
+ elm_interface_atspi_accessible_state_changed_signal_emit(obj, ELM_ATSPI_STATE_SHOWING, EINA_TRUE);
+ }
}
EOLIAN static void
@@ -562,7 +563,12 @@ _elm_widget_evas_object_smart_hide(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUS
eina_iterator_free(it);
if (_elm_config->atspi_mode)
- elm_interface_atspi_accessible_state_changed_signal_emit(obj, ELM_ATSPI_STATE_SHOWING, EINA_FALSE);
+ {
+ Eo *parent;
+ eo_do(obj, parent = elm_interface_atspi_accessible_parent_get());
+ if (parent) elm_interface_atspi_accessible_children_changed_del_signal_emit(parent, obj);
+ elm_interface_atspi_accessible_state_changed_signal_emit(obj, ELM_ATSPI_STATE_SHOWING, EINA_FALSE);
+ }
}
EOLIAN static void
@@ -1282,8 +1288,6 @@ _elm_widget_sub_object_del(Eo *obj, Elm_Widget_Smart_Data *sd, Evas_Object *sobj
sd->subobjs = eina_list_remove(sd->subobjs, sobj);
- if (_elm_config->atspi_mode)
- elm_interface_atspi_accessible_children_changed_del_signal_emit(obj, sobj);
_callbacks_del(sobj, obj);
return EINA_TRUE;
@@ -4431,7 +4435,9 @@ _elm_widget_item_eo_base_destructor(Eo *eo_item, Elm_Widget_Item_Data *item)
eina_stringshare_del(item->description);
if (_elm_config->atspi_mode)
- elm_interface_atspi_accessible_children_changed_del_signal_emit(item->widget, eo_item);
+ elm_interface_atspi_accessible_children_changed_del_signal_emit(item->widget, eo_item);
+
+ elm_interface_atspi_accessible_removed(eo_item);
EINA_MAGIC_SET(item, EINA_MAGIC_NONE);
@@ -5721,19 +5727,15 @@ _elm_widget_eo_base_constructor(Eo *obj, Elm_Widget_Smart_Data *sd)
sd->on_create = EINA_FALSE;
sd->role = ELM_ATSPI_ROLE_UNKNOWN;
-
return obj;
}
EOLIAN static void
_elm_widget_eo_base_destructor(Eo *obj, Elm_Widget_Smart_Data *sd)
{
- Eo *parent;
if (sd->description) eina_stringshare_del(sd->description);
- eo_do(obj, parent = elm_interface_atspi_accessible_parent_get());
- if (parent && !eo_destructed_is(parent))
- elm_interface_atspi_accessible_children_changed_del_signal_emit(parent, obj);
+ elm_interface_atspi_accessible_removed(obj);
eo_do_super(obj, ELM_WIDGET_CLASS, eo_destructor());
}
diff --git a/legacy/elementary/src/lib/elm_win.c b/legacy/elementary/src/lib/elm_win.c
index d0bfb9a2c0..65388e3f9f 100644
--- a/legacy/elementary/src/lib/elm_win.c
+++ b/legacy/elementary/src/lib/elm_win.c
@@ -1113,7 +1113,7 @@ _elm_win_focus_in(Ecore_Evas *ee)
if (_elm_config->atspi_mode)
{
- eo_do(obj, eo_event_callback_call(ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_ACTIVATED, NULL));
+ elm_interface_atspi_window_activated_signal_emit(obj);
elm_interface_atspi_accessible_state_changed_signal_emit(obj, ELM_ATSPI_STATE_ACTIVE, EINA_TRUE);
}
@@ -1151,7 +1151,7 @@ _elm_win_focus_out(Ecore_Evas *ee)
if (_elm_config->atspi_mode)
{
- eo_do(obj, eo_event_callback_call(ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_DEACTIVATED, NULL));
+ elm_interface_atspi_window_deactivated_signal_emit(obj);
elm_interface_atspi_accessible_state_changed_signal_emit(obj, ELM_ATSPI_STATE_ACTIVE, EINA_FALSE);
}
@@ -1358,15 +1358,13 @@ _elm_win_state_change(Ecore_Evas *ee)
{
eo_do(obj, eo_event_callback_call(ELM_WIN_EVENT_ICONIFIED, NULL));
if (_elm_config->atspi_mode)
- eo_do(obj, eo_event_callback_call
- (ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_MINIMIZED, NULL));
+ elm_interface_atspi_window_minimized_signal_emit(obj);
}
else
{
eo_do(obj, eo_event_callback_call(ELM_WIN_EVENT_NORMAL, NULL));
if (_elm_config->atspi_mode)
- eo_do(obj, eo_event_callback_call
- (ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_RESTORED, NULL));
+ elm_interface_atspi_window_restored_signal_emit(obj);
}
}
if (ch_sticky)
@@ -1404,15 +1402,13 @@ _elm_win_state_change(Ecore_Evas *ee)
{
eo_do(obj, eo_event_callback_call(ELM_WIN_EVENT_MAXIMIZED, NULL));
if (_elm_config->atspi_mode)
- eo_do(obj, eo_event_callback_call
- (ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_MAXIMIZED, NULL));
+ elm_interface_atspi_window_maximized_signal_emit(obj);
}
else
{
eo_do(obj, eo_event_callback_call(ELM_WIN_EVENT_UNMAXIMIZED, NULL));
if (_elm_config->atspi_mode)
- eo_do(obj, eo_event_callback_call
- (ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_RESTORED, NULL));
+ elm_interface_atspi_window_restored_signal_emit(obj);
}
}
if (ch_profile)
@@ -1620,7 +1616,7 @@ _elm_win_evas_object_smart_hide(Eo *obj, Elm_Win_Data *sd)
#endif
}
if (_elm_config->atspi_mode)
- eo_do(obj, eo_event_callback_call(ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_DESTROYED, NULL));
+ elm_interface_atspi_window_deactivated_signal_emit(obj);
if (_elm_win_policy_quit_triggered(obj))
_elm_win_flush_cache_and_exit(obj);
@@ -1894,6 +1890,9 @@ _elm_win_evas_object_smart_del(Eo *obj, Elm_Win_Data *sd)
if (sd->autodel_clear) *(sd->autodel_clear) = -1;
+ if (_elm_config->atspi_mode)
+ elm_interface_atspi_window_destroyed_signal_emit(obj);
+
_elm_win_list = eina_list_remove(_elm_win_list, obj);
_elm_win_count--;
_elm_win_state_eval_queue();
@@ -1958,9 +1957,6 @@ _elm_win_evas_object_smart_del(Eo *obj, Elm_Win_Data *sd)
{
_elm_win_flush_cache_and_exit(obj);
}
-
- if (_elm_config->atspi_mode)
- eo_do(obj, eo_event_callback_call(ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_DESTROYED, NULL));
}
static void
@@ -2079,7 +2075,7 @@ _elm_win_delete_request(Ecore_Evas *ee)
evas_object_hide(obj);
// FIXME: if above callback deletes - then the below will be invalid
if (_elm_config->atspi_mode)
- eo_do(obj, eo_event_callback_call(ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_DESTROYED, NULL));
+ elm_interface_atspi_window_destroyed_signal_emit(obj);
if (autodel) evas_object_del(obj);
else sd->autodel_clear = NULL;
evas_object_unref(obj);
@@ -3869,7 +3865,7 @@ _elm_win_finalize_internal(Eo *obj, Elm_Win_Data *sd, const char *name, Elm_Win_
eo_do(obj, elm_interface_atspi_accessible_role_set(ELM_ATSPI_ROLE_WINDOW));
if (_elm_config->atspi_mode == ELM_ATSPI_MODE_ON)
- eo_do(obj, eo_event_callback_call(ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_CREATED, NULL));
+ elm_interface_atspi_window_created_signal_emit(obj);
evas_object_show(sd->edje);
@@ -5553,11 +5549,13 @@ _on_atspi_bus_connected(void *data EINA_UNUSED, Eo *obj EINA_UNUSED, const Eo_Ev
* recieve all org.a11y.window events and could keep track of active
* windows whithin system.
*/
- eo_do(win, eo_event_callback_call(ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_CREATED, NULL));
+ elm_interface_atspi_window_created_signal_emit(win);
if (elm_win_focus_get(win))
- eo_do(win, eo_event_callback_call(ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_ACTIVATED, NULL));
+ {
+ elm_interface_atspi_window_activated_signal_emit(win);
+ }
else
- eo_do(win, eo_event_callback_call(ELM_INTERFACE_ATSPI_WINDOW_EVENT_WINDOW_DEACTIVATED, NULL));
+ elm_interface_atspi_window_deactivated_signal_emit(win);
}
return EINA_TRUE;
}
diff --git a/legacy/elementary/src/tests/elm_test_genlist.c b/legacy/elementary/src/tests/elm_test_genlist.c
index ade75c8801..1dc64a256c 100644
--- a/legacy/elementary/src/tests/elm_test_genlist.c
+++ b/legacy/elementary/src/tests/elm_test_genlist.c
@@ -80,8 +80,11 @@ END_TEST
static Eina_Bool
_children_changed_cb(void *data EINA_UNUSED, Eo *obj EINA_UNUSED,
- const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
+ const Eo_Event_Description *desc, void *event_info EINA_UNUSED)
{
+ if (desc != ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_CHILDREN_CHANGED)
+ return EINA_TRUE;
+
ev_data = *(Elm_Atspi_Event_Children_Changed_Data*)event_info;
current = obj;
counter++;
@@ -98,7 +101,7 @@ START_TEST(elm_atspi_children_events_add)
Elm_Object_Item *it[3];
- eo_do(genlist, eo_event_callback_add(ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_CHILDREN_CHANGED, _children_changed_cb, NULL));
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_handler_add(_children_changed_cb, NULL));
it[0] = elm_genlist_item_append(genlist, &itc, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
ck_assert(genlist == current);
@@ -135,7 +138,7 @@ START_TEST(elm_atspi_children_events_del1)
it[1] = elm_genlist_item_prepend(genlist, &itc, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
it[2] = elm_genlist_item_append(genlist, &itc, NULL, NULL, ELM_GENLIST_ITEM_TREE, NULL, NULL);
- eo_do(genlist, eo_event_callback_add(ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_CHILDREN_CHANGED, _children_changed_cb, NULL));
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_handler_add(_children_changed_cb, NULL));
elm_object_item_del(it[0]);
ck_assert(genlist == current);
@@ -163,7 +166,7 @@ START_TEST(elm_atspi_children_events_del2)
it = elm_genlist_item_append(genlist, &itc, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
- eo_do(genlist, eo_event_callback_add(ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_CHILDREN_CHANGED, _children_changed_cb, NULL));
+ eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_handler_add(_children_changed_cb, NULL));
elm_genlist_clear(genlist);
ck_assert(genlist == current);