internal/ui: bug fix: the aspect ratio should update the window size limits

Updates #1804
This commit is contained in:
Hajime Hoshi 2022-02-09 22:58:31 +09:00
parent f2da62a175
commit ad675640b1

View File

@ -1141,15 +1141,27 @@ func (u *UserInterface) swapBuffers() {
// updateWindowSizeLimits must be called from the main thread. // updateWindowSizeLimits must be called from the main thread.
func (u *UserInterface) updateWindowSizeLimits() { func (u *UserInterface) updateWindowSizeLimits() {
aspectRatio := 0.0
if !u.isFullscreen() && u.isWindowAspectRatioFixed() {
w, h := u.window.GetSize()
aspectRatio = float64(h) / float64(w)
}
m := u.currentMonitor() m := u.currentMonitor()
minw, minh, maxw, maxh := u.getWindowSizeLimitsInDIP() minw, minh, maxw, maxh := u.getWindowSizeLimitsInDIP()
if minw < 0 { if minw < 0 {
minw = glfw.DontCare // Always set the minimum window width.
minw = int(u.dipToGLFWPixel(float64(u.minimumWindowWidth()), m))
} else { } else {
minw = int(u.dipToGLFWPixel(float64(minw), m)) minw = int(u.dipToGLFWPixel(float64(minw), m))
} }
if minh < 0 { if minh < 0 {
if aspectRatio > 0 {
minh = int(float64(minw) * aspectRatio)
} else {
minh = glfw.DontCare minh = glfw.DontCare
}
} else { } else {
minh = int(u.dipToGLFWPixel(float64(minh), m)) minh = int(u.dipToGLFWPixel(float64(minh), m))
} }
@ -1222,6 +1234,16 @@ func (u *UserInterface) setWindowSizeInDIP(width, height int, fullscreen bool) {
u.setWindowSizeInDIPImpl(width, height, fullscreen) u.setWindowSizeInDIPImpl(width, height, fullscreen)
// TODO: This must be called just after the window is created.
// This relies on the initial value of lastDeviceScaleFactor is 0 so this is called, but the condition is fragile.
// Refactor this.
n, d := glfw.DontCare, glfw.DontCare
if !fullscreen && u.isWindowAspectRatioFixed() {
n, d = width, height
}
u.window.SetAspectRatio(n, d)
u.updateWindowSizeLimits()
u.adjustViewSize() u.adjustViewSize()
// As width might be updated, update windowWidth/Height here. // As width might be updated, update windowWidth/Height here.
@ -1229,6 +1251,17 @@ func (u *UserInterface) setWindowSizeInDIP(width, height int, fullscreen bool) {
u.windowHeightInDIP = height u.windowHeightInDIP = height
} }
func (u *UserInterface) minimumWindowWidth() int {
// On Windows, giving a too small width doesn't call a callback (#165).
// To prevent hanging up, return asap if the width is too small.
if u.window.GetAttrib(glfw.Decorated) == glfw.False {
return 1
}
// 126 is an arbitrary number and I guess this is small enough.
return 126
}
func (u *UserInterface) setWindowSizeInDIPImpl(width, height int, fullscreen bool) { func (u *UserInterface) setWindowSizeInDIPImpl(width, height int, fullscreen bool) {
if fullscreen { if fullscreen {
if x, y := u.origPos(); x == invalidPos || y == invalidPos { if x, y := u.origPos(); x == invalidPos || y == invalidPos {
@ -1250,17 +1283,9 @@ func (u *UserInterface) setWindowSizeInDIPImpl(width, height int, fullscreen boo
} }
} }
} else { } else {
// On Windows, giving a too small width doesn't call a callback (#165). if mw := u.minimumWindowWidth(); width < mw {
// To prevent hanging up, return asap if the width is too small. width = mw
// 126 is an arbitrary number and I guess this is small enough.
minWindowWidth := 126
if u.window.GetAttrib(glfw.Decorated) == glfw.False {
minWindowWidth = 1
} }
if width < minWindowWidth {
width = minWindowWidth
}
if u.isNativeFullscreenAvailable() && u.isNativeFullscreen() { if u.isNativeFullscreenAvailable() && u.isNativeFullscreen() {
u.setNativeFullscreen(false) u.setNativeFullscreen(false)
} else if !u.isNativeFullscreenAvailable() && u.window.GetMonitor() != nil { } else if !u.isNativeFullscreenAvailable() && u.window.GetMonitor() != nil {
@ -1295,15 +1320,6 @@ func (u *UserInterface) setWindowSizeInDIPImpl(width, height int, fullscreen boo
}) })
} }
} }
// TODO: This must be called just after the window is created.
// This relies on the initial value of lastDeviceScaleFactor is 0 so this is called, but the condition is fragile.
// Refactor this.
n, d := glfw.DontCare, glfw.DontCare
if !fullscreen && u.isWindowAspectRatioFixed() {
n, d = u.window.GetSize()
}
u.window.SetAspectRatio(n, d)
} }
// updateVsync must be called on the main thread. // updateVsync must be called on the main thread.