Add dbus_gesture_adapter to broadcast gestures.
authorLukasz Stanislawski <l.stanislaws@samsung.com>
Tue, 23 Jun 2015 12:07:09 +0000 (14:07 +0200)
committerLukasz Stanislawski <l.stanislaws@samsung.com>
Tue, 23 Jun 2015 12:10:03 +0000 (14:10 +0200)
Change-Id: I6cd0164dc867e39c94abed948cf43430efdaae2e

include/dbus_gesture_adapter.h [new file with mode: 0644]
include/screen_reader_gestures.h
src/dbus_gesture_adapter.c [new file with mode: 0644]
src/navigator.c

diff --git a/include/dbus_gesture_adapter.h b/include/dbus_gesture_adapter.h
new file mode 100644 (file)
index 0000000..ec42f29
--- /dev/null
@@ -0,0 +1,12 @@
+#ifndef DBUS_GESTURE_ADAPTER_H_
+#define DBUS_GESTURE_ADAPTER_H_
+
+#include "screen_reader_gestures.h"
+
+void dbus_gesture_adapter_init(void);
+
+void dbus_gesture_adapter_shutdown(void);
+
+void dbus_gesture_adapter_emit(const Gesture_Info *info);
+
+#endif
index 757c47d..ba82d05 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef SCREEN_READER_GESTURES_H_
-#define SCREEN_READER_GESTURES_H
+#define SCREEN_READER_GESTURES_H_
 
 #include <Ecore.h>
 #include <Ecore_X.h>
