From 29fba848099acd48edb2a96241a40efa249d1922 Mon Sep 17 00:00:00 2001 From: lesleyrs <19632758+lesleyrs@users.noreply.github.com> Date: Wed, 20 Dec 2023 03:23:39 +0100 Subject: [PATCH] fixes for borderless fullscreen --- src/platforms/rcore_desktop.c | 21 +++++++++++++++------ src/platforms/rcore_web.c | 2 +- src/raylib.h | 4 ++-- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/platforms/rcore_desktop.c b/src/platforms/rcore_desktop.c index 0dfcacd81..86d5a3d46 100644 --- a/src/platforms/rcore_desktop.c +++ b/src/platforms/rcore_desktop.c @@ -197,7 +197,7 @@ void ToggleFullscreen(void) } // Toggle borderless windowed mode -void ToggleBorderlessWindowed(void) +void ToggleBorderlessWindowed(int extraWidth) // increase or decrease window size to stop flickering { // Leave fullscreen before attempting to set borderless windowed mode and get screen position from it bool wasOnFullscreen = false; @@ -240,7 +240,7 @@ void ToggleBorderlessWindowed(void) // Set screen position and size glfwSetWindowPos(platform.handle, monitorPosX, monitorPosY); - glfwSetWindowSize(platform.handle, monitorWidth, monitorHeight); + glfwSetWindowSize(platform.handle, monitorWidth + extraWidth, monitorHeight); // Refocus window glfwFocusWindow(platform.handle); @@ -317,7 +317,7 @@ void SetWindowState(unsigned int flags) // NOTE: This must be handled before FLAG_FULLSCREEN_MODE because ToggleBorderlessWindowed() needs to get some fullscreen values if fullscreen is running if (((CORE.Window.flags & FLAG_BORDERLESS_WINDOWED_MODE) != (flags & FLAG_BORDERLESS_WINDOWED_MODE)) && ((flags & FLAG_BORDERLESS_WINDOWED_MODE) > 0)) { - ToggleBorderlessWindowed(); // NOTE: Window state flag updated inside function + ToggleBorderlessWindowed(0); // NOTE: Window state flag updated inside function } // State change: FLAG_FULLSCREEN_MODE @@ -432,7 +432,7 @@ void ClearWindowState(unsigned int flags) // NOTE: This must be handled before FLAG_FULLSCREEN_MODE because ToggleBorderlessWindowed() needs to get some fullscreen values if fullscreen is running if (((CORE.Window.flags & FLAG_BORDERLESS_WINDOWED_MODE) > 0) && ((flags & FLAG_BORDERLESS_WINDOWED_MODE) > 0)) { - ToggleBorderlessWindowed(); // NOTE: Window state flag updated inside function + ToggleBorderlessWindowed(0); // NOTE: Window state flag updated inside function } // State change: FLAG_FULLSCREEN_MODE @@ -1655,8 +1655,17 @@ static void WindowMaximizeCallback(GLFWwindow *window, int maximized) // GLFW3 WindowFocus Callback, runs when window get/lose focus static void WindowFocusCallback(GLFWwindow *window, int focused) { - if (focused) CORE.Window.flags &= ~FLAG_WINDOW_UNFOCUSED; // The window was focused - else CORE.Window.flags |= FLAG_WINDOW_UNFOCUSED; // The window lost focus + if (focused) { + CORE.Window.flags &= ~FLAG_WINDOW_UNFOCUSED; // The window was focused + if (IsWindowState(FLAG_BORDERLESS_WINDOWED_MODE)) { + SetWindowState(FLAG_WINDOW_TOPMOST); + } + } else { + CORE.Window.flags |= FLAG_WINDOW_UNFOCUSED; // The window lost focus + if (IsWindowState(FLAG_BORDERLESS_WINDOWED_MODE)) { + ClearWindowState(FLAG_WINDOW_TOPMOST); + } + } } // GLFW3 Window Drop Callback, runs when drop files into window diff --git a/src/platforms/rcore_web.c b/src/platforms/rcore_web.c index ba44096bb..7653088f5 100644 --- a/src/platforms/rcore_web.c +++ b/src/platforms/rcore_web.c @@ -247,7 +247,7 @@ void ToggleFullscreen(void) } // Toggle borderless windowed mode -void ToggleBorderlessWindowed(void) +void ToggleBorderlessWindowed(int extraWidth) { platform.ourFullscreen = true; bool enterBorderless = false; diff --git a/src/raylib.h b/src/raylib.h index 206b26573..1cf3d13ab 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -968,8 +968,8 @@ RLAPI bool IsWindowResized(void); // Check if wi RLAPI bool IsWindowState(unsigned int flag); // Check if one specific window flag is enabled RLAPI void SetWindowState(unsigned int flags); // Set window configuration state using flags (only PLATFORM_DESKTOP) RLAPI void ClearWindowState(unsigned int flags); // Clear window configuration state flags -RLAPI void ToggleFullscreen(void); // Toggle window state: fullscreen/windowed (only PLATFORM_DESKTOP) -RLAPI void ToggleBorderlessWindowed(void); // Toggle window state: borderless windowed (only PLATFORM_DESKTOP) +RLAPI void ToggleFullscreen(void); // Toggle window state: fullscreen/windowed +RLAPI void ToggleBorderlessWindowed(int extraWidth); // Toggle window state: borderless windowed (extraWidth ignored on PLATFORM_WEB) RLAPI void MaximizeWindow(void); // Set window state: maximized, if resizable (only PLATFORM_DESKTOP) RLAPI void MinimizeWindow(void); // Set window state: minimized, if resizable (only PLATFORM_DESKTOP) RLAPI void RestoreWindow(void); // Set window state: not minimized/maximized (only PLATFORM_DESKTOP)