[Spice-devel] [spice-gtk 4/9] Move code to handle modifier in a specific file

Marc-André Lureau marcandre.lureau at gmail.com
Wed Jun 8 17:22:29 UTC 2016


Hi

On Wed, Jun 8, 2016 at 1:10 PM, Frediano Ziglio <fziglio at redhat.com> wrote:
> Allows to extend it in the future.
> This code is OS dependent and is not a good idea to keep with
> SpiceGtkSession.
>
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
>  src/Makefile.am          |  2 ++
>  src/keyboard-modifiers.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++
>  src/keyboard-modifiers.h | 34 ++++++++++++++++++
>  src/spice-gtk-session.c  | 58 +-----------------------------
>  4 files changed, 128 insertions(+), 57 deletions(-)
>  create mode 100644 src/keyboard-modifiers.c
>  create mode 100644 src/keyboard-modifiers.h
>
> diff --git a/src/Makefile.am b/src/Makefile.am
> index 73bb39c..94e37bc 100644
> --- a/src/Makefile.am
> +++ b/src/Makefile.am
> @@ -138,6 +138,8 @@ SPICE_GTK_SOURCES_COMMON =          \
>         desktop-integration.c           \
>         desktop-integration.h           \
>         usb-device-widget.c             \
> +       keyboard-modifiers.c            \
> +       keyboard-modifiers.h            \
>         $(NULL)

Why not, but I suggest to use a common prefix for file and functions,
such as spice-gtk-keyboard.

