[Tizen][ATSPI] Hot fix disabling propagation of key events to A11Y bus 32/278532/7 submit/tizen/20220801.051748 submit/tizen/20220801.084849
authorLukasz Oleksak <l.oleksak@samsung.com>
Thu, 21 Jul 2022 13:58:19 +0000 (15:58 +0200)
committerChun <jykeon@samsung.com>
Mon, 1 Aug 2022 04:59:17 +0000 (04:59 +0000)
Hot fix for performance issue.
The patch should be reverted after the solution is applied.

Change-Id: I1f266d4a9ece4a317d8abe8da24bf4cf8580584f

src/lib/elementary/elm_atspi_bridge.c

index 123d17c..1e525a2 100644 (file)
@@ -84,17 +84,10 @@ static Eina_Hash *read_command_id = NULL;
    if (!obj) \
      return _dbus_invalid_ref_error_new(msg);
 
-typedef struct Key_Event_Info {
-     Ecore_Event_Key event;
-     int type;
-     Eo *bridge;
-} Key_Event_Info;
-
 typedef struct _Elm_Atspi_Bridge_Data
 {
    Eldbus_Connection *session_bus;
    Eldbus_Connection *a11y_bus;
-   Eina_List *reemited_events;
    Eina_Hash *cache;
    Eldbus_Service_Interface *cache_interface;
    Eldbus_Signal_Handler *register_hdl;
@@ -107,7 +100,6 @@ typedef struct _Elm_Atspi_Bridge_Data
    unsigned long object_children_broadcast_mask;
    unsigned long long object_state_broadcast_mask;
    unsigned long long window_signal_broadcast_mask;
-   Ecore_Event_Filter *key_flr;
    Eldbus_Object *bus_obj;
    Eina_List *pending_requests;
    int id;
@@ -215,7 +207,6 @@ Eo *plug_type_proxy_get(Eo *obj, Evas_Object *widget);
 //
 // utility functions
 static void _iter_interfaces_append(Eldbus_Message_Iter *iter, const Eo *obj);
-static Eina_Bool _elm_atspi_bridge_key_filter(void *data, void *loop, int type, void *event);
 static void _object_desktop_reference_append(Eldbus_Message_Iter *iter);
 static void _on_object_add(void *data, const Efl_Event *event);
 static void _on_object_del(void *data, const Efl_Event *event);
@@ -6745,8 +6736,6 @@ _event_handlers_register(Eo *bridge)
    //TIZEN_ONLY(20160527) - Add direct reading feature
    pd->reading_state_changed_hdl = eldbus_signal_handler_add(pd->a11y_bus, ELM_ATSPI_DIRECT_READ_BUS, ELM_ATSPI_DIRECT_READ_PATH, ELM_ATSPI_DIRECT_READ_INTERFACE, "ReadingStateChanged", _on_reading_state_changed, bridge);
    //
-
-   pd->key_flr = ecore_event_filter_add(NULL, _elm_atspi_bridge_key_filter, NULL, bridge);
 }
 
 static void
@@ -6889,9 +6878,6 @@ _a11y_connection_shutdown(Eo *bridge)
 
    _interfaces_unregister(bridge);
 
-   if (pd->key_flr) ecore_event_filter_del(pd->key_flr);
-   pd->key_flr = NULL;
-
    if (pd->register_hdl) eldbus_signal_handler_del(pd->register_hdl);
    pd->register_hdl = NULL;
 
@@ -7219,43 +7205,6 @@ _elm_atspi_bridge_shutdown(void)
    _efl_access_shutdown();
 }
 
-static Key_Event_Info*
-_key_event_info_new(int event_type, const Ecore_Event_Key *data, Eo *bridge)
-{
-   Key_Event_Info *ret;
-   EINA_SAFETY_ON_NULL_RETURN_VAL(data, NULL);
-
-   ret = calloc(1, sizeof(Key_Event_Info));
-
-   ret->type = event_type;
-   ret->event = *data;
-   ret->bridge = bridge;
-
-   ret->event.keyname = eina_stringshare_add(data->keyname);
-   ret->event.key = eina_stringshare_add(data->key);
-   ret->event.string = eina_stringshare_add(data->string);
-   ret->event.compose = eina_stringshare_add(data->compose);
-   ret->event.modifiers = data->modifiers;
-
-   // not sure why it is here, but explicite keep it NULLed.
-   ret->event.data = NULL;
-
-   return ret;
-}
-
-static void
-_key_event_info_free(Key_Event_Info *data)
-{
-   EINA_SAFETY_ON_NULL_RETURN(data);
-
-   eina_stringshare_del(data->event.keyname);
-   eina_stringshare_del(data->event.key);
-   eina_stringshare_del(data->event.string);
-   eina_stringshare_del(data->event.compose);
-
-   free(data);
-}
-
 static short
 _ecore_modifiers_2_atspi(unsigned int modifiers)
 {
@@ -7277,119 +7226,6 @@ _ecore_modifiers_2_atspi(unsigned int modifiers)
    return ret;
 }
 
