kimcinoo pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=45aeaa67503f8d0abd509df8f9e5154f882c671e
commit 45aeaa67503f8d0abd509df8f9e5154f882c671e Author: Shinwoo Kim <cinoo....@samsung.com> Date: Fri Jun 4 20:20:00 2021 +0900 atspi: add atspi bridge ready event Summary: calling elm_init does not guarantee of readiness of atspi bridge even though elm_init is calling _elm_atspi_bridge_init. widget or user could want to know when the atspi bridge is ready. Reviewers: Hermet, jsuya, herb Reviewed By: Hermet Subscribers: cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D12283 --- src/lib/elementary/elm_atspi_bridge.c | 22 +++++++++++++++++++++- src/lib/elementary/elm_general.h | 28 ++++++++++++++++++++++++++++ src/lib/elementary/elm_main.c | 1 + 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/lib/elementary/elm_atspi_bridge.c b/src/lib/elementary/elm_atspi_bridge.c index 868a72ccf2..6d68384f04 100644 --- a/src/lib/elementary/elm_atspi_bridge.c +++ b/src/lib/elementary/elm_atspi_bridge.c @@ -118,6 +118,8 @@ struct collection_match_rule { static Eo *_instance; static int _init_count = 0; +EAPI int ELM_EVENT_ATSPI_BRIDGE_STATE_CHANGED = -1; + // Object Event handlers static void _state_changed_signal_send(void *data, const Efl_Event *event); static void _bounds_changed_signal_send(void *data, const Efl_Event *event); @@ -4305,6 +4307,7 @@ end: static void _registered_listeners_get(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending) { + Elm_Event_Atspi_Bridge_State_Changed *e; const char *event, *bus; ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN(data, pd); pd->pending_requests = eina_list_remove(pd->pending_requests, pending); @@ -4335,7 +4338,16 @@ _registered_listeners_get(void *data, const Eldbus_Message *msg, Eldbus_Pending } if (!pd->connected) - efl_event_callback_legacy_call(data, ELM_ATSPI_BRIDGE_EVENT_CONNECTED, NULL); + { + efl_event_callback_legacy_call(data, ELM_ATSPI_BRIDGE_EVENT_CONNECTED, NULL); + e = calloc(1, sizeof(Elm_Event_Atspi_Bridge_State_Changed)); + if (e) + { + e->state = ELM_ATSPI_BRIDGE_CONNECTED; + ecore_event_add(ELM_EVENT_ATSPI_BRIDGE_STATE_CHANGED, e, NULL, NULL); + } + } + pd->connected = EINA_TRUE; } @@ -4810,6 +4822,7 @@ _interfaces_unregister(Eo *bridge) static void _a11y_connection_shutdown(Eo *bridge) { + Elm_Event_Atspi_Bridge_State_Changed *e; ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN(bridge, pd); Eldbus_Pending *pending; @@ -4852,6 +4865,13 @@ _a11y_connection_shutdown(Eo *bridge) pd->event_hdlr = NULL; efl_event_callback_legacy_call(bridge, ELM_ATSPI_BRIDGE_EVENT_DISCONNECTED, NULL); + e = calloc(1, sizeof(Elm_Event_Atspi_Bridge_State_Changed)); + if (e) + { + e->state = ELM_ATSPI_BRIDGE_DISCONNECTED; + ecore_event_add(ELM_EVENT_ATSPI_BRIDGE_STATE_CHANGED, e, NULL, NULL); + } + pd->connected = EINA_FALSE; } diff --git a/src/lib/elementary/elm_general.h b/src/lib/elementary/elm_general.h index b0708e11c3..21e6a5c482 100644 --- a/src/lib/elementary/elm_general.h +++ b/src/lib/elementary/elm_general.h @@ -491,6 +491,28 @@ typedef enum ELM_FOCUS_REGION_SHOW_ITEM /**< As an item. */ } Elm_Focus_Region_Show_Mode; +/** Possible values for the atspi bridge state. + * + * @since 1.26 + * + * @ingroup Elm_Atspi_Bridge + */ +typedef enum +{ + ELM_ATSPI_BRIDGE_CONNECTED = 0, /**< when atspi bridge is ready */ + ELM_ATSPI_BRIDGE_DISCONNECTED, /**< when atspi bridge is shutdown */ +} Elm_Atspi_Bridge_State; + +/** Data on event when atspi bridge state is changed + * + * @since 1.26 + * + * @ingroup Elm_Atspi_Bridge + */ +typedef struct _Elm_Event_Atspi_Bridge_State_Changed +{ + Elm_Atspi_Bridge_State state; +} Elm_Event_Atspi_Bridge_State_Changed; /**************************************************************************/ EAPI extern int ELM_ECORE_EVENT_ETHUMB_CONNECT; @@ -520,6 +542,12 @@ EAPI extern int ELM_EVENT_PROCESS_BACKGROUND; */ EAPI extern int ELM_EVENT_PROCESS_FOREGROUND; +/** + * Emitted when atspi bridge state is changed. + * @since 1.26 + */ +EAPI extern int ELM_EVENT_ATSPI_BRIDGE_STATE_CHANGED; + typedef Eina_Bool (*Elm_Event_Cb)(void *data, Evas_Object *obj, Evas_Object *src, Evas_Callback_Type type, void *event_info); /**< Function prototype definition for callbacks on input events happening on Elementary widgets. @a data will receive the user data pointer passed to elm_object_event_callback_add(). @a src will be a pointer to the widget on which the input event took place. @a type will get the type of this event and @a event_info, the struct with details on this event. */ EAPI extern double _elm_startup_time; diff --git a/src/lib/elementary/elm_main.c b/src/lib/elementary/elm_main.c index bb2ec1d084..325726abfd 100644 --- a/src/lib/elementary/elm_main.c +++ b/src/lib/elementary/elm_main.c @@ -438,6 +438,7 @@ elm_init(int argc, char **argv) ecore_event_handler_add(ECORE_EVENT_LOCALE_CHANGED, _sys_lang_changed, NULL); ELM_CNP_EVENT_SELECTION_CHANGED = ecore_event_type_new(); + ELM_EVENT_ATSPI_BRIDGE_STATE_CHANGED = ecore_event_type_new(); if (_elm_config->atspi_mode != ELM_ATSPI_MODE_OFF) _elm_atspi_bridge_init(); --