>
>  nodist_SPICE_GTK_SOURCES_COMMON =      \
> diff --git a/src/keyboard-modifiers.c b/src/keyboard-modifiers.c
> new file mode 100644
> index 0000000..9166dbc
> --- /dev/null
> +++ b/src/keyboard-modifiers.c
> @@ -0,0 +1,91 @@
> +/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
> +/*
> +   Copyright (C) 2016 Red Hat, Inc.
> +
> +   This library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   This library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with this library; if not, see <http://www.gnu.org/licenses/>.
> +*/
> +#include "config.h"
> +
> +#ifdef HAVE_X11_XKBLIB_H
> +#include <X11/XKBlib.h>
> +#include <gdk/gdkx.h>
> +#endif
> +#ifdef GDK_WINDOWING_X11
> +#include <X11/Xlib.h>
> +#include <gdk/gdkx.h>
> +#endif
> +#ifdef G_OS_WIN32
> +#include <windows.h>
> +#include <gdk/gdkwin32.h>
> +#endif
> +
> +#include <gtk/gtk.h>
> +
> +#include "channel-inputs.h"
> +#include "keyboard-modifiers.h"
> +
> +guint32 get_keyboard_lock_modifiers(void)
> +{
> +    guint32 modifiers = 0;
> +#if GTK_CHECK_VERSION(3,18,0)
> +    GdkKeymap *keyboard = gdk_keymap_get_default();
> +
> +    if (gdk_keymap_get_caps_lock_state(keyboard)) {
> +        modifiers |= SPICE_INPUTS_CAPS_LOCK;
> +    }
> +
> +    if (gdk_keymap_get_num_lock_state(keyboard)) {
> +        modifiers |= SPICE_INPUTS_NUM_LOCK;
> +    }
> +
> +    if (gdk_keymap_get_scroll_lock_state(keyboard)) {
> +        modifiers |= SPICE_INPUTS_SCROLL_LOCK;
> +    }
> +#elif defined(HAVE_X11_XKBLIB_H)
> +    Display *x_display = NULL;
> +    XKeyboardState keyboard_state;
> +
> +    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 0;
> +    }
> +
> +    x_display = GDK_SCREEN_XDISPLAY(screen);
> +    XGetKeyboardControl(x_display, &keyboard_state);
> +
> +    if (keyboard_state.led_mask & 0x01) {
> +        modifiers |= SPICE_INPUTS_CAPS_LOCK;
> +    }
> +    if (keyboard_state.led_mask & 0x02) {
> +        modifiers |= SPICE_INPUTS_NUM_LOCK;
> +    }
> +    if (keyboard_state.led_mask & 0x04) {
> +        modifiers |= SPICE_INPUTS_SCROLL_LOCK;
> +    }
> +#elif defined(G_OS_WIN32)
> +    if (GetKeyState(VK_CAPITAL) & 1) {
> +        modifiers |= SPICE_INPUTS_CAPS_LOCK;
> +    }
> +    if (GetKeyState(VK_NUMLOCK) & 1) {
> +        modifiers |= SPICE_INPUTS_NUM_LOCK;
> +    }
> +    if (GetKeyState(VK_SCROLL) & 1) {
> +        modifiers |= SPICE_INPUTS_SCROLL_LOCK;
> +    }
> +#else
> +    g_warning("get_keyboard_lock_modifiers not implemented");
> +#endif // GTK_CHECK_VERSION(3,18,0)
> +    return modifiers;
> +}
> diff --git a/src/keyboard-modifiers.h b/src/keyboard-modifiers.h
> new file mode 100644
> index 0000000..d87a930
> --- /dev/null
> +++ b/src/keyboard-modifiers.h
> @@ -0,0 +1,34 @@
> +/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
> +/*
> +   Copyright (C) 2016 Red Hat, Inc.
> +
> +   This library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   This library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with this library; if not, see <http://www.gnu.org/licenses/>.
> +*/
> +
> +#ifndef KEYBOARD_MODIFIERS_H
> +#define KEYBOARD_MODIFIERS_H
> +
> +#if !defined(__SPICE_CLIENT_GTK_H_INSIDE__) && !defined(SPICE_COMPILATION)
> +#warning "Only <spice-client-gtk.h> can be included directly"
> +#endif
> +
> +#include <glib.h>
> +
> +G_BEGIN_DECLS
> +
> +guint32 get_keyboard_lock_modifiers(void);
> +
> +G_END_DECLS
> +
> +#endif /* KEYBOARD_MODIFIERS_H */
> diff --git a/src/spice-gtk-session.c b/src/spice-gtk-session.c
> index 6cdae87..b2028d9 100644
> --- a/src/spice-gtk-session.c
> +++ b/src/spice-gtk-session.c
> @@ -44,6 +44,7 @@
>  #include "spice-session-priv.h"
>  #include "spice-util-priv.h"
>  #include "spice-channel-priv.h"
> +#include "keyboard-modifiers.h"
>
>  #define CLIPBOARD_LAST (VD_AGENT_CLIPBOARD_SELECTION_SECONDARY + 1)
>
> @@ -122,63 +123,6 @@ enum {
>      PROP_SYNC_MODIFIERS,
>  };
>
> -static guint32 get_keyboard_lock_modifiers(void)
> -{
> -    guint32 modifiers = 0;
> -#if GTK_CHECK_VERSION(3,18,0)
> -    GdkKeymap *keyboard = gdk_keymap_get_default();
> -
> -    if (gdk_keymap_get_caps_lock_state(keyboard)) {
> -        modifiers |= SPICE_INPUTS_CAPS_LOCK;
> -    }
> -
> -    if (gdk_keymap_get_num_lock_state(keyboard)) {
> -        modifiers |= SPICE_INPUTS_NUM_LOCK;
> -    }
> -
> -    if (gdk_keymap_get_scroll_lock_state(keyboard)) {
> -        modifiers |= SPICE_INPUTS_SCROLL_LOCK;
> -    }
> -#else
> -#ifdef HAVE_X11_XKBLIB_H
> -    Display *x_display = NULL;
> -    XKeyboardState keyboard_state;
> -
> -    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 0;
> -    }
> -
> -    x_display = GDK_SCREEN_XDISPLAY(screen);
> -    XGetKeyboardControl(x_display, &keyboard_state);
> -
> -    if (keyboard_state.led_mask & 0x01) {
> -        modifiers |= SPICE_INPUTS_CAPS_LOCK;
> -    }
> -    if (keyboard_state.led_mask & 0x02) {
> -        modifiers |= SPICE_INPUTS_NUM_LOCK;
> -    }
> -    if (keyboard_state.led_mask & 0x04) {
> -        modifiers |= SPICE_INPUTS_SCROLL_LOCK;
> -    }
> -#elif defined(G_OS_WIN32)
> -    if (GetKeyState(VK_CAPITAL) & 1) {
> -        modifiers |= SPICE_INPUTS_CAPS_LOCK;
> -    }
> -    if (GetKeyState(VK_NUMLOCK) & 1) {
> -        modifiers |= SPICE_INPUTS_NUM_LOCK;
> -    }
> -    if (GetKeyState(VK_SCROLL) & 1) {
> -        modifiers |= SPICE_INPUTS_SCROLL_LOCK;
> -    }
> -#else
> -    g_warning("get_keyboard_lock_modifiers not implemented");
> -#endif // HAVE_X11_XKBLIB_H
> -#endif // GTK_CHECK_VERSION(3,18,0)
> -    return modifiers;
> -}
> -
>  static void spice_gtk_session_sync_keyboard_modifiers_for_channel(SpiceGtkSession *self,
>                                                                    SpiceInputsChannel* inputs,
>                                                                    gboolean force)
> --
> 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