|
@@ -313,6 +313,8 @@ static unsigned int displayWidth, displayHeight;// Display width and height (mon
|
|
|
static int screenWidth, screenHeight; // Screen width and height (used render area)
|
|
|
static int renderWidth, renderHeight; // Framebuffer width and height (render area, including black bars if required)
|
|
|
static int currentWidth, currentHeight; // Current render width and height, it could change on BeginTextureMode()
|
|
|
+static int windowLeftPos, windowTopPos;
|
|
|
+static int requireVsync = 0;
|
|
|
static int renderOffsetX = 0; // Offset X from render area (must be divided by 2)
|
|
|
static int renderOffsetY = 0; // Offset Y from render area (must be divided by 2)
|
|
|
static bool fullscreen = false; // Fullscreen mode (useful only for PLATFORM_DESKTOP)
|
|
@@ -855,10 +857,24 @@ void ToggleFullscreen(void)
|
|
|
{
|
|
|
#if defined(PLATFORM_DESKTOP)
|
|
|
fullscreen = !fullscreen; // Toggle fullscreen flag
|
|
|
+ requireVsync = true;
|
|
|
|
|
|
// NOTE: glfwSetWindowMonitor() doesn't work properly (bugs)
|
|
|
- if (fullscreen) glfwSetWindowMonitor(window, glfwGetPrimaryMonitor(), 0, 0, screenWidth, screenHeight, GLFW_DONT_CARE);
|
|
|
- else glfwSetWindowMonitor(window, NULL, 0, 0, screenWidth, screenHeight, GLFW_DONT_CARE);
|
|
|
+ if (fullscreen) {
|
|
|
+ glfwGetWindowPos(window, &windowLeftPos, &windowTopPos);
|
|
|
+
|
|
|
+ GLFWmonitor *monitor = glfwGetPrimaryMonitor();
|
|
|
+ if (!monitor)
|
|
|
+ {
|
|
|
+ TraceLog(LOG_WARNING, "Failed to get monitor");
|
|
|
+ glfwSetWindowMonitor(window, glfwGetPrimaryMonitor(), 0, 0, screenWidth, screenHeight, GLFW_DONT_CARE);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const GLFWvidmode *mode = glfwGetVideoMode(monitor);
|
|
|
+ glfwSetWindowMonitor(window, glfwGetPrimaryMonitor(), 0, 0, screenWidth, screenHeight, mode->refreshRate);
|
|
|
+ }
|
|
|
+ else glfwSetWindowMonitor(window, NULL, windowLeftPos, windowTopPos, screenWidth, screenHeight, GLFW_DONT_CARE);
|
|
|
#endif
|
|
|
|
|
|
#if defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI)
|
|
@@ -1759,6 +1775,7 @@ Color Fade(Color color, float alpha)
|
|
|
void SetConfigFlags(unsigned int flags)
|
|
|
{
|
|
|
configFlags = flags;
|
|
|
+ requireVsync = true;
|
|
|
|
|
|
if (configFlags & FLAG_FULLSCREEN_MODE) fullscreen = true;
|
|
|
if (configFlags & FLAG_WINDOW_ALWAYS_RUN) alwaysRun = true;
|
|
@@ -2697,6 +2714,13 @@ static bool InitGraphicsDevice(int width, int height)
|
|
|
|
|
|
if (fullscreen)
|
|
|
{
|
|
|
+ // remember center for switchinging from fullscreen to window
|
|
|
+ windowLeftPos = displayWidth/2 - screenWidth/2;
|
|
|
+ windowTopPos = displayHeight/2 - screenHeight/2;
|
|
|
+
|
|
|
+ if (windowLeftPos < 0) windowLeftPos = 0;
|
|
|
+ if (windowTopPos < 0) windowTopPos = 0;
|
|
|
+
|
|
|
// Obtain recommended displayWidth/displayHeight from a valid videomode for the monitor
|
|
|
int count = 0;
|
|
|
const GLFWvidmode *modes = glfwGetVideoModes(glfwGetPrimaryMonitor(), &count);
|
|
@@ -3794,6 +3818,11 @@ static void PollInputEvents(void)
|
|
|
static void SwapBuffers(void)
|
|
|
{
|
|
|
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)
|
|
|
+ if (requireVsync) {
|
|
|
+ glfwMakeContextCurrent(window);
|
|
|
+ glfwSwapInterval((configFlags & FLAG_VSYNC_HINT) != 0);
|
|
|
+ requireVsync = false;
|
|
|
+ }
|
|
|
glfwSwapBuffers(window);
|
|
|
#endif
|
|
|
|