From 00dd65c985bf3afd2dea6de5198864015b647e4a Mon Sep 17 00:00:00 2001 From: Shinwoo Kim Date: Thu, 27 May 2021 20:39:26 +0900 Subject: [PATCH] atspi: make plug and socket window work This is for making Elm.Plug and Efl.Ui.Win_Socket_Legacy work Elm.Plug (Embedding side such as Quickpanel) has a child Elm.Atspi.Proxy Efl.Ui.Win_Socket_Legacy (Such as Music player) also has Elm.Atspi.Proxy. 1 finger tap did not work because PLUG proxy does not have size. It is able to override efl_access_component_accessible_at_get to fix this. But this patch set makes PLUG proxy have size. flick "next" and "prev" did not work. The changes in elm_atspi_bridge.c is fixing this issue. Each comment explains what the change is going to fix. This patch is fixing following items (1) connection between plug and socket window including atspi on > off > on case (2) 1 finger single tap on socket window (3) 1 finger swipe between plug and socket window (4) 1 finger double tap and hold on socket window, then 1 finger tap on plug *tizen-fix Change-Id: I34f76892da29232c4ae9da892d550fc023759570 --- src/lib/elementary/efl_access_component.c | 8 ++++ src/lib/elementary/efl_ui_win.c | 22 ++++++++- src/lib/elementary/efl_ui_win_socket.c | 71 ++++++++++++++++++++++++++-- src/lib/elementary/elc_ctxpopup.c | 7 +-- src/lib/elementary/elm_atspi_bridge.c | 34 ++++++++------ src/lib/elementary/elm_atspi_proxy.c | 46 ++++++++++++------ src/lib/elementary/elm_plug.c | 77 ++++++++++++++++++++++++++++++- src/lib/elementary/elm_priv.h | 6 +-- src/lib/elementary_tizen/elc_ctxpopup.c | 7 +-- 9 files changed, 230 insertions(+), 48 deletions(-) diff --git a/src/lib/elementary/efl_access_component.c b/src/lib/elementary/efl_access_component.c index 6432ec0..51934d9 100644 --- a/src/lib/elementary/efl_access_component.c +++ b/src/lib/elementary/efl_access_component.c @@ -91,6 +91,14 @@ _efl_access_component_screen_coords_extents_get(const Eo *obj, Eina_Rect r) ecore_evas_geometry_get(ee, &ee_x, &ee_y, NULL, NULL); r.x += ee_x; r.y += ee_y; + + //TIZEN_ONLY(20210608): make plug and socket window work + int sx = 0, sy = 0; + Evas_Object *top = elm_widget_top_get(obj); + efl_access_component_socket_offset_get(top, &sx, &sy); + r.x += sx; + r.y += sy; + // } return r; diff --git a/src/lib/elementary/efl_ui_win.c b/src/lib/elementary/efl_ui_win.c index 267d339..2e91df3 100644 --- a/src/lib/elementary/efl_ui_win.c +++ b/src/lib/elementary/efl_ui_win.c @@ -1746,7 +1746,16 @@ _elm_win_focus_in(Ecore_Evas *ee) _elm_win_focus_highlight_reconfigure_job_start(sd); _elm_win_frame_style_update(sd, 0, 1); - if (_elm_atspi_enabled()) + //TIZEN_ONLY(20210608): make plug and socket window work + /* elm_plug: do not send activate signal if window is socket window. + The socket window is embedded in another window. if AT-client works + with activated embedded window directly, it will lost chance to work + with embedding window. ex: "1 finger double tap and hold" makes the + embedded window get focus when embedded window has highlight object, + then "1 finger tap" will interact with the embedded window even though + the "1 finger tap" occurs on embedding window */ + if (_elm_atspi_enabled() && sd->type != EFL_UI_WIN_TYPE_SOCKET_IMAGE) + // { efl_access_window_activated_signal_emit(obj); efl_access_state_changed_signal_emit(obj, EFL_ACCESS_STATE_TYPE_ACTIVE, EINA_TRUE); @@ -1797,7 +1806,16 @@ _elm_win_focus_out(Ecore_Evas *ee) /* access */ _elm_access_object_highlight_disable(evas_object_evas_get(obj)); - if (_elm_atspi_enabled()) + //TIZEN_ONLY(20210608): make plug and socket window work + /* elm_plug: do not send deactivate signal if window is socket window. + The socket window is embedded in another window. if AT-client works + with activated embedded window directly, it will lost chance to work + with embedding window. ex: "1 finger double tap and hold" makes the + embedded window get focus when embedded window has highlight object, + then "1 finger tap" will interact with the embedded window even though + the "1 finger tap" occurs on embedding window */ + if (_elm_atspi_enabled() && sd->type != EFL_UI_WIN_TYPE_SOCKET_IMAGE) + // { efl_access_window_deactivated_signal_emit(obj); efl_access_state_changed_signal_emit(obj, EFL_ACCESS_STATE_TYPE_ACTIVE, EINA_FALSE); diff --git a/src/lib/elementary/efl_ui_win_socket.c b/src/lib/elementary/efl_ui_win_socket.c index 4ab34da..1ec89ab 100644 --- a/src/lib/elementary/efl_ui_win_socket.c +++ b/src/lib/elementary/efl_ui_win_socket.c @@ -24,6 +24,10 @@ typedef struct //TIZEN_ONLY(20171108): make atspi_proxy work Eo *socket_proxy; /* reference object to atspi object in separate process @since 1.15 */ // + //TIZEN_ONLY(20210608): make plug and socket window work + Eina_Stringshare *svcname; + int svcnum; + // } Efl_Ui_Win_Socket_Data; //TIZEN_ONLY(20170613) -listen if access mode is enabled @@ -31,6 +35,10 @@ typedef struct Efl_Ui_Win_Socket_Data * sd = efl_data_scope_get(o, MY_CLASS) // +//TIZEN_ONLY(20210608): make plug and socket window work +static Ecore_Event_Handler *_atspi_bridge_ready_handler = NULL; +// + EOLIAN static Efl_Object * _efl_ui_win_socket_efl_object_finalize(Eo *obj, Efl_Ui_Win_Socket_Data *pd EINA_UNUSED) { @@ -40,6 +48,44 @@ _efl_ui_win_socket_efl_object_finalize(Eo *obj, Efl_Ui_Win_Socket_Data *pd EINA_ return obj; } +//TIZEN_ONLY(20210608): make plug and socket window work +static Eina_Bool +_atspi_bridge_state_changed(void *data, int type EINA_UNUSED, void *event) +{ + Eo *proxy = data; + Elm_Event_Atspi_Bridge_State_Changed *ev = event; + + if (ev->state == ELM_ATSPI_BRIDGE_CONNECTED) + { + elm_atspi_bridge_utils_proxy_listen(proxy); + } + + return ECORE_CALLBACK_PASS_ON; +} + +static void +_win_socket_proxy_create_and_listen(Eo *obj, Efl_Ui_Win_Socket_Data *sd) +{ + sd->socket_proxy = _elm_atspi_bridge_utils_proxy_create(obj, sd->svcname, sd->svcnum, ELM_ATSPI_PROXY_TYPE_SOCKET); + evas_object_data_set(obj, "___atspi_socket_proxy", sd->socket_proxy); + + /* elm_plug: socket window is a11y child of proxy(of socket window) + so the proxy should be a11y parent of the socket window. + finding a11y parents happens in atspi_accessible_get_neighbor + it will find proxy, and doing "GetNeighbor" with the search mode + NEIGHBOR_SEARCH_MODE_CONTIUNE_AFTER_FAILED_RECURSING */ + Eo *p = efl_access_object_access_parent_get(obj); + efl_access_object_access_parent_set(obj, sd->socket_proxy); + efl_access_object_access_parent_set(sd->socket_proxy, p); + + if (!elm_atspi_bridge_utils_proxy_listen(sd->socket_proxy)) + { + if (_atspi_bridge_ready_handler) ecore_event_handler_del(_atspi_bridge_ready_handler); + _atspi_bridge_ready_handler = ecore_event_handler_add(ELM_EVENT_ATSPI_BRIDGE_STATE_CHANGED, _atspi_bridge_state_changed, sd->socket_proxy); + } +} +// + EOLIAN static Eina_Bool _efl_ui_win_socket_socket_listen(Eo *obj, Efl_Ui_Win_Socket_Data *pd EINA_UNUSED, const char *svcname, int svcnum, Eina_Bool svcsys) { @@ -53,12 +99,16 @@ _efl_ui_win_socket_socket_listen(Eo *obj, Efl_Ui_Win_Socket_Data *pd EINA_UNUSED if (!ecore_evas_extn_socket_listen(ee, svcname, svcnum, svcsys)) return EINA_FALSE; - if (_elm_atspi_enabled()) + if (_elm_config->atspi_mode) { + if (pd->svcname) eina_stringshare_del(pd->svcname); + pd->svcname = eina_stringshare_add(svcname); + pd->svcnum = svcnum; + if (pd->socket_proxy) efl_del(pd->socket_proxy); - pd->socket_proxy = _elm_atspi_bridge_utils_proxy_create(obj, svcname, svcnum, ELM_ATSPI_PROXY_TYPE_SOCKET); - elm_atspi_bridge_utils_proxy_listen(pd->socket_proxy); + + _win_socket_proxy_create_and_listen(obj, pd); } return EINA_TRUE; @@ -96,6 +146,16 @@ _access_socket_proxy_listen(Eo * obj) } // } + else + { + if (!sd->svcname) return; + + /* TODO: sometime the proxy is created already, + do not have to create again. remove multiple creation. */ + if (sd->socket_proxy) return; + + _win_socket_proxy_create_and_listen(obj, sd); + } } @@ -108,6 +168,11 @@ _access_socket_proxy_del(Eo * obj) efl_del(sd->socket_proxy); sd->socket_proxy = NULL; evas_object_data_set(obj, "___atspi_socket_proxy", NULL); + if (_atspi_bridge_ready_handler) + { + ecore_event_handler_del(_atspi_bridge_ready_handler); + _atspi_bridge_ready_handler = NULL; + } } } // diff --git a/src/lib/elementary/elc_ctxpopup.c b/src/lib/elementary/elc_ctxpopup.c index 5427a35..82a7de5 100644 --- a/src/lib/elementary/elc_ctxpopup.c +++ b/src/lib/elementary/elc_ctxpopup.c @@ -1768,7 +1768,6 @@ _elm_ctxpopup_efl_access_object_state_set_get(const Eo *obj, Elm_Ctxpopup_Data * EOLIAN static Eina_Rect _elm_ctxpopup_efl_access_component_extents_get(const Eo *obj EINA_UNUSED, Elm_Ctxpopup_Data *sd, Eina_Bool screen_coords) { - int ee_x, ee_y; Eina_Rect r; if (!sd->box) @@ -1783,11 +1782,7 @@ _elm_ctxpopup_efl_access_component_extents_get(const Eo *obj EINA_UNUSED, Elm_Ct if (screen_coords) { - Ecore_Evas *ee = ecore_evas_ecore_evas_get(evas_object_evas_get(sd->box)); - if (!ee) return r; - ecore_evas_geometry_get(ee, &ee_x, &ee_y, NULL, NULL); - r.x += ee_x; - r.y += ee_y; + r = _efl_access_component_screen_coords_extents_get(obj, r); } return r; } diff --git a/src/lib/elementary/elm_atspi_bridge.c b/src/lib/elementary/elm_atspi_bridge.c index 0573cd8..7476ca3 100644 --- a/src/lib/elementary/elm_atspi_bridge.c +++ b/src/lib/elementary/elm_atspi_bridge.c @@ -171,7 +171,6 @@ static int _init_count = 0; //TIZEN_ONLY(20171108): make atspi_proxy work static const char *_a11y_socket_address; // - EAPI int ELM_EVENT_ATSPI_BRIDGE_STATE_CHANGED = -1; // Object Event handlers @@ -1077,6 +1076,7 @@ _accessible_get_neighbor(const Eldbus_Service_Interface *iface EINA_UNUSED, cons iter = eldbus_message_iter_get(ret); Eo *accessible = _calculate_neighbor(bridge, root, start, direction == 1, search_mode); + _bridge_iter_object_reference_append(bridge, iter, accessible); _bridge_object_register(bridge, accessible); @@ -5356,7 +5356,10 @@ static void *_calculate_neighbor_impl(accessibility_navigation_pointer_table *ta { /* This only works if we navigate backward, and it is not possible to find in embedded process. In this case the deputy should be used */ - return _deputy_of_proxy_in_parent_get(start); + Eo *d = _deputy_of_proxy_in_parent_get(start); + if (d) return d; + + /* elm_plug: does not have deputy, do not return if deputy is null */ } void *node = start ? start : root; @@ -7013,7 +7016,6 @@ _a11y_bus_initialize(Eo *obj, const char *socket_addr) // register accessible object event listener pd->event_hdlr = efl_access_object_event_handler_add(_bridge_accessible_event_dispatch, obj); - } static void @@ -7152,7 +7154,7 @@ static void _bridge_object_register(Eo *bridge, Eo *obj) //TIZEN_ONLY(20210423): recover init failure static Eina_Bool -_init_job(void *data) +_init_job(void *data EINA_UNUSED) { _instance = efl_add_ref(ELM_ATSPI_BRIDGE_CLASS, NULL); _init_count++; @@ -7841,16 +7843,16 @@ static void _plug_connect(Eldbus_Connection *conn, Eo *proxy) return; } -EAPI void elm_atspi_bridge_utils_proxy_connect(Eo *proxy) +EAPI Eina_Bool elm_atspi_bridge_utils_proxy_connect(Eo *proxy) { Eo *bridge = _elm_atspi_bridge_get(); if (!bridge) { ERR("AT-SPI: Atspi bridge is not enabled."); efl_event_callback_call(proxy, ELM_ATSPI_PROXY_EVENT_DISCONNECTED, NULL); - return; + return EINA_FALSE; } - ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN(bridge, pd); + ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN_VAL(bridge, pd, EINA_FALSE); if (!pd->a11y_bus) { @@ -7859,9 +7861,11 @@ EAPI void elm_atspi_bridge_utils_proxy_connect(Eo *proxy) pd->plug_queue = eina_list_append(pd->plug_queue, proxy); efl_event_callback_add(proxy, EFL_EVENT_DEL, _from_list_remove, &pd->plug_queue); } - return; + return EINA_TRUE; } _plug_connect(pd->a11y_bus, proxy); + + return EINA_TRUE; } //TIZEN_ONLY(20200320) atspi: sanitize service, bus and path names for Dbus communication @@ -7976,7 +7980,9 @@ Eo* _elm_atspi_bridge_utils_proxy_create(Eo *parent, const char *svcname, int sv return NULL; } - efl_access_object_access_parent_set(ret, parent); + /* a11y parent of socket window is socket proxy */ + if (type != ELM_ATSPI_PROXY_TYPE_SOCKET) + efl_access_object_access_parent_set(ret, parent); if (_instance) { _bridge_object_register(_instance, ret); @@ -8051,15 +8057,15 @@ _socket_ifc_create(Eldbus_Connection *conn, Eo *proxy) _add_plug_or_socket_to_connected_list_in_bridge(proxy); } -EAPI void elm_atspi_bridge_utils_proxy_listen(Eo *proxy) +EAPI Eina_Bool elm_atspi_bridge_utils_proxy_listen(Eo *proxy) { Eo *bridge = _elm_atspi_bridge_get(); if (!bridge) { ERR("AT-SPI: Atspi bridge is not enabled."); - return; + return EINA_FALSE; } - ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN(bridge, pd); + ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN_VAL(bridge, pd, EINA_FALSE); if (!pd->a11y_bus) { if (!eina_list_data_find(pd->socket_queue, proxy)) @@ -8067,9 +8073,11 @@ EAPI void elm_atspi_bridge_utils_proxy_listen(Eo *proxy) pd->socket_queue = eina_list_append(pd->socket_queue, proxy); efl_event_callback_add(proxy, EFL_EVENT_DEL, _from_list_remove, &pd->socket_queue); } - return; + return EINA_TRUE; } _socket_ifc_create(pd->a11y_bus, proxy); + + return EINA_TRUE; } // diff --git a/src/lib/elementary/elm_atspi_proxy.c b/src/lib/elementary/elm_atspi_proxy.c index 2517583..6b3a9d3 100644 --- a/src/lib/elementary/elm_atspi_proxy.c +++ b/src/lib/elementary/elm_atspi_proxy.c @@ -77,27 +77,35 @@ _elm_atspi_proxy_address_get_retry_timer_add(Eo *obj, Elm_Atspi_Proxy_Data *_pd) _retry_timer_cb, obj); } -EOLIAN static void -_elm_atspi_proxy_efl_object_destructor(Eo *obj, Elm_Atspi_Proxy_Data *_pd) +static void +_proxy_resource_del(Elm_Atspi_Proxy_Data *pd) { - if (_pd->retry_timer) + if (pd->retry_timer) { - ecore_timer_del(_pd->retry_timer); - _pd->retry_timer = NULL; + ecore_timer_del(pd->retry_timer); + pd->retry_timer = NULL; } - if (_pd->type == ELM_ATSPI_PROXY_TYPE_SOCKET) - _socket_list = eina_list_remove(_socket_list, obj); - if (_pd->bus) + if (pd->bus) { - eina_stringshare_del(_pd->bus); - _pd->bus = NULL; + eina_stringshare_del(pd->bus); + pd->bus = NULL; } - if (_pd->path) + + if (pd->path) { - eina_stringshare_del(_pd->path); - _pd->path = NULL; + eina_stringshare_del(pd->path); + pd->path = NULL; } +} + +EOLIAN static void +_elm_atspi_proxy_efl_object_destructor(Eo *obj, Elm_Atspi_Proxy_Data *_pd) +{ + if (_pd->type == ELM_ATSPI_PROXY_TYPE_SOCKET) + _socket_list = eina_list_remove(_socket_list, obj); + + _proxy_resource_del(_pd); efl_destructor(efl_super(obj, MY_CLASS)); } @@ -161,10 +169,20 @@ EOLIAN static void _elm_atspi_proxy_efl_ui_widget_atspi(Eo *obj, Elm_Atspi_Proxy_Data *_pd, Eina_Bool is_atspi) { EINA_SAFETY_ON_NULL_RETURN(obj); - if (is_atspi && _pd->type == ELM_ATSPI_PROXY_TYPE_PLUG) + + if (_pd->type != ELM_ATSPI_PROXY_TYPE_PLUG) return; + + if (is_atspi) { elm_atspi_bridge_utils_proxy_connect(obj); } + else + { + /* elm_plug: need to remove resource for next connection + next connection means that the case of "atspi on > off > on" + see the timer callback checking path and bus. */ + _proxy_resource_del(_pd); + } } #include "elm_atspi_proxy_eo.c" diff --git a/src/lib/elementary/elm_plug.c b/src/lib/elementary/elm_plug.c index 17c5027..f602bf0 100644 --- a/src/lib/elementary/elm_plug.c +++ b/src/lib/elementary/elm_plug.c @@ -26,6 +26,8 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] = { {NULL, NULL} }; +static Ecore_Event_Handler *_atspi_bridge_ready_handler = NULL; + static void _sizing_eval(Evas_Object *obj EINA_UNUSED) { @@ -178,6 +180,71 @@ _elm_plug_image_object_get(const Eo *obj, void *sd EINA_UNUSED) return wd->resize_obj; } +//TIZEN_ONLY(20210608): make plug and socket window work +static void +_proxy_widget_move_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Coord x, y; + Eo *proxy = data; + + evas_object_geometry_get(obj, &x, &y, NULL, NULL); + elm_atspi_bridge_utils_proxy_offset_set(proxy, x, y); + evas_object_move(proxy, x, y); +} + +static void +_proxy_widget_resize_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Coord w, h; + Eo *proxy = data; + + evas_object_geometry_get(obj, NULL, NULL, &w, &h); + evas_object_resize(proxy, w, h); +} + +static void +_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); + 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_del(plug); +} + +static void +_on_proxy_connected_cb(void *data, const Efl_Event *event) +{ + Evas_Coord x, y, w, h; + Evas_Object *widget = data; + + evas_object_geometry_get(widget, &x, &y, &w, &h); + elm_atspi_bridge_utils_proxy_offset_set(event->object, x, y); + + evas_object_move(event->object, x, y); + evas_object_resize(event->object, w, h); + + evas_object_event_callback_add(widget, EVAS_CALLBACK_MOVE, _proxy_widget_move_cb, event->object); + evas_object_event_callback_add(widget, EVAS_CALLBACK_RESIZE, _proxy_widget_resize_cb, event->object); +} + +static Eina_Bool +_atspi_bridge_state_changed(void *data, int type EINA_UNUSED, void *event) +{ + Eo *proxy = data; + Elm_Event_Atspi_Bridge_State_Changed *ev = event; + + if (ev->state == ELM_ATSPI_BRIDGE_CONNECTED) + { + elm_atspi_bridge_utils_proxy_connect(proxy); + } + + return ECORE_CALLBACK_PASS_ON; +} +// + EOLIAN static Eina_Bool _elm_plug_connect(Eo *obj, void *sd EINA_UNUSED, const char *svcname, int svcnum, Eina_Bool svcsys) { @@ -205,7 +272,15 @@ _elm_plug_connect(Eo *obj, void *sd EINA_UNUSED, const char *svcname, int svcnum if (_elm_config->atspi_mode) { Eo *proxy = _elm_atspi_bridge_utils_proxy_create(obj, svcname, svcnum, ELM_ATSPI_PROXY_TYPE_PLUG); - elm_atspi_bridge_utils_proxy_connect(proxy); + + efl_event_callback_add(obj, EFL_EVENT_DEL, _on_widget_del, proxy); + efl_event_callback_add(proxy, ELM_ATSPI_PROXY_EVENT_CONNECTED, _on_proxy_connected_cb, obj); + + if (!elm_atspi_bridge_utils_proxy_connect(proxy)) + { + if (_atspi_bridge_ready_handler) ecore_event_handler_del(_atspi_bridge_ready_handler); + _atspi_bridge_ready_handler = ecore_event_handler_add(ELM_EVENT_ATSPI_BRIDGE_STATE_CHANGED, _atspi_bridge_state_changed, proxy); + } } // diff --git a/src/lib/elementary/elm_priv.h b/src/lib/elementary/elm_priv.h index fa042cc..63b52cf 100644 --- a/src/lib/elementary/elm_priv.h +++ b/src/lib/elementary/elm_priv.h @@ -898,16 +898,16 @@ void *_elm_icon_signal_callback_del(Evas_Object *obj, Edje_Signal_Cb func_cb); //TIZEN_ONLY(20171108): make atspi_proxy work Eo* _elm_atspi_bridge_utils_proxy_create(Eo *parent, const char *svcname, int svcnum, Elm_Atspi_Proxy_Type type); -void elm_atspi_bridge_utils_proxy_listen(Eo *proxy); -void elm_atspi_bridge_utils_proxy_connect(Eo *proxy); +Eina_Bool elm_atspi_bridge_utils_proxy_listen(Eo *proxy); +Eina_Bool elm_atspi_bridge_utils_proxy_connect(Eo *proxy); void elm_atspi_bridge_utils_proxy_offset_set(Eo *proxy, int x, int y); void elm_object_accessibility_highlight_set(void *obj, Eina_Bool val); Eina_Bool _elm_atspi_bridge_plug_id_split(const char *plug_id, char **bus, char **path); +// //TIZEN_ONLY(20170621) handle atspi proxy connection at runtime void _access_socket_proxy_listen(Eo * obj); void _access_socket_proxy_del(Eo * obj); // -// /* end of DEPRECATED */ /* DO NOT USE THIS this is only for performance optimization! */ diff --git a/src/lib/elementary_tizen/elc_ctxpopup.c b/src/lib/elementary_tizen/elc_ctxpopup.c index c4bf316..d00e51f 100644 --- a/src/lib/elementary_tizen/elc_ctxpopup.c +++ b/src/lib/elementary_tizen/elc_ctxpopup.c @@ -2890,7 +2890,6 @@ _elm_ctxpopup_efl_access_object_access_children_get(const Eo *eo_item EINA_UNUSE EOLIAN static Eina_Rect _elm_ctxpopup_efl_access_component_extents_get(const Eo *obj EINA_UNUSED, Elm_Ctxpopup_Data *sd, Eina_Bool screen_coords) { - int ee_x, ee_y; Eina_Rect r; if (!sd->scr) @@ -2905,11 +2904,7 @@ _elm_ctxpopup_efl_access_component_extents_get(const Eo *obj EINA_UNUSED, Elm_Ct if (screen_coords) { - Ecore_Evas *ee = ecore_evas_ecore_evas_get(evas_object_evas_get(sd->scr)); - if (!ee) return r; - ecore_evas_geometry_get(ee, &ee_x, &ee_y, NULL, NULL); - r.x += ee_x; - r.y += ee_y; + r = _efl_access_component_screen_coords_extents_get(obj, r); } return r; } -- 2.7.4