Ecore_Wayland: Updates to work with latest Wayland:
authorChristopher Michael <cpmichael1@comcast.net>
Wed, 4 Jul 2012 07:16:29 +0000 (07:16 +0000)
committerChristopher Michael <cpmichael1@comcast.net>
Wed, 4 Jul 2012 07:16:29 +0000 (07:16 +0000)
  Add pointer frame callback. Add pointer surface listener.
  Use doubles for input surface position.
  Fix dnd function prototype to use wl_data_offer now.
  Fix dnd_add function to not use proxy_create anymore.
  Fix regression where window resizing down would leave artifacts.
    - Need to update the window allocation size before attaching the
new buffer.
  Fix set_transient & set_popup to use the parent surface, not the
shell surface.

SVN revision: 73254

legacy/ecore/src/lib/ecore_wayland/Ecore_Wayland.h
legacy/ecore/src/lib/ecore_wayland/ecore_wl_dnd.c
legacy/ecore/src/lib/ecore_wayland/ecore_wl_input.c
legacy/ecore/src/lib/ecore_wayland/ecore_wl_private.h
legacy/ecore/src/lib/ecore_wayland/ecore_wl_window.c

index ec0776b..5ff3293 100644 (file)
@@ -122,6 +122,7 @@ struct _Ecore_Wl_Input
    struct wl_touch *touch;
 
    struct wl_surface *cursor_surface;
+   struct wl_callback *cursor_frame_cb;
 
    struct wl_data_device *data_device;
 
index 39e4f1c..164693f 100644 (file)
@@ -15,7 +15,7 @@ static const struct wl_data_offer_listener _ecore_wl_data_offer_listener =
 };
 
 void 