-static void
-_iter_marshall_key_event(Eldbus_Message_Iter *iter, Key_Event_Info *data)
-{
-   Eldbus_Message_Iter *struct_iter;
-   EINA_SAFETY_ON_NULL_RETURN(data);
-
-   struct_iter = eldbus_message_iter_container_new(iter, 'r', NULL);
-
-   const char *str = data->event.keyname ? data->event.keyname : "";
-   int is_text = data->event.keyname ? 1 : 0;
-   int type;
-   if (data->type == ECORE_EVENT_KEY_DOWN)
-     type = ATSPI_KEY_PRESSED_EVENT;
-   else
-     type = ATSPI_KEY_RELEASED_EVENT;
-
-   eldbus_message_iter_arguments_append(struct_iter, "uinnisb", type, 0, data->event.keycode, _ecore_modifiers_2_atspi(data->event.modifiers), data->event.timestamp, str, is_text);
-   eldbus_message_iter_container_close(iter, struct_iter);
-}
-
-static void
-_on_event_del(void *user_data, void *func_data EINA_UNUSED)
-{
-   Key_Event_Info *info = user_data;
-   _key_event_info_free(info);
-}
-
-static void
-_on_listener_answer(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)
-{
-   Key_Event_Info *info = data;
-   const char *errname, *errmsg;
-   Eina_Bool ret = EINA_TRUE;
-
-   ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN(info->bridge, pd);
-
-   if (eldbus_message_error_get(msg, &errname, &errmsg))
-     {
-        ERR("%s %s", errname, errmsg);
-        goto reemit;
-     }
-   if (!eldbus_message_arguments_get(msg, "b", &ret))
-     {
-        ERR("Return message does not contain return value");
-        goto reemit;
-     }
-   if (ret)
-     {
-        _key_event_info_free(info);
-        return;
-     }
-reemit:
-   ecore_event_add(info->type, &info->event, _on_event_del, info);
-   pd->reemited_events = eina_list_append(pd->reemited_events, &info->event);
-}
-
-static Eina_Bool
-_elm_atspi_bridge_key_filter(void *data, void *loop EINA_UNUSED, int type, void *event)
-{
-   Eldbus_Message *msg;
-   Eldbus_Message_Iter *iter;
-   Ecore_Event_Key *key_event = event;
-   Key_Event_Info *ke;
-   Eo *bridge = data;
-
-   ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN_VAL(bridge, pd, EINA_TRUE);
-
-   // TIZEN_ONLY(20160802): do not handle events if the window is not activated
-   if (!pd->window_activated) return EINA_TRUE;
-   //
-
-   if ((type != ECORE_EVENT_KEY_DOWN) && (type != ECORE_EVENT_KEY_UP)) return EINA_TRUE;
-
-   // check if reemited
-   if (eina_list_data_find(pd->reemited_events, event))
-     {
-        pd->reemited_events = eina_list_remove(pd->reemited_events, event);
-        return EINA_TRUE;
-     }
-   // TIZEN_ONLY(20170118): Not handle events if keyboard is on
-   if (pd->root)
-     {
-        Eina_List *children, *l;
-        Evas_Object *child;
-        children = efl_access_object_access_children_get(pd->root);
-
-        EINA_LIST_FOREACH(children, l, child)
-          {
-             if (efl_ui_focus_object_focus_get(child)) break;
-          }
-        eina_list_free(children);
-
-        Elm_Win_Keyboard_Mode mode;
-        mode = elm_win_keyboard_mode_get(child);
-        if (mode == ELM_WIN_KEYBOARD_ON) return EINA_TRUE;
-     }
-   //
-
-   ke = _key_event_info_new(type, key_event, bridge);
-   if (!ke) return EINA_TRUE;
-
-   msg = eldbus_message_method_call_new(ATSPI_DBUS_NAME_REGISTRY, ATSPI_DBUS_PATH_DEC,
-                                        ATSPI_DBUS_INTERFACE_DEC, "NotifyListenersSync");
-   iter = eldbus_message_iter_get(msg);
-   _iter_marshall_key_event(iter, ke);
-
-   // timeout should be kept reasonably low to avoid delays
-   if (!eldbus_connection_send(pd->a11y_bus, msg, _on_listener_answer, ke, 100))
-     return EINA_TRUE;
-
-   return EINA_FALSE;
-}
-
 EOLIAN Eina_Bool
 _elm_atspi_bridge_connected_get(const Eo *obj EINA_UNUSED, Elm_Atspi_Bridge_Data *pd)
 {