From 73666a7935034a97a51381716c85470634d22c2c Mon Sep 17 00:00:00 2001 From: Corentin Chary Date: Fri, 10 Jun 2011 10:31:32 +0200 Subject: xwayland: remove the two step input initialization Signed-off-by: Corentin Chary --- hw/xfree86/xwayland/xwayland-client.c | 169 ++----------------------------- hw/xfree86/xwayland/xwayland-input.c | 176 ++++++++++++++++++++++++++++++--- hw/xfree86/xwayland/xwayland-private.h | 3 +- hw/xfree86/xwayland/xwayland.c | 6 -- 4 files changed, 171 insertions(+), 183 deletions(-) diff --git a/hw/xfree86/xwayland/xwayland-client.c b/hw/xfree86/xwayland/xwayland-client.c index 7c6a9b4d4..944db6165 100644 --- a/hw/xfree86/xwayland/xwayland-client.c +++ b/hw/xfree86/xwayland/xwayland-client.c @@ -30,17 +30,10 @@ #include #include -#include #include #include -#include #include -#include -#include -#include -#include -#include #include "xwayland.h" #include "xwayland-private.h" @@ -107,155 +100,6 @@ create_output(struct xwl_screen *xwl_screen, uint32_t id, &output_listener, xwl_output); } -static void -input_device_handle_motion(void *data, struct wl_input_device *input_device, - uint32_t time, - int32_t x, int32_t y, int32_t sx, int32_t sy) -{ - struct xwl_input_device *xwl_input_device = data; - struct xwl_screen *xwl_screen = xwl_input_device->xwl_screen; - int32_t dx, dy, lx, ly; - - xwl_input_device->time = time; - - if (!xwl_input_device->focus_window) - return ; - - dx = xwl_input_device->focus_window->window->drawable.x; - dy = xwl_input_device->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); -} - -static void -input_device_handle_button(void *data, struct wl_input_device *input_device, - uint32_t time, uint32_t button, uint32_t state) -{ - struct xwl_input_device *xwl_input_device = data; - int index; - - xwl_input_device->time = time; - - switch (button) { - case BTN_MIDDLE: - index = 2; - break; - case BTN_RIGHT: - index = 3; - break; - default: - index = button - BTN_LEFT + 1; - break; - } - - xf86PostButtonEvent(xwl_input_device->pointer, - TRUE, index, state, 0, 0); -} - -static void -input_device_handle_key(void *data, struct wl_input_device *input_device, - uint32_t time, uint32_t key, uint32_t state) -{ - struct xwl_input_device *xwl_input_device = data; - uint32_t modifier; - - xwl_input_device->time = time; - - switch (key) { - case KEY_LEFTMETA: - case KEY_RIGHTMETA: - modifier = MODIFIER_META; - break; - default: - modifier = 0; - break; - } - - if (state) - xwl_input_device->modifiers |= modifier; - else - xwl_input_device->modifiers &= ~modifier; - - xf86PostKeyboardEvent(xwl_input_device->keyboard, key + 8, state); -} - -static void -input_device_handle_pointer_focus(void *data, - struct wl_input_device *input_device, - uint32_t time, - struct wl_surface *surface, - int32_t x, int32_t y, int32_t sx, int32_t sy) - -{ - struct xwl_input_device *xwl_input_device = data; - - xwl_input_device->time = time; - - if (surface) - xwl_input_device->focus_window = wl_surface_get_user_data(surface); - else - xwl_input_device->focus_window = NULL; - - if (xwl_input_device->focus_window) - SetDeviceRedirectWindow(xwl_input_device->pointer, - xwl_input_device->focus_window->window); - else - SetDeviceRedirectWindow(xwl_input_device->pointer, - PointerRootWin); -} - -static void -input_device_handle_keyboard_focus(void *data, - struct wl_input_device *input_device, - uint32_t time, - struct wl_surface *surface, - struct wl_array *keys) -{ - struct xwl_input_device *xwl_input_device = data; - uint32_t *k, *end; - - xwl_input_device->time = time; - - xwl_input_device->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; - break; - } - } -} - -static const struct wl_input_device_listener input_device_listener = { - input_device_handle_motion, - input_device_handle_button, - input_device_handle_key, - input_device_handle_pointer_focus, - input_device_handle_keyboard_focus, -}; - -static void -create_input_device(struct xwl_screen *xwl_screen, uint32_t id, - uint32_t version) -{ - struct xwl_input_device *xwl_input_device; - - xwl_input_device = xwl_input_device_create(xwl_screen); - xwl_input_device->input_device = - wl_input_device_create (xwl_screen->display, id, 1); - xwl_input_device->id = id; - - wl_input_device_add_listener(xwl_input_device->input_device, - &input_device_listener, - xwl_input_device); -} - static void global_handler(struct wl_display *display, uint32_t id, @@ -280,8 +124,6 @@ global_handler(struct wl_display *display, xwl_screen->shm = wl_shm_create (xwl_screen->display, id, 1); } else if (strcmp (interface, "wl_output") == 0) { create_output(xwl_screen, id, 1); - } else if (strcmp (interface, "wl_input_device") == 0) { - create_input_device(xwl_screen, id, 1); } } @@ -385,8 +227,13 @@ wayland_screen_close(struct xwl_screen *xwl_screen) struct xwl_input_device *xwl_input_device, *itmp; struct xwl_window *xwl_window, *wtmp; - wl_display_remove_global_listener(xwl_screen->display, - xwl_screen->global_listener); + if (xwl_screen->global_listener) + wl_display_remove_global_listener(xwl_screen->display, + xwl_screen->global_listener); + + if (xwl_screen->input_listener) + wl_display_remove_global_listener(xwl_screen->display, + xwl_screen->input_listener); if (xwl_screen->drm_fd >= 0) close(xwl_screen->drm_fd); @@ -428,6 +275,8 @@ wayland_screen_close(struct xwl_screen *xwl_screen) xwl_screen->drm_fd = -1; xwl_screen->wayland_fd = -1; + xwl_screen->global_listener = NULL; + xwl_screen->input_listener = NULL; xwl_screen->display = NULL; xwl_screen->compositor = NULL; xwl_screen->drm = NULL; diff --git a/hw/xfree86/xwayland/xwayland-input.c b/hw/xfree86/xwayland/xwayland-input.c index 6da3fcca5..19a597408 100644 --- a/hw/xfree86/xwayland/xwayland-input.c +++ b/hw/xfree86/xwayland/xwayland-input.c @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -37,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -343,38 +345,182 @@ add_input_device(struct xwl_input_device *xwl_input_device) } static void -add_input_devices(struct xwl_screen *xwl_screen) +input_device_handle_motion(void *data, struct wl_input_device *input_device, + uint32_t time, + int32_t x, int32_t y, int32_t sx, int32_t sy) { - struct xwl_input_device *xwl_input_device; + struct xwl_input_device *xwl_input_device = data; + struct xwl_screen *xwl_screen = xwl_input_device->xwl_screen; + int32_t dx, dy, lx, ly; + + xwl_input_device->time = time; + + if (!xwl_input_device->focus_window) + return ; + + dx = xwl_input_device->focus_window->window->drawable.x; + dy = xwl_input_device->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); - list_for_each_entry(xwl_input_device, - &xwl_screen->input_device_list, link) - add_input_device(xwl_input_device); + xf86PostMotionEvent(xwl_input_device->pointer, + TRUE, 0, 2, lx, ly); } -void -xwl_input_init(struct xwl_screen *xwl_screen) +static void +input_device_handle_button(void *data, struct wl_input_device *input_device, + uint32_t time, uint32_t button, uint32_t state) +{ + struct xwl_input_device *xwl_input_device = data; + int index; + + xwl_input_device->time = time; + + switch (button) { + case BTN_MIDDLE: + index = 2; + break; + case BTN_RIGHT: + index = 3; + break; + default: + index = button - BTN_LEFT + 1; + break; + } + + xf86PostButtonEvent(xwl_input_device->pointer, + TRUE, index, state, 0, 0); +} + +static void +input_device_handle_key(void *data, struct wl_input_device *input_device, + uint32_t time, uint32_t key, uint32_t state) +{ + struct xwl_input_device *xwl_input_device = data; + uint32_t modifier; + + xwl_input_device->time = time; + + switch (key) { + case KEY_LEFTMETA: + case KEY_RIGHTMETA: + modifier = MODIFIER_META; + break; + default: + modifier = 0; + break; + } + + if (state) + xwl_input_device->modifiers |= modifier; + else + xwl_input_device->modifiers &= ~modifier; + + xf86PostKeyboardEvent(xwl_input_device->keyboard, key + 8, state); +} + +static void +input_device_handle_pointer_focus(void *data, + struct wl_input_device *input_device, + uint32_t time, + struct wl_surface *surface, + int32_t x, int32_t y, int32_t sx, int32_t sy) + { - xwl_screen->input_initialized = 1; - add_input_devices(xwl_screen); + struct xwl_input_device *xwl_input_device = data; + + xwl_input_device->time = time; + + if (surface) + xwl_input_device->focus_window = wl_surface_get_user_data(surface); + else + xwl_input_device->focus_window = NULL; + + if (xwl_input_device->focus_window) + SetDeviceRedirectWindow(xwl_input_device->pointer, + xwl_input_device->focus_window->window); + else + SetDeviceRedirectWindow(xwl_input_device->pointer, + PointerRootWin); +} + +static void +input_device_handle_keyboard_focus(void *data, + struct wl_input_device *input_device, + uint32_t time, + struct wl_surface *surface, + struct wl_array *keys) +{ + struct xwl_input_device *xwl_input_device = data; + uint32_t *k, *end; + + xwl_input_device->time = time; + + xwl_input_device->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; + break; + } + } } -struct xwl_input_device * -xwl_input_device_create(struct xwl_screen *xwl_screen) +static const struct wl_input_device_listener input_device_listener = { + input_device_handle_motion, + input_device_handle_button, + input_device_handle_key, + input_device_handle_pointer_focus, + input_device_handle_keyboard_focus, +}; + +static void +create_input_device(struct xwl_screen *xwl_screen, uint32_t id, + uint32_t version) { struct xwl_input_device *xwl_input_device; xwl_input_device = calloc(sizeof *xwl_input_device, 1); if (xwl_input_device == NULL) { ErrorF("create_input ENOMEM"); - return NULL; + return ; } xwl_input_device->xwl_screen = xwl_screen; list_add(&xwl_input_device->link, &xwl_screen->input_device_list); - if (xwl_screen->input_initialized) - add_input_device(xwl_input_device); + add_input_device(xwl_input_device); + + xwl_input_device->input_device = + wl_input_device_create (xwl_screen->display, id, 1); + xwl_input_device->id = id; - return xwl_input_device; + wl_input_device_add_listener(xwl_input_device->input_device, + &input_device_listener, + xwl_input_device); +} + +static void +input_handler(struct wl_display *display, + uint32_t id, + const char *interface, + uint32_t version, + void *data) +{ + struct xwl_screen *xwl_screen = data; + + if (strcmp (interface, "wl_input_device") == 0) { + create_input_device(xwl_screen, id, 1); + } +} + +void +xwl_input_init(struct xwl_screen *xwl_screen) +{ + xwl_screen->input_listener = + wl_display_add_global_listener(xwl_screen->display, + input_handler, xwl_screen); } diff --git a/hw/xfree86/xwayland/xwayland-private.h b/hw/xfree86/xwayland/xwayland-private.h index 265dc6319..0ad2aa87e 100644 --- a/hw/xfree86/xwayland/xwayland-private.h +++ b/hw/xfree86/xwayland/xwayland-private.h @@ -49,6 +49,7 @@ struct xwl_screen { struct wl_display *display; struct wl_compositor *compositor; struct wl_global_listener *global_listener; + struct wl_global_listener *input_listener; struct wl_drm *drm; struct wl_shm *shm; struct wl_visual *argb_visual; @@ -103,8 +104,6 @@ struct xwl_input_device { struct xwl_output * xwl_output_create(struct xwl_screen *xwl_screen); -struct xwl_input_device * -xwl_input_device_create(struct xwl_screen *xwl_screen); void xwl_input_teardown(pointer p); pointer xwl_input_setup(pointer module, pointer opts, int *errmaj, int *errmin); diff --git a/hw/xfree86/xwayland/xwayland.c b/hw/xfree86/xwayland/xwayland.c index 67d09f14d..ccdf28f69 100644 --- a/hw/xfree86/xwayland/xwayland.c +++ b/hw/xfree86/xwayland/xwayland.c @@ -35,19 +35,13 @@ #include #include #include -#include #include #include #include -#include -#include #include -#include #include #include -#include -#include #include #include -- cgit v1.2.3