diff --git a/src/posix/cocoa/gl_sysfb.h b/src/posix/cocoa/gl_sysfb.h index 1b60ece56..4e54e77a6 100644 --- a/src/posix/cocoa/gl_sysfb.h +++ b/src/posix/cocoa/gl_sysfb.h @@ -51,15 +51,14 @@ public: SystemBaseFrameBuffer(void *hMonitor, bool fullscreen); ~SystemBaseFrameBuffer(); - virtual bool IsFullscreen(); - virtual void SetVSync(bool vsync); + bool IsFullscreen() override; int GetClientWidth() override; int GetClientHeight() override; void ToggleFullscreen(bool yes) override; void SetWindowSize(int width, int height) override; - void SetMode(bool fullscreen, bool hiDPI); + virtual void SetMode(bool fullscreen, bool hiDPI); static void UseHiDPI(bool hiDPI); static void SetCursor(NSCursor* cursor); @@ -69,12 +68,6 @@ public: protected: SystemBaseFrameBuffer() {} - void SwapBuffers(); - - void SetGammaTable(uint16_t* table); - void ResetGammaTable(); - -private: void SetFullscreenMode(); void SetWindowedMode(); @@ -83,12 +76,6 @@ private: CocoaWindow* m_window; - static const uint32_t GAMMA_CHANNEL_SIZE = 256; - static const uint32_t GAMMA_CHANNEL_COUNT = 3; - static const uint32_t GAMMA_TABLE_SIZE = GAMMA_CHANNEL_SIZE * GAMMA_CHANNEL_COUNT; - - uint16_t m_originalGamma[GAMMA_TABLE_SIZE]; - int GetTitleBarHeight() const; static const int MINIMUM_WIDTH = 320; @@ -100,11 +87,15 @@ class SystemGLFrameBuffer : public SystemBaseFrameBuffer typedef SystemBaseFrameBuffer Super; public: - SystemGLFrameBuffer(void *hMonitor, bool fullscreen) - : SystemBaseFrameBuffer(hMonitor, fullscreen) - {} + SystemGLFrameBuffer(void *hMonitor, bool fullscreen); + + void SetVSync(bool vsync) override; + + void SetMode(bool fullscreen, bool hiDPI) override; protected: + void SwapBuffers(); + SystemGLFrameBuffer() {} }; diff --git a/src/posix/cocoa/i_video.mm b/src/posix/cocoa/i_video.mm index 6ca549654..08e2a46b9 100644 --- a/src/posix/cocoa/i_video.mm +++ b/src/posix/cocoa/i_video.mm @@ -165,19 +165,17 @@ namespace // --------------------------------------------------------------------------- -@interface CocoaView : NSOpenGLView +@interface OpenGLCocoaView : NSOpenGLView { NSCursor* m_cursor; } -- (void)resetCursorRects; - - (void)setCursor:(NSCursor*)cursor; @end -@implementation CocoaView +@implementation OpenGLCocoaView - (void)resetCursorRects { @@ -220,11 +218,6 @@ public: // --------------------------------------------------------------------------- -EXTERN_CVAR(Float, Gamma) - -// --------------------------------------------------------------------------- - - extern id appCtrl; @@ -297,28 +290,9 @@ SystemBaseFrameBuffer::SystemBaseFrameBuffer(void*, const bool fullscreen) { SetFlash(0, 0); - NSOpenGLPixelFormat* pixelFormat = CreatePixelFormat(); - - if (nil == pixelFormat) - { - I_FatalError("Cannot create OpenGL pixel format, graphics hardware is not supported"); - } - - // Create OpenGL context and view - - const NSRect contentRect = [m_window contentRectForFrameRect:[m_window frame]]; - NSOpenGLView* glView = [[CocoaView alloc] initWithFrame:contentRect - pixelFormat:pixelFormat]; - [[glView openGLContext] makeCurrentContext]; - - [m_window setContentView:glView]; - assert(frameBuffer == nullptr); frameBuffer = this; - // To be able to use OpenGL functions in SetMode() - ogl_LoadFunctions(); - FConsoleWindow::GetInstance().Show(false); } @@ -334,6 +308,8 @@ SystemBaseFrameBuffer::~SystemBaseFrameBuffer() [nc removeObserver:m_window name:NSWindowDidEndLiveResizeNotification object:nil]; + + [m_window dealloc]; } bool SystemBaseFrameBuffer::IsFullscreen() @@ -378,20 +354,6 @@ int SystemBaseFrameBuffer::GetTitleBarHeight() const } -void SystemBaseFrameBuffer::SetVSync(bool vsync) -{ - const GLint value = vsync ? 1 : 0; - - [[NSOpenGLContext currentContext] setValues:&value - forParameter:NSOpenGLCPSwapInterval]; -} - - -void SystemBaseFrameBuffer::SwapBuffers() -{ - [[NSOpenGLContext currentContext] flushBuffer]; -} - int SystemBaseFrameBuffer::GetClientWidth() { const int clientWidth = I_GetContentViewSize(m_window).width; @@ -453,6 +415,113 @@ void SystemBaseFrameBuffer::SetWindowedMode() } void SystemBaseFrameBuffer::SetMode(const bool fullscreen, const bool hiDPI) +{ + if (fullscreen) + { + SetFullscreenMode(); + } + else + { + SetWindowedMode(); + } + + [m_window updateTitle]; + + if (![m_window isKeyWindow]) + { + [m_window makeKeyAndOrderFront:nil]; + } + + m_fullscreen = fullscreen; + m_hiDPI = hiDPI; +} + + +void SystemBaseFrameBuffer::UseHiDPI(const bool hiDPI) +{ + if (frameBuffer != nullptr) + { + frameBuffer->SetMode(frameBuffer->m_fullscreen, hiDPI); + } +} + +void SystemBaseFrameBuffer::SetCursor(NSCursor* cursor) +{ + if (frameBuffer != nullptr) + { + NSWindow* const window = frameBuffer->m_window; + id view = [window contentView]; + + [view setCursor:cursor]; + [window invalidateCursorRectsForView:view]; + } +} + +void SystemBaseFrameBuffer::SetWindowVisible(bool visible) +{ + if (frameBuffer != nullptr) + { + if (visible) + { + [frameBuffer->m_window orderFront:nil]; + } + else + { + [frameBuffer->m_window orderOut:nil]; + } + + I_SetNativeMouse(!visible); + } +} + +void SystemBaseFrameBuffer::SetWindowTitle(const char* title) +{ + if (frameBuffer != nullptr) + { + NSString* const nsTitle = nullptr == title ? nil : + [NSString stringWithCString:title encoding:NSISOLatin1StringEncoding]; + [frameBuffer->m_window setTitle:nsTitle]; + } +} + + +// --------------------------------------------------------------------------- + + +SystemGLFrameBuffer::SystemGLFrameBuffer(void *hMonitor, bool fullscreen) +: SystemBaseFrameBuffer(hMonitor, fullscreen) +{ + NSOpenGLPixelFormat* pixelFormat = CreatePixelFormat(); + + if (nil == pixelFormat) + { + I_FatalError("Cannot create OpenGL pixel format, graphics hardware is not supported"); + } + + // Create OpenGL context and view + + const NSRect contentRect = [m_window contentRectForFrameRect:[m_window frame]]; + OpenGLCocoaView* glView = [[OpenGLCocoaView alloc] initWithFrame:contentRect + pixelFormat:pixelFormat]; + [[glView openGLContext] makeCurrentContext]; + + [m_window setContentView:glView]; + + // To be able to use OpenGL functions in SetMode() + ogl_LoadFunctions(); +} + + +void SystemGLFrameBuffer::SetVSync(bool vsync) +{ + const GLint value = vsync ? 1 : 0; + + [[NSOpenGLContext currentContext] setValues:&value + forParameter:NSOpenGLCPSwapInterval]; +} + + +void SystemGLFrameBuffer::SetMode(const bool fullscreen, const bool hiDPI) { NSOpenGLView* const glView = [m_window contentView]; [glView setWantsBestResolutionOpenGLSurface:hiDPI]; @@ -486,51 +555,9 @@ void SystemBaseFrameBuffer::SetMode(const bool fullscreen, const bool hiDPI) } -void SystemBaseFrameBuffer::UseHiDPI(const bool hiDPI) +void SystemGLFrameBuffer::SwapBuffers() { - if (frameBuffer != nullptr) - { - frameBuffer->SetMode(frameBuffer->m_fullscreen, hiDPI); - } -} - -void SystemBaseFrameBuffer::SetCursor(NSCursor* cursor) -{ - if (frameBuffer != nullptr) - { - NSWindow* const window = frameBuffer->m_window; - CocoaView* const view = [window contentView]; - - [view setCursor:cursor]; - [window invalidateCursorRectsForView:view]; - } -} - -void SystemBaseFrameBuffer::SetWindowVisible(bool visible) -{ - if (frameBuffer != nullptr) - { - if (visible) - { - [frameBuffer->m_window orderFront:nil]; - } - else - { - [frameBuffer->m_window orderOut:nil]; - } - - I_SetNativeMouse(!visible); - } -} - -void SystemBaseFrameBuffer::SetWindowTitle(const char* title) -{ - if (frameBuffer != nullptr) - { - NSString* const nsTitle = nullptr == title ? nil : - [NSString stringWithCString:title encoding:NSISOLatin1StringEncoding]; - [frameBuffer->m_window setTitle:nsTitle]; - } + [[NSOpenGLContext currentContext] flushBuffer]; }