win32: implement fullscreen_on_monitor
authorJason Francis <jafrancis999@gmail.com>
Wed, 24 May 2023 22:48:37 +0000 (18:48 -0400)
committerJason Francis <jafrancis999@gmail.com>
Wed, 24 May 2023 22:48:37 +0000 (18:48 -0400)
Track the HMONITOR so it can be used by the toplevel layout.

gdk/win32/gdkdisplay-win32.c
gdk/win32/gdkmonitor-win32.c
gdk/win32/gdkmonitor-win32.h
gdk/win32/gdksurface-win32.c

index fb7ddd858b4c651292acc2a57e46d10fe4b0160b..843fe2c6533c2ca67f39f2381abfe9ce4f2a43c4 100644 (file)
@@ -292,6 +292,7 @@ _gdk_win32_display_init_monitors (GdkWin32Display *win32_display)
       if (!w32_ex_monitor->remove)
         continue;
 
+      w32_ex_monitor->hmonitor = NULL;
       g_list_store_remove (G_LIST_STORE (win32_display->monitors), i);
       gdk_monitor_invalidate (ex_monitor);
     }
index 3702820c9803590fe9d53b76f489048551e93bd6..d8b8600488a6292f1455589d6da8921d046e32ab 100644 (file)
@@ -601,6 +601,8 @@ enum_monitor (HMONITOR hmonitor,
 
               if (w32mon == NULL)
                 continue;
+
+              w32mon->hmonitor = hmonitor;
             }
           else
             {
index 11121a660fdbaae5095357734a822128142d3150..6107e5b50594dd2d5afeb30943b3e1a416b6ad56 100644 (file)
@@ -35,6 +35,9 @@ struct _GdkWin32Monitor
   /* Device instance path (used to match GdkWin32Monitor to monitor device) */
   char *instance_path;
 
+  /* MOnitor handle (used to fullscreen windows on monitors) */
+  HMONITOR hmonitor;
+
   /* TRUE if monitor is made up by us
    * (this happens when system has logical monitors, but no physical ones).
    */
index aa18e117b3657cea0f168ca8d670deaa2f26b943..df4cf37f9ab3ef9de486911890cce443c2b5c042 100644 (file)
@@ -50,6 +50,7 @@
 #include "gdkdisplay-win32.h"
 #include "gdkdevice-win32.h"
 #include "gdkcairocontext-win32.h"
+#include "gdkmonitor-win32.h"
 
 #include <cairo-win32.h>
 #include <dwmapi.h>
@@ -625,7 +626,8 @@ get_outer_rect (GdkSurface *window,
 }
 
 static void
-gdk_win32_surface_fullscreen (GdkSurface *window);
+gdk_win32_surface_fullscreen (GdkSurface *window,
+                              GdkMonitor *monitor);
 
 static void
 show_window_internal (GdkSurface *window,
@@ -789,11 +791,7 @@ show_window_internal (GdkSurface *window,
     }
 
 
-  if (window->state & GDK_TOPLEVEL_STATE_FULLSCREEN)
-    {
-      gdk_win32_surface_fullscreen (window);
-    }
-  else if (window->state & GDK_TOPLEVEL_STATE_MAXIMIZED)
+  if (window->state & GDK_TOPLEVEL_STATE_MAXIMIZED)
     {
       GtkShowWindow (window, SW_MAXIMIZE);
     }
@@ -4008,11 +4006,12 @@ gdk_win32_surface_unmaximize (GdkSurface *surface)
 }
 
 static void
-gdk_win32_surface_fullscreen (GdkSurface *window)
+gdk_win32_surface_fullscreen (GdkSurface *window,
+                              GdkMonitor *monitor)
 {
   int x, y, width, height;
   FullscreenInfo *fi;
-  HMONITOR monitor;
+  HMONITOR hmonitor = NULL;
   MONITORINFO mi;
 
   g_return_if_fail (GDK_IS_SURFACE (window));
@@ -4025,9 +4024,14 @@ gdk_win32_surface_fullscreen (GdkSurface *window)
     {
       GdkWin32Surface *impl = GDK_WIN32_SURFACE (window);
 
-      monitor = MonitorFromWindow (GDK_SURFACE_HWND (window), MONITOR_DEFAULTTONEAREST);
+      if (monitor && GDK_IS_WIN32_MONITOR (monitor))
+        hmonitor = GDK_WIN32_MONITOR (monitor)->hmonitor;
+
+      if (!hmonitor)
+        hmonitor = MonitorFromWindow (GDK_SURFACE_HWND (window), MONITOR_DEFAULTTONEAREST);
+
       mi.cbSize = sizeof (mi);
-      if (monitor && GetMonitorInfo (monitor, &mi))
+      if (hmonitor && GetMonitorInfo (hmonitor, &mi))
        {
          x = mi.rcMonitor.left;
          y = mi.rcMonitor.top;
@@ -4869,9 +4873,16 @@ gdk_win32_toplevel_present (GdkToplevel       *toplevel,
   if (gdk_toplevel_layout_get_fullscreen (layout, &fullscreen))
     {
       if (fullscreen)
-        gdk_win32_surface_fullscreen (surface);
+        {
+          GdkMonitor *monitor;
+
+          monitor = gdk_toplevel_layout_get_fullscreen_monitor (layout);
+          gdk_win32_surface_fullscreen (surface, monitor);
+        }
       else
-        gdk_win32_surface_unfullscreen (surface);
+        {
+          gdk_win32_surface_unfullscreen (surface);
+        }
     }
 
   gdk_win32_surface_show (surface, FALSE);