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;
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;
//
// 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);
//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
_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;
_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)
{
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)
{