mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-11-10 04:57:26 +01:00
internal/uidriver/glfw: Bug fix: Crash on some operations on native fullscreen mode (macOS)
This change forbids some operations when the wiindow is natively fullscreened on macOS in order to avoid crashes. Closes #1578
This commit is contained in:
parent
b3afcae16c
commit
b8e8485fde
@ -432,13 +432,18 @@ func (u *UserInterface) SetFullscreen(fullscreen bool) {
|
||||
}
|
||||
|
||||
var update bool
|
||||
var nativeFullscreen bool
|
||||
_ = u.t.Call(func() error {
|
||||
update = u.isFullscreen() != fullscreen
|
||||
nativeFullscreen = u.isNativeFullscreen()
|
||||
return nil
|
||||
})
|
||||
if !update {
|
||||
return
|
||||
}
|
||||
if nativeFullscreen {
|
||||
return
|
||||
}
|
||||
|
||||
var w, h int
|
||||
_ = u.t.Call(func() error {
|
||||
|
@ -39,6 +39,11 @@ package glfw
|
||||
// *x = bounds.origin.x;
|
||||
// *y = bounds.origin.y;
|
||||
// }
|
||||
//
|
||||
// static bool isNativeFullscreen() {
|
||||
// return [[NSApplication sharedApplication] currentSystemPresentationOptions] &
|
||||
// NSApplicationPresentationFullScreen;
|
||||
// }
|
||||
import "C"
|
||||
|
||||
import (
|
||||
@ -83,3 +88,7 @@ func currentMonitorByOS(w *glfw.Window) *glfw.Monitor {
|
||||
func (u *UserInterface) nativeWindow() uintptr {
|
||||
return u.window.GetCocoaWindow()
|
||||
}
|
||||
|
||||
func (u *UserInterface) isNativeFullscreen() bool {
|
||||
return bool(C.isNativeFullscreen())
|
||||
}
|
||||
|
@ -62,3 +62,7 @@ func (u *UserInterface) nativeWindow() uintptr {
|
||||
// TODO: Implement this.
|
||||
return 0
|
||||
}
|
||||
|
||||
func (u *UserInterface) isNativeFullscreen() bool {
|
||||
return false
|
||||
}
|
||||
|
@ -184,3 +184,7 @@ func currentMonitorByOS(_ *glfw.Window) *glfw.Monitor {
|
||||
func (u *UserInterface) nativeWindow() uintptr {
|
||||
return u.window.GetWin32Window()
|
||||
}
|
||||
|
||||
func (u *UserInterface) isNativeFullscreen() bool {
|
||||
return false
|
||||
}
|
||||
|
@ -49,6 +49,10 @@ func (w *window) SetDecorated(decorated bool) {
|
||||
}
|
||||
|
||||
_ = w.ui.t.Call(func() error {
|
||||
if w.ui.isNativeFullscreen() {
|
||||
return nil
|
||||
}
|
||||
|
||||
v := glfw.False
|
||||
if decorated {
|
||||
v = glfw.True
|
||||
@ -81,6 +85,10 @@ func (w *window) SetResizable(resizable bool) {
|
||||
return
|
||||
}
|
||||
_ = w.ui.t.Call(func() error {
|
||||
if w.ui.isNativeFullscreen() {
|
||||
return nil
|
||||
}
|
||||
|
||||
v := glfw.False
|
||||
if resizable {
|
||||
v = glfw.True
|
||||
@ -108,6 +116,10 @@ func (w *window) SetFloating(floating bool) {
|
||||
return
|
||||
}
|
||||
_ = w.ui.t.Call(func() error {
|
||||
if w.ui.isNativeFullscreen() {
|
||||
return nil
|
||||
}
|
||||
|
||||
v := glfw.False
|
||||
if floating {
|
||||
v = glfw.True
|
||||
|
3
run.go
3
run.go
@ -477,6 +477,9 @@ func IsFullscreen() bool {
|
||||
//
|
||||
// SetFullscreen does nothing on mobiles.
|
||||
//
|
||||
// SetFullscreen does nothing on macOS when the window is fullscreened natively by the macOS desktop
|
||||
// instead of SetFullscreen(true).
|
||||
//
|
||||
// SetFullscreen is concurrent-safe.
|
||||
func SetFullscreen(fullscreen bool) {
|
||||
uiDriver().SetFullscreen(fullscreen)
|
||||
|
@ -42,6 +42,9 @@ func IsWindowDecorated() bool {
|
||||
// SetWindowDecorated works only on desktops.
|
||||
// SetWindowDecorated does nothing on other platforms.
|
||||
//
|
||||
// SetWindowDecorated does nothing on macOS when the window is fullscreened natively by the macOS desktop
|
||||
// instead of SetFullscreen(true).
|
||||
//
|
||||
// SetWindowDecorated is concurrent-safe.
|
||||
func SetWindowDecorated(decorated bool) {
|
||||
if w := uiDriver().Window(); w != nil {
|
||||
@ -67,6 +70,9 @@ func IsWindowResizable() bool {
|
||||
//
|
||||
// If SetWindowResizable is called with true and Run is used, SetWindowResizable panics. Use RunGame instead.
|
||||
//
|
||||
// SetWindowResizable does nothing on macOS when the window is fullscreened natively by the macOS desktop
|
||||
// instead of SetFullscreen(true).
|
||||
//
|
||||
// SetWindowResizable is concurrent-safe.
|
||||
func SetWindowResizable(resizable bool) {
|
||||
theUIContext.setWindowResizable(resizable)
|
||||
@ -253,6 +259,9 @@ func IsWindowFloating() bool {
|
||||
//
|
||||
// SetWindowFloating does nothing on browsers or mobiles.
|
||||
//
|
||||
// SetWindowFloating does nothing on macOS when the window is fullscreened natively by the macOS desktop
|
||||
// instead of SetFullscreen(true).
|
||||
//
|
||||
// SetWindowFloating is concurrent-safe.
|
||||
func SetWindowFloating(float bool) {
|
||||
if w := uiDriver().Window(); w != nil {
|
||||
|
Loading…
Reference in New Issue
Block a user