[Spice-devel] [PATCH spice-gtk 4/4] Make auto-usbredir a session setting rather then a per display setting

Marc-André Lureau mlureau at redhat.com
Mon Oct 10 07:45:56 PDT 2011


ack

----- Original Message -----
> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> ---
>  gtk/spice-gtk-session.c |   55
>  ++++++++++++++++++++++++++++++++++++++++++++++-
>  gtk/spice-widget-priv.h |    1 -
>  gtk/spice-widget.c      |   43 ++++--------------------------------
>  gtk/spicy.c             |    6 ++--
>  4 files changed, 62 insertions(+), 43 deletions(-)
> 
> diff --git a/gtk/spice-gtk-session.c b/gtk/spice-gtk-session.c
> index c7f9be7..7e958e5 100644
> --- a/gtk/spice-gtk-session.c
> +++ b/gtk/spice-gtk-session.c
> @@ -20,13 +20,15 @@
>  #include <spice/vd_agent.h>
>  #include "spice-common.h"
>  #include "spice-gtk-session.h"
> +#include "spice-gtk-session-priv.h"
>  
>  #define CLIPBOARD_LAST (VD_AGENT_CLIPBOARD_SELECTION_SECONDARY + 1)
>  
>  struct _SpiceGtkSessionPrivate {
>      SpiceSession            *session;
> -    SpiceMainChannel        *main;
> +    /* Clipboard related */
>      gboolean                auto_clipboard_enable;
> +    SpiceMainChannel        *main;
>      GtkClipboard            *clipboard;
>      GtkClipboard            *clipboard_primary;
>      GtkTargetEntry          *clip_targets[CLIPBOARD_LAST];
> @@ -35,6 +37,9 @@ struct _SpiceGtkSessionPrivate {
>      gboolean                clip_grabbed[CLIPBOARD_LAST];
>      gboolean                clipboard_by_guest[CLIPBOARD_LAST];
>      gboolean
>                     clipboard_selfgrab_pending[CLIPBOARD_LAST];
> +    /* auto-usbredir related */
> +    gboolean                auto_usbredir_enable;
> +    gboolean                keyboard_focus;
>  };
>  
>  /**
> @@ -85,6 +90,7 @@ enum {
>      PROP_0,
>      PROP_SESSION,
>      PROP_AUTO_CLIPBOARD,
> +    PROP_AUTO_USBREDIR,
>  };
>  
>  static void spice_gtk_session_init(SpiceGtkSession *self)
> @@ -202,6 +208,9 @@ static void
> spice_gtk_session_get_property(GObject    *gobject,
>      case PROP_AUTO_CLIPBOARD:
>          g_value_set_boolean(value, s->auto_clipboard_enable);
>          break;
> +    case PROP_AUTO_USBREDIR:
> +        g_value_set_boolean(value, s->auto_usbredir_enable);
> +        break;
>      default:
>  	G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec);
>  	break;
> @@ -223,6 +232,10 @@ static void
> spice_gtk_session_set_property(GObject      *gobject,
>      case PROP_AUTO_CLIPBOARD:
>          s->auto_clipboard_enable = g_value_get_boolean(value);
>          break;
> +    case PROP_AUTO_USBREDIR:
> +        s->auto_usbredir_enable = g_value_get_boolean(value);
> +        spice_gtk_session_update_keyboard_focus(self,
> s->keyboard_focus);
> +        break;
>      default:
>          G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec);
>          break;
> @@ -275,6 +288,26 @@ static void
> spice_gtk_session_class_init(SpiceGtkSessionClass *klass)
>                                G_PARAM_CONSTRUCT |
>                                G_PARAM_STATIC_STRINGS));
>  
> +    /**
> +     * SpiceGtkSession:auto-usbredir:
> +     *
> +     * Automatically redirect newly plugged in USB devices. Note the
> auto
> +     * redirection only happens when a #SpiceDisplay associated with
> the
> +     * session had keyboard focus.
> +     *
> +     * Since: 0.8
> +     **/
> +    g_object_class_install_property
> +        (gobject_class, PROP_AUTO_USBREDIR,
> +         g_param_spec_boolean("auto-usbredir",
> +                              "Auto USB Redirection",
> +                              "Automatically redirect newly plugged
> in USB"
> +                              "Devices to the guest.",
> +                              FALSE,
> +                              G_PARAM_READWRITE |
> +                              G_PARAM_CONSTRUCT |
> +                              G_PARAM_STATIC_STRINGS));
> +
>      g_type_class_add_private(klass, sizeof(SpiceGtkSessionPrivate));
>  }
>  
> @@ -727,6 +760,26 @@ static void channel_destroy(SpiceSession
> *session, SpiceChannel *channel,
>      }
>  }
>  
> +/* ----------------------------------------------------------------
> */
> +/* private functions (usbredir related)
>                             */
> +void spice_gtk_session_update_keyboard_focus(SpiceGtkSession *self,
> +                                             gboolean state)
> +{
> +    SpiceGtkSessionPrivate *s = SPICE_GTK_SESSION_GET_PRIVATE(self);
> +    SpiceUsbDeviceManager *manager;
> +    gboolean auto_connect = FALSE;
> +
> +    s->keyboard_focus = state;
> +
> +    if (s->auto_usbredir_enable && s->keyboard_focus)
> +        auto_connect = TRUE;
> +
> +    manager = spice_usb_device_manager_get(s->session, NULL, NULL);
> +    if (manager) {
> +        g_object_set(manager, "auto-connect", auto_connect, NULL);
> +    }
> +}
> +
>  /*
>  ------------------------------------------------------------------
>  */
>  /* public functions
>                                                    */
>  
> diff --git a/gtk/spice-widget-priv.h b/gtk/spice-widget-priv.h
> index f94c8c6..a5791a4 100644
> --- a/gtk/spice-widget-priv.h
> +++ b/gtk/spice-widget-priv.h
> @@ -48,7 +48,6 @@ struct _SpiceDisplayPrivate {
>      bool                    keyboard_grab_enable;
>      bool                    mouse_grab_enable;
>      bool                    resize_guest_enable;
> -    bool                    auto_usbredir_enable;
>  
>      /* state */
>      enum SpiceSurfaceFmt    format;
> diff --git a/gtk/spice-widget.c b/gtk/spice-widget.c
> index 15a2b61..afe030d 100644
> --- a/gtk/spice-widget.c
> +++ b/gtk/spice-widget.c
> @@ -32,6 +32,7 @@
>  
>  #include "spice-widget.h"
>  #include "spice-widget-priv.h"
> +#include "spice-gtk-session-priv.h"
>  #include "vncdisplaykeymap.h"
>  
>  /* Some compatibility defines to let us build on both Gtk2 and Gtk3
>  */
> @@ -84,7 +85,6 @@ enum {
>      PROP_MOUSE_GRAB,
>      PROP_RESIZE_GUEST,
>      PROP_AUTO_CLIPBOARD,
> -    PROP_AUTO_USBREDIR,
>      PROP_SCALING,
>  };
>  
> @@ -113,7 +113,6 @@ static void disconnect_display(SpiceDisplay
> *display);
>  static void channel_new(SpiceSession *s, SpiceChannel *channel,
>  gpointer data);
>  static void channel_destroy(SpiceSession *s, SpiceChannel *channel,
>  gpointer data);
>  static void sync_keyboard_lock_modifiers(SpiceDisplay *display);
> -static void update_auto_usbredir(SpiceDisplay *display);
>  
>  /* ----------------------------------------------------------------
>  */
>  
> @@ -146,9 +145,6 @@ static void spice_display_get_property(GObject
>    *object,
>          g_object_get(d->gtk_session, "auto-clipboard", &boolean,
>          NULL);
>          g_value_set_boolean(value, boolean);
>          break;
> -    case PROP_AUTO_USBREDIR:
> -        g_value_set_boolean(value, d->auto_usbredir_enable);
> -        break;
>      case PROP_SCALING:
>          g_value_set_boolean(value, d->allow_scaling);
>  	break;
> @@ -211,10 +207,6 @@ static void spice_display_set_property(GObject
>      *object,
>          g_object_set(d->gtk_session, "auto-clipboard",
>                       g_value_get_boolean(value), NULL);
>          break;
> -    case PROP_AUTO_USBREDIR:
> -        d->auto_usbredir_enable = g_value_get_boolean(value);
> -        update_auto_usbredir(display);
> -        break;
>      default:
>          G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
>          break;
> @@ -616,22 +608,6 @@ static void recalc_geometry(GtkWidget *widget,
> gboolean set_display)
>      }
>  }
>  
> -static void update_auto_usbredir(SpiceDisplay *display)
> -{
> -    SpiceDisplayPrivate *d = SPICE_DISPLAY_GET_PRIVATE(display);
> -    SpiceUsbDeviceManager *manager;
> -    gboolean auto_connect = FALSE;
> -
> -    if (d->auto_usbredir_enable && d->keyboard_have_focus)
> -        auto_connect = TRUE;
> -
> -    /* FIXME: allow specifying a different GMainContext then the
> default */
> -    manager = spice_usb_device_manager_get(d->session, NULL /* FIXME
> */, NULL);
> -    if (manager) {
> -        g_object_set(manager, "auto-connect", auto_connect, NULL);
> -    }
> -}
> -
>  /* ----------------------------------------------------------------
>  */
>  
>  #define CONVERT_0565_TO_0888(s)
>                                          \
> @@ -917,7 +893,8 @@ static gboolean focus_in_event(GtkWidget *widget,
> GdkEventFocus *focus G_GNUC_UN
>      sync_keyboard_lock_modifiers(display);
>      d->keyboard_have_focus = true;
>      try_keyboard_grab(display);
> -    update_auto_usbredir(display);
> +    spice_gtk_session_update_keyboard_focus(d->gtk_session,
> +                                            d->keyboard_have_focus);
>  #ifdef WIN32
>      focus_window = GDK_WINDOW_HWND(gtk_widget_get_window(widget));
>      g_return_val_if_fail(focus_window != NULL, true);
> @@ -941,7 +918,8 @@ static gboolean focus_out_event(GtkWidget
> *widget, GdkEventFocus *focus G_GNUC_U
>  
>      release_keys(display);
>      d->keyboard_have_focus = false;
> -    update_auto_usbredir(display);
> +    spice_gtk_session_update_keyboard_focus(d->gtk_session,
> +                                            d->keyboard_have_focus);
>      return true;
>  }
>  
> @@ -1231,17 +1209,6 @@ static void
> spice_display_class_init(SpiceDisplayClass *klass)
>                                G_PARAM_STATIC_STRINGS));
>  
>      g_object_class_install_property
> -        (gobject_class, PROP_AUTO_USBREDIR,
> -         g_param_spec_boolean("auto-usbredir",
> -                              "Auto USB Redirection",
> -                              "Automatically redirect newly plugged
> in USB"
> -                              "Devices to the guest.",
> -                              TRUE,
> -                              G_PARAM_READWRITE |
> -                              G_PARAM_CONSTRUCT |
> -                              G_PARAM_STATIC_STRINGS));
> -
> -    g_object_class_install_property
>          (gobject_class, PROP_SCALING,
>           g_param_spec_boolean("scaling", "Scaling",
>                                "Whether we should use scaling",
> diff --git a/gtk/spicy.c b/gtk/spicy.c
> index 3034dbb..e837414 100644
> --- a/gtk/spicy.c
> +++ b/gtk/spicy.c
> @@ -721,13 +721,13 @@ static const char *spice_display_properties[] =
> {
>      "grab-mouse",
>      "resize-guest",
>      "scaling",
> -#ifdef USE_USBREDIR
> -    "auto-usbredir",
> -#endif
>  };
>  
>  static const char *spice_gtk_session_properties[] = {
>      "auto-clipboard",
> +#ifdef USE_USBREDIR
> +    "auto-usbredir",
> +#endif
>  };
>  
>  static const GtkToggleActionEntry tentries[] = {
> --
> 1.7.6.4
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
> 


More information about the Spice-devel mailing list