Skip to content

Commit 5ad086c

Browse files
committed
GLFW fix, check monitor scale before creating fullscreen window.
If monitor scaling (DPI scaling) is != 1.0 then the current monitor resolution is used. This is to avoid scaling of framebuffer.
1 parent 231c572 commit 5ad086c

File tree

1 file changed

+34
-13
lines changed

1 file changed

+34
-13
lines changed

graphics-by-opengl-lwjgl3/src/main/java/com/nucleus/lwjgl3/GLFWWindow.java

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -118,23 +118,35 @@ protected Size createGLFWWindow(PropertySettings appSettings, long monitor) {
118118
protected void createFullscreen(long monitor, VideoMode requested) {
119119
SimpleLogger.d(getClass(), "Fullscreen resolution " + requested.getWidth() + ", " + requested.getHeight());
120120
GLFWVidMode vidMode = GLFW.glfwGetVideoMode(monitor);
121-
float[] x = new float[1];
122-
float[] y = new float[1];
123-
GLFW.glfwGetWindowContentScale(monitor, x, y);
121+
122+
float[] xscale = new float[1];
123+
float[] yscale = new float[1];
124+
GLFW.glfwGetMonitorContentScale(monitor, xscale, yscale);
124125
SimpleLogger.d(getClass(), "Current monitor resolution " + vidMode.width() + ", " + vidMode.height()
125-
+ " and scale: " + x[0] + ", " + y[0]);
126+
+ " and scale: " + xscale[0] + ", " + yscale[0]);
126127
if (requested.getWidth() == vidMode.width() && requested.getHeight() == vidMode.height()) {
127128
SimpleLogger.d(getClass(), "Setting current monitor to fullscreen");
128129
setVideoMode(requested, monitorIndex);
129130
} else {
130-
GLFW.glfwWindowHint(GLFW.GLFW_ICONIFIED, GLFW.GLFW_FALSE);
131-
SimpleLogger.d(getClass(), "Creating new window");
132-
window = createWindow(requested.getWidth(), requested.getHeight(), monitor);
133-
GLFWVidMode m = GLFW.glfwGetVideoMode(monitor);
134-
if (m.width() != requested.getWidth() || m.height() != requested.getHeight()) {
135-
throw new IllegalArgumentException("Could not create videomode");
131+
// Check monitor content scale
132+
if (xscale[0] != 1.0 || yscale[0] != 1.0) {
133+
VideoMode current = new VideoMode(vidMode.width(), vidMode.height(), true, requested.getSwapInterval());
134+
SimpleLogger.d(getClass(), "-------------------------------------------------------------------");
135+
SimpleLogger.d(getClass(), "Monitor scaling is set to " + (xscale[0]) * 100
136+
+ "%, this will affect chosen fullscreen windows.");
137+
SimpleLogger.d(getClass(), "Setting mode to current monitor resolution " + vidMode.toString());
138+
SimpleLogger.d(getClass(), "To resolve this issue, turn off or set DPI scaling to 100%");
139+
SimpleLogger.d(getClass(), "-------------------------------------------------------------------");
140+
requested = current;
136141
}
137142
}
143+
window = createWindow(requested.getWidth(), requested.getHeight(), monitor);
144+
GLFWVidMode m = GLFW.glfwGetVideoMode(monitor);
145+
if (m.width() != requested.getWidth() || m.height() != requested.getHeight()) {
146+
throw new IllegalArgumentException("Could not create videomode, requested " + requested.toString()
147+
+ ", but is " + m.width() + ", " + m.height());
148+
}
149+
138150
}
139151

140152
private Size getFrameBufferSize(long window) {
@@ -177,22 +189,31 @@ private List<Size> listVideoModes(long monitor) {
177189
}
178190
}
179191
if (Environment.getInstance().isProperty(Property.TEST_FULLSCREEN_MODES, false)) {
192+
float[] xscale = new float[1];
193+
float[] yscale = new float[1];
194+
GLFW.glfwGetMonitorContentScale(monitor, xscale, yscale);
180195
// Test if fullscreen modes are created properly.
181-
SimpleLogger.d(getClass(), "Testing " + sizes.size() + " monitor modes.");
196+
SimpleLogger.d(getClass(),
197+
"Testing " + sizes.size() + " monitor modes. Content scale: " + xscale[0] + ", " + yscale[0]);
182198
int[] width = new int[1];
183199
int[] height = new int[1];
184200
for (Size s : sizes) {
185201
SimpleLogger.d(getClass(), "Creating window with size " + s.toString() + " for monitor " + monitor);
186202
long win = GLFW.glfwCreateWindow(s.getWidth(), s.getHeight(), "", monitor, MemoryUtil.NULL);
203+
GLFWVidMode mode = GLFW.glfwGetVideoMode(monitor);
187204
GLFW.glfwGetFramebufferSize(win, width, height);
188205
Size framebuffer = new Size(width[0], height[0]);
189206
GLFW.glfwGetWindowSize(win, width, height);
190207
Size windowSize = new Size(width[0], height[0]);
191208
if (framebuffer.equals(s)) {
192-
SimpleLogger.d(getClass(), "SUCCESS for monitor mode " + s.toString());
209+
SimpleLogger.d(getClass(), "SUCCESS for monitor mode " + s.toString() + ", vidMode " + mode.width()
210+
+ ", " + mode.height());
193211
} else {
212+
194213
SimpleLogger.d(getClass(),
195-
"FAILED for monitor mode " + s.toString() + ", real size " + framebuffer);
214+
"FAILED for monitor mode " + s.toString() + ", framebuffer: " + framebuffer + ", window: "
215+
+ windowSize + ", vidMode " + mode.width()
216+
+ ", " + mode.height());
196217
}
197218
GLFW.glfwDestroyWindow(win);
198219
}

0 commit comments

Comments
 (0)