diff --git a/src/dbus_gesture_adapter.c b/src/dbus_gesture_adapter.c
new file mode 100644 (file)
index 0000000..046b467
--- /dev/null
@@ -0,0 +1,213 @@
+#include "dbus_gesture_adapter.h"
+#include "logger.h"
+
+#include <Eldbus.h>
+
+#define E_A11Y_SERVICE_BUS_NAME "com.samsung.EModule"
+#define E_A11Y_SERVICE_NAVI_IFC_NAME "com.samsung.GestureNavigation"
+#define E_A11Y_SERVICE_NAVI_OBJ_PATH "/com/samsung/GestureNavigation"
+
+static Eldbus_Connection *conn;
+static Eldbus_Service_Interface *service;
+static Eldbus_Pending *addr_req;
+
+enum _Signals
+{
+   GESTURE_DETECTED = 0,
+};
+
+static const Eldbus_Signal _signals[] = {
+   [GESTURE_DETECTED] = {"GestureDetected", ELDBUS_ARGS({"siiiiu", NULL}), 0},
+   {NULL, ELDBUS_ARGS({NULL, NULL}), 0}
+};
+
+static const Eldbus_Service_Interface_Desc desc = {
+   E_A11Y_SERVICE_NAVI_IFC_NAME, NULL, _signals, NULL, NULL, NULL
+};
+
+void _on_get_a11y_address(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending)
+{
+   const char *sock_addr;
+   const char *errname, *errmsg;
+   Eldbus_Connection *session = data;
+
+   if (eldbus_message_error_get(msg, &errname, &errmsg))
+     {
+        ERROR("GetAddress failed: %s %s", errname, errmsg);
+        return;
+     }
+
+   if (!eldbus_message_arguments_get(msg, "s", &sock_addr) || !sock_addr)
+     {
+        ERROR("Could not get A11Y Bus socket address.");
+        goto end;
+     }
+
+   if (!(conn = eldbus_address_connection_get(sock_addr)))
+     {
+        ERROR("Failed to connect to %s", sock_addr);
+        goto end;
+     }
+
+   if (!(service = eldbus_service_interface_register(conn, E_A11Y_SERVICE_NAVI_OBJ_PATH, &desc)))
+     {
+        ERROR("Failed to register %s interface", E_A11Y_SERVICE_NAVI_IFC_NAME);
+        eldbus_connection_unref(conn);
+        conn = NULL;
+        goto end;
+     }
+
+   eldbus_name_request(conn, E_A11Y_SERVICE_BUS_NAME, ELDBUS_NAME_REQUEST_FLAG_DO_NOT_QUEUE, NULL, NULL);
+
+end:
+   eldbus_connection_unref(session);
+}
+
+void dbus_gesture_adapter_init(void)
+{
+   Eldbus_Connection *session;
+   Eldbus_Message *msg;
+
+   eldbus_init();
+
+   if (!(session = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION)))
+     {
+        ERROR("Unable to get session bus");
+        return;
+     }
+
+   if (!(msg = eldbus_message_method_call_new("org.a11y.Bus", "/org/a11y/bus",
+                                      "org.a11y.Bus", "GetAddress")))
+     {
+        ERROR("DBus message allocation failed");
+        goto fail_msg;
+     }
+
+   if (!(addr_req = eldbus_connection_send(session, msg, _on_get_a11y_address, session, -1)))
+     {
+        ERROR("Message send failed");
+        goto fail_send;
+     }
+
+   return;
+
+fail_send:
+   eldbus_message_unref(msg);
+fail_msg:
+   eldbus_connection_unref(session);
+}
+
+void dbus_gesture_adapter_shutdown(void)
+{
+   if (addr_req) eldbus_pending_cancel(addr_req);
+   if (service) eldbus_service_object_unregister(service);
+   if (conn) eldbus_connection_unref(conn);
+
+   conn = NULL;
+   addr_req = NULL;
+   service = NULL;
+
+   eldbus_shutdown();
+}
+
+static const char *_gesture_enum_to_string(Gesture g)
+{
+   switch(g)
+     {
+      case ONE_FINGER_HOVER:
+         return "OneFingerHover";
+      case TWO_FINGERS_HOVER:
+         return "TwoFingersHover";
+      case THREE_FINGERS_HOVER:
+         return "ThreeFingersHover";
+      case ONE_FINGER_FLICK_LEFT:
+         return "OneFingerFlickLeft";
+      case ONE_FINGER_FLICK_RIGHT:
+         return "OneFingerFlickRight";
+      case ONE_FINGER_FLICK_UP:
+         return "OneFingerFlickUp";
+      case ONE_FINGER_FLICK_DOWN:
+         return "OneFingerFlickDown";
+      case TWO_FINGERS_FLICK_UP:
+         return "TwoFingersFlickUp";
+      case TWO_FINGERS_FLICK_DOWN:
+         return "TwoFingersFlickDown";
+      case TWO_FINGERS_FLICK_LEFT:
+         return "TwoFingersFlickLeft";
+      case TWO_FINGERS_FLICK_RIGHT:
+         return "TwoFingersFlickRight";
+      case THREE_FINGERS_FLICK_LEFT:
+         return "ThreeFingersFlickLeft";
+      case THREE_FINGERS_FLICK_RIGHT:
+         return "ThreeFingersFlickRight";
+      case THREE_FINGERS_FLICK_UP:
+         return "ThreeFingersFlickUp";
+      case THREE_FINGERS_FLICK_DOWN:
+         return "ThreeFingersFlickDown";
+      case ONE_FINGER_SINGLE_TAP:
+         return "OneFingerSingleTap";
+      case ONE_FINGER_DOUBLE_TAP:
+         return "OneFingerDoubleTap";
+      case ONE_FINGER_TRIPLE_TAP:
+         return "OneFingerTripleTap";
+      case TWO_FINGERS_SINGLE_TAP:
+         return "TwoFingersSingleTap";
+      case TWO_FINGERS_DOUBLE_TAP:
+         return "TwoFingersDoubleTap";
+      case TWO_FINGERS_TRIPLE_TAP:
+         return "TwoFingersTripleTap";
+      case THREE_FINGERS_SINGLE_TAP:
+         return "ThreeFingersSingleTap";
+      case THREE_FINGERS_DOUBLE_TAP:
+         return "ThreeFingersDoubleTap";
+      case THREE_FINGERS_TRIPLE_TAP:
+         return "ThreeFingersTripleTap";
+      case ONE_FINGER_FLICK_LEFT_RETURN:
+         return "OneFingerFlickLeftReturn";
+      case ONE_FINGER_FLICK_RIGHT_RETURN:
+         return "OneFingerFlickRightReturn";
+      case ONE_FINGER_FLICK_UP_RETURN:
+         return "OneFingerFlickUpReturn";
+      case ONE_FINGER_FLICK_DOWN_RETURN:
+         return "OneFingerFlickDownReturn";
+      case TWO_FINGERS_FLICK_LEFT_RETURN:
+         return "TwoFingersFlickLeftReturn";
+      case TWO_FINGERS_FLICK_RIGHT_RETURN:
+         return "TwoFingersFlickRightReturn";
+      case TWO_FINGERS_FLICK_UP_RETURN:
+         return "TwoFingersFlickUpReturn";
+      case TWO_FINGERS_FLICK_DOWN_RETURN:
+         return "TwoFingersFlickDownReturn";
+      case THREE_FINGERS_FLICK_LEFT_RETURN:
+         return "ThreeFingersFlickLeftReturn";
+      case THREE_FINGERS_FLICK_RIGHT_RETURN:
+         return "ThreeFingersFlickRightReturn";
+      case THREE_FINGERS_FLICK_UP_RETURN:
+         return "ThreeFingersFlickUpReturn";
+      case THREE_FINGERS_FLICK_DOWN_RETURN:
+         return "ThreeFingersFlickDownReturn";
+      default:
+         ERROR("unhandled gesture enum");
+         return NULL;
+     }
+}
+
+void dbus_gesture_adapter_emit(const Gesture_Info *info)
+{
+   const char *name;
+
+   if (!service)
+     return;
+
+   name = _gesture_enum_to_string(info->type);
+   if (!name)
+     return;
+
+   if (!eldbus_service_signal_emit(service, GESTURE_DETECTED, name, info->x_beg, info->y_beg,
+                                   info->x_end, info->y_end, info->state))
+     {
+        ERROR("Unable to send GestureDetected signal");
+     }
+   else
+     DEBUG("Successfullt send GestureDetected singal");
+}
index 4310caf..6bbb285 100644 (file)
@@ -16,6 +16,7 @@
 #include "screen_reader_haptic.h"
 #include "screen_reader_tts.h"
 #include "screen_reader_gestures.h"
+#include "dbus_gesture_adapter.h"
 
 #define QUICKPANEL_DOWN TRUE
 #define QUICKPANEL_UP FALSE
@@ -1566,6 +1567,8 @@ _is_active_entry(void)
 
 static void on_gesture_detected(void *data, Gesture_Info *info)
 {
+   dbus_gesture_adapter_emit(info);
+
    switch(info->type)
       {
       case ONE_FINGER_HOVER:
@@ -1703,6 +1706,7 @@ void navigator_init(void)
    DEBUG("START");
    screen_reader_gestures_tracker_register(on_gesture_detected, NULL);
    // register on active_window
+   dbus_gesture_adapter_init();
    window_tracker_init();
    window_tracker_register(on_window_activate, NULL);
    window_tracker_active_window_request();
@@ -1730,6 +1734,7 @@ void navigator_shutdown(void)
          flat_navi_context_free(context);
          context = NULL;
       }
+   dbus_gesture_adapter_shutdown();
    object_cache_shutdown();
    app_tracker_shutdown();
    window_tracker_shutdown();