[Spice-devel] [spice-gtk 5/9] Add set_keyboard_lock_modifiers
Marc-André Lureau
marcandre.lureau at gmail.com
Wed Jun 8 17:22:24 UTC 2016
Hi
On Wed, Jun 8, 2016 at 1:10 PM, Frediano Ziglio <fziglio at redhat.com> wrote:
> Code from commit 063c1b9c0627c87eb7f5369c4a6b9776a22e5c7d.
>
I guess the rationale comes after. Having os/desktop-specific code is
always a big burden.
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
> src/keyboard-modifiers.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++
> src/keyboard-modifiers.h | 1 +
> 2 files changed, 74 insertions(+)
>
> diff --git a/src/keyboard-modifiers.c b/src/keyboard-modifiers.c
> index 9166dbc..b6c9d8f 100644
> --- a/src/keyboard-modifiers.c
> +++ b/src/keyboard-modifiers.c
> @@ -89,3 +89,76 @@ guint32 get_keyboard_lock_modifiers(void)
> #endif // GTK_CHECK_VERSION(3,18,0)
> return modifiers;
> }
> +
> +#if defined(HAVE_X11_XKBLIB_H)
> +typedef enum SpiceLed {
> + CAPS_LOCK_LED = 1,
> + NUM_LOCK_LED,
> + SCROLL_LOCK_LED,
> +} SpiceLed;
> +
> +static guint get_modifier_mask(Display *x_display, KeySym modifier)
> +{
> + int mask = 0;
> + int i;
> +
> + XModifierKeymap* map = XGetModifierMapping(x_display);
> + KeyCode keycode = XKeysymToKeycode(x_display, modifier);
> + if (keycode == NoSymbol) {
> + return 0;
> + }
> +
> + for (i = 0; i < 8; i++) {
> + if (map->modifiermap[map->max_keypermod * i] == keycode) {
> + mask = 1 << i;
> + }
> + }
> + XFreeModifiermap(map);
> + return mask;
> +}
> +
> +static void set_keyboard_led(Display *x_display, SpiceLed led, int set)
> +{
> + guint mask;
> + XKeyboardControl keyboard_control;
> +
> + switch (led) {
> + case CAPS_LOCK_LED:
> + if ((mask = get_modifier_mask(x_display, XK_Caps_Lock)) != 0) {
> + XkbLockModifiers(x_display, XkbUseCoreKbd, mask, set ? mask : 0);
> + }
> + return;
> + case NUM_LOCK_LED:
> + if ((mask = get_modifier_mask(x_display, XK_Num_Lock)) != 0) {
> + XkbLockModifiers(x_display, XkbUseCoreKbd, mask, set ? mask : 0);
> + }
> + return;
> + case SCROLL_LOCK_LED:
> + keyboard_control.led_mode = set ? LedModeOn : LedModeOff;
> + keyboard_control.led = led;
> + XChangeKeyboardControl(x_display, KBLed | KBLedMode, &keyboard_control);
> + return;
> + }
> +}
> +#endif
> +
> +void set_keyboard_lock_modifiers(guint32 modifiers)
> +{
> +#if defined(HAVE_X11_XKBLIB_H)
> + Display *x_display;
> +
> + GdkScreen *screen = gdk_screen_get_default();
> + if (!GDK_IS_X11_DISPLAY(gdk_screen_get_display(screen))) {
> + SPICE_DEBUG("FIXME: gtk backend is not X11");
> + return;
> + }
> +
> + x_display = GDK_SCREEN_XDISPLAY(screen);
> +
> + set_keyboard_led(x_display, CAPS_LOCK_LED, !!(modifiers & SPICE_INPUTS_CAPS_LOCK));
> + set_keyboard_led(x_display, NUM_LOCK_LED, !!(modifiers & SPICE_INPUTS_NUM_LOCK));
> + set_keyboard_led(x_display, SCROLL_LOCK_LED, !!(modifiers & SPICE_INPUTS_SCROLL_LOCK));
> +#else
> + g_warning("set_keyboard_lock_modifiers not implemented");
> +#endif
> +}
> diff --git a/src/keyboard-modifiers.h b/src/keyboard-modifiers.h
> index d87a930..016be84 100644
> --- a/src/keyboard-modifiers.h
> +++ b/src/keyboard-modifiers.h
> @@ -28,6 +28,7 @@
> G_BEGIN_DECLS
>
> guint32 get_keyboard_lock_modifiers(void);
> +void set_keyboard_lock_modifiers(guint32 modifiers);
>
> G_END_DECLS
>
> --
> 2.7.4
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel
--
Marc-André Lureau
More information about the Spice-devel
mailing list