desktop-shell: Implement defualt pointer grab
authorJaehoon Jeong <jh01.j@samsung.com>
Fri, 21 Aug 2015 13:20:41 +0000 (22:20 +0900)
committer김태균 <tkq.kim@samsung.com>
Mon, 24 Aug 2015 05:58:07 +0000 (14:58 +0900)
Change-Id: I67354a57e1c90f42334cede8eb3e3d3b4eefe4c9

src/lib/desktop-shell/shell.c

index 43495ab..50a41e7 100644 (file)
@@ -93,24 +93,96 @@ shell_pointer_default_grab_motion(shell_pointer_grab_t *grab,
                                   int32_t x, int32_t y, uint32_t time, void *userdata)
 {
     /* TODO */
-    PEPPER_ERROR("[%d, %d]\n", x, y);
+    shell_seat_t        *shseat = grab->shseat;
+    pepper_pointer_t    *pointer = pepper_seat_get_pointer(shseat->seat);
+    pepper_view_t       *view;
+    pepper_view_t       *pointer_focus_view;
+
+    view                = pepper_compositor_pick_view(shseat->shell->compositor, x, y);
+    pointer_focus_view  = pepper_pointer_get_focus_view(pointer);
+
+    if (view != pointer_focus_view )
+    {
+        /* Send pointer_leave  */
+        if (pointer_focus_view)
+        {
+            pepper_pointer_send_leave(pointer, pointer_focus_view);
+        }
+
+        /* Send pointer enter */
+        if (view)
+        {
+            pepper_pointer_send_enter(pointer, view);
+        }
+
+        pepper_pointer_set_focus_view(pointer, view);
+    }
+
+    if (view)
+    {
+        pepper_pointer_send_motion(pointer, view, time, x, y);
+    }
 }
 
 static void
 shell_pointer_default_grab_button(shell_pointer_grab_t *grab,
                                uint32_t button, uint32_t state, uint32_t time, void *userdata)
 {
-    /* TODO */
+    shell_seat_t        *shseat = grab->shseat;
+    pepper_pointer_t    *pointer = pepper_seat_get_pointer(shseat->seat);
+    pepper_view_t       *view;
+    pepper_view_t       *keyboard_focus_view;
+    int                  x, y;
+
+    pepper_pointer_get_position(pointer, &x, &y);
+
+    view = pepper_compositor_pick_view(shseat->shell->compositor, x, y);
+
+    if (view)
+    {
+        pepper_pointer_send_button(pointer, view, time, button, state);
+    }
+
+    /* Set keyboard focus */
+    if (state == 1 )    /* pressed */
+    {
+        pepper_keyboard_t *keyboard = pepper_seat_get_keyboard(shseat->seat);
+
+        keyboard_focus_view = pepper_keyboard_get_focus_view(keyboard);
+
+        /* Send keyboard_leave event */
+        if (keyboard_focus_view)
+        {
+            pepper_keyboard_send_leave(keyboard, keyboard_focus_view);
+        }
+
+        if (view)
+        {
+            pepper_keyboard_send_enter(keyboard, view);
+        }
+
+        pepper_keyboard_set_focus_view(keyboard, view);
+    }
 }
 
 static void
-shell_pointer_default_grab_axis(shell_pointer_grab_t *grab,
-                                uint32_t               time,
-                                enum wl_pointer_axis   axis,
-                                wl_fixed_t             amount,
-                                void                 *userdata)
+shell_pointer_default_grab_axis(shell_pointer_grab_t    *grab,
+                                uint32_t                 time,
+                                enum wl_pointer_axis     axis,
+                                wl_fixed_t               amount,
+                                void                    *userdata)
 {
-    /* TODO */
+    shell_seat_t        *shseat = grab->shseat;
+    pepper_pointer_t    *pointer = pepper_seat_get_pointer(shseat->seat);
+    pepper_view_t       *view;
+    int                  x, y;
+
+    pepper_pointer_get_position(pointer, &x, &y);
+
+    view = pepper_compositor_pick_view(shseat->shell->compositor, x, y);
+
+    if (view)
+        pepper_pointer_send_axis(pointer, view, time, axis, amount);
 }
 
 shell_pointer_grab_interface_t shell_pointer_default_grab =