atspi: notify registry daemon about keyboard events.
authorLukasz Stanislawski <l.stanislaws@samsung.com>
Mon, 16 Jun 2014 06:16:39 +0000 (15:16 +0900)
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>
Mon, 16 Jun 2014 06:16:39 +0000 (15:16 +0900)
Test Plan: elemeentary_test with Orca Screen reader 3.10.1

Reviewers: raster, z.kosinski

Reviewed By: raster

Differential Revision: https://phab.enlightenment.org/D1025

legacy/elementary/src/lib/elm_atspi_bridge.c
legacy/elementary/src/lib/elm_priv.h
legacy/elementary/src/lib/elm_widget.c

index 83f7415..3ddacf3 100644 (file)
@@ -3305,3 +3305,47 @@ _elm_atspi_bridge_shutdown(void)
         _root = NULL;
      }
 }
+
+static void
+_iter_marshall_key_event(Eldbus_Message_Iter *iter, Evas_Callback_Type type, void *event)
+{
+   Eldbus_Message_Iter *struct_iter;
+
+   EINA_SAFETY_ON_NULL_RETURN(event);
+
+   struct_iter = eldbus_message_iter_container_new(iter, 'r', NULL);
+
+   if (type == EVAS_CALLBACK_KEY_DOWN)
+     {
+        Evas_Event_Key_Down *kde = event;
+        const char *str = kde->string ? kde->string : "";
+        int is_text = kde->string ? 1 : 0;
+        eldbus_message_iter_arguments_append(struct_iter, "uiiiisb", ATSPI_KEY_PRESSED_EVENT, 0, kde->keycode, 0, kde->timestamp, str, is_text);
+     }
+   else if (type == EVAS_CALLBACK_KEY_UP)
+     {
+        Evas_Event_Key_Up *kue = event;
+        const char *str = kue->string ? kue->string : "";
+        int is_text = kue->string ? 1 : 0;
+        eldbus_message_iter_arguments_append(struct_iter, "uiiiisb", ATSPI_KEY_RELEASED_EVENT, 0, kue->keycode, 0, kue->timestamp, str, is_text);
+     }
+
+   eldbus_message_iter_container_close(iter, struct_iter);
+}
+
+EAPI void
+_elm_atspi_bridge_key_event_notify(Evas_Callback_Type type, void *event)
+{
+   Eldbus_Message *msg;
+   Eldbus_Message_Iter *iter;
+
+   if (!_init_count) return;
+   if ((type != EVAS_CALLBACK_KEY_DOWN) && (type != EVAS_CALLBACK_KEY_UP)) return;
+
+   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, type, event);
+
+   eldbus_connection_send(_a11y_bus, msg, NULL, NULL, -1);
+}
index c9994df..d76843d 100644 (file)
@@ -348,6 +348,7 @@ Eo                   *_elm_atspi_root_get(void);
 
 void                 _elm_atspi_bridge_init(void);
 void                 _elm_atspi_bridge_shutdown(void);
+void                 _elm_atspi_bridge_key_event_notify(Evas_Callback_Type type, void *event);
 
 void                 _elm_prefs_init(void);
 void                 _elm_prefs_shutdown(void);
index 0263c25..6d24f0a 100644 (file)
@@ -615,6 +615,9 @@ _propagate_event(void *data,
       default:
          break;
      }
+   if (_elm_config->atspi_mode)
+     _elm_atspi_bridge_key_event_notify(type, event_info);
+
 
    elm_widget_event_propagate(obj, type, event_info, event_flags);
 }