summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorentin Chary <corentin.chary@gmail.com>2011-06-10 10:31:32 +0200
committerKristian Høgsberg <krh@bitplanet.net>2012-03-27 09:31:57 -0400
commit73666a7935034a97a51381716c85470634d22c2c (patch)
treeda0372e2a167a6fb716888dedc1abf65a8d5a66c
parent59127a58599adf1a09e50863db0644b5cbceb589 (diff)
xwayland: remove the two step input initialization
Signed-off-by: Corentin Chary <corentin.chary@gmail.com>
-rw-r--r--hw/xfree86/xwayland/xwayland-client.c169
-rw-r--r--hw/xfree86/xwayland/xwayland-input.c176
-rw-r--r--hw/xfree86/xwayland/xwayland-private.h3
-rw-r--r--hw/xfree86/xwayland/xwayland.c6
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 <unistd.h>
#include <fcntl.h>
-#include <linux/input.h>
#include <wayland-util.h>
#include <wayland-client.h>
-#include <xf86Xinput.h>
#include <xf86Crtc.h>
-#include <xf86str.h>
-#include <windowstr.h>
-#include <input.h>
-#include <inputstr.h>
-#include <exevents.h>
#include "xwayland.h"
#include "xwayland-private.h"
@@ -108,155 +101,6 @@ create_output(struct xwl_screen *xwl_screen, uint32_t id,
}
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,
const char *interface,
@@ -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 <stdint.h>
#include <unistd.h>
+#include <linux/input.h>
#include <wayland-util.h>
#include <wayland-client.h>
#include <X11/extensions/compositeproto.h>
@@ -37,6 +38,7 @@
#include <compositeext.h>
#include <selection.h>
#include <extinit.h>
+#include <exevents.h>
#include <input.h>
#include <inputstr.h>
#include <exevents.h>
@@ -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 <wayland-util.h>
#include <wayland-client.h>
#include <X11/extensions/compositeproto.h>
-#include <xserver-properties.h>
#include <compositeext.h>
#include <selection.h>
#include <extinit.h>
-#include <input.h>
-#include <inputstr.h>
#include <exevents.h>
-#include <xkbsrv.h>
#include <xf86Xinput.h>
#include <xf86Crtc.h>
-#include <xf86str.h>
-#include <windowstr.h>
#include <xf86Priv.h>
#include <mipointrst.h>