[gtk/wip/chergert/quartz4u] macos: track key window status



commit a4d6620d327d2787180d93329f4d00660625c7de
Author: Christian Hergert <chergert redhat com>
Date:   Mon May 4 15:21:53 2020 -0700

    macos: track key window status

 gdk/macos/GdkMacosWindow.c  | 14 ++------------
 gdk/macos/gdkmacossurface.c | 35 +++++++++++++++++++++++++++++++++++
 2 files changed, 37 insertions(+), 12 deletions(-)
---
diff --git a/gdk/macos/GdkMacosWindow.c b/gdk/macos/GdkMacosWindow.c
index 4a95ced812..9f850f2244 100644
--- a/gdk/macos/GdkMacosWindow.c
+++ b/gdk/macos/GdkMacosWindow.c
@@ -102,22 +102,12 @@
 
 -(void)windowDidBecomeKey:(NSNotification *)aNotification
 {
-#if 0
-  GdkSurface *window = [[self contentView] gdkSurface];
-
-  gdk_synthesize_surface_state (window, 0, GDK_SURFACE_STATE_FOCUSED);
-  _gdk_quartz_events_update_focus_window (window, TRUE);
-#endif
+  _gdk_macos_surface_set_is_key (gdkSurface, TRUE);
 }
 
 -(void)windowDidResignKey:(NSNotification *)aNotification
 {
-#if 0
-  GdkSurface *window = [[self contentView] gdkSurface];
-
-  _gdk_quartz_events_update_focus_window (window, FALSE);
-  gdk_synthesize_surface_state (window, GDK_SURFACE_STATE_FOCUSED, 0);
-#endif
+  _gdk_macos_surface_set_is_key (gdkSurface, FALSE);
 }
 
 -(void)windowDidBecomeMain:(NSNotification *)aNotification
diff --git a/gdk/macos/gdkmacossurface.c b/gdk/macos/gdkmacossurface.c
index 6d932f673a..d789e55934 100644
--- a/gdk/macos/gdkmacossurface.c
+++ b/gdk/macos/gdkmacossurface.c
@@ -54,6 +54,7 @@ typedef struct
   int scale;
 
   guint modal_hint : 1;
+  guint is_key : 1;
 } GdkMacosSurfacePrivate;
 
 G_DEFINE_TYPE_WITH_PRIVATE (GdkMacosSurface, gdk_macos_surface, GDK_TYPE_SURFACE)
@@ -109,9 +110,13 @@ gdk_macos_surface_hide (GdkSurface *surface)
 {
   GdkMacosSurface *self = (GdkMacosSurface *)surface;
   GdkMacosSurfacePrivate *priv = gdk_macos_surface_get_instance_private (self);
+  GdkSeat *seat;
 
   g_assert (GDK_IS_MACOS_SURFACE (self));
 
+  seat = gdk_display_get_default_seat (surface->display);
+  gdk_seat_ungrab (seat);
+
   [priv->window hide];
 }
 
@@ -695,3 +700,33 @@ _gdk_macos_surface_damage_cairo (GdkMacosSurface *self,
   [view setCairoSurfaceWithRegion:surface
                       cairoRegion:painted];
 }
+
+void
+_gdk_macos_surface_set_is_key (GdkMacosSurface *self,
+                               gboolean         is_key)
+{
+  GdkMacosSurfacePrivate *priv = gdk_macos_surface_get_instance_private (self);
+  GdkMacosDisplay *display;
+
+  g_return_if_fail (GDK_IS_MACOS_SURFACE (self));
+
+  display = GDK_MACOS_DISPLAY (GDK_SURFACE (self)->display);
+  is_key = !!is_key;
+
+  if (is_key != priv->is_key)
+    {
+      GdkSeat *seat = gdk_display_get_default_seat (GDK_DISPLAY (display));
+      GdkDevice *keyboard = gdk_seat_get_keyboard (seat);
+      GdkEvent *event;
+
+      priv->is_key = is_key;
+
+      if (is_key)
+        gdk_synthesize_surface_state (GDK_SURFACE (self), 0, GDK_SURFACE_STATE_FOCUSED);
+      else
+        gdk_synthesize_surface_state (GDK_SURFACE (self), GDK_SURFACE_STATE_FOCUSED, 0);
+
+      event = gdk_focus_event_new (GDK_SURFACE (self), keyboard, NULL, is_key);
+      _gdk_event_queue_append (display, event);
+    }
+}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]