x11: feed pointer events
authorJaehoon Jeong <jh01.j@samsung.com>
Tue, 18 Aug 2015 12:29:12 +0000 (21:29 +0900)
committer김태균 <tkq.kim@samsung.com>
Thu, 20 Aug 2015 05:38:35 +0000 (14:38 +0900)
 - TODO: axis up/down, keyboard events

Change-Id: I2eb64e994aab6c7bbbfed938e70e1b72fd08d805

src/lib/x11/x11-input.c
src/lib/x11/x11-internal.h

index ed4f478..693f022 100644 (file)
@@ -11,36 +11,52 @@ x11_handle_input_event(x11_seat_t* seat, uint32_t type, xcb_generic_event_t* xev
     case XCB_ENTER_NOTIFY:
         {
             PEPPER_TRACE("enter\n");
-            break;
         }
+        break;
     case XCB_LEAVE_NOTIFY:
         {
             PEPPER_TRACE("leave\n");
-            break;
         }
+        break;
     case XCB_KEY_PRESS:
     case XCB_KEY_RELEASE:
         break;
     case XCB_BUTTON_PRESS:
         {
-            xcb_button_press_event_t *bp = (xcb_button_press_event_t *)xev;
+            xcb_button_press_event_t      *bp = (xcb_button_press_event_t *)xev;
+            pepper_pointer_button_event_t  event;
+
             switch (bp->detail)
             {
             case XCB_BUTTON_INDEX_1:/* FIXME: LEFT */
-                PEPPER_TRACE("left click\n");
-                break;
             case XCB_BUTTON_INDEX_3:/* FIXME: RIGHT */
-                PEPPER_TRACE("right click\n");
+                {
+                }
+                break;
+            case XCB_BUTTON_INDEX_4:
+                /* TODO: axis up */
+                break;
+            case XCB_BUTTON_INDEX_5:
+                /* TODO: axis down */
                 break;
             default:
                 PEPPER_TRACE("wheel or something pressed\n");
                 break;
             }
+
+            event.time   = bp->time;
+            event.button = bp->detail;
+            event.state  = WL_POINTER_BUTTON_STATE_PRESSED; /* FIXME */
+
+            pepper_object_emit_event((pepper_object_t *)seat->pointer,
+                                     PEPPER_EVENT_INPUT_DEVICE_POINTER_BUTTON, &event);
         }
         break;
     case XCB_BUTTON_RELEASE:
         {
-            xcb_button_release_event_t *br = (xcb_button_release_event_t *)xev;
+            xcb_button_release_event_t    *br = (xcb_button_release_event_t *)xev;
+            pepper_pointer_button_event_t  event;
+
             switch (br->detail)
             {
             case XCB_BUTTON_INDEX_1:/* FIXME: LEFT */
@@ -53,19 +69,31 @@ x11_handle_input_event(x11_seat_t* seat, uint32_t type, xcb_generic_event_t* xev
                 PEPPER_TRACE("wheel or something pressed\n");
                 break;
             }
+
+            event.time   = br->time;
+            event.button = br->detail;
+            event.state  = WL_POINTER_BUTTON_STATE_RELEASED; /* FIXME */
+
+            pepper_object_emit_event((pepper_object_t *)seat->pointer,
+                                     PEPPER_EVENT_INPUT_DEVICE_POINTER_BUTTON, &event);
         }
         break;
     case XCB_MOTION_NOTIFY:
         {
-            xcb_motion_notify_event_t *motion = (xcb_motion_notify_event_t *)xev;
-            UNUSED(motion);
+            xcb_motion_notify_event_t     *motion = (xcb_motion_notify_event_t *)xev;
+            pepper_pointer_motion_event_t  event;
+
+            event.time = motion->time;
+            event.x = motion->event_x;
+            event.y = motion->event_y;
+
+            pepper_object_emit_event((pepper_object_t *)seat->pointer,
+                                     PEPPER_EVENT_INPUT_DEVICE_POINTER_MOTION_ABSOLUTE, &event);
         }
         break;
     default :
         PEPPER_ERROR("unknown input event, [0x%x]\n", type);
     }
-
-    /* TODO: send input event */
 }
 
 void
@@ -94,6 +122,15 @@ x11_seat_destroy(void *data)
 {
     x11_seat_t *seat = (x11_seat_t *)data;
 
+    if (seat->pointer)
+        pepper_input_device_destroy(seat->pointer);
+
+    if (seat->keyboard)
+        pepper_input_device_destroy(seat->keyboard);
+
+    if (seat->conn)
+        seat->conn->seat = NULL;
+
     free(seat);
 }
 
@@ -142,7 +179,9 @@ pepper_x11_seat_create(pepper_x11_connection_t* conn)
     if (!seat->pointer)
     {
         PEPPER_ERROR("failed to create pepper pointer device\n");
-        /* TODO: error handling */
+
+        x11_seat_destroy(seat);
+        return ;
     }
     seat->caps |= WL_SEAT_CAPABILITY_POINTER;
 
@@ -151,10 +190,13 @@ pepper_x11_seat_create(pepper_x11_connection_t* conn)
     if (!seat->keyboard)
     {
         PEPPER_ERROR("failed to create pepper keyboard device\n");
-        /* TODO: error handling */
+
+        x11_seat_destroy(seat);
+        return ;
     }
     seat->caps |= WL_SEAT_CAPABILITY_KEYBOARD;
 
     /* x-connection has only 1 seat */
     conn->seat = seat;
+    seat->conn = conn;
 }
index 9a45172..69e1d27 100644 (file)
@@ -68,6 +68,8 @@ struct x11_output
 
 struct x11_seat
 {
+    pepper_x11_connection_t        *conn;
+
     pepper_input_device_t          *pointer;
     pepper_input_device_t          *keyboard;
     pepper_input_device_t          *touch;