-_ecore_wl_dnd_add(Ecore_Wl_Input *input, struct wl_data_device *data_device, unsigned int id)
+_ecore_wl_dnd_add(Ecore_Wl_Input *input, struct wl_data_device *data_device __UNUSED__, struct wl_data_offer *offer)
 {
    Ecore_Wl_Dnd_Source *source;
 
@@ -25,10 +25,7 @@ _ecore_wl_dnd_add(Ecore_Wl_Input *input, struct wl_data_device *data_device, uns
    wl_array_init(&source->types);
    source->refcount = 1;
    source->input = input;
-   /* FIXME: Change this when wayland has typesafe wrapper for it */
-   source->offer = (struct wl_data_offer *)
-     wl_proxy_create_for_id((struct wl_proxy *)data_device, 
-                            id, &wl_data_offer_interface);
+   source->offer = offer;
    wl_data_offer_add_listener(source->offer, 
                               &_ecore_wl_data_offer_listener, source);
 }
index 0239924..0c5036e 100644 (file)
@@ -46,6 +46,7 @@ static void _ecore_wl_input_cb_pointer_leave(void *data, struct wl_pointer *poin
 static void _ecore_wl_input_cb_pointer_motion(void *data, struct wl_pointer *pointer __UNUSED__, unsigned int timestamp, wl_fixed_t sx, wl_fixed_t sy);
 static void _ecore_wl_input_cb_pointer_button(void *data, struct wl_pointer *pointer __UNUSED__, unsigned int serial, unsigned int timestamp, unsigned int button, unsigned int state);
 static void _ecore_wl_input_cb_pointer_axis(void *data, struct wl_pointer *pointer __UNUSED__, unsigned int timestamp, unsigned int axis, wl_fixed_t value);
+static void _ecore_wl_input_cb_pointer_frame(void *data, struct wl_callback *callback, unsigned int timestamp __UNUSED__);
 static void _ecore_wl_input_cb_keyboard_keymap(void *data, struct wl_keyboard *keyboard __UNUSED__, unsigned int format, int fd, unsigned int size);
 static void _ecore_wl_input_cb_keyboard_enter(void *data, struct wl_keyboard *keyboard __UNUSED__, unsigned int serial, struct wl_surface *surface, struct wl_array *keys __UNUSED__);
 static void _ecore_wl_input_cb_keyboard_leave(void *data, struct wl_keyboard *keyboard __UNUSED__, unsigned int serial, struct wl_surface *surface);
@@ -56,7 +57,7 @@ static void _ecore_wl_input_cb_touch_up(void *data, struct wl_touch *touch __UNU
 static void _ecore_wl_input_cb_touch_motion(void *data, struct wl_touch *touch __UNUSED__, unsigned int timestamp, int id __UNUSED__, wl_fixed_t x, wl_fixed_t y);
 static void _ecore_wl_input_cb_touch_frame(void *data __UNUSED__, struct wl_touch *touch __UNUSED__);
 static void _ecore_wl_input_cb_touch_cancel(void *data __UNUSED__, struct wl_touch *touch __UNUSED__);
-static void _ecore_wl_input_cb_data_offer(void *data, struct wl_data_device *data_device, unsigned int id);
+static void _ecore_wl_input_cb_data_offer(void *data, struct wl_data_device *data_device, struct wl_data_offer *offer);
 static void _ecore_wl_input_cb_data_enter(void *data, struct wl_data_device *data_device, unsigned int timestamp, struct wl_surface *surface, wl_fixed_t x, wl_fixed_t y, struct wl_data_offer *offer);
 static void _ecore_wl_input_cb_data_leave(void *data, struct wl_data_device *data_device);
 static void _ecore_wl_input_cb_data_motion(void *data, struct wl_data_device *data_device, unsigned int timestamp, wl_fixed_t x, wl_fixed_t y);
@@ -118,6 +119,11 @@ static const struct wl_data_device_listener _ecore_wl_data_listener =
    _ecore_wl_input_cb_data_selection
 };
 
+static const struct wl_callback_listener _ecore_wl_pointer_surface_listener = 
+{
+   _ecore_wl_input_cb_pointer_frame
+};
+
 /* local variables */
 static int _pointer_x, _pointer_y;
 
@@ -184,6 +190,9 @@ ecore_wl_input_cursor_from_name_set(Ecore_Wl_Input *input, const char *cursor_na
         wl_surface_attach(input->cursor_surface, buffer, 0, 0);
         wl_surface_damage(input->cursor_surface, 0, 0, 
                           cursor_image->width, cursor_image->height);
+
+        if (!input->cursor_frame_cb)
+          _ecore_wl_input_cb_pointer_frame(input, NULL, 0);
      }
 }
 
@@ -243,16 +252,17 @@ _ecore_wl_input_del(Ecore_Wl_Input *input)
    input->selection_source = NULL;
 
    if (input->data_device) wl_data_device_destroy(input->data_device);
-   if (input->seat) wl_seat_destroy(input->seat);
-   wl_list_remove(&input->link);
-
    if (input->xkb.state)
      xkb_state_unref(input->xkb.state);
    if (input->xkb.keymap)
      xkb_map_unref(input->xkb.keymap);
+
    if (input->cursor_surface)
      wl_surface_destroy(input->cursor_surface);
 
+   wl_list_remove(&input->link);
+   if (input->seat) wl_seat_destroy(input->seat);
+
    free(input);
 }
 
@@ -322,9 +332,10 @@ _ecore_wl_input_cb_pointer_motion(void *data, struct wl_pointer *pointer __UNUSE
 
    input->timestamp = timestamp;
 
-   /* TODO: FIXME: NB: Weston window code has set pointer image here also */
    if (input->pointer_focus)
      _ecore_wl_input_mouse_move_send(input, input->pointer_focus, timestamp);
+
+   ecore_wl_input_cursor_default_restore(input);
 }
 
 static void 
@@ -376,6 +387,31 @@ _ecore_wl_input_cb_pointer_axis(void *data, struct wl_pointer *pointer __UNUSED_
 }
 
 static void 
