[PATCH 3/3] xwayland: Handle keymap changes

Kristian Høgsberg hoegsberg at gmail.com
Tue Oct 22 23:50:27 CEST 2013


On Mon, Oct 21, 2013 at 02:41:54PM +0200, Rui Matos wrote:
> ---
>  hw/xfree86/xwayland/xwayland-input.c | 39 +++++++++++++++++++++++++++++++++---
>  include/input.h                      |  2 +-
>  2 files changed, 37 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/xfree86/xwayland/xwayland-input.c b/hw/xfree86/xwayland/xwayland-input.c
> index d031b34..ebf1af1 100644
> --- a/hw/xfree86/xwayland/xwayland-input.c
> +++ b/hw/xfree86/xwayland/xwayland-input.c
> @@ -143,7 +143,10 @@ xwl_keyboard_proc(DeviceIntPtr device, int what)
>      switch (what) {
>      case DEVICE_INIT:
>  	device->public.on = FALSE;
> -	len = strnlen(xwl_seat->keymap, xwl_seat->keymap_size);
> +        if (xwl_seat->keymap)
> +            len = strnlen(xwl_seat->keymap, xwl_seat->keymap_size);
> +        else
> +            len = 0;
>          if (!InitKeyboardDeviceStructFromString(device, xwl_seat->keymap,
>  						len,
>  						NULL, xwl_keyboard_control))
> @@ -453,12 +456,42 @@ keyboard_handle_keymap(void *data, struct wl_keyboard *keyboard,
>  		       uint32_t format, int fd, uint32_t size)
>  {
>      struct xwl_seat *xwl_seat = data;
> +    DeviceIntPtr master;
> +    XkbDescPtr xkb;
> +    XkbChangesRec changes = { 0 };
> +
> +    if (xwl_seat->keymap)
> +        munmap(xwl_seat->keymap, xwl_seat->keymap_size);
>  
>      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 */

So much better than the current way we handle this...

Thanks all three committed to the xwayland branch.

Kristian

> +    if (xwl_seat->keymap == MAP_FAILED) {
> +        xwl_seat->keymap_size = 0;
> +        xwl_seat->keymap = NULL;
> +        goto out;
> +    }
> +
> +    if (!xwl_seat->keyboard)
> +        goto out;
> +
> +    xkb = XkbCompileKeymapFromString(xwl_seat->keyboard, xwl_seat->keymap,
> +                                     strnlen(xwl_seat->keymap, xwl_seat->keymap_size));
> +    if (!xkb)
> +        goto out;
> +
> +    XkbUpdateDescActions(xkb, xkb->min_key_code, XkbNumKeys(xkb), &changes);
> +    /* Keep the current controls */
> +    XkbCopyControls(xkb, xwl_seat->keyboard->key->xkbInfo->desc);
> +
> +    XkbDeviceApplyKeymap(xwl_seat->keyboard, xkb);
> +
> +    master = GetMaster(xwl_seat->keyboard, MASTER_KEYBOARD);
> +    if (master && master->lastSlave == xwl_seat->keyboard)
> +        XkbDeviceApplyKeymap(master, xkb);
> +
> +    XkbFreeKeyboard(xkb, XkbAllComponentsMask, TRUE);
>  
> + out:
>      close(fd);
>  }
>  
> diff --git a/include/input.h b/include/input.h
> index 9f09e65..ecbcb0a 100644
> --- a/include/input.h
> +++ b/include/input.h
> @@ -508,7 +508,7 @@ extern int AttachDevice(ClientPtr client,
>                          DeviceIntPtr slave, DeviceIntPtr master);
>  
>  extern _X_EXPORT DeviceIntPtr GetPairedDevice(DeviceIntPtr kbd);
> -extern DeviceIntPtr GetMaster(DeviceIntPtr dev, int type);
> +extern _X_EXPORT DeviceIntPtr GetMaster(DeviceIntPtr dev, int type);
>  
>  extern _X_EXPORT int AllocDevicePair(ClientPtr client,
>                                       const char *name,
> -- 
> 1.8.3.1
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel


More information about the wayland-devel mailing list