On Fri, 22 Aug 2014 13:22:27 +0300
Giulio Camuffo <giuliocamu...@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
_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to