cocoadisplay: Fix fullscreen regression on Intel macs

Partially backs out 619050bb32a6b154e48af968ca9372278292cd61

Fixes #1316 (for good this time hopefully)
This commit is contained in:
rdb 2022-12-08 15:20:14 +01:00
parent 602bd3e023
commit dae26c2e4b

View File

@ -43,35 +43,12 @@
#import <OpenGL/OpenGL.h>
#import <Carbon/Carbon.h>
#include <sys/sysctl.h>
TypeHandle CocoaGraphicsWindow::_type_handle;
#ifndef MAC_OS_X_VERSION_10_15
#define NSAppKitVersionNumber10_14 1671
#endif
/**
* Returns true if this is an arm64-based mac.
*/
static int is_arm64_mac() {
#ifdef __aarch64__
return 1;
#elif defined(__x86_64__)
// Running in Rosetta 2?
static int ret = -1;
if (ret < 0) {
size_t size = sizeof(ret);
if (sysctlbyname("sysctl.proc_translated", &ret, &size, nullptr, 0) == -1) {
ret = 0;
}
}
return ret;
#else
return 0;
#endif
}
/**
*
*/
@ -211,29 +188,17 @@ begin_frame(FrameMode mode, Thread *current_thread) {
cocoagsg->lock_context();
// Set the drawable.
if (_properties.get_fullscreen() && !is_arm64_mac()) {
// Fullscreen. Note that this call doesn't work with the newer
// Metal-based OpenGL drivers.
CGLError err = CGLSetFullScreenOnDisplay((CGLContextObj) [cocoagsg->_context CGLContextObj], CGDisplayIDToOpenGLDisplayMask(_display));
if (err != kCGLNoError) {
cocoadisplay_cat.error()
<< "Failed call to CGLSetFullScreenOnDisplay with display mask "
<< CGDisplayIDToOpenGLDisplayMask(_display) << ": " << CGLErrorString(err) << "\n";
return false;
}
} else {
// Although not recommended, it is technically possible to use the same
// context with multiple different-sized windows. If that happens, the
// context needs to be updated accordingly.
if ([cocoagsg->_context view] != _view) {
// XXX I'm not 100% sure that changing the view requires it to update.
_context_needs_update = true;
[cocoagsg->_context setView:_view];
// Although not recommended, it is technically possible to use the same
// context with multiple different-sized windows. If that happens, the
// context needs to be updated accordingly.
if ([cocoagsg->_context view] != _view) {
// XXX I'm not 100% sure that changing the view requires it to update.
_context_needs_update = true;
[cocoagsg->_context setView:_view];
if (cocoadisplay_cat.is_spam()) {
cocoadisplay_cat.spam()
<< "Switching context to view " << _view << "\n";
}
if (cocoadisplay_cat.is_spam()) {
cocoadisplay_cat.spam()
<< "Switching context to view " << _view << "\n";
}
}