From 8457df2d1fa72063ee1692c98e00b31160b1a3e7 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Fri, 24 Jun 2022 13:54:18 +0200 Subject: [PATCH] app: [macOS] add support for undecorated windows Signed-off-by: Elias Naur --- app/os_macos.go | 43 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/app/os_macos.go b/app/os_macos.go index b1ddf661..b4d026d0 100644 --- a/app/os_macos.go +++ b/app/os_macos.go @@ -98,6 +98,26 @@ static NSWindowStyleMask getWindowStyleMask(CFTypeRef windowRef) { return [window styleMask]; } +static void setWindowStyleMask(CFTypeRef windowRef, NSWindowStyleMask mask) { + NSWindow *window = (__bridge NSWindow *)windowRef; + window.styleMask = mask; +} + +static void setWindowTitleVisibility(CFTypeRef windowRef, NSWindowTitleVisibility state) { + NSWindow *window = (__bridge NSWindow *)windowRef; + window.titleVisibility = state; +} + +static void setWindowTitlebarAppearsTransparent(CFTypeRef windowRef, int transparent) { + NSWindow *window = (__bridge NSWindow *)windowRef; + window.titlebarAppearsTransparent = (BOOL)transparent; +} + +static void setWindowStandardButtonHidden(CFTypeRef windowRef, NSWindowButton btn, int hide) { + NSWindow *window = (__bridge NSWindow *)windowRef; + [window standardWindowButton:btn].hidden = (BOOL)hide; +} + static void closeWindow(CFTypeRef windowRef) { NSWindow* window = (__bridge NSWindow *)windowRef; [window performClose:nil]; @@ -269,11 +289,12 @@ func (w *window) WriteClipboard(s string) { func (w *window) updateWindowMode() { style := int(C.getWindowStyleMask(w.window)) - if style&C.NSWindowStyleMaskFullScreen > 0 { + if style&C.NSWindowStyleMaskFullScreen != 0 { w.config.Mode = Fullscreen } else { w.config.Mode = Windowed } + w.config.Decorated = style&C.NSWindowStyleMaskFullSizeContentView == 0 } func (w *window) Configure(options []Option) { @@ -283,8 +304,6 @@ func (w *window) Configure(options []Option) { w.updateWindowMode() cnf := w.config cnf.apply(cfg, options) - // Decorations are never disabled. - cnf.Decorated = true switch cnf.Mode { case Fullscreen: @@ -347,6 +366,23 @@ func (w *window) Configure(options []Option) { } if cnf.Decorated != prev.Decorated { w.config.Decorated = cnf.Decorated + mask := C.getWindowStyleMask(w.window) + style := C.NSWindowStyleMask(C.NSWindowStyleMaskTitled | C.NSWindowStyleMaskResizable | C.NSWindowStyleMaskMiniaturizable | C.NSWindowStyleMaskClosable) + style = C.NSWindowStyleMaskFullSizeContentView + mask &^= style + barTrans := C.int(C.NO) + titleVis := C.NSWindowTitleVisibility(C.NSWindowTitleVisible) + if !cnf.Decorated { + mask |= style + barTrans = C.YES + titleVis = C.NSWindowTitleHidden + } + C.setWindowTitlebarAppearsTransparent(w.window, barTrans) + C.setWindowTitleVisibility(w.window, titleVis) + C.setWindowStyleMask(w.window, mask) + C.setWindowStandardButtonHidden(w.window, C.NSWindowCloseButton, barTrans) + C.setWindowStandardButtonHidden(w.window, C.NSWindowMiniaturizeButton, barTrans) + C.setWindowStandardButtonHidden(w.window, C.NSWindowZoomButton, barTrans) } if w.config != prev { w.w.Event(ConfigEvent{Config: w.config}) @@ -782,6 +818,7 @@ func newWindow(win *callbacks, options []Option) error { errch <- nil w.w = win w.window = C.gio_createWindow(w.view, 0, 0, 0, 0, 0, 0) + w.updateWindowMode() win.SetDriver(w) w.Configure(options) if nextTopLeft.x == 0 && nextTopLeft.y == 0 {