[PATCH weston v3] compositor: add a way to change the keyboard locks

Pekka Paalanen ppaalanen at gmail.com
Thu Aug 28 02:12:59 PDT 2014


On Fri, 22 Aug 2014 13:22:27 +0300
Giulio Camuffo <giuliocamuffo at gmail.com> wrote:

> This adds a function weston_keyboard_set_locks() which can be used to
> change the state of the num lock and the caps locks, changing the leds too.
> Only the evdev and libinput backends supports this, since it doesn't make
> sense for embedded sessions.
> ---
> 
> v3: forgot semicolon
> 
>  src/compositor.h | 10 ++++++++++
>  src/input.c      | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 65 insertions(+)
> 
> diff --git a/src/compositor.h b/src/compositor.h
> index c0fc0a6..d80b05e 100644
> --- a/src/compositor.h
> +++ b/src/compositor.h
> @@ -68,6 +68,12 @@ enum weston_keyboard_modifier {
>  	MODIFIER_SHIFT = (1 << 3),
>  };
>  
> +enum weston_keyboard_locks {
> +	NUM_LOCK = (1 << 0),
> +	CAPS_LOCK = (1 << 1),
> +	SCROLL_LOCK = (1 << 2),
> +};

Hmm, this is compositor.h which is exported/installed and used by third
party things, so I think these should have a prefix to avoid name
clashes.

> +
>  enum weston_led {
>  	LED_NUM_LOCK = (1 << 0),
>  	LED_CAPS_LOCK = (1 << 1),
> @@ -393,6 +399,10 @@ weston_keyboard_start_grab(struct weston_keyboard *device,
>  			   struct weston_keyboard_grab *grab);
>  void
>  weston_keyboard_end_grab(struct weston_keyboard *keyboard);
> +int
> +weston_keyboard_set_locks(struct weston_keyboard *keyboard,
> +			  enum weston_keyboard_locks maks,

Typo 'maks'.

> +			  enum weston_keyboard_locks value);

Is this to be used only with a single lock at a time?
If you meant one can 'or' together several locks, you shouldn't use enum
type in the function arguments but uint32_t + documentation.

>  
>  struct weston_touch *
>  weston_touch_create(void);
> diff --git a/src/input.c b/src/input.c
> index 975cd77..195deb3 100644
> --- a/src/input.c
> +++ b/src/input.c
> @@ -1062,6 +1062,61 @@ notify_axis(struct weston_seat *seat, uint32_t time, uint32_t axis,
>  				     value);
>  }
>  
> +WL_EXPORT int
> +weston_keyboard_set_locks(struct weston_keyboard *keyboard,
> +			  enum weston_keyboard_locks mask,
> +			  enum weston_keyboard_locks value)
> +{
> +#ifdef ENABLE_XKBCOMMON
> +	uint32_t mods_depressed, mods_latched, mods_locked, group;
> +	uint32_t serial;
> +	int num, caps;

Shouldn't these be uint32_t too?

> +
> +	/* We don't want the leds to go out of sync with the actual state
> +	 * so if the backend has no way to change the leds don't try to
> +	 * change the state */
> +	if (!keyboard->seat->led_update)
> +		return -1;
> +
> +	mods_depressed = xkb_state_serialize_mods(keyboard->xkb_state.state,
> +						XKB_STATE_DEPRESSED);
> +	mods_latched = xkb_state_serialize_mods(keyboard->xkb_state.state,
> +						XKB_STATE_LATCHED);
> +	mods_locked = xkb_state_serialize_mods(keyboard->xkb_state.state,
> +						XKB_STATE_LOCKED);
> +	group = xkb_state_serialize_group(keyboard->xkb_state.state,
> +                                      XKB_STATE_EFFECTIVE);
> +
> +	num = (1 << keyboard->xkb_info->mod2_mod);
> +	caps = (1 << keyboard->xkb_info->caps_mod);
> +	if (mask & NUM_LOCK) {
> +		if (value & NUM_LOCK)
> +			mods_locked |= num;
> +		else
> +			mods_locked = mods_locked & ~num;

Could also do mods_locked &= ~num; :-)

I would be careful making sure the types match.

> +	}
> +	if (mask & CAPS_LOCK) {
> +		if (value & CAPS_LOCK)
> +			mods_locked |= caps;
> +		else
> +			mods_locked = mods_locked & ~caps;
> +	}
> +	if (mask & SCROLL_LOCK)
> +		weston_log("Changing the SCROLL_LOCK value is not supported.");

Return failure here?

> +
> +	xkb_state_update_mask(keyboard->xkb_state.state, mods_depressed,
> +			      mods_latched, mods_locked, 0, 0, group);
> +
> +	serial = wl_display_next_serial(
> +				keyboard->seat->compositor->wl_display);
> +	notify_modifiers(keyboard->seat, serial);
> +
> +	return 0;
> +#else
> +	return -1;
> +#endif
> +}
> +
>  #ifdef ENABLE_XKBCOMMON
>  WL_EXPORT void
>  notify_modifiers(struct weston_seat *seat, uint32_t serial)

The #ifdeffing looks ok.


Thanks,
pq


More information about the wayland-devel mailing list