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:
Hajime Hoshi 2021-04-18 17:35:46 +09:00
parent fda1fd9a95
commit 78732d93f6
7 changed files with 45 additions and 0 deletions

View File

@ -520,6 +520,10 @@ func (u *UserInterface) SetFullscreen(fullscreen bool) {
} }
_ = u.t.Call(func() error { _ = u.t.Call(func() error {
if u.isNativeFullscreen() {
return nil
}
w, h := u.windowWidth, u.windowHeight w, h := u.windowWidth, u.windowHeight
u.setWindowSize(w, h, fullscreen) u.setWindowSize(w, h, fullscreen)
return nil return nil

View File

@ -38,6 +38,11 @@ package glfw
// *x = bounds.origin.x; // *x = bounds.origin.x;
// *y = bounds.origin.y; // *y = bounds.origin.y;
// } // }
//
// static bool isNativeFullscreen() {
// return [[NSApplication sharedApplication] currentSystemPresentationOptions] &
// NSApplicationPresentationFullScreen;
// }
import "C" import "C"
import ( import (
@ -82,3 +87,7 @@ func currentMonitorByOS(w *glfw.Window) *glfw.Monitor {
func (u *UserInterface) nativeWindow() uintptr { func (u *UserInterface) nativeWindow() uintptr {
return u.window.GetCocoaWindow() return u.window.GetCocoaWindow()
} }
func (u *UserInterface) isNativeFullscreen() bool {
return bool(C.isNativeFullscreen())
}

View File

@ -63,3 +63,7 @@ func (u *UserInterface) nativeWindow() uintptr {
// TODO: Implement this. // TODO: Implement this.
return 0 return 0
} }
func (u *UserInterface) isNativeFullscreen() bool {
return false
}

View File

@ -145,3 +145,7 @@ func currentMonitorByOS(w *glfw.Window) *glfw.Monitor {
func (u *UserInterface) nativeWindow() uintptr { func (u *UserInterface) nativeWindow() uintptr {
return u.window.GetWin32Window() return u.window.GetWin32Window()
} }
func (u *UserInterface) isNativeFullscreen() bool {
return false
}

View File

@ -47,6 +47,10 @@ func (w *window) SetDecorated(decorated bool) {
} }
_ = w.ui.t.Call(func() error { _ = w.ui.t.Call(func() error {
if w.ui.isNativeFullscreen() {
return nil
}
v := glfw.False v := glfw.False
if decorated { if decorated {
v = glfw.True v = glfw.True
@ -79,6 +83,10 @@ func (w *window) SetResizable(resizable bool) {
return return
} }
_ = w.ui.t.Call(func() error { _ = w.ui.t.Call(func() error {
if w.ui.isNativeFullscreen() {
return nil
}
v := glfw.False v := glfw.False
if resizable { if resizable {
v = glfw.True v = glfw.True
@ -106,6 +114,10 @@ func (w *window) SetFloating(floating bool) {
return return
} }
_ = w.ui.t.Call(func() error { _ = w.ui.t.Call(func() error {
if w.ui.isNativeFullscreen() {
return nil
}
v := glfw.False v := glfw.False
if floating { if floating {
v = glfw.True v = glfw.True

3
run.go
View File

@ -270,6 +270,9 @@ func IsFullscreen() bool {
// //
// SetFullscreen does nothing on browsers or mobiles. // SetFullscreen does nothing on browsers or mobiles.
// //
// SetFullscreen does nothing on macOS when the window is fullscreened natively by the macOS desktop
// instead of SetFullscreen(true).
//
// SetFullscreen is concurrent-safe. // SetFullscreen is concurrent-safe.
func SetFullscreen(fullscreen bool) { func SetFullscreen(fullscreen bool) {
uiDriver().SetFullscreen(fullscreen) uiDriver().SetFullscreen(fullscreen)

View File

@ -42,6 +42,9 @@ func IsWindowDecorated() bool {
// SetWindowDecorated works only on desktops. // SetWindowDecorated works only on desktops.
// SetWindowDecorated does nothing on other platforms. // 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. // SetWindowDecorated is concurrent-safe.
func SetWindowDecorated(decorated bool) { func SetWindowDecorated(decorated bool) {
if w := uiDriver().Window(); w != nil { 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. // 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. // SetWindowResizable is concurrent-safe.
func SetWindowResizable(resizable bool) { func SetWindowResizable(resizable bool) {
theUIContext.setWindowResizable(resizable) theUIContext.setWindowResizable(resizable)
@ -228,6 +234,9 @@ func IsWindowFloating() bool {
// //
// SetWindowFloating does nothing on browsers or mobiles. // 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. // SetWindowFloating is concurrent-safe.
func SetWindowFloating(float bool) { func SetWindowFloating(float bool) {
if w := uiDriver().Window(); w != nil { if w := uiDriver().Window(); w != nil {