+_ecore_wl_input_cb_pointer_frame(void *data, struct wl_callback *callback, unsigned int timestamp __UNUSED__)
+{
+   Ecore_Wl_Input *input;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(input = data)) return;
+
+   if (callback)
+     {
+        if (callback != input->cursor_frame_cb) return;
+        wl_callback_destroy(callback);
+        input->cursor_frame_cb = NULL;
+     }
+
+   /* TODO: Finish me */
+   if (!input->cursor_frame_cb)
+     {
+        input->cursor_frame_cb = wl_surface_frame(input->cursor_surface);
+        wl_callback_add_listener(input->cursor_frame_cb, 
+                                 &_ecore_wl_pointer_surface_listener, input);
+     }
+}
+
+static void 
 _ecore_wl_input_cb_keyboard_keymap(void *data, struct wl_keyboard *keyboard __UNUSED__, unsigned int format, int fd, unsigned int size)
 {
    Ecore_Wl_Input *input;
@@ -596,8 +632,8 @@ _ecore_wl_input_cb_pointer_enter(void *data, struct wl_pointer *pointer __UNUSED
         input->timestamp = (tv.tv_sec * 1000 + tv.tv_usec / 1000);
      }
 
-   input->sx = wl_fixed_to_int(sx);
-   input->sy = wl_fixed_to_int(sy);
+   input->sx = wl_fixed_to_double(sx);
+   input->sy = wl_fixed_to_double(sy);
    input->display->serial = serial;
    input->pointer_enter_serial = serial;
 
@@ -799,11 +835,11 @@ _ecore_wl_input_cb_touch_cancel(void *data __UNUSED__, struct wl_touch *touch __
 }
 
 static void 
-_ecore_wl_input_cb_data_offer(void *data, struct wl_data_device *data_device, unsigned int id)
+_ecore_wl_input_cb_data_offer(void *data, struct wl_data_device *data_device, struct wl_data_offer *offer)
 {
    LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   _ecore_wl_dnd_add(data, data_device, id);
+   _ecore_wl_dnd_add(data, data_device, offer);
 }
 
 static void 
index 20d7626..63a5f12 100644 (file)
@@ -78,7 +78,7 @@ void _ecore_wl_input_add(Ecore_Wl_Display *ewd, unsigned int id);
 void _ecore_wl_input_del(Ecore_Wl_Input *input);
 void _ecore_wl_input_pointer_xy_get(int *x, int *y);
 
-void _ecore_wl_dnd_add(Ecore_Wl_Input *input, struct wl_data_device *data_device, unsigned int id);
+void _ecore_wl_dnd_add(Ecore_Wl_Input *input, struct wl_data_device *data_device, struct wl_data_offer *offer);
 void _ecore_wl_dnd_enter(void *data, struct wl_data_device *data_device __UNUSED__, unsigned int timestamp __UNUSED__, struct wl_surface *surface, int x, int y, struct wl_data_offer *offer);
 void _ecore_wl_dnd_leave(void *data, struct wl_data_device *data_device __UNUSED__);
 void _ecore_wl_dnd_motion(void *data, struct wl_data_device *data_device __UNUSED__, unsigned int timestamp __UNUSED__, int x, int y);
index 45a82a3..f642aec 100644 (file)
@@ -270,9 +270,8 @@ ecore_wl_window_buffer_attach(Ecore_Wl_Window *win, struct wl_buffer *buffer, in
       case ECORE_WL_WINDOW_BUFFER_TYPE_SHM:
         if (win->surface)
           {
-             if (buffer)
-               wl_surface_attach(win->surface, buffer, x, y);
-
+             /* if (buffer) */
+             wl_surface_attach(win->surface, buffer, x, y);
              wl_surface_damage(win->surface, 0, 0, 
                                win->allocation.w, win->allocation.h);
 
@@ -337,14 +336,14 @@ ecore_wl_window_show(Ecore_Wl_Window *win)
         break;
       case ECORE_WL_WINDOW_TYPE_TRANSIENT:
         wl_shell_surface_set_transient(win->shell_surface, 
-                                       win->parent->shell_surface, 
+                                       win->parent->surface, 
                                        win->allocation.x, win->allocation.y, 0);
         break;
       case ECORE_WL_WINDOW_TYPE_MENU:
         wl_shell_surface_set_popup(win->shell_surface, 
                                    _ecore_wl_disp->input->seat,
                                    _ecore_wl_disp->serial,
-                                   win->parent->shell_surface, 
+                                   win->parent->surface, 
                                    win->allocation.x, win->allocation.y, 0);
         break;
       case ECORE_WL_WINDOW_TYPE_NONE: