Hi,

On 11/23/2011 04:43 PM, Marc-André Lureau wrote:
---
  gtk/spice-widget-priv.h |    1 +
  gtk/spice-widget.c      |   80 ++++++++++++++++++++++++++++++++++++++++------
  gtk/spicy.c             |    6 +++
  3 files changed, 76 insertions(+), 11 deletions(-)


Hmm, although the patch should work fine as is I think it
would be more clean for update_keyboard_grab() to also
test for keyboard_grab_inhibit, and for
session_inhibit_keyboard_grab_changed to use
update_keyboard_grab(), also see my comments below.

diff --git a/gtk/spice-widget-priv.h b/gtk/spice-widget-priv.h
index a86168d..bd5eec6 100644
--- a/gtk/spice-widget-priv.h
+++ b/gtk/spice-widget-priv.h
@@ -62,6 +62,7 @@ struct _SpiceDisplayPrivate {
      bool                    convert;
      bool                    have_mitshm;
      gboolean                allow_scaling;
+    gboolean                disable_inputs;

      /* TODO: make a display object instead? */
  #ifdef WITH_X11
diff --git a/gtk/spice-widget.c b/gtk/spice-widget.c
index 0edc70f..a6b840a 100644
--- a/gtk/spice-widget.c
+++ b/gtk/spice-widget.c
@@ -86,6 +86,7 @@ enum {
      PROP_RESIZE_GUEST,
      PROP_AUTO_CLIPBOARD,
      PROP_SCALING,
+    PROP_DISABLE_INPUTS,
  };

  /* Signals */
@@ -102,8 +103,10 @@ static guint signals[SPICE_DISPLAY_LAST_SIGNAL];
  static HWND focus_window = NULL;
  #endif

+static void update_keyboard_grab(SpiceDisplay *display);
  static void try_keyboard_grab(SpiceDisplay *display);
  static void try_keyboard_ungrab(SpiceDisplay *display);
+static void update_mouse_grab(SpiceDisplay *display);
  static void try_mouse_grab(SpiceDisplay *display);
  static void try_mouse_ungrab(SpiceDisplay *display);
  static void recalc_geometry(GtkWidget *widget, gboolean set_display);
@@ -148,6 +151,9 @@ static void spice_display_get_property(GObject    *object,
      case PROP_SCALING:
          g_value_set_boolean(value, d->allow_scaling);
        break;
+    case PROP_DISABLE_INPUTS:
+        g_value_set_boolean(value, d->disable_inputs);
+       break;
      default:
          G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
          break;
@@ -172,17 +178,11 @@ static void spice_display_set_property(GObject      
*object,
          break;
      case PROP_KEYBOARD_GRAB:
          d->keyboard_grab_enable = g_value_get_boolean(value);
-        if (d->keyboard_grab_enable) {
-            try_keyboard_grab(display);
-        } else {
-            try_keyboard_ungrab(display);
-        }
+        update_keyboard_grab(display);
          break;
      case PROP_MOUSE_GRAB:
          d->mouse_grab_enable = g_value_get_boolean(value);
-        if (!d->mouse_grab_enable) {
-            try_mouse_ungrab(display);
-        }
+        update_mouse_grab(display);
          break;
      case PROP_RESIZE_GUEST:
          d->resize_guest_enable = g_value_get_boolean(value);
@@ -207,6 +207,12 @@ 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_DISABLE_INPUTS:
+        d->disable_inputs = g_value_get_boolean(value);
+        gtk_widget_set_can_focus(GTK_WIDGET(display), !d->disable_inputs);
+        update_keyboard_grab(display);
+        update_mouse_grab(display);
+        break;
      default:
          G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
          break;

The patch should probably also modify the session_inhibit_keyboard_grab_changed
function to use update_keyboard_grab().

@@ -430,14 +436,15 @@ static void try_keyboard_grab(SpiceDisplay *display)

      if (g_getenv("SPICE_NOGRAB"))
          return;
-
-    if (d->keyboard_grab_active)
+    if (d->disable_inputs)
          return;

      if (d->keyboard_grab_inhibit)
          return;
      if (!d->keyboard_grab_enable)
          return;
+    if (d->keyboard_grab_active)
+        return;
      if (!d->keyboard_have_focus)
          return;
      if (!d->mouse_have_pointer)
@@ -463,7 +470,6 @@ static void try_keyboard_grab(SpiceDisplay *display)
      }
  }

-
  static void try_keyboard_ungrab(SpiceDisplay *display)
  {
      SpiceDisplayPrivate *d = SPICE_DISPLAY_GET_PRIVATE(display);
@@ -482,6 +488,16 @@ static void try_keyboard_ungrab(SpiceDisplay *display)
      g_signal_emit(widget, signals[SPICE_DISPLAY_KEYBOARD_GRAB], 0, false);
  }

+static void update_keyboard_grab(SpiceDisplay *display)
+{
+    SpiceDisplayPrivate *d = SPICE_DISPLAY_GET_PRIVATE(display);
+
+    if (d->keyboard_grab_enable&&  !d->disable_inputs)

The test should also test for && !d->keyboard_grab_inhibit

+        try_keyboard_grab(display);
+    else
+        try_keyboard_ungrab(display);
+}
+
  static GdkGrabStatus do_pointer_grab(SpiceDisplay *display)
  {
      SpiceDisplayPrivate *d = SPICE_DISPLAY_GET_PRIVATE(display);
@@ -553,6 +569,8 @@ static void try_mouse_grab(SpiceDisplay *display)

      if (g_getenv("SPICE_NOGRAB"))
          return;
+    if (d->disable_inputs)
+        return;

      if (!d->mouse_grab_enable)
          return;
@@ -614,6 +632,16 @@ static void try_mouse_ungrab(SpiceDisplay *display)
      g_signal_emit(display, signals[SPICE_DISPLAY_MOUSE_GRAB], 0, false);
  }

+static void update_mouse_grab(SpiceDisplay *display)
+{
+    SpiceDisplayPrivate *d = SPICE_DISPLAY_GET_PRIVATE(display);
+
+    if (d->mouse_grab_enable&&  !d->disable_inputs)
+        update_mouse_pointer(display);
+    else
+        try_mouse_ungrab(display);
+}
+
  static void recalc_geometry(GtkWidget *widget, gboolean set_display)
  {
      SpiceDisplay *display = SPICE_DISPLAY(widget);
@@ -746,6 +774,9 @@ static void send_key(SpiceDisplay *display, int scancode, 
int down)
      if (!d->inputs)
          return;

+    if (d->disable_inputs)
+        return;
+
      i = scancode / 32;
      b = scancode % 32;
      m = (1<<  b);
@@ -991,6 +1022,8 @@ static gboolean motion_event(GtkWidget *widget, 
GdkEventMotion *motion)

      if (!d->inputs)
          return true;
+    if (d->disable_inputs)
+        return true;

      gdk_drawable_get_size(gtk_widget_get_window(widget),&ww,&wh);
      if (spicex_is_scaled(display)) {
@@ -1051,6 +1084,8 @@ static gboolean scroll_event(GtkWidget *widget, 
GdkEventScroll *scroll)

      if (!d->inputs)
          return true;
+    if (d->disable_inputs)
+        return true;

      if (scroll->direction == GDK_SCROLL_UP)
          button = SPICE_MOUSE_BUTTON_UP;
@@ -1077,6 +1112,9 @@ static gboolean button_event(GtkWidget *widget, 
GdkEventButton *button)
              button->type == GDK_BUTTON_PRESS ? "press" : "release",
              button->button, button->state);

+    if (d->disable_inputs)
+        return true;
+
      if (!spicex_is_scaled(display)) {
          gint x, y;

@@ -1248,6 +1286,23 @@ static void spice_display_class_init(SpiceDisplayClass 
*klass)
                                G_PARAM_READWRITE |
                                G_PARAM_CONSTRUCT |
                                G_PARAM_STATIC_STRINGS));
+
+    /**
+     * SpiceDisplay:disable-inputs:
+     *
+     * Disable all keyboard&  mouse inputs.
+     *
+     * Since: 0.8
+     **/
+    g_object_class_install_property
+        (gobject_class, PROP_DISABLE_INPUTS,
+         g_param_spec_boolean("disable-inputs", "Disable inputs",
+                              "Whether inputs should be disabled",
+                              FALSE,
+                              G_PARAM_READWRITE |
+                              G_PARAM_CONSTRUCT |
+                              G_PARAM_STATIC_STRINGS));
+
      /**
       * SpiceDisplay::mouse-grab:
       * @display: the #SpiceDisplay that emitted the signal
@@ -1774,6 +1829,9 @@ static void sync_keyboard_lock_modifiers(SpiceDisplay 
*display)
      guint32 modifiers;
      GdkWindow *w;

+    if (d->disable_inputs)
+        return;
+
      w = gtk_widget_get_parent_window(GTK_WIDGET(display));
      if (w == NULL) /* it can happen if the display is not yet shown */
          return;
diff --git a/gtk/spicy.c b/gtk/spicy.c
index 6c05b1e..427b8d1 100644
--- a/gtk/spicy.c
+++ b/gtk/spicy.c
@@ -721,6 +721,7 @@ static const char *spice_display_properties[] = {
      "grab-mouse",
      "resize-guest",
      "scaling",
+    "disable-inputs",
  };

  static const char *spice_gtk_session_properties[] = {
@@ -748,6 +749,10 @@ static const GtkToggleActionEntry tentries[] = {
          .label       = N_("Scale display"),
          .callback    = G_CALLBACK(menu_cb_bool_prop),
      },{
+        .name        = "disable-inputs",
+        .label       = N_("Disable inputs"),
+        .callback    = G_CALLBACK(menu_cb_bool_prop),
+    },{
          .name        = "auto-clipboard",
          .label       = N_("Automagic clipboard sharing between host and 
guest"),
          .callback    = G_CALLBACK(menu_cb_bool_prop),
@@ -798,6 +803,7 @@ static char ui_xml[] =
  "<menuitem action='grab-mouse'/>\n"
  "<menuitem action='resize-guest'/>\n"
  "<menuitem action='scaling'/>\n"
+"<menuitem action='disable-inputs'/>\n"
  "<menuitem action='auto-clipboard'/>\n"
  #ifdef USE_USBREDIR
  "<menuitem action='auto-usbredir'/>\n"


Regards,

Hans
_______________________________________________
Spice-devel mailing list
Spice-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/spice-devel

Reply via email to