diff options
author | Kristian Høgsberg <krh@bitplanet.net> | 2012-05-16 15:29:20 -0400 |
---|---|---|
committer | Christopher James Halse Rogers <christopher.halse.rogers@canonical.com> | 2012-06-13 15:26:20 +1000 |
commit | ff307f0458c67255d712b7f08f4fc058c951c442 (patch) | |
tree | 1583dd5e6c31f65d00fa9f5d88ead73e1af7b80a | |
parent | f6ea000450988f411260701df11ad381c98f52df (diff) |
Update to wl_seat protocol change
-rw-r--r-- | hw/xfree86/xwayland/xwayland-cursor.c | 16 | ||||
-rw-r--r-- | hw/xfree86/xwayland/xwayland-input.c | 268 | ||||
-rw-r--r-- | hw/xfree86/xwayland/xwayland-private.h | 8 | ||||
-rw-r--r-- | hw/xfree86/xwayland/xwayland-window.c | 14 | ||||
-rw-r--r-- | hw/xfree86/xwayland/xwayland.c | 14 |
5 files changed, 145 insertions, 175 deletions
diff --git a/hw/xfree86/xwayland/xwayland-cursor.c b/hw/xfree86/xwayland/xwayland-cursor.c index f53ef94ca..2bbebcb7e 100644 --- a/hw/xfree86/xwayland/xwayland-cursor.c +++ b/hw/xfree86/xwayland/xwayland-cursor.c @@ -152,7 +152,7 @@ xwl_set_cursor(DeviceIntPtr device, ScreenPtr screen, CursorPtr cursor, int x, int y) { struct xwl_screen *xwl_screen; - struct xwl_input_device *xwl_input_device; + struct xwl_seat *xwl_seat; struct wl_buffer *buffer; if (!cursor) @@ -160,17 +160,17 @@ xwl_set_cursor(DeviceIntPtr device, xwl_screen = xwl_screen_get(screen); - if (!xwl_screen || xorg_list_is_empty(&xwl_screen->input_device_list)) - return ; + if (!xwl_screen || xorg_list_is_empty(&xwl_screen->seat_list)) + return; - xwl_input_device = xorg_list_first_entry(&xwl_screen->input_device_list, - struct xwl_input_device, link); + xwl_seat = xorg_list_first_entry(&xwl_screen->seat_list, + struct xwl_seat, link); buffer = dixGetPrivate(&cursor->devPrivates, &xwl_cursor_private_key); - wl_input_device_attach(xwl_input_device->input_device, - xwl_input_device->pointer_enter_serial, buffer, - cursor->bits->xhot, cursor->bits->yhot); + wl_pointer_attach(xwl_seat->wl_pointer, + xwl_seat->pointer_enter_serial, buffer, + cursor->bits->xhot, cursor->bits->yhot); } static void diff --git a/hw/xfree86/xwayland/xwayland-input.c b/hw/xfree86/xwayland/xwayland-input.c index e8779ff01..706623ad2 100644 --- a/hw/xfree86/xwayland/xwayland-input.c +++ b/hw/xfree86/xwayland/xwayland-input.c @@ -234,7 +234,7 @@ xwl_input_setup(pointer module, pointer opts, int *errmaj, int *errmin) } static DeviceIntPtr -device_added(struct xwl_input_device *xwl_input_device, const char *driver) +device_added(struct xwl_seat *xwl_seat, const char *driver) { DeviceIntPtr dev = NULL; InputInfoPtr pInfo; @@ -246,13 +246,12 @@ device_added(struct xwl_input_device *xwl_input_device, const char *driver) pInfo->driver = xstrdup(driver); - if (asprintf(&pInfo->name, "%s:%d", - pInfo->driver, xwl_input_device->id) == -1) { + if (asprintf(&pInfo->name, "%s:%d", pInfo->driver, xwl_seat->id) == -1) { free(pInfo); return NULL; } - pInfo->private = xwl_input_device; + pInfo->private = xwl_seat; rc = xf86NewInputDevice(pInfo, &dev, 1); if (rc != Success) { @@ -267,37 +266,63 @@ device_added(struct xwl_input_device *xwl_input_device, const char *driver) } static void -input_device_handle_motion(void *data, struct wl_input_device *input_device, - uint32_t time, wl_fixed_t sx_w, wl_fixed_t sy_w) +pointer_handle_enter(void *data, struct wl_pointer *pointer, + uint32_t serial, struct wl_surface *surface, + wl_fixed_t sx_w, wl_fixed_t sy_w) + +{ + struct xwl_seat *xwl_seat = data; + + xwl_seat->xwl_screen->serial = serial; + xwl_seat->pointer_enter_serial = serial; + + xwl_seat->focus_window = wl_surface_get_user_data(surface); + + SetDeviceRedirectWindow(xwl_seat->pointer, xwl_seat->focus_window->window); +} + +static void +pointer_handle_leave(void *data, struct wl_pointer *pointer, + uint32_t serial, struct wl_surface *surface) +{ + struct xwl_seat *xwl_seat = data; + + xwl_seat->xwl_screen->serial = serial; + + xwl_seat->focus_window = NULL; + SetDeviceRedirectWindow(xwl_seat->pointer, PointerRootWin); +} + +static void +pointer_handle_motion(void *data, struct wl_pointer *pointer, + uint32_t time, wl_fixed_t sx_w, wl_fixed_t sy_w) { - struct xwl_input_device *xwl_input_device = data; - struct xwl_screen *xwl_screen = xwl_input_device->xwl_screen; + struct xwl_seat *xwl_seat = data; + struct xwl_screen *xwl_screen = xwl_seat->xwl_screen; int32_t dx, dy, lx, ly; int sx = wl_fixed_to_int(sx_w); int sy = wl_fixed_to_int(sy_w); - if (!xwl_input_device->focus_window) + if (!xwl_seat->focus_window) return ; - dx = xwl_input_device->focus_window->window->drawable.x; - dy = xwl_input_device->focus_window->window->drawable.y; + dx = xwl_seat->focus_window->window->drawable.x; + dy = xwl_seat->focus_window->window->drawable.y; lx = xf86ScaleAxis(sx + dx, 0xFFFF, 0, xwl_screen->scrninfo->virtualX, 0); ly = xf86ScaleAxis(sy + dy, 0xFFFF, 0, xwl_screen->scrninfo->virtualY, 0); - xf86PostMotionEvent(xwl_input_device->pointer, - TRUE, 0, 2, lx, ly); + xf86PostMotionEvent(xwl_seat->pointer, TRUE, 0, 2, lx, ly); } static void -input_device_handle_button(void *data, struct wl_input_device *input_device, - uint32_t serial, uint32_t time, uint32_t button, - uint32_t state) +pointer_handle_button(void *data, struct wl_pointer *pointer, uint32_t serial, + uint32_t time, uint32_t button, uint32_t state) { - struct xwl_input_device *xwl_input_device = data; + struct xwl_seat *xwl_seat = data; int index; - xwl_input_device->xwl_screen->serial = serial; + xwl_seat->xwl_screen->serial = serial; switch (button) { case BTN_MIDDLE: @@ -311,19 +336,41 @@ input_device_handle_button(void *data, struct wl_input_device *input_device, break; } - xf86PostButtonEvent(xwl_input_device->pointer, - TRUE, index, state, 0, 0); + xf86PostButtonEvent(xwl_seat->pointer, TRUE, index, state, 0, 0); } static void -input_device_handle_key(void *data, struct wl_input_device *input_device, - uint32_t serial, uint32_t time, uint32_t key, - uint32_t state) +pointer_handle_axis(void *data, struct wl_pointer *pointer, + uint32_t time, uint32_t axis, int32_t value) { - struct xwl_input_device *xwl_input_device = data; + struct xwl_seat *xwl_seat = data; + int index; + + if (value == 1) + index = 4; + else if (value == -1) + index = 5; + + xf86PostButtonEvent(xwl_seat->pointer, TRUE, index, 1, 0, 0); + xf86PostButtonEvent(xwl_seat->pointer, TRUE, index, 0, 0, 0); +} + +static const struct wl_pointer_listener pointer_listener = { + pointer_handle_enter, + pointer_handle_leave, + pointer_handle_motion, + pointer_handle_button, + pointer_handle_axis, +}; + +static void +keyboard_handle_key(void *data, struct wl_keyboard *keyboard, uint32_t serial, + uint32_t time, uint32_t key, uint32_t state) +{ + struct xwl_seat *xwl_seat = data; uint32_t modifier; - xwl_input_device->xwl_screen->serial = serial; + xwl_seat->xwl_screen->serial = serial; switch (key) { case KEY_LEFTMETA: @@ -336,174 +383,95 @@ input_device_handle_key(void *data, struct wl_input_device *input_device, } if (state) - xwl_input_device->modifiers |= modifier; + xwl_seat->modifiers |= modifier; else - xwl_input_device->modifiers &= ~modifier; - - xf86PostKeyboardEvent(xwl_input_device->keyboard, key + 8, state); -} - -static void -input_device_handle_pointer_enter(void *data, - struct wl_input_device *input_device, - uint32_t serial, struct wl_surface *surface, - wl_fixed_t sx_w, wl_fixed_t sy_w) - -{ - struct xwl_input_device *xwl_input_device = data; - - xwl_input_device->xwl_screen->serial = serial; - xwl_input_device->pointer_enter_serial = serial; - - xwl_input_device->focus_window = wl_surface_get_user_data(surface); + xwl_seat->modifiers &= ~modifier; - SetDeviceRedirectWindow(xwl_input_device->pointer, - xwl_input_device->focus_window->window); + xf86PostKeyboardEvent(xwl_seat->keyboard, key + 8, state); } static void -input_device_handle_keyboard_enter(void *data, - struct wl_input_device *input_device, - uint32_t serial, - struct wl_surface *surface, - struct wl_array *keys) +keyboard_handle_enter(void *data, struct wl_keyboard *keyboard, + uint32_t serial, + struct wl_surface *surface, struct wl_array *keys) { - struct xwl_input_device *xwl_input_device = data; + struct xwl_seat *xwl_seat = data; uint32_t *k, *end; - xwl_input_device->xwl_screen->serial = serial; + xwl_seat->xwl_screen->serial = serial; - xwl_input_device->modifiers = 0; + xwl_seat->modifiers = 0; end = (uint32_t *) ((char *) keys->data + keys->size); for (k = keys->data; k < end; k++) { switch (*k) { case KEY_LEFTMETA: case KEY_RIGHTMETA: - xwl_input_device->modifiers |= MODIFIER_META; + xwl_seat->modifiers |= MODIFIER_META; break; } } } static void -input_device_handle_axis(void *data, struct wl_input_device *input_device, - uint32_t time, uint32_t axis, int32_t value) +keyboard_handle_leave(void *data, struct wl_keyboard *keyboard, + uint32_t serial, struct wl_surface *surface) { - struct xwl_input_device *xwl_input_device = data; - int index; - - if (value == 1) - index = 4; - else if (value == -1) - index = 5; - - xf86PostButtonEvent(xwl_input_device->pointer, TRUE, index, 1, 0, 0); - xf86PostButtonEvent(xwl_input_device->pointer, TRUE, index, 0, 0, 0); -} - -static void -input_device_handle_pointer_leave(void *data, - struct wl_input_device *input_device, - uint32_t serial, struct wl_surface *surface) -{ - struct xwl_input_device *xwl_input_device = data; - - xwl_input_device->xwl_screen->serial = serial; - - xwl_input_device->focus_window = NULL; - SetDeviceRedirectWindow(xwl_input_device->pointer, PointerRootWin); -} - -static void -input_device_handle_keyboard_leave(void *data, - struct wl_input_device *input_device, - uint32_t serial, - struct wl_surface *surface) -{ - struct xwl_input_device *xwl_input_device = data; + struct xwl_seat *xwl_seat = data; - xwl_input_device->xwl_screen->serial = serial; + xwl_seat->xwl_screen->serial = serial; } -static void -input_device_handle_touch_down(void *data, - struct wl_input_device *wl_input_device, - uint32_t serial, uint32_t time, - struct wl_surface *surface, - int32_t id, wl_fixed_t x, wl_fixed_t y) -{ -} - -static void -input_device_handle_touch_up(void *data, - struct wl_input_device *wl_input_device, - uint32_t serial, uint32_t time, int32_t id) -{ -} +static const struct wl_keyboard_listener keyboard_listener = { + keyboard_handle_enter, + keyboard_handle_leave, + keyboard_handle_key, +}; static void -input_device_handle_touch_motion(void *data, - struct wl_input_device *wl_input_device, - uint32_t time, int32_t id, - wl_fixed_t x, wl_fixed_t y) +seat_handle_capabilities(void *data, struct wl_seat *seat, + enum wl_seat_capability caps) { -} + struct xwl_seat *xwl_seat = data; -static void -input_device_handle_touch_frame(void *data, - struct wl_input_device *wl_input_device) -{ -} + if (caps & WL_SEAT_CAPABILITY_POINTER) { + xwl_seat->pointer = device_added(xwl_seat, "xwayland-pointer"); + xwl_seat->wl_pointer = wl_seat_get_pointer(seat); + wl_pointer_add_listener(xwl_seat->wl_pointer, + &pointer_listener, xwl_seat); + } -static void -input_device_handle_touch_cancel(void *data, - struct wl_input_device *wl_input_device) -{ + if (caps & WL_SEAT_CAPABILITY_KEYBOARD) { + xwl_seat->keyboard = device_added(xwl_seat, "xwayland-keyboard"); + xwl_seat->wl_keyboard = wl_seat_get_keyboard(seat); + wl_keyboard_add_listener(xwl_seat->wl_keyboard, + &keyboard_listener, xwl_seat); + } } -static const struct wl_input_device_listener input_device_listener = { - input_device_handle_motion, - input_device_handle_button, - input_device_handle_axis, - input_device_handle_key, - input_device_handle_pointer_enter, - input_device_handle_pointer_leave, - input_device_handle_keyboard_enter, - input_device_handle_keyboard_leave, - input_device_handle_touch_down, - input_device_handle_touch_up, - input_device_handle_touch_motion, - input_device_handle_touch_frame, - input_device_handle_touch_cancel, +static const struct wl_seat_listener seat_listener = { + seat_handle_capabilities, }; static void create_input_device(struct xwl_screen *xwl_screen, uint32_t id, uint32_t version) { - struct xwl_input_device *xwl_input_device; + struct xwl_seat *xwl_seat; - xwl_input_device = calloc(sizeof *xwl_input_device, 1); - if (xwl_input_device == NULL) { + xwl_seat = calloc(sizeof *xwl_seat, 1); + if (xwl_seat == NULL) { ErrorF("create_input ENOMEM"); return ; } - xwl_input_device->xwl_screen = xwl_screen; - xorg_list_add(&xwl_input_device->link, &xwl_screen->input_device_list); - - xwl_input_device->pointer = - device_added(xwl_input_device, "xwayland-pointer"); - xwl_input_device->keyboard = - device_added(xwl_input_device, "xwayland-keyboard"); + xwl_seat->xwl_screen = xwl_screen; + xorg_list_add(&xwl_seat->link, &xwl_screen->seat_list); - xwl_input_device->input_device = - wl_display_bind(xwl_screen->display, id, &wl_input_device_interface); - xwl_input_device->id = id; + xwl_seat->seat = + wl_display_bind(xwl_screen->display, id, &wl_seat_interface); + xwl_seat->id = id; - wl_input_device_add_listener(xwl_input_device->input_device, - &input_device_listener, - xwl_input_device); + wl_seat_add_listener(xwl_seat->seat, &seat_listener, xwl_seat); } static void @@ -515,7 +483,7 @@ input_handler(struct wl_display *display, { struct xwl_screen *xwl_screen = data; - if (strcmp (interface, "wl_input_device") == 0) { + if (strcmp (interface, "wl_seat") == 0) { create_input_device(xwl_screen, id, 1); } } diff --git a/hw/xfree86/xwayland/xwayland-private.h b/hw/xfree86/xwayland/xwayland-private.h index 4d6fbab21..bde56f2e3 100644 --- a/hw/xfree86/xwayland/xwayland-private.h +++ b/hw/xfree86/xwayland/xwayland-private.h @@ -57,7 +57,7 @@ struct xwl_screen { uint32_t flags; char *device_name; uint32_t authenticated; - struct xorg_list input_device_list; + struct xorg_list seat_list; struct xorg_list damage_window_list; struct xorg_list window_list; uint32_t serial; @@ -87,11 +87,13 @@ struct xwl_output { #define MODIFIER_META 0x01 -struct xwl_input_device { +struct xwl_seat { DeviceIntPtr pointer; DeviceIntPtr keyboard; struct xwl_screen *xwl_screen; - struct wl_input_device *input_device; + struct wl_seat *seat; + struct wl_pointer *wl_pointer; + struct wl_keyboard *wl_keyboard; int grab; struct xwl_window *focus_window; int32_t grab_x, grab_y; diff --git a/hw/xfree86/xwayland/xwayland-window.c b/hw/xfree86/xwayland/xwayland-window.c index c30fc08db..63d38868f 100644 --- a/hw/xfree86/xwayland/xwayland-window.c +++ b/hw/xfree86/xwayland/xwayland-window.c @@ -220,18 +220,18 @@ xwl_unrealize_window(WindowPtr window) ScreenPtr screen = window->drawable.pScreen; struct xwl_screen *xwl_screen; struct xwl_window *xwl_window; - struct xwl_input_device *xwl_input_device; + struct xwl_seat *xwl_seat; Bool ret; xwl_screen = xwl_screen_get(screen); - xorg_list_for_each_entry(xwl_input_device, - &xwl_screen->input_device_list, link) { - if (!xwl_input_device->focus_window) + xorg_list_for_each_entry(xwl_seat, + &xwl_screen->seat_list, link) { + if (!xwl_seat->focus_window) continue ; - if (xwl_input_device->focus_window->window == window) { - xwl_input_device->focus_window = NULL; - SetDeviceRedirectWindow(xwl_input_device->pointer, PointerRootWin); + if (xwl_seat->focus_window->window == window) { + xwl_seat->focus_window = NULL; + SetDeviceRedirectWindow(xwl_seat->pointer, PointerRootWin); } } diff --git a/hw/xfree86/xwayland/xwayland.c b/hw/xfree86/xwayland/xwayland.c index 028f66d09..d04c76480 100644 --- a/hw/xfree86/xwayland/xwayland.c +++ b/hw/xfree86/xwayland/xwayland.c @@ -232,7 +232,7 @@ xwl_screen_pre_init(ScrnInfoPtr scrninfo, return NULL; } - xorg_list_init(&xwl_screen->input_device_list); + xorg_list_init(&xwl_screen->seat_list); xorg_list_init(&xwl_screen->damage_window_list); xorg_list_init(&xwl_screen->window_list); xwl_screen->scrninfo = scrninfo; @@ -304,7 +304,7 @@ xwl_create_window_buffer_shm(struct xwl_window *xwl_window, void xwl_screen_close(struct xwl_screen *xwl_screen) { - struct xwl_input_device *xwl_input_device, *itmp; + struct xwl_seat *xwl_seat, *itmp; struct xwl_window *xwl_window, *wtmp; if (xwl_screen->input_listener) @@ -312,10 +312,10 @@ void xwl_screen_close(struct xwl_screen *xwl_screen) xwl_screen->input_listener); - xorg_list_for_each_entry_safe(xwl_input_device, itmp, - &xwl_screen->input_device_list, link) { - wl_input_device_destroy(xwl_input_device->input_device); - free(xwl_input_device); + xorg_list_for_each_entry_safe(xwl_seat, itmp, + &xwl_screen->seat_list, link) { + wl_seat_destroy(xwl_seat->seat); + free(xwl_seat); } xorg_list_for_each_entry_safe(xwl_window, wtmp, &xwl_screen->window_list, link) { @@ -325,7 +325,7 @@ void xwl_screen_close(struct xwl_screen *xwl_screen) } xwl_screen->input_listener = NULL; - xorg_list_init(&xwl_screen->input_device_list); + xorg_list_init(&xwl_screen->seat_list); xorg_list_init(&xwl_screen->damage_window_list); xorg_list_init(&xwl_screen->window_list); xwl_screen->root_x = 0; |