From dee3296f9e147845e795ca176565f98363564edc Mon Sep 17 00:00:00 2001 From: Islam Sharabash Date: Thu, 13 May 2021 12:32:14 -0700 Subject: [PATCH] Enable showing the popover without taking application focus and keeping the popover visible without disabling right click --- Sources/Popover/Popover.swift | 20 ++++++++++--------- Sources/Popover/PopoverWindowController.swift | 10 +++++++--- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/Sources/Popover/Popover.swift b/Sources/Popover/Popover.swift index 163a03d..f5d97f1 100644 --- a/Sources/Popover/Popover.swift +++ b/Sources/Popover/Popover.swift @@ -12,11 +12,7 @@ public class Popover: NSObject { return popoverWindowController?.window } - public var keepPopoverVisible: Bool = false { - didSet { - keepPopoverVisible ? removeMonitors() : setupMonitors() - } - } + public var keepPopoverVisible: Bool = false @objc dynamic var item: NSStatusItem! { didSet { @@ -90,10 +86,14 @@ public class Popover: NSObject { localEventMonitor?.start() } - /// Shows the Popover with no animation public func show() { + self.show(withFocus: true) + } + + /// Shows the Popover with no animation + public func show(withFocus: Bool) { guard !isPopoverWindowVisible else { return } - popoverWindowController?.show() + popoverWindowController?.show(withFocus: withFocus) globalEventMonitor?.start() guard let button = item.button else { return } @@ -117,7 +117,9 @@ public class Popover: NSObject { private func setupMonitors() { globalEventMonitor = EventMonitor(monitorType: .global, mask: [.leftMouseDown, .rightMouseDown], globalHandler: { [weak self] _ in guard let self = self else { return } - self.dismiss() + if (!self.keepPopoverVisible) { + self.dismiss() + } }, localHandler: nil) if menuItems != nil, menuItems?.isNotEmpty ?? false { @@ -167,7 +169,7 @@ public class Popover: NSObject { } @objc private func handleStatusItemButtonAction(_ sender: Any?) { - isPopoverWindowVisible ? dismiss() : show() + isPopoverWindowVisible ? dismiss() : show(withFocus: true) } private func setTargetAction(for button: NSButton) { diff --git a/Sources/Popover/PopoverWindowController.swift b/Sources/Popover/PopoverWindowController.swift index f040c91..e3b4a59 100644 --- a/Sources/Popover/PopoverWindowController.swift +++ b/Sources/Popover/PopoverWindowController.swift @@ -28,14 +28,18 @@ class PopoverWindowController: NSWindowController, NSWindowDelegate { fatalError("init(coder:) has not been implemented") } - func show() { + func show(withFocus: Bool) { guard !isAnimating else { return } updateWindowFrame() - showWindow(nil) + if (withFocus) { + showWindow(nil) + window?.makeKey() + } else { + window?.orderFrontRegardless() + } windowIsOpen = true - window?.makeKey() // TODO: animation }