From bbb54d5f5408522ab06e435d09c50c568c6bedca Mon Sep 17 00:00:00 2001 From: Thomas Banks Date: Tue, 10 Feb 2026 07:21:31 +0000 Subject: [PATCH] app: enable creation of top most windows Floating windows are rendered above all other non-floating windows. Apple Documentation: https://developer.apple.com/documentation/appkit/nswindow/level-swift.struct Signed-off-by: Thomas Banks --- app/os.go | 2 ++ app/os_macos.go | 10 ++++++++++ app/window.go | 9 +++++++++ 3 files changed, 21 insertions(+) diff --git a/app/os.go b/app/os.go index 79adaafd..d35e6de7 100644 --- a/app/os.go +++ b/app/os.go @@ -45,6 +45,8 @@ type Config struct { CustomRenderer bool // Decorated reports whether window decorations are provided automatically. Decorated bool + // TopMost windows render above all other non-top-most windows. + TopMost bool // Focused reports whether has the keyboard focus. Focused bool // decoHeight is the height of the fallback decoration for platforms such diff --git a/app/os_macos.go b/app/os_macos.go index 839a0ae4..c58f98f0 100644 --- a/app/os_macos.go +++ b/app/os_macos.go @@ -241,6 +241,13 @@ static void setTitle(CFTypeRef windowRef, CFTypeRef titleRef) { } } +static void setWindowLevel(CFTypeRef windowRef, NSWindowLevel level) { + @autoreleasepool { + NSWindow *window = (__bridge NSWindow *)windowRef; + window.level = level; + } +} + static int isWindowZoomed(CFTypeRef windowRef) { @autoreleasepool { NSWindow *window = (__bridge NSWindow *)windowRef; @@ -495,6 +502,9 @@ func (w *window) Configure(options []Option) { barTrans = C.YES titleVis = C.NSWindowTitleHidden } + if cnf.TopMost { + C.setWindowLevel(window, C.NSFloatingWindowLevel) + } C.setWindowTitlebarAppearsTransparent(window, barTrans) C.setWindowTitleVisibility(window, titleVis) C.setWindowStyleMask(window, mask) diff --git a/app/window.go b/app/window.go index 3953600d..977ab6a1 100644 --- a/app/window.go +++ b/app/window.go @@ -969,6 +969,15 @@ func Decorated(enabled bool) Option { } } +// TopMost windows will be rendered above all other non-top-most windows. +// +// TopMost windows are only supported on MacOS currently. +func TopMost(enabled bool) Option { + return func(_ unit.Metric, cnf *Config) { + cnf.TopMost = enabled + } +} + // flushEvent is sent to detect when the user program // has completed processing of all prior events. Its an // [io/event.Event] but only for internal use.