From dc2e6cfada4c140372448528cee9784efb07962c Mon Sep 17 00:00:00 2001 From: Lukasz Oleksak Date: Wed, 14 Dec 2022 15:36:29 +0100 Subject: [PATCH] [AT-SPI] Add child_bus attribute to parents having remote accessibility object child This will allow AT-clients to query in a single dbus call (via collection iface) all busses used for UI embedding. Result of such query may be used by AT-client to limit its dbus calls to: a) active window process b) processes that provide UIs embedded in active window and avoid dbus calls to processes being in background, which respond very slowly. Change-Id: Ifb73172cd63d67257ac9c03b9d98c3dbc23fe845 --- src/lib/elementary/efl_ui_widget.c | 1 + src/lib/elementary/elm_atspi_bridge.c | 8 ++++++-- src/lib/elementary/elm_atspi_ewk_wrapper.c | 8 +++++--- src/lib/elementary/elm_plug.c | 1 + 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/lib/elementary/efl_ui_widget.c b/src/lib/elementary/efl_ui_widget.c index 1ab5e81..430b8d4 100644 --- a/src/lib/elementary/efl_ui_widget.c +++ b/src/lib/elementary/efl_ui_widget.c @@ -7503,6 +7503,7 @@ _on_widget_del(void *data, const Efl_Event *event) Eo *plug = data; evas_object_event_callback_del_full(event->object, EVAS_CALLBACK_MOVE, _proxy_widget_move_cb, plug); + efl_access_object_attribute_del(event->object, "child_bus"); efl_del(plug); } diff --git a/src/lib/elementary/elm_atspi_bridge.c b/src/lib/elementary/elm_atspi_bridge.c index 7e34afe..bbe5a00 100644 --- a/src/lib/elementary/elm_atspi_bridge.c +++ b/src/lib/elementary/elm_atspi_bridge.c @@ -7595,7 +7595,11 @@ static void _embedded_reply_cb(void *data, const Eldbus_Message *msg, Eldbus_Pen parent = efl_parent_get(proxy); if (parent) - efl_access_children_changed_added_signal_emit(parent, proxy); + { + const char *bus = eldbus_message_sender_get(msg); + efl_access_object_attribute_append(parent, "child_bus", bus); + efl_access_children_changed_added_signal_emit(parent, proxy); + } } static void @@ -7887,7 +7891,7 @@ Eo* _elm_atspi_bridge_utils_proxy_create(Eo *parent, const char *svcname, int sv /* a11y parent of socket window is socket proxy */ if (type != ELM_ATSPI_PROXY_TYPE_SOCKET) - efl_access_object_access_parent_set(ret, parent); + efl_access_object_access_parent_set(ret, parent); if (_instance) { _bridge_object_register(_instance, ret); diff --git a/src/lib/elementary/elm_atspi_ewk_wrapper.c b/src/lib/elementary/elm_atspi_ewk_wrapper.c index 257c6e3..b382576 100644 --- a/src/lib/elementary/elm_atspi_ewk_wrapper.c +++ b/src/lib/elementary/elm_atspi_ewk_wrapper.c @@ -28,8 +28,9 @@ EFL_CALLBACKS_ARRAY_DEFINE(resize_watch, { EFL_GFX_ENTITY_EVENT_SIZE_CHANGED, _ewk_view_geometry_changed }); static void -_elm_atspi_ewk_wrapper_disconnect(Elm_Atspi_Ewk_Wrapper_Data *_pd) +_elm_atspi_ewk_wrapper_disconnect(Elm_Atspi_Ewk_Wrapper_Data *_pd, Eo *obj) { + efl_access_object_attribute_del(obj, "child_bus"); if (_pd->proxy) efl_del(_pd->proxy); free(_pd->plug_id); _pd->proxy = NULL; @@ -87,6 +88,7 @@ _elm_atspi_ewk_wrapper_proxy_create(const char *plugid, Eo *parent) } elm_obj_atspi_proxy_address_set(proxy, bus, path); + efl_access_object_attribute_append(parent, "child_bus", bus); free(bus); free(path); @@ -104,7 +106,7 @@ _elm_atspi_ewk_wrapper_connection_init(Eo *obj, Elm_Atspi_Ewk_Wrapper_Data *_pd) // when plug_id is NULL, disconnect if (!plug_id) { - _elm_atspi_ewk_wrapper_disconnect(_pd); + _elm_atspi_ewk_wrapper_disconnect(_pd, obj); return; } @@ -113,7 +115,7 @@ _elm_atspi_ewk_wrapper_connection_init(Eo *obj, Elm_Atspi_Ewk_Wrapper_Data *_pd) return; // destroy current connection - _elm_atspi_ewk_wrapper_disconnect(_pd); + _elm_atspi_ewk_wrapper_disconnect(_pd, obj); // make new connection using proxy object _pd->proxy = _elm_atspi_ewk_wrapper_proxy_create(plug_id, obj); diff --git a/src/lib/elementary/elm_plug.c b/src/lib/elementary/elm_plug.c index ce611a5..7ca4663 100644 --- a/src/lib/elementary/elm_plug.c +++ b/src/lib/elementary/elm_plug.c @@ -211,6 +211,7 @@ _on_widget_del(void *data, const Efl_Event *event) evas_object_event_callback_del_full(event->object, EVAS_CALLBACK_RESIZE, _proxy_widget_resize_cb, plug); ecore_event_handler_del(_atspi_bridge_ready_handler); + efl_access_object_attribute_del(event->object, "child_bus"); efl_del(plug); } -- 2.7.4