From 2cea75508316f1ffcbda1f6c837c211f9071ff52 Mon Sep 17 00:00:00 2001 From: Peter Luo Date: Mon, 31 May 2021 18:51:14 +0800 Subject: [PATCH 1/4] Automatically expand or collapse when mouse enters menu bar --- Hidden Bar.xcodeproj/project.pbxproj | 12 ++++ hidden/Common/Util.swift | 7 ++ .../StatusBar/MouseOverDetector.swift | 71 +++++++++++++++++++ .../StatusBar/StatusBarController.swift | 6 ++ hidden/Models/EventMoniter.swift | 40 +++++++++++ hidden/Models/WindowInfo.swift | 47 ++++++++++++ 6 files changed, 183 insertions(+) create mode 100644 hidden/Features/StatusBar/MouseOverDetector.swift create mode 100644 hidden/Models/EventMoniter.swift create mode 100644 hidden/Models/WindowInfo.swift diff --git a/Hidden Bar.xcodeproj/project.pbxproj b/Hidden Bar.xcodeproj/project.pbxproj index 5f5abdf..6c9ec1f 100644 --- a/Hidden Bar.xcodeproj/project.pbxproj +++ b/Hidden Bar.xcodeproj/project.pbxproj @@ -9,6 +9,9 @@ /* Begin PBXBuildFile section */ 00117C4426600671005E517C /* Assets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00117C4326600671005E517C /* Assets.swift */; }; 00137CDF24A63DB1004AC855 /* Notification.Name+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00137CDE24A63DB1004AC855 /* Notification.Name+Extension.swift */; }; + 0095D59A2664E5EE00D4E607 /* EventMoniter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0095D5992664E5EE00D4E607 /* EventMoniter.swift */; }; + 0095D59C2664E8C900D4E607 /* MouseOverDetector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0095D59B2664E8C900D4E607 /* MouseOverDetector.swift */; }; + 0095D59E2664EDB000D4E607 /* WindowInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0095D59D2664EDB000D4E607 /* WindowInfo.swift */; }; 0842CDFB23A9FDD000D14BD4 /* GlobalKeybindingPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0842CDFA23A9FDD000D14BD4 /* GlobalKeybindingPreferences.swift */; }; 08A5F85A23AA007A00981CA5 /* PreferencesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A5F85923AA007A00981CA5 /* PreferencesViewController.swift */; }; 08A5F85C23AA013100981CA5 /* SelectedSecond.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A5F85B23AA013100981CA5 /* SelectedSecond.swift */; }; @@ -59,6 +62,9 @@ /* Begin PBXFileReference section */ 00117C4326600671005E517C /* Assets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Assets.swift; sourceTree = ""; }; 00137CDE24A63DB1004AC855 /* Notification.Name+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Notification.Name+Extension.swift"; sourceTree = ""; }; + 0095D5992664E5EE00D4E607 /* EventMoniter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventMoniter.swift; sourceTree = ""; }; + 0095D59B2664E8C900D4E607 /* MouseOverDetector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MouseOverDetector.swift; sourceTree = ""; }; + 0095D59D2664EDB000D4E607 /* WindowInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowInfo.swift; sourceTree = ""; }; 0842CDFA23A9FDD000D14BD4 /* GlobalKeybindingPreferences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobalKeybindingPreferences.swift; sourceTree = ""; }; 08A5F85923AA007A00981CA5 /* PreferencesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PreferencesViewController.swift; sourceTree = ""; }; 08A5F85B23AA013100981CA5 /* SelectedSecond.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectedSecond.swift; sourceTree = ""; }; @@ -141,6 +147,8 @@ children = ( 0842CDFA23A9FDD000D14BD4 /* GlobalKeybindingPreferences.swift */, 08A5F85B23AA013100981CA5 /* SelectedSecond.swift */, + 0095D5992664E5EE00D4E607 /* EventMoniter.swift */, + 0095D59D2664EDB000D4E607 /* WindowInfo.swift */, ); path = Models; sourceTree = ""; @@ -159,6 +167,7 @@ isa = PBXGroup; children = ( 92C97B9022018C1F0007559C /* StatusBarController.swift */, + 0095D59B2664E8C900D4E607 /* MouseOverDetector.swift */, ); path = StatusBar; sourceTree = ""; @@ -398,10 +407,12 @@ files = ( 92C97B8F220147FE0007559C /* Constant.swift in Sources */, 08C20FE023AB44E60035D978 /* Bundle+Extension.swift in Sources */, + 0095D59E2664EDB000D4E607 /* WindowInfo.swift in Sources */, 08A5F85C23AA013100981CA5 /* SelectedSecond.swift in Sources */, 08A5F86123AA085B00981CA5 /* Preferences.swift in Sources */, 92C97B9122018C1F0007559C /* StatusBarController.swift in Sources */, 55F3F1192608923B0054B881 /* Date+Extension.swift in Sources */, + 0095D59C2664E8C900D4E607 /* MouseOverDetector.swift in Sources */, 92D2122221FEE06600C92FF4 /* LauncherApplication.app in Sources */, 08B9F32C2411883300AA0551 /* NSWindow+Extension.swift in Sources */, 929113F521F9D04100173149 /* AppDelegate.swift in Sources */, @@ -409,6 +420,7 @@ 92C97B88220032ED0007559C /* Util.swift in Sources */, 967F4B2524169BC800F18D3C /* String+Extension.swift in Sources */, 00117C4426600671005E517C /* Assets.swift in Sources */, + 0095D59A2664E5EE00D4E607 /* EventMoniter.swift in Sources */, 08A5F85A23AA007A00981CA5 /* PreferencesViewController.swift in Sources */, 3CF14C82221FA49D0083D42B /* PreferencesWindowController.swift in Sources */, 92C97B8B220049D20007559C /* NSBarButtonItem+Extension.swift in Sources */, diff --git a/hidden/Common/Util.swift b/hidden/Common/Util.swift index 5a7b5e6..6e52518 100644 --- a/hidden/Common/Util.swift +++ b/hidden/Common/Util.swift @@ -29,5 +29,12 @@ class Util { let prefWindow = PreferencesWindowController.shared.window prefWindow?.bringToFront() } + + static var screenWithMouse : NSScreen? { + let mouseLocation = NSEvent.mouseLocation + let screens = NSScreen.screens + let screenWithMouse = (screens.first { NSMouseInRect(mouseLocation, $0.frame, false) }) + return screenWithMouse + } } diff --git a/hidden/Features/StatusBar/MouseOverDetector.swift b/hidden/Features/StatusBar/MouseOverDetector.swift new file mode 100644 index 0000000..ceaf807 --- /dev/null +++ b/hidden/Features/StatusBar/MouseOverDetector.swift @@ -0,0 +1,71 @@ +// +// MouseOverDetector.swift +// Hidden Bar +// +// Created by Peter Luo on 2021/5/31. +// Copyright © 2021 Dwarves Foundation. All rights reserved. +// + +import AppKit +import os // for os_log + +class MouseOverDetector { + + // flags + var mouseIsInArea = false + var mouseClickedInsideArea = false + + var entersAreaHandler : ()->Void + var leavesAreaHandler : (Bool)->Void // $0: whether or not the mouse has clicked inside the area before leaving + + private var statusBarY : CGFloat + private var mouseMoveMoniter : EventMoniter? + private var mouseClickMoniters = [EventMoniter]() + + init(entersArea entersAreaHandler: @escaping ()->Void, leavesArea leavesAreaHandler: @escaping (Bool)->Void) { + self.entersAreaHandler = entersAreaHandler + self.leavesAreaHandler = leavesAreaHandler + + if let statusbarRect = WindowInfo.cgRectOfWindow(named: "Menubar"), + let currentScreen = NSScreen.main { + // Cocoa uses top to down y coords but CoreGraphics uses down to top coords + // To avoid convertion everytime, statusBarY is inverted on initialize + statusBarY = currentScreen.frame.height - statusbarRect.height + print(statusbarRect.height) + } else { + os_log("Unable to get status bar height") + statusBarY = .nan + } + mouseMoveMoniter = EventMoniter(eventType: .mouseMoved, handler: mouseMoved) + mouseClickMoniters = [ + EventMoniter(eventType: .leftMouseUp , handler: mouseClicked), + EventMoniter(eventType: .rightMouseUp, handler: mouseClicked), + EventMoniter(eventType: .otherMouseUp, handler: mouseClicked), + ] + + mouseMoveMoniter?.start() + mouseClickMoniters.forEach { $0.start() } + } + + private func mouseClicked(_ event: NSEvent) { + if NSEvent.mouseLocation.y >= statusBarY { // clicks inside the status bar + mouseClickedInsideArea = true + } + } + + private func mouseMoved(_ event: NSEvent) { + if mouseIsInArea { + if NSEvent.mouseLocation.y < statusBarY { // leaves area + leavesAreaHandler(mouseClickedInsideArea) + mouseIsInArea = false + } + } else { + if NSEvent.mouseLocation.y >= statusBarY { // enters area + mouseClickedInsideArea = false + entersAreaHandler() + mouseIsInArea = true + } + } + } + +} diff --git a/hidden/Features/StatusBar/StatusBarController.swift b/hidden/Features/StatusBar/StatusBarController.swift index 01ea54b..3a043fb 100644 --- a/hidden/Features/StatusBar/StatusBarController.swift +++ b/hidden/Features/StatusBar/StatusBarController.swift @@ -12,6 +12,7 @@ class StatusBarController { //MARK: - Variables private var timer:Timer? = nil + private var mouseOverDetector : MouseOverDetector? //MARK: - BarItems @@ -69,6 +70,11 @@ class StatusBarController { if Preferences.areSeparatorsHidden {hideSeparators()} autoCollapseIfNeeded() + + mouseOverDetector = MouseOverDetector( + entersArea: expandMenubar, + leavesArea: { if !$0 {self.collapseMenuBar()} } + ) } private func setupUI() { diff --git a/hidden/Models/EventMoniter.swift b/hidden/Models/EventMoniter.swift new file mode 100644 index 0000000..0e968f1 --- /dev/null +++ b/hidden/Models/EventMoniter.swift @@ -0,0 +1,40 @@ +// +// EventMoniter.swift +// Hidden Bar +// +// Created by Peter Luo on 2021/5/31. +// Copyright © 2021 Dwarves Foundation. All rights reserved. +// + +import AppKit + +class EventMoniter { + + var globalMoniter : Any? + var localMoniter : Any? + var handler : (NSEvent)->Void + var eventType : NSEvent.EventTypeMask + + init(eventType: NSEvent.EventTypeMask, handler: @escaping (NSEvent)->Void) { + self.handler = handler + self.eventType = eventType + } + + func start() { + globalMoniter = NSEvent.addGlobalMonitorForEvents(matching: eventType, handler: handler) + localMoniter = NSEvent.addLocalMonitorForEvents(matching: eventType) { event in + self.handler(event) + return event + } + } + + func stop() { + globalMoniter = nil + localMoniter = nil + } + + deinit { + stop() + } + +} diff --git a/hidden/Models/WindowInfo.swift b/hidden/Models/WindowInfo.swift new file mode 100644 index 0000000..9ed14d2 --- /dev/null +++ b/hidden/Models/WindowInfo.swift @@ -0,0 +1,47 @@ +// +// WindowInfo.swift +// Hidden Bar +// +// Created by Peter Luo on 2021/5/31. +// Copyright © 2021 Dwarves Foundation. All rights reserved. +// + +import AppKit + +class WindowInfo { + + enum InfoType : String { + case alpha = "kCGWindowAlpha" + case bounds = "kCGWindowBounds" + case ownerName = "kCGWindowOwnerName" + case ownerPID = "kCGWindowOwnerPID" + case number = "kCGWindowNumber" + case name = "kCGWindowName" + case layer = "kCGWindowLayer" + } + + static var infoList : [ [ String : Any ] ]? { + let options = CGWindowListOption(arrayLiteral: .excludeDesktopElements, .optionOnScreenOnly) + guard let infoList = CGWindowListCopyWindowInfo(options, CGWindowID(0)) else { return nil } + return (infoList as! [[String : Any]]) + } + + static func infoFor(windowNamed windowName: String, infoType: WindowInfo.InfoType) -> Any? { + guard let infoList = WindowInfo.infoList else { return nil } + for info in infoList { + if let name = info["kCGWindowName"] as? String, name == windowName { + return info[infoType.rawValue] + } + } + return nil + } + + static func cgRectOfWindow(named windowName: String) -> CGRect? { + guard let bounds = WindowInfo.infoFor(windowNamed: windowName, infoType: .bounds), + let cgRect = CGRect(dictionaryRepresentation: bounds as! CFDictionary) + else { return nil } + + return cgRect + } + +} From adce9c261f12208d523b9c9c204d228aeb54a1a9 Mon Sep 17 00:00:00 2001 From: Peter Luo Date: Mon, 31 May 2021 19:04:42 +0800 Subject: [PATCH 2/4] Support multiple screens --- Hidden Bar.xcodeproj/project.pbxproj | 4 +++ hidden/Extensions/CGPoint+Extension.swift | 15 +++++++++ .../StatusBar/MouseOverDetector.swift | 32 ++++++++++++------- 3 files changed, 40 insertions(+), 11 deletions(-) create mode 100644 hidden/Extensions/CGPoint+Extension.swift diff --git a/Hidden Bar.xcodeproj/project.pbxproj b/Hidden Bar.xcodeproj/project.pbxproj index 6c9ec1f..47097ff 100644 --- a/Hidden Bar.xcodeproj/project.pbxproj +++ b/Hidden Bar.xcodeproj/project.pbxproj @@ -12,6 +12,7 @@ 0095D59A2664E5EE00D4E607 /* EventMoniter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0095D5992664E5EE00D4E607 /* EventMoniter.swift */; }; 0095D59C2664E8C900D4E607 /* MouseOverDetector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0095D59B2664E8C900D4E607 /* MouseOverDetector.swift */; }; 0095D59E2664EDB000D4E607 /* WindowInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0095D59D2664EDB000D4E607 /* WindowInfo.swift */; }; + 0095D5A02664F7F800D4E607 /* CGPoint+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0095D59F2664F7F800D4E607 /* CGPoint+Extension.swift */; }; 0842CDFB23A9FDD000D14BD4 /* GlobalKeybindingPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0842CDFA23A9FDD000D14BD4 /* GlobalKeybindingPreferences.swift */; }; 08A5F85A23AA007A00981CA5 /* PreferencesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A5F85923AA007A00981CA5 /* PreferencesViewController.swift */; }; 08A5F85C23AA013100981CA5 /* SelectedSecond.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A5F85B23AA013100981CA5 /* SelectedSecond.swift */; }; @@ -65,6 +66,7 @@ 0095D5992664E5EE00D4E607 /* EventMoniter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventMoniter.swift; sourceTree = ""; }; 0095D59B2664E8C900D4E607 /* MouseOverDetector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MouseOverDetector.swift; sourceTree = ""; }; 0095D59D2664EDB000D4E607 /* WindowInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowInfo.swift; sourceTree = ""; }; + 0095D59F2664F7F800D4E607 /* CGPoint+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CGPoint+Extension.swift"; sourceTree = ""; }; 0842CDFA23A9FDD000D14BD4 /* GlobalKeybindingPreferences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobalKeybindingPreferences.swift; sourceTree = ""; }; 08A5F85923AA007A00981CA5 /* PreferencesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PreferencesViewController.swift; sourceTree = ""; }; 08A5F85B23AA013100981CA5 /* SelectedSecond.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectedSecond.swift; sourceTree = ""; }; @@ -191,6 +193,7 @@ 00137CDE24A63DB1004AC855 /* Notification.Name+Extension.swift */, 55F3F1182608923B0054B881 /* Date+Extension.swift */, 55F3F11C2608925A0054B881 /* StackView+Extension.swift */, + 0095D59F2664F7F800D4E607 /* CGPoint+Extension.swift */, ); path = Extensions; sourceTree = ""; @@ -427,6 +430,7 @@ 92C97B8D220058740007559C /* NSView+Extension.swift in Sources */, 0842CDFB23A9FDD000D14BD4 /* GlobalKeybindingPreferences.swift in Sources */, 55F3F11D2608925A0054B881 /* StackView+Extension.swift in Sources */, + 0095D5A02664F7F800D4E607 /* CGPoint+Extension.swift in Sources */, 08C20FE223AB452C0035D978 /* AboutViewController.swift in Sources */, 00137CDF24A63DB1004AC855 /* Notification.Name+Extension.swift in Sources */, 08A5F86423AA09F300981CA5 /* UserDefault+Extension.swift in Sources */, diff --git a/hidden/Extensions/CGPoint+Extension.swift b/hidden/Extensions/CGPoint+Extension.swift new file mode 100644 index 0000000..5444798 --- /dev/null +++ b/hidden/Extensions/CGPoint+Extension.swift @@ -0,0 +1,15 @@ +// +// CGPoint+Extension.swift +// Hidden Bar +// +// Created by Peter Luo on 2021/5/31. +// Copyright © 2021 Dwarves Foundation. All rights reserved. +// + +import Foundation + +extension CGPoint { + static func ~=(lhs: CGPoint, rhs: CGPoint) -> Bool { + Int(lhs.x) == Int(rhs.x) && Int(lhs.y) == Int(rhs.y) + } +} diff --git a/hidden/Features/StatusBar/MouseOverDetector.swift b/hidden/Features/StatusBar/MouseOverDetector.swift index ceaf807..86765b9 100644 --- a/hidden/Features/StatusBar/MouseOverDetector.swift +++ b/hidden/Features/StatusBar/MouseOverDetector.swift @@ -18,24 +18,17 @@ class MouseOverDetector { var entersAreaHandler : ()->Void var leavesAreaHandler : (Bool)->Void // $0: whether or not the mouse has clicked inside the area before leaving - private var statusBarY : CGFloat + private var statusBarY : CGFloat = .nan private var mouseMoveMoniter : EventMoniter? private var mouseClickMoniters = [EventMoniter]() + private var previousMouseLocation: CGPoint = .zero + init(entersArea entersAreaHandler: @escaping ()->Void, leavesArea leavesAreaHandler: @escaping (Bool)->Void) { self.entersAreaHandler = entersAreaHandler self.leavesAreaHandler = leavesAreaHandler - if let statusbarRect = WindowInfo.cgRectOfWindow(named: "Menubar"), - let currentScreen = NSScreen.main { - // Cocoa uses top to down y coords but CoreGraphics uses down to top coords - // To avoid convertion everytime, statusBarY is inverted on initialize - statusBarY = currentScreen.frame.height - statusbarRect.height - print(statusbarRect.height) - } else { - os_log("Unable to get status bar height") - statusBarY = .nan - } + updateMenubarMinY() mouseMoveMoniter = EventMoniter(eventType: .mouseMoved, handler: mouseMoved) mouseClickMoniters = [ EventMoniter(eventType: .leftMouseUp , handler: mouseClicked), @@ -53,7 +46,24 @@ class MouseOverDetector { } } + private func updateMenubarMinY() { + if let statusbarRect = WindowInfo.cgRectOfWindow(named: "Menubar"), + let currentScreen = Util.screenWithMouse { + // Cocoa uses top to down y coords but CoreGraphics uses down to top coords + // To avoid convertion everytime, statusBarY is inverted on initialize + statusBarY = currentScreen.frame.height - statusbarRect.height + } else { + os_log("unable to get menu bar height") + } + } + private func mouseMoved(_ event: NSEvent) { + // must have at least 1 pixel of difference before proceeding + guard !(NSEvent.mouseLocation ~= previousMouseLocation) else { return } + if NSScreen.screens.count > 1 { + updateMenubarMinY() + } + if mouseIsInArea { if NSEvent.mouseLocation.y < statusBarY { // leaves area leavesAreaHandler(mouseClickedInsideArea) From 791816f512f449030943ce50630654c10457f9de Mon Sep 17 00:00:00 2001 From: Peter Luo Date: Mon, 31 May 2021 19:20:31 +0800 Subject: [PATCH 3/4] Added auto expand and collapse option --- hidden/AppDelegate.swift | 1 + hidden/Base.lproj/Main.storyboard | 55 ++++++++++++------- hidden/Common/Preferences.swift | 12 ++++ hidden/Extensions/UserDefault+Extension.swift | 1 + .../PreferencesViewController.swift | 5 ++ .../StatusBar/MouseOverDetector.swift | 9 ++- .../StatusBar/StatusBarController.swift | 13 ++++- hidden/Models/EventMoniter.swift | 3 + 8 files changed, 75 insertions(+), 24 deletions(-) diff --git a/hidden/AppDelegate.swift b/hidden/AppDelegate.swift index d947afd..4a119c1 100644 --- a/hidden/AppDelegate.swift +++ b/hidden/AppDelegate.swift @@ -47,6 +47,7 @@ class AppDelegate: NSObject, NSApplicationDelegate{ UserDefaults.standard.register(defaults: [ UserDefaults.Key.isAutoStart: false, UserDefaults.Key.isShowPreference: true, + UserDefaults.Key.autoExpandCollapse: false, UserDefaults.Key.isAutoHide: true, UserDefaults.Key.numberOfSecondForAutoHide: 10.0, UserDefaults.Key.areSeparatorsHidden: false, diff --git a/hidden/Base.lproj/Main.storyboard b/hidden/Base.lproj/Main.storyboard index f7cd930..fa4b8aa 100644 --- a/hidden/Base.lproj/Main.storyboard +++ b/hidden/Base.lproj/Main.storyboard @@ -413,17 +413,17 @@ - + - + - + - + In your Mac's menu bar, hold ⌘ and drag icons @@ -433,7 +433,7 @@ between sections to configure Hidden Bar. - + @@ -441,7 +441,7 @@ between sections to configure Hidden Bar. - + @@ -449,7 +449,7 @@ between sections to configure Hidden Bar. - + @@ -570,7 +570,7 @@ between sections to configure Hidden Bar. - + @@ -579,7 +579,7 @@ between sections to configure Hidden Bar. - + @@ -588,7 +588,7 @@ between sections to configure Hidden Bar. - + @@ -614,7 +614,7 @@ between sections to configure Hidden Bar. - + @@ -622,13 +622,13 @@ between sections to configure Hidden Bar. - + - + - + @@ -763,6 +773,7 @@ between sections to configure Hidden Bar. + @@ -770,13 +781,14 @@ between sections to configure Hidden Bar. + - + - + @@ -784,7 +796,7 @@ between sections to configure Hidden Bar. - + @@ -861,6 +873,7 @@ between sections to configure Hidden Bar. + diff --git a/hidden/Common/Preferences.swift b/hidden/Common/Preferences.swift index d69adb1..85fcf93 100644 --- a/hidden/Common/Preferences.swift +++ b/hidden/Common/Preferences.swift @@ -74,6 +74,18 @@ enum Preferences { } } + static var autoExpandCollapse: Bool { + get { + UserDefaults.standard.bool(forKey: UserDefaults.Key.autoExpandCollapse) + } + set { + print(newValue) + UserDefaults.standard.set(newValue, forKey: UserDefaults.Key.autoExpandCollapse) + + NotificationCenter.default.post(Notification(name: .prefsChanged)) + } + } + static var areSeparatorsHidden: Bool { get { UserDefaults.standard.bool(forKey: UserDefaults.Key.areSeparatorsHidden) diff --git a/hidden/Extensions/UserDefault+Extension.swift b/hidden/Extensions/UserDefault+Extension.swift index a870fab..03a5fb1 100644 --- a/hidden/Extensions/UserDefault+Extension.swift +++ b/hidden/Extensions/UserDefault+Extension.swift @@ -15,6 +15,7 @@ extension UserDefaults { static let isAutoStart = "isAutoStart" static let isAutoHide = "isAutoHide" static let isShowPreference = "isShowPreferences" + static let autoExpandCollapse = "autoExpandCollapse" static let areSeparatorsHidden = "areSeparatorsHidden" static let alwaysHiddenSectionEnabled = "alwaysHiddenSectionEnabled" static let useFullStatusBarOnExpandEnabled = "useFullStatusBarOnExpandEnabled" diff --git a/hidden/Features/Preferences/PreferencesViewController.swift b/hidden/Features/Preferences/PreferencesViewController.swift index c0e0d2f..675d93b 100644 --- a/hidden/Features/Preferences/PreferencesViewController.swift +++ b/hidden/Features/Preferences/PreferencesViewController.swift @@ -30,6 +30,7 @@ class PreferencesViewController: NSViewController { @IBOutlet weak var checkBoxLogin: NSButton! @IBOutlet weak var checkBoxShowPreferences: NSButton! @IBOutlet weak var checkBoxShowAlwaysHiddenSection: NSButton! + @IBOutlet weak var checkBoxAutoExpandCollapse: NSButton! @IBOutlet weak var checkBoxUseFullStatusbar: NSButton! @IBOutlet weak var timePopup: NSPopUpButton! @@ -74,6 +75,9 @@ class PreferencesViewController: NSViewController { Preferences.isShowPreference = sender.state == .on } + @IBAction func autoExpandCollapse(_ sender: NSButton) { + Preferences.autoExpandCollapse = sender.state == .on + } @IBAction func showAlwaysHiddenSectionChanged(_ sender: NSButton) { Preferences.alwaysHiddenSectionEnabled = sender.state == .on @@ -156,6 +160,7 @@ class PreferencesViewController: NSViewController { checkBoxAutoHide.state = Preferences.isAutoHide ? .on : .off checkBoxShowPreferences.state = Preferences.isShowPreference ? .on : .off checkBoxShowAlwaysHiddenSection.state = Preferences.alwaysHiddenSectionEnabled ? .on : .off + checkBoxAutoExpandCollapse.state = Preferences.autoExpandCollapse ? .on : .off timePopup.selectItem(at: SelectedSecond.secondToPossition(seconds: Preferences.numberOfSecondForAutoHide)) } diff --git a/hidden/Features/StatusBar/MouseOverDetector.swift b/hidden/Features/StatusBar/MouseOverDetector.swift index 86765b9..2554d7b 100644 --- a/hidden/Features/StatusBar/MouseOverDetector.swift +++ b/hidden/Features/StatusBar/MouseOverDetector.swift @@ -35,11 +35,18 @@ class MouseOverDetector { EventMoniter(eventType: .rightMouseUp, handler: mouseClicked), EventMoniter(eventType: .otherMouseUp, handler: mouseClicked), ] - + } + + func start() { mouseMoveMoniter?.start() mouseClickMoniters.forEach { $0.start() } } + func stop() { + mouseMoveMoniter?.stop() + mouseClickMoniters.forEach { $0.stop() } + } + private func mouseClicked(_ event: NSEvent) { if NSEvent.mouseLocation.y >= statusBarY { // clicks inside the status bar mouseClickedInsideArea = true diff --git a/hidden/Features/StatusBar/StatusBarController.swift b/hidden/Features/StatusBar/StatusBarController.swift index 3a043fb..a882bf8 100644 --- a/hidden/Features/StatusBar/StatusBarController.swift +++ b/hidden/Features/StatusBar/StatusBarController.swift @@ -75,6 +75,8 @@ class StatusBarController { entersArea: expandMenubar, leavesArea: { if !$0 {self.collapseMenuBar()} } ) + + updatePrefs() } private func setupUI() { @@ -199,7 +201,7 @@ class StatusBarController { let toggleAutoHideItem = NSMenuItem(title: "Toggle Auto Collapse".localized, action: #selector(toggleAutoHide), keyEquivalent: "t") toggleAutoHideItem.target = self toggleAutoHideItem.tag = 1 - NotificationCenter.default.addObserver(self, selector: #selector(updateAutoHide), name: .prefsChanged, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(updatePrefs), name: .prefsChanged, object: nil) menu.addItem(toggleAutoHideItem) menu.addItem(NSMenuItem.separator()) @@ -217,9 +219,16 @@ class StatusBarController { } } - @objc func updateAutoHide() { + @objc func updatePrefs() { updateAutoCollapseMenuTitle() autoCollapseIfNeeded() + + if Preferences.autoExpandCollapse { + mouseOverDetector?.stop() + mouseOverDetector?.start() + } else { + mouseOverDetector?.stop() + } } @objc func openPreferenceViewControllerIfNeeded() { diff --git a/hidden/Models/EventMoniter.swift b/hidden/Models/EventMoniter.swift index 0e968f1..c023066 100644 --- a/hidden/Models/EventMoniter.swift +++ b/hidden/Models/EventMoniter.swift @@ -29,6 +29,9 @@ class EventMoniter { } func stop() { + guard globalMoniter != nil && localMoniter != nil else { return } + NSEvent.removeMonitor(globalMoniter!) + NSEvent.removeMonitor(localMoniter!) globalMoniter = nil localMoniter = nil } From 77ec28d70d6cb6d54bf3640f543618a6d637bdf1 Mon Sep 17 00:00:00 2001 From: Peter Luo Date: Tue, 1 Jun 2021 18:38:03 +0800 Subject: [PATCH 4/4] Not collapse when menu bar is in use --- Hidden Bar.xcodeproj/project.pbxproj | 2 +- .../xcschemes/Hidden Bar.xcscheme | 2 +- .../xcschemes/LauncherApplication.xcscheme | 2 +- hidden/AppDelegate.swift | 2 +- hidden/Base.lproj/Main.storyboard | 4 +-- hidden/Common/Assets.swift | 4 +-- hidden/Common/Constant.swift | 2 -- hidden/Common/Preferences.swift | 1 - hidden/Common/Util.swift | 34 +++++++++++++++++++ .../StatusBar/MouseOverDetector.swift | 9 +++-- .../StatusBar/StatusBarController.swift | 8 +++-- 11 files changed, 55 insertions(+), 15 deletions(-) diff --git a/Hidden Bar.xcodeproj/project.pbxproj b/Hidden Bar.xcodeproj/project.pbxproj index 47097ff..8ea93ca 100644 --- a/Hidden Bar.xcodeproj/project.pbxproj +++ b/Hidden Bar.xcodeproj/project.pbxproj @@ -334,7 +334,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 1010; - LastUpgradeCheck = 1130; + LastUpgradeCheck = 1250; ORGANIZATIONNAME = "Dwarves Foundation"; TargetAttributes = { 929113F021F9D04100173149 = { diff --git a/Hidden Bar.xcodeproj/xcshareddata/xcschemes/Hidden Bar.xcscheme b/Hidden Bar.xcodeproj/xcshareddata/xcschemes/Hidden Bar.xcscheme index 0693785..dd16079 100644 --- a/Hidden Bar.xcodeproj/xcshareddata/xcschemes/Hidden Bar.xcscheme +++ b/Hidden Bar.xcodeproj/xcshareddata/xcschemes/Hidden Bar.xcscheme @@ -1,6 +1,6 @@