aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorraysan5 <raysan5@gmail.com>2016-06-26 01:36:06 +0200
committerraysan5 <raysan5@gmail.com>2016-06-26 01:36:06 +0200
commit6981e2bffaf6626b4ffc3f667dd9cc1de2c196da (patch)
tree705ba36ba32b462b17d63c8c8562232a7a145b4c /src
parent8fb84d9e638dea9b4eaaee52b61e1a7ea6681005 (diff)
downloadraylib-6981e2bffaf6626b4ffc3f667dd9cc1de2c196da.tar.gz
raylib-6981e2bffaf6626b4ffc3f667dd9cc1de2c196da.zip
Get supported videomodes for fullscreen
Diffstat (limited to 'src')
-rw-r--r--src/core.c53
1 files changed, 31 insertions, 22 deletions
diff --git a/src/core.c b/src/core.c
index de632c09..f02178c5 100644
--- a/src/core.c
+++ b/src/core.c
@@ -480,16 +480,14 @@ bool IsWindowMinimized(void)
}
// Fullscreen toggle
-// TODO: When destroying window context is lost and resources too, take care!
void ToggleFullscreen(void)
{
#if defined(PLATFORM_DESKTOP)
fullscreen = !fullscreen; // Toggle fullscreen flag
- rlglClose(); // De-init rlgl
- glfwDestroyWindow(window); // Destroy the current window (we will recreate it!)
-
- InitWindow(screenWidth, screenHeight, windowTitle);
+ // 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);
#endif
#if defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI)
@@ -1525,25 +1523,40 @@ static void InitGraphicsDevice(int width, int height)
if (fullscreen)
{
- // At this point we need to manage render size vs screen size
- // NOTE: This function uses and modifies global module variables:
- // screenWidth/screenHeight - renderWidth/renderHeight - downscaleView
- SetupFramebufferSize(displayWidth, displayHeight);
-
- // TODO: SetupFramebufferSize() does not consider properly display video modes.
- // It setups a renderWidth/renderHeight with black bars that could not match a valid video mode,
- // and so, framebuffer is not scaled properly to some monitors.
-
+ // Obtain recommended displayWidth/displayHeight from a valid videomode for the monitor
int count;
const GLFWvidmode *modes = glfwGetVideoModes(glfwGetPrimaryMonitor(), &count);
+ // Get closest videomode to desired screenWidth/screenHeight
for (int i = 0; i < count; i++)
{
- // TODO: Check modes[i]->width;
- // TODO: Check modes[i]->height;
+ if (modes[i].width >= screenWidth)
+ {
+ if (modes[i].height >= screenHeight)
+ {
+ displayWidth = modes[i].width;
+ displayHeight = modes[i].height;
+ break;
+ }
+ }
}
- window = glfwCreateWindow(screenWidth, screenHeight, windowTitle, glfwGetPrimaryMonitor(), NULL);
+ TraceLog(WARNING, "Closest fullscreen videomode: %i x %i", displayWidth, displayHeight);
+
+ // NOTE: ISSUE: Closest videomode could not match monitor aspect-ratio, for example,
+ // for a desired screen size of 800x450 (16:9), closest supported videomode is 800x600 (4:3),
+ // framebuffer is rendered correctly but once displayed on a 16:9 monitor, it gets stretched
+ // by the sides to fit all monitor space...
+
+ // At this point we need to manage render size vs screen size
+ // NOTE: This function uses and modifies global module variables:
+ // screenWidth/screenHeight - renderWidth/renderHeight - downscaleView
+ SetupFramebufferSize(displayWidth, displayHeight);
+
+ window = glfwCreateWindow(displayWidth, displayHeight, windowTitle, glfwGetPrimaryMonitor(), NULL);
+
+ // NOTE: Full-screen change, not working properly...
+ //glfwSetWindowMonitor(window, glfwGetPrimaryMonitor(), 0, 0, screenWidth, screenHeight, GLFW_DONT_CARE);
}
else
{
@@ -1785,11 +1798,7 @@ static void InitGraphicsDevice(int width, int height)
// Compute framebuffer size relative to screen size and display size
// NOTE: Global variables renderWidth/renderHeight and renderOffsetX/renderOffsetY can be modified
static void SetupFramebufferSize(int displayWidth, int displayHeight)
-{
- // TODO: SetupFramebufferSize() does not consider properly display video modes.
- // It setups a renderWidth/renderHeight with black bars that could not match a valid video mode,
- // and so, framebuffer is not scaled properly to some monitors.
-
+{
// Calculate renderWidth and renderHeight, we have the display size (input params) and the desired screen size (global var)
if ((screenWidth > displayWidth) || (screenHeight > displayHeight))
{