Eina_Hash *event_hash;
Eina_List *socket_queue;
Eina_List *plug_queue;
+ // TIZEN_ONLY(20171109) : fix for invalid proxy object, when at-spi has been restarted
+ Eina_List *connected_plugs_sockets;
+ //
Eina_Bool connected : 1;
// TIZEN_ONLY(20160802): do not handle events if the window is not activated
Eina_Bool window_activated : 1;
static Eo *_calculate_navigable_accessible_at_point(Eo *bridge, Eo *root, Eina_Bool coord_type, int x, int y);
static Eo *_calculate_neighbor(Eo *bridge, Eo *root, Eo *current, Eina_Bool forward, int search_mode);
//
+// TIZEN_ONLY(20171109) : fix for invalid proxy object, when at-spi has been restarted
+Eo *plug_type_proxy_get(Eo *obj, Evas_Object *widget);
+//
+
typedef struct {
const Eo_Event_Description *desc;
EINA_LIST_FOREACH(wd->subobjs, l, widget)
{
- Eo *proxy;
+ // TIZEN_ONLY(20171109) : fix for invalid proxy object, when at-spi has been restarted
+ Eo *proxy = plug_type_proxy_get(parent, widget);
+ //
- proxy = evas_object_data_get(widget, "__widget_proxy");
if (proxy)
{
int px, py, pw, ph;
_a11y_connection_shutdown(Eo *bridge)
{
ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN(bridge, pd);
+
+ // TIZEN_ONLY(20171109) : fix for invalid proxy object, when at-spi has been restarted
+ Eo *socket;
+ EINA_LIST_FREE(pd->connected_plugs_sockets, socket)
+ evas_object_data_set(socket, "__proxy_invalid", (void*)1);
+ //
+
Eldbus_Pending *pending;
if (pd->connected)
return NULL;
}
+static Eina_Bool _from_list_remove(void *data, Eo *obj, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Eina_List **list = data;
+ *list = eina_list_remove(*list, obj);
+ return EINA_TRUE;
+}
+
EOLIAN void
_elm_atspi_bridge_eo_base_destructor(Eo *obj, Elm_Atspi_Bridge_Data *pd)
{
_a11y_connection_shutdown(obj);
+ Eo *socket_elem = NULL;
+ EINA_LIST_FREE(pd->connected_plugs_sockets, socket_elem)
+ {
+ eo_do(socket_elem, eo_event_callback_del(EO_EV_DEL, _from_list_remove, &pd->connected_plugs_sockets));
+ }
+
if (pd->bus_obj) eldbus_object_unref(pd->bus_obj);
if (pd->session_bus) eldbus_connection_unref(pd->session_bus);
if (pd->root) eo_del(pd->root);
eldbus_object_send(dobj, msg, _socket_addr_get_cb, proxy, 100);
}
+static void _add_plug_or_socket_to_connected_list_in_bridge(Eo *plug_or_socket)
+{
+ Eo *bridge = _elm_atspi_bridge_get();
+ ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN(bridge, pd);
+ pd->connected_plugs_sockets = eina_list_append(pd->connected_plugs_sockets, plug_or_socket);
+ eo_do(plug_or_socket, eo_event_callback_add(EO_EV_DEL, _from_list_remove, &pd->connected_plugs_sockets));
+}
+
static void _plug_connect(Eldbus_Connection *conn, Eo *proxy)
{
const char *bus, *path;
eo_do(proxy, bus = eo_key_data_get("__svc_bus"));
eo_do(proxy, path = eo_key_data_get("__svc_path"));
+ _add_plug_or_socket_to_connected_list_in_bridge(proxy);
if (bus && path)
{
_plug_address_discover(conn, proxy, bus, path);
return;
}
-static Eina_Bool _from_list_remove(void *data, Eo *obj, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
-{
- Eina_List **list = data;
- *list = eina_list_remove(*list, obj);
- return EINA_TRUE;
-}
-
EAPI void elm_atspi_bridge_utils_proxy_connect(Eo *proxy)
{
Eo *bridge = _elm_atspi_bridge_get();
pd->interfaces.socket =
eldbus_service_interface_fallback_register(pd->a11y_bus, ELM_ACCESS_OBJECT_PATH_PREFIX2, &socket_iface_desc);
//
+
+ _add_plug_or_socket_to_connected_list_in_bridge(proxy);
}
EAPI void elm_atspi_bridge_utils_proxy_listen(Eo *proxy)
// TIZEN ONLY - END
//TIZEN_ONLY(20170621) handle atspi proxy connection at runtime
-static Eo *
-_plug_type_proxy_get(Eo *obj, Evas_Object *widget)
+Eo *
+plug_type_proxy_get(Eo *obj, Evas_Object *widget)
{
Eo *proxy = NULL;
const char *plug_id;
eo_do_super(obj, MY_CLASS, elm_interface_atspi_accessible_attribute_append("___PlugID", plug_id));
proxy = evas_object_data_get(widget, "__widget_proxy");
- if (proxy) return proxy;
+ // TIZEN_ONLY(20171109) : fix for invalid proxy object, when at-spi has been restarted
+ if (proxy)
+ {
+ if (!evas_object_data_get(proxy, "__proxy_invalid")) return proxy;
+ evas_object_data_del(widget, "__widget_proxy");
+ }
+ //
if (_elm_atspi_bridge_plug_id_split(plug_id, &svcname, &svcnum))
{
Eo *proxy = NULL;
EINA_LIST_FOREACH(wd->subobjs, l, widget)
{
- if (evas_object_data_get(widget, "___PLUGID"))
- proxy = _plug_type_proxy_get(obj, widget);
+ proxy = plug_type_proxy_get(obj, widget);
if (proxy) break;
}
return proxy;
/* This assumes that only one proxy exists in obj */
if (!proxy)
{
- proxy = _plug_type_proxy_get(obj, widget);
+ proxy = plug_type_proxy_get(obj, widget);
if (proxy)
{
accs = eina_list_append(accs, proxy);
proxy = evas_object_data_get(smart_parent, "__widget_proxy");
if (proxy)
{
+ // TIZEN_ONLY(20171109) : fix for invalid proxy object, when at-spi has been restarted
+ Eo *parent;
+ eo_do(smart_parent, parent = elm_interface_atspi_accessible_parent_get());
+ proxy = plug_type_proxy_get(parent, smart_parent);
+ //
evas_object_geometry_get(smart_parent, &px, &py, &pw, &ph);
if (x >= px && x <= px + pw && y >= py && y <= py +ph)
{