macos: Skip running `showAndMakeKey` when a window is minimized by user action
authorsumibi-yakitori <nekosoft360@gmail.com>
Sat, 2 Apr 2022 12:29:27 +0000 (21:29 +0900)
committersumibi-yakitori <nekosoft360@gmail.com>
Mon, 4 Apr 2022 16:06:44 +0000 (01:06 +0900)
When a window is minimized by user action, the `showAndMakeKey` method is not executed when idle. This prevents the window from being un-minimized immediately.
And allow programmatic minimization of a window by un-minimizing them in `_gdk_macos_toplevel_surface_present`

Closes #4811

gdk/macos/gdkmacosdisplay.c
gdk/macos/gdkmacostoplevelsurface.c

index d85a744563e16a08e77b81eb659039e7d89031e5..41be42cfbee8619e94e24b715859aa45b7e85aeb 100644 (file)
@@ -434,7 +434,8 @@ select_key_in_idle_cb (gpointer data)
         {
           GdkMacosSurface *surface = iter->data;
 
-          if (GDK_SURFACE_IS_MAPPED (GDK_SURFACE (surface)))
+          if (GDK_SURFACE_IS_MAPPED (GDK_SURFACE (surface)) &&
+              ([surface->window styleMask] & NSWindowStyleMaskMiniaturizable) == 0)
             {
               [surface->window showAndMakeKey:YES];
               break;
index 1759077563597ec05e3deedb263efd0b87b99c15..a26f9727a2f09b8aa6c4336cde83ddbea3e2fd89 100644 (file)
@@ -82,6 +82,19 @@ _gdk_macos_toplevel_surface_unmaximize (GdkMacosToplevelSurface *self)
     [window zoom:window];
 }
 
+static void
+_gdk_macos_toplevel_surface_unminimize (GdkMacosToplevelSurface *self)
+{
+  NSWindow *window;
+
+  g_assert (GDK_IS_MACOS_TOPLEVEL_SURFACE (self));
+
+  window = _gdk_macos_surface_get_native (GDK_MACOS_SURFACE (self));
+
+  if ([window isMiniaturized])
+    [window deminiaturize:window];
+}
+
 static void
 _gdk_macos_toplevel_surface_present (GdkToplevel       *toplevel,
                                      GdkToplevelLayout *layout)
@@ -202,6 +215,8 @@ _gdk_macos_toplevel_surface_present (GdkToplevel       *toplevel,
         _gdk_macos_toplevel_surface_unfullscreen (self);
     }
 
+  _gdk_macos_toplevel_surface_unminimize (self);
+
   if (!GDK_MACOS_SURFACE (self)->did_initial_present)
     {
       int x = 0, y = 0;