gdkseatdefault: Don't hide GdkSurface on grab failure
authorVictor Toso <me@victortoso.com>
Thu, 24 May 2018 13:42:47 +0000 (15:42 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Tue, 29 May 2018 12:05:14 +0000 (14:05 +0200)
Application is not expecting that.

Bug found due gdk_seat_grab() failure on Lock Screen. When user
Unlock the screen, the application is visible but does not receive
enter-event any more on X11/GNOME.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1485968
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1571422

Signed-off-by: Victor Toso <victortoso@redhat.com>
Signed-off-by: Carlos Garnacho <carlosg@gnome.org>
gdk/gdkseatdefault.c

index 3f43427f7304daabec9564715becfc00a887c320..2de1c36c5fd639fd560d0cf6294065d948f76dc4 100644 (file)
@@ -115,8 +115,10 @@ gdk_seat_default_grab (GdkSeat                *seat,
   GdkSeatDefaultPrivate *priv;
   guint32 evtime = event ? gdk_event_get_time (event) : GDK_CURRENT_TIME;
   GdkGrabStatus status = GDK_GRAB_SUCCESS;
+  gboolean was_visible;
 
   priv = gdk_seat_default_get_instance_private (GDK_SEAT_DEFAULT (seat));
+  was_visible = gdk_surface_is_visible (surface);
 
   if (prepare_func)
     (prepare_func) (seat, surface, prepare_func_data);
@@ -163,10 +165,12 @@ gdk_seat_default_grab (GdkSeat                *seat,
         {
           if (capabilities & ~GDK_SEAT_CAPABILITY_KEYBOARD)
             gdk_device_ungrab (priv->master_pointer, evtime);
-          gdk_surface_hide (surface);
         }
     }
 
+  if (status != GDK_GRAB_SUCCESS && !was_visible)
+    gdk_surface_hide (surface);
+
   G_GNUC_END_IGNORE_DEPRECATIONS;
 
   return status;