We can now use this new entry point from xwayland to initialize the
keyboard map to what the wayland server sends.

Reviewed-by: Daniel Stone <dan...@fooishbar.org>
---
 hw/xfree86/xwayland/xwayland-input.c   | 55 ++++++++++++++++++++++++----------
 hw/xfree86/xwayland/xwayland-private.h |  5 ++++
 2 files changed, 45 insertions(+), 15 deletions(-)

This one isn't for xserver master.  I'll add it to the xwayland
branch, but it's here to show the motivation for the three previous
patches.

Kristian

diff --git a/hw/xfree86/xwayland/xwayland-input.c 
b/hw/xfree86/xwayland/xwayland-input.c
index 8f52c3e..b6f3331 100644
--- a/hw/xfree86/xwayland/xwayland-input.c
+++ b/hw/xfree86/xwayland/xwayland-input.c
@@ -51,6 +51,7 @@
 #include <windowstr.h>
 #include <xf86Priv.h>
 #include <mipointrst.h>
+#include <sys/mman.h>
 
 #include "xwayland.h"
 #include "xwayland-private.h"
@@ -137,22 +138,17 @@ xwl_keyboard_control(DeviceIntPtr device, KeybdCtrl *ctrl)
 static int
 xwl_keyboard_proc(DeviceIntPtr device, int what)
 {
-    XkbRMLVOSet rmlvo;
+    InputInfoPtr pInfo = device->public.devicePrivate;
+    struct xwl_seat *xwl_seat = pInfo->private;
+    int len;
 
     switch (what) {
     case DEVICE_INIT:
        device->public.on = FALSE;
-
-        /* FIXME: Get the keymap from wl_keyboard::keymap events, which
-         *        requires more X server API to set a keymap from a string
-         *        rather than RMLVO. */
-        rmlvo.rules = "evdev";
-        rmlvo.model = "evdev";
-        rmlvo.layout = "us";
-        rmlvo.variant = NULL;
-        rmlvo.options = NULL;
-
-        if (!InitKeyboardDeviceStruct(device, &rmlvo, NULL, 
xwl_keyboard_control))
+       len = strnlen(xwl_seat->keymap, xwl_seat->keymap_size);
+        if (!InitKeyboardDeviceStructFromString(device, xwl_seat->keymap,
+                                               len,
+                                               NULL, xwl_keyboard_control))
             return BadValue;
 
         return Success;
@@ -441,7 +437,12 @@ static void
 keyboard_handle_keymap(void *data, struct wl_keyboard *keyboard,
                       uint32_t format, int fd, uint32_t size)
 {
-    /* FIXME: Handle keymap */
+    struct xwl_seat *xwl_seat = data;
+
+    xwl_seat->keymap_size = size;
+    xwl_seat->keymap = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
+    if (xwl_seat->keymap == MAP_FAILED)
+       ;       /* wah wah */
 
     close(fd);
 }
@@ -492,13 +493,30 @@ static const struct wl_keyboard_listener 
keyboard_listener = {
 };
 
 static void
+add_devices(void *data, struct wl_callback *callback, uint32_t time)
+{
+    struct xwl_seat *xwl_seat = data;
+
+    wl_callback_destroy(callback);
+
+    if (xwl_seat->wl_pointer)
+       xwl_seat->pointer = device_added(xwl_seat, "xwayland-pointer");
+    if (xwl_seat->wl_keyboard)
+       xwl_seat->keyboard = device_added(xwl_seat, "xwayland-keyboard");
+}
+
+static const struct wl_callback_listener add_devices_listener = {
+       add_devices
+};
+
+static void
 seat_handle_capabilities(void *data, struct wl_seat *seat,
                         enum wl_seat_capability caps)
 {
        struct xwl_seat *xwl_seat = data;
+       struct wl_callback *callback;
 
        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);
@@ -506,12 +524,19 @@ seat_handle_capabilities(void *data, struct wl_seat *seat,
        }
 
        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);
+
        }
         /* FIXME: Touch ... */
+
+       /* Add devices after we've received keymaps. */
+       if (caps) {
+           callback = wl_display_sync(xwl_seat->xwl_screen->display);
+           wl_callback_add_listener(callback,
+                                    &add_devices_listener, xwl_seat);
+       }
 }
 
 static const struct wl_seat_listener seat_listener = {
diff --git a/hw/xfree86/xwayland/xwayland-private.h 
b/hw/xfree86/xwayland/xwayland-private.h
index 5b602d7..3bdd1b9 100644
--- a/hw/xfree86/xwayland/xwayland-private.h
+++ b/hw/xfree86/xwayland/xwayland-private.h
@@ -99,8 +99,13 @@ struct xwl_seat {
     uint32_t                    pointer_enter_serial;
     struct xorg_list            link;
     CursorPtr                    x_cursor;
+
+    size_t                      keymap_size;
+    char                       *keymap;
+
 };
 
+
 struct xwl_screen *xwl_screen_get(ScreenPtr screen);
 
 void xwayland_screen_preinit_output(struct xwl_screen *xwl_screen, ScrnInfoPtr 
scrninfo);
-- 
1.8.1.4

_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to