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.
This commit is contained in:
Lukasz Stanislawski 2015-09-03 14:07:23 +02:00
parent 59fc5e1643
commit f15796036e
12 changed files with 364 additions and 185 deletions

View File

@ -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 \

View File

@ -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);
cl.bridge = bridge;
eo_do(bridge, root = elm_obj_atspi_bridge_root_get());
to_process = eina_list_append(NULL, root);
eina_hash_foreach(pd->cache, _cache_item_reference_append_cb, &cl);
eldbus_message_iter_container_close(iter, cl.iter);
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);
Eina_List *children;
eo_do(obj, children = elm_interface_atspi_accessible_children_get());
to_process = eina_list_merge(to_process, children);
}
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");
@ -3126,6 +3150,40 @@ _property_changed_signal_send(void *data, Eo *obj EINA_UNUSED, const Eo_Event_De
return EINA_TRUE;
}
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)
{
@ -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;
Eo *bridge = data;
_bridge_object_unregister(bridge, obj);
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);
}
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;
}

View File

@ -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

View File

@ -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;
}

View File

@ -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"

View File

@ -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;
}
}

View File

@ -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, desc) \
eo_do(obj, eo_event_callback_call(ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_ACTIVE_DESCENDANT_CHANGED, desc));
#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_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

View File

@ -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

View File

@ -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

View File

@ -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());
}

View File

@ -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;
}

View File

@ -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);