[PATCH] xwayland: Handle the wl_keyboard modifiers event

Kristian Høgsberg hoegsberg at gmail.com
Wed Jan 8 21:25:40 PST 2014


On Tue, Oct 22, 2013 at 04:52:06PM +0200, Rui Matos wrote:
> This allows us to keep track of latched and locked modifiers as well
> as the XKB group while the keyboard focus is on another wayland
> client. Note that we don't need to track depressed modifiers since
> wayland guarantees that we'll get them as key press events whenever
> we get the keyboard focus.

That looks good.  Applied, thanks for the reminder.

Kristian

> ---
>  hw/xfree86/xwayland/xwayland-input.c   | 40 +++++++++++++++++++++++++++++++++-
>  hw/xfree86/xwayland/xwayland-private.h |  2 +-
>  2 files changed, 40 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/xfree86/xwayland/xwayland-input.c b/hw/xfree86/xwayland/xwayland-input.c
> index ebf1af1..2f14b20 100644
> --- a/hw/xfree86/xwayland/xwayland-input.c
> +++ b/hw/xfree86/xwayland/xwayland-input.c
> @@ -504,6 +504,7 @@ keyboard_handle_enter(void *data, struct wl_keyboard *keyboard,
>      uint32_t *k;
>  
>      xwl_seat->xwl_screen->serial = serial;
> +    xwl_seat->keyboard_focus = surface;
>  
>      wl_array_copy(&xwl_seat->keys, keys);
>      wl_array_for_each(k, &xwl_seat->keys)
> @@ -521,6 +522,8 @@ keyboard_handle_leave(void *data, struct wl_keyboard *keyboard,
>  
>      wl_array_for_each(k, &xwl_seat->keys)
>  	xf86PostKeyboardEvent(xwl_seat->keyboard, *k + 8, 0);
> +
> +    xwl_seat->keyboard_focus = NULL;
>  }
>  
>  static void
> @@ -529,7 +532,42 @@ keyboard_handle_modifiers(void *data, struct wl_keyboard *keyboard,
>  			  uint32_t mods_latched, uint32_t mods_locked,
>  			  uint32_t group)
>  {
> -    /* FIXME: Need more server XKB API here. */
> +    struct xwl_seat *xwl_seat = data;
> +    DeviceIntPtr dev;
> +    XkbStateRec old_state, *new_state;
> +    xkbStateNotify sn;
> +    CARD16 changed;
> +
> +    /* We don't need any of this while we have keyboard focus since
> +       the regular key event processing already takes care of setting
> +       our internal state correctly. */
> +    if (xwl_seat->keyboard_focus)
> +        return;
> +
> +    for (dev = inputInfo.devices; dev; dev = dev->next) {
> +        if (dev != xwl_seat->keyboard && dev != GetMaster(xwl_seat->keyboard, MASTER_KEYBOARD))
> +            continue;
> +
> +        old_state = dev->key->xkbInfo->state;
> +        new_state = &dev->key->xkbInfo->state;
> +
> +        new_state->locked_group = group & XkbAllGroupsMask;
> +        new_state->locked_mods = mods_locked & XkbAllModifiersMask;
> +        XkbLatchModifiers(dev, XkbAllModifiersMask, mods_latched & XkbAllModifiersMask);
> +
> +        XkbComputeDerivedState(dev->key->xkbInfo);
> +
> +        changed = XkbStateChangedFlags(&old_state, new_state);
> +        if (!changed)
> +            continue;
> +
> +        sn.keycode = 0;
> +        sn.eventType = 0;
> +        sn.requestMajor = XkbReqCode;
> +        sn.requestMinor = X_kbLatchLockState; /* close enough */
> +        sn.changed = changed;
> +        XkbSendStateNotify(dev, &sn);
> +    }
>  }
>  
>  static const struct wl_keyboard_listener keyboard_listener = {
> diff --git a/hw/xfree86/xwayland/xwayland-private.h b/hw/xfree86/xwayland/xwayland-private.h
> index aa9fc03..bdecf8a 100644
> --- a/hw/xfree86/xwayland/xwayland-private.h
> +++ b/hw/xfree86/xwayland/xwayland-private.h
> @@ -112,7 +112,7 @@ struct xwl_seat {
>  
>      size_t			 keymap_size;
>      char			*keymap;
> -
> +    struct wl_surface           *keyboard_focus;
>  };
>  
>  
> -- 
> 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