From: Jason Francis Date: Wed, 24 May 2023 22:48:37 +0000 (-0400) Subject: win32: implement fullscreen_on_monitor X-Git-Tag: archive/raspbian/4.12.3+ds-1+rpi1~1^2^2^2~22^2~1^2~205^2 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=cf79ad4433923b95939542421780def80e5570f8;p=gtk4.git win32: implement fullscreen_on_monitor Track the HMONITOR so it can be used by the toplevel layout. --- diff --git a/gdk/win32/gdkdisplay-win32.c b/gdk/win32/gdkdisplay-win32.c index fb7ddd858b..843fe2c653 100644 --- a/gdk/win32/gdkdisplay-win32.c +++ b/gdk/win32/gdkdisplay-win32.c @@ -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); } diff --git a/gdk/win32/gdkmonitor-win32.c b/gdk/win32/gdkmonitor-win32.c index 3702820c98..d8b8600488 100644 --- a/gdk/win32/gdkmonitor-win32.c +++ b/gdk/win32/gdkmonitor-win32.c @@ -601,6 +601,8 @@ enum_monitor (HMONITOR hmonitor, if (w32mon == NULL) continue; + + w32mon->hmonitor = hmonitor; } else { diff --git a/gdk/win32/gdkmonitor-win32.h b/gdk/win32/gdkmonitor-win32.h index 11121a660f..6107e5b505 100644 --- a/gdk/win32/gdkmonitor-win32.h +++ b/gdk/win32/gdkmonitor-win32.h @@ -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). */ diff --git a/gdk/win32/gdksurface-win32.c b/gdk/win32/gdksurface-win32.c index aa18e117b3..df4cf37f9a 100644 --- a/gdk/win32/gdksurface-win32.c +++ b/gdk/win32/gdksurface-win32.c @@ -50,6 +50,7 @@ #include "gdkdisplay-win32.h" #include "gdkdevice-win32.h" #include "gdkcairocontext-win32.h" +#include "gdkmonitor-win32.h" #include #include @@ -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);