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
This commit is contained in:
Shinwoo Kim 2021-06-04 20:20:00 +09:00
parent bc48081c93
commit 45aeaa6750
3 changed files with 50 additions and 1 deletions

View File

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

View File

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

View File

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