mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-25 03:08:54 +01:00
internal/ui: bug fix: the aspect ratio should update the window size limits
Updates #1804
This commit is contained in:
parent
f2da62a175
commit
ad675640b1
@ -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.
|
||||||
|
Loading…
Reference in New Issue
Block a user