From 2bf1cbad2ac669f1fb4269c89e655b22f9c3418d Mon Sep 17 00:00:00 2001 From: Harvey Zuccon Date: Sat, 7 Mar 2026 23:13:57 +1100 Subject: [PATCH] Fix notch ears. Fix Terminal Detach. Add icons. Fix mouse hover behaviour during shrink. --- .DS_Store | Bin 0 -> 10244 bytes Downterm/Downterm.xcodeproj/project.pbxproj | 25 ++- .../UserInterfaceState.xcuserstate | Bin 30171 -> 31266 bytes Downterm/Downterm/Components/NotchShape.swift | 22 +- Downterm/Downterm/ContentView.swift | 36 +++- .../Managers/PopoutWindowController.swift | 40 ++-- .../Downterm/Managers/ScreenManager.swift | 32 ++- Downterm/Downterm/Models/NotchViewModel.swift | 30 +++ .../AppIcon.appiconset/Contents.json | 68 ++++++ .../AppIcon.appiconset/icon_128x128.png | Bin 0 -> 945 bytes .../AppIcon.appiconset/icon_128x128@2x.png | Bin 0 -> 1939 bytes .../AppIcon.appiconset/icon_16x16.png | Bin 0 -> 735 bytes .../AppIcon.appiconset/icon_16x16@2x.png | Bin 0 -> 290 bytes .../AppIcon.appiconset/icon_256x256.png | Bin 0 -> 1939 bytes .../AppIcon.appiconset/icon_256x256@2x.png | Bin 0 -> 4366 bytes .../AppIcon.appiconset/icon_32x32.png | Bin 0 -> 958 bytes .../AppIcon.appiconset/icon_32x32@2x.png | Bin 0 -> 512 bytes .../AppIcon.appiconset/icon_512x512.png | Bin 0 -> 4366 bytes .../AppIcon.appiconset/icon_512x512@2x.png | Bin 0 -> 30060 bytes .../Resources/Assets.xcassets/Contents.json | 6 + Downterm/Downterm/Resources/Info.plist | 8 +- icons/.DS_Store | Bin 0 -> 6148 bytes icons/Downterm-icon-128.png | Bin 0 -> 945 bytes icons/Downterm-icon-256.png | Bin 0 -> 1939 bytes icons/Downterm-icon-32.png | Bin 0 -> 290 bytes icons/Downterm-icon-512.png | Bin 0 -> 4366 bytes icons/Downterm-icon-64.png | Bin 0 -> 512 bytes icons/Icon.svg | 197 ++++++++++++++++++ 28 files changed, 419 insertions(+), 45 deletions(-) create mode 100644 .DS_Store create mode 100644 Downterm/Downterm/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Downterm/Downterm/Resources/Assets.xcassets/AppIcon.appiconset/icon_128x128.png create mode 100644 Downterm/Downterm/Resources/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png create mode 100644 Downterm/Downterm/Resources/Assets.xcassets/AppIcon.appiconset/icon_16x16.png create mode 100644 Downterm/Downterm/Resources/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png create mode 100644 Downterm/Downterm/Resources/Assets.xcassets/AppIcon.appiconset/icon_256x256.png create mode 100644 Downterm/Downterm/Resources/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png create mode 100644 Downterm/Downterm/Resources/Assets.xcassets/AppIcon.appiconset/icon_32x32.png create mode 100644 Downterm/Downterm/Resources/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png create mode 100644 Downterm/Downterm/Resources/Assets.xcassets/AppIcon.appiconset/icon_512x512.png create mode 100644 Downterm/Downterm/Resources/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png create mode 100644 Downterm/Downterm/Resources/Assets.xcassets/Contents.json create mode 100644 icons/.DS_Store create mode 100644 icons/Downterm-icon-128.png create mode 100644 icons/Downterm-icon-256.png create mode 100644 icons/Downterm-icon-32.png create mode 100644 icons/Downterm-icon-512.png create mode 100644 icons/Downterm-icon-64.png create mode 100644 icons/Icon.svg diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..e420e6d2fdb889f11755ba8a6390d2dabea78b3e GIT binary patch literal 10244 zcmeHM&2JM&6n_%}tVtjnNYWBfX@xl;VcK2CA4FA!F-9fjkSH6`gpaywd*UptcdXq_ z42>fB-j6?^e?X5t)1G>%IC15`g@2$2PMmqOGd8x9sD~IDH8ax8dpmF5jOXY5?b~?^ z0HnBCvj7YL(6Dl;k7Kh(;dWkkl@Zyaqa^4L5LQ}Yv*NMJuCb~^A)pXY2q**;0t$h{ zfdIyAUbHbGRjUwC2q*-)2=M2FftAaGlx-p7M+Y|X5dh^VcE<&EejMOFhLi;<+d`rR z3lXj;g)5Oq3?kgI-;m=9QnrN@?m*<>gUFSMJfV9GC8pRP*d znb0TCo|~MSoSvSZ`Q+2{v$Ge<`nifzeOwRtkG;t}78Jcry6RS$Z@WLx)rdZcxKh^7 z4vbr-weQ|{tvqewn5p+2@myaAl=}DUfm>T#Uk_=t+M}V4?U+sy+yysqKGy4NIn~GWGSG0 zrg&|;=~P|6p1l4>z?m#8b(G6O(IF`md}W;KXi}2oU$hN`I|qJ^GQKM zRC?}QuWs2@)@TZI{z<>J!Ad2Wm(o5TcW=%7{`|(^h}yr5Xm0eb(B=#EtiNRkzQ_DJ z_VQnR36_C^ht+`)+pADQhP9Am5nct*00YusV$Gq=gt@rQ%igPCK^A*5knPE+{Wpv> zujNukK5ZV5kwXJS@%jJD=b_ysLuO+Z^2o+C%=fVI&rUG;Xz_8j6Cd;QY0gH=%2+95 zE;lz2Ab9}9vTuO=8I1=;x{HXSqoU(}L9Ba|43UnO43s=XrVj@lubJ`ds%7QVNXP8p z`|5|LV;>@lj*5~)%vP(tW zF;86VRd}x5!1_H_Uii4Skg*FkeIEkwf~Vu-yb;<=)Z>DBfh#E6LZXJ{qkjxg`8-7Z d5a#m^dMfQ^%?93Z4mxl5Aaghl9K$&OzXQvX9R2_R literal 0 HcmV?d00001 diff --git a/Downterm/Downterm.xcodeproj/project.pbxproj b/Downterm/Downterm.xcodeproj/project.pbxproj index 52acea9..90b7056 100644 --- a/Downterm/Downterm.xcodeproj/project.pbxproj +++ b/Downterm/Downterm.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 0F4A88A33D93B6E100A1C001 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0F4A88A33D93B6E100A1C002 /* Assets.xcassets */; }; 2213F430F3D8A88033607CD2 /* NotchSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA6359CF9DDF89413440300D /* NotchSettings.swift */; }; 247C6F84E7ADE7AED43381E2 /* DowntermApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B671125208055E5334CB85E /* DowntermApp.swift */; }; 26A767A10DDA77A690CC3C37 /* NotchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 589421631401C819FE1A7BA9 /* NotchViewModel.swift */; }; @@ -35,6 +36,7 @@ 02FEFF9074A85F02C43D9408 /* NotchWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotchWindow.swift; sourceTree = ""; }; 0A973877BCE6084D0EBBBDBD /* SettingsWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsWindowController.swift; sourceTree = ""; }; 0B567F3B5D006D2B35630CFF /* LaunchAtLoginHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchAtLoginHelper.swift; sourceTree = ""; }; + 0F4A88A33D93B6E100A1C002 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 15A290D4D21D6C01A583A372 /* ScreenManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenManager.swift; sourceTree = ""; }; 1E47000112562615C7E59489 /* SwiftTermView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftTermView.swift; sourceTree = ""; }; 1FC09C538CBE7C2D072008B2 /* NotchShape.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotchShape.swift; sourceTree = ""; }; @@ -72,6 +74,7 @@ 0EF94ED46B4860C241540F0A /* Resources */ = { isa = PBXGroup; children = ( + 0F4A88A33D93B6E100A1C002 /* Assets.xcassets */, 9547A79F60E46F4521A70674 /* Downterm.entitlements */, ); path = Resources; @@ -171,6 +174,7 @@ buildPhases = ( F3C6D5CD1247D246A3F6F7AB /* Sources */, 6085DF2BDFFB2A99C4ABD514 /* Frameworks */, + 0F4A88A33D93B6E100A1C003 /* Resources */, ); buildRules = ( ); @@ -214,6 +218,17 @@ }; /* End PBXProject section */ +/* Begin PBXResourcesBuildPhase section */ + 0F4A88A33D93B6E100A1C003 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0F4A88A33D93B6E100A1C001 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ F3C6D5CD1247D246A3F6F7AB /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -250,17 +265,20 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CLANG_USE_OPTIMIZATION_PROFILE = YES; CODE_SIGN_ENTITLEMENTS = Downterm/Resources/Downterm.entitlements; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; COMBINE_HIDPI_IMAGES = YES; "DEVELOPMENT_TEAM[sdk=macosx*]" = G698BP272N; INFOPLIST_FILE = Downterm/Resources/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = CommandNotch; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.downterm.app; + MARKETING_VERSION = 0.0.3; + PRODUCT_BUNDLE_IDENTIFIER = com.commandnotch.app; PRODUCT_NAME = Downterm; SDKROOT = macosx; }; @@ -334,17 +352,20 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CLANG_USE_OPTIMIZATION_PROFILE = YES; CODE_SIGN_ENTITLEMENTS = Downterm/Resources/Downterm.entitlements; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; COMBINE_HIDPI_IMAGES = YES; "DEVELOPMENT_TEAM[sdk=macosx*]" = G698BP272N; INFOPLIST_FILE = Downterm/Resources/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = CommandNotch; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.downterm.app; + MARKETING_VERSION = 0.0.3; + PRODUCT_BUNDLE_IDENTIFIER = com.commandnotch.app; PRODUCT_NAME = Downterm; SDKROOT = macosx; }; diff --git a/Downterm/Downterm.xcodeproj/project.xcworkspace/xcuserdata/harvmaster.xcuserdatad/UserInterfaceState.xcuserstate b/Downterm/Downterm.xcodeproj/project.xcworkspace/xcuserdata/harvmaster.xcuserdatad/UserInterfaceState.xcuserstate index de94b2f30c628ee798d0a28a9db918435e28adf7..00e001456b1dcc0d67c562f0a213032094d7ef3a 100644 GIT binary patch delta 15184 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 diff --git a/Downterm/Downterm/Components/NotchShape.swift b/Downterm/Downterm/Components/NotchShape.swift index 71cb44e..a0aad11 100644 --- a/Downterm/Downterm/Components/NotchShape.swift +++ b/Downterm/Downterm/Components/NotchShape.swift @@ -5,13 +5,13 @@ import SwiftUI /// between the compact closed state and the expanded open state. /// /// The shape uses quadratic Bezier curves to produce the distinctive -/// "ear" ramps on each side when closed, and a clean rounded-bottom +/// top-edge cut-ins of the closed notch, and a clean rounded-bottom /// rectangle when open (topCornerRadius approaches 0). struct NotchShape: Shape { - /// Radius applied to the top-left and top-right outer corners (the "ears"). - /// When close to 0, the top corners become sharp and the shape is a - /// rectangle with rounded bottom corners — no visible ear ramps. + /// Radius applied to the top-left and top-right transitions where the notch + /// curves away from the screen edge. When close to 0, the top corners become + /// sharp and the shape is a rectangle with rounded bottom corners. var topCornerRadius: CGFloat /// Radius applied to the bottom-left and bottom-right inner corners. @@ -46,10 +46,10 @@ struct NotchShape: Shape { path.move(to: CGPoint(x: minX, y: minY)) if topR > 0.5 { - // Top-left ear: curve down from the top edge + // Leave the screen edge horizontally, then turn into the side wall. path.addQuadCurve( to: CGPoint(x: minX + topR, y: minY + topR), - control: CGPoint(x: minX, y: minY + topR) + control: CGPoint(x: minX + topR, y: minY) ) } else { path.addLine(to: CGPoint(x: minX, y: minY)) @@ -73,14 +73,14 @@ struct NotchShape: Shape { control: CGPoint(x: maxX - topR, y: maxY) ) - // Right edge up to top-right ear area + // Right edge up to the top-right transition path.addLine(to: CGPoint(x: maxX - topR, y: minY + topR)) if topR > 0.5 { - // Top-right ear: curve back up to the top edge + // Mirror the top-left transition. path.addQuadCurve( to: CGPoint(x: maxX, y: minY), - control: CGPoint(x: maxX, y: minY + topR) + control: CGPoint(x: maxX - topR, y: minY) ) } else { path.addLine(to: CGPoint(x: maxX, y: minY)) @@ -100,8 +100,8 @@ extension NotchShape { NotchShape(topCornerRadius: 6, bottomCornerRadius: 14) } - /// Open-state shape: no ear ramps, just rounded bottom corners. - /// topCornerRadius is near-zero so the ears disappear and the panel + /// Open-state shape: no top-edge cut-ins, just rounded bottom corners. + /// topCornerRadius is near-zero so the top becomes effectively flat and the panel /// extends flush to the top edge of the screen. static var opened: NotchShape { NotchShape(topCornerRadius: 0, bottomCornerRadius: 24) diff --git a/Downterm/Downterm/ContentView.swift b/Downterm/Downterm/ContentView.swift index 7eb79ae..507497e 100644 --- a/Downterm/Downterm/ContentView.swift +++ b/Downterm/Downterm/ContentView.swift @@ -65,6 +65,16 @@ struct ContentView: View { .animation(vm.notchState == .open ? vm.openAnimation : vm.closeAnimation, value: vm.notchSize.width) .animation(vm.notchState == .open ? vm.openAnimation : vm.closeAnimation, value: vm.notchSize.height) .onHover { handleHover($0) } + .onChange(of: vm.isCloseTransitionActive) { _, isClosing in + if isClosing { + hoverTask?.cancel() + } else { + scheduleHoverOpenIfNeeded() + } + } + .onDisappear { + hoverTask?.cancel() + } .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) .edgesIgnoringSafeArea(.all) } @@ -146,20 +156,30 @@ struct ContentView: View { private func handleHover(_ hovering: Bool) { if hovering { withAnimation(hoverAnimation) { vm.isHovering = true } - guard openNotchOnHover, vm.notchState == .closed else { return } - - hoverTask?.cancel() - hoverTask = Task { @MainActor in - try? await Task.sleep(nanoseconds: UInt64(minimumHoverDuration * 1_000_000_000)) - guard !Task.isCancelled, vm.isHovering else { return } - vm.requestOpen?() - } + scheduleHoverOpenIfNeeded() } else { hoverTask?.cancel() withAnimation(hoverAnimation) { vm.isHovering = false } } } + private func scheduleHoverOpenIfNeeded() { + hoverTask?.cancel() + guard openNotchOnHover, + vm.notchState == .closed, + !vm.isCloseTransitionActive, + vm.isHovering else { return } + + hoverTask = Task { @MainActor in + try? await Task.sleep(nanoseconds: UInt64(minimumHoverDuration * 1_000_000_000)) + guard !Task.isCancelled, + vm.isHovering, + vm.notchState == .closed, + !vm.isCloseTransitionActive else { return } + vm.requestOpen?() + } + } + private func abbreviate(_ title: String) -> String { title.count <= 30 ? title : String(title.prefix(28)) + "…" } diff --git a/Downterm/Downterm/Managers/PopoutWindowController.swift b/Downterm/Downterm/Managers/PopoutWindowController.swift index 71a280f..0ee6a36 100644 --- a/Downterm/Downterm/Managers/PopoutWindowController.swift +++ b/Downterm/Downterm/Managers/PopoutWindowController.swift @@ -1,6 +1,6 @@ import AppKit import SwiftUI -import SwiftTerm +import Combine /// Manages standalone pop-out terminal windows for detached tabs. /// Each detached tab gets its own resizable window with the terminal view. @@ -12,6 +12,7 @@ class PopoutWindowController: NSObject, NSWindowDelegate { /// Tracks open pop-out windows so they aren't released prematurely. private var windows: [UUID: NSWindow] = [:] private var sessions: [UUID: TerminalSession] = [:] + private var titleObservers: [UUID: AnyCancellable] = [:] private override init() { super.init() @@ -21,6 +22,12 @@ class PopoutWindowController: NSObject, NSWindowDelegate { func popout(session: TerminalSession) { let windowID = session.id + if let existingWindow = windows[windowID] { + existingWindow.makeKeyAndOrderFront(nil) + NSApp.activate(ignoringOtherApps: true) + return + } + let win = NSWindow( contentRect: NSRect(x: 0, y: 0, width: 720, height: 480), styleMask: [.titled, .closable, .resizable, .miniaturizable], @@ -33,12 +40,14 @@ class PopoutWindowController: NSObject, NSWindowDelegate { win.delegate = self win.isReleasedWhenClosed = false - // Embed the terminal view directly - let tv = session.terminalView - tv.removeFromSuperview() - tv.frame = NSRect(origin: .zero, size: win.contentView!.bounds.size) - tv.autoresizingMask = [.width, .height] - win.contentView?.addSubview(tv) + let hostingView = NSHostingView( + rootView: SwiftTermView(session: session) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .background(Color.black) + .preferredColorScheme(.dark) + ) + hostingView.frame = NSRect(origin: .zero, size: win.contentRect(forFrameRect: win.frame).size) + win.contentView = hostingView win.center() win.makeKeyAndOrderFront(nil) @@ -48,16 +57,22 @@ class PopoutWindowController: NSObject, NSWindowDelegate { sessions[windowID] = session // Update window title when the terminal title changes - session.$title + titleObservers[windowID] = session.$title .receive(on: RunLoop.main) .sink { [weak win] title in win?.title = title } - .store(in: &popoutCancellables) } - private var popoutCancellables = Set() - // MARK: - NSWindowDelegate + func windowDidBecomeKey(_ notification: Notification) { + guard let window = notification.object as? NSWindow, + let entry = windows.first(where: { $0.value === window }), + let terminalView = sessions[entry.key]?.terminalView, + terminalView.window === window else { return } + + window.makeFirstResponder(terminalView) + } + func windowWillClose(_ notification: Notification) { guard let closingWindow = notification.object as? NSWindow else { return } @@ -66,8 +81,7 @@ class PopoutWindowController: NSObject, NSWindowDelegate { sessions[entry.key]?.terminate() sessions.removeValue(forKey: entry.key) windows.removeValue(forKey: entry.key) + titleObservers.removeValue(forKey: entry.key) } } } - -import Combine diff --git a/Downterm/Downterm/Managers/ScreenManager.swift b/Downterm/Downterm/Managers/ScreenManager.swift index 182863b..b40a477 100644 --- a/Downterm/Downterm/Managers/ScreenManager.swift +++ b/Downterm/Downterm/Managers/ScreenManager.swift @@ -10,6 +10,7 @@ import Combine class ScreenManager: ObservableObject { static let shared = ScreenManager() + private let focusRetryDelay: TimeInterval = 0.01 private(set) var windows: [String: NotchWindow] = [:] private(set) var viewModels: [String: NotchViewModel] = [:] @@ -91,6 +92,8 @@ class ScreenManager: ObservableObject { guard let vm = viewModels[screenUUID], let window = windows[screenUUID] else { return } + vm.cancelCloseTransition() + withAnimation(vm.openAnimation) { vm.open() } @@ -102,18 +105,15 @@ class ScreenManager: ObservableObject { NSApp.activate(ignoringOtherApps: true) window.makeKeyAndOrderFront(nil) - // After layout settles, push keyboard focus to the terminal view - DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { - if let tv = TerminalManager.shared.activeTab?.terminalView { - window.makeFirstResponder(tv) - } - } + focusActiveTerminal(in: screenUUID) } func closeNotch(screenUUID: String) { guard let vm = viewModels[screenUUID], let window = windows[screenUUID] else { return } + vm.beginCloseTransition() + withAnimation(vm.closeAnimation) { vm.close() } @@ -124,7 +124,9 @@ class ScreenManager: ObservableObject { private func detachActiveTab() { if let session = TerminalManager.shared.detachActiveTab() { - PopoutWindowController.shared.popout(session: session) + DispatchQueue.main.async { + PopoutWindowController.shared.popout(session: session) + } } } @@ -247,4 +249,20 @@ class ScreenManager: ObservableObject { repositionWindows() } } + + private func focusActiveTerminal(in screenUUID: String, attemptsRemaining: Int = 12) { + guard let window = windows[screenUUID], + let terminalView = TerminalManager.shared.activeTab?.terminalView else { return } + + if terminalView.window === window { + window.makeFirstResponder(terminalView) + return + } + + guard attemptsRemaining > 0 else { return } + + DispatchQueue.main.asyncAfter(deadline: .now() + focusRetryDelay) { [weak self] in + self?.focusActiveTerminal(in: screenUUID, attemptsRemaining: attemptsRemaining - 1) + } + } } diff --git a/Downterm/Downterm/Models/NotchViewModel.swift b/Downterm/Downterm/Models/NotchViewModel.swift index 621e822..6f52206 100644 --- a/Downterm/Downterm/Models/NotchViewModel.swift +++ b/Downterm/Downterm/Models/NotchViewModel.swift @@ -11,6 +11,7 @@ class NotchViewModel: ObservableObject { @Published var notchSize: CGSize @Published var closedNotchSize: CGSize @Published var isHovering: Bool = false + @Published var isCloseTransitionActive: Bool = false let terminalManager = TerminalManager.shared @@ -29,6 +30,8 @@ class NotchViewModel: ObservableObject { @AppStorage(NotchSettings.Keys.closeSpringResponse) private var closeSpringResponse = NotchSettings.Defaults.closeSpringResponse @AppStorage(NotchSettings.Keys.closeSpringDamping) private var closeSpringDamping = NotchSettings.Defaults.closeSpringDamping + private var closeTransitionTask: Task? + var openAnimation: Animation { .spring(response: openSpringResponse, dampingFraction: openSpringDamping) } @@ -63,4 +66,31 @@ class NotchViewModel: ObservableObject { var openNotchSize: CGSize { CGSize(width: openWidth, height: openHeight) } + + var closeInteractionLockDuration: TimeInterval { + max(closeSpringResponse + 0.2, 0.35) + } + + func beginCloseTransition() { + closeTransitionTask?.cancel() + isCloseTransitionActive = true + + let delay = closeInteractionLockDuration + closeTransitionTask = Task { @MainActor [weak self] in + try? await Task.sleep(nanoseconds: UInt64(delay * 1_000_000_000)) + guard let self, !Task.isCancelled else { return } + self.isCloseTransitionActive = false + self.closeTransitionTask = nil + } + } + + func cancelCloseTransition() { + closeTransitionTask?.cancel() + closeTransitionTask = nil + isCloseTransitionActive = false + } + + deinit { + closeTransitionTask?.cancel() + } } diff --git a/Downterm/Downterm/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/Downterm/Downterm/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..64dc11e --- /dev/null +++ b/Downterm/Downterm/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "filename" : "icon_16x16.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "filename" : "icon_16x16@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "filename" : "icon_32x32.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "filename" : "icon_32x32@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "filename" : "icon_128x128.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "filename" : "icon_128x128@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "filename" : "icon_256x256.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "filename" : "icon_256x256@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "filename" : "icon_512x512.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "filename" : "icon_512x512@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Downterm/Downterm/Resources/Assets.xcassets/AppIcon.appiconset/icon_128x128.png b/Downterm/Downterm/Resources/Assets.xcassets/AppIcon.appiconset/icon_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..ec0a5fadf7b50c66b1672212cb8357408b243120 GIT binary patch literal 945 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9G08$g&*{RsbBprB-l zYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&K-G4hE{-7;bKc%P=smfR;n>IH z9~LZGnzJslS=Oq{ZGx1?a@pPKjT1K8FUV_J8++KrrefNO=YN8ooa>I$Dc@8yl%cVl(Gw)Vp1G9Exx?&rm>T)QV%<>k9^FUy>q?8`Uqe!O7J zx5mIu@V0q;*GEZ*NvmeZm#q67@wc~X(UOvtUHdxw*w3@mlj_(eEZMAkwzPVkM%R_Qch?r}jQLz)Ham1>NRZm(mAA8x zy;b|2zR`~PO0?0;kexAMcJsr7gD>kJ4-XHY>Y>7I&Yrb*YDrk=LyLeHQc-z$;->DIo0d!JqA5p-PU=cF3B$#|6jg!Yu2TgTXyZ* zRaS3qY`pn*vDxgazkXG9WFB0=G-KYpYmXi+nshSd?BhU@%%Y-C_UpN{zx`*6JCXL~ zWyilzH7lzvAHK!DklZi&ySgD;+1$zhM|${Y<%Q~Rw7)Ul*;VTvzK*|r-pA`~?Vop9 zhH=;?$8X%v@}|PjetkRtyVsQ~mwamf{%f1)djA`h{hN)UyF*x#_T-}>R6d(XZ1bME8Z^SKwpLJ`)M5K906 ztoQE=3TA!@UMWb^|rSeoEu0%Xwo6VaS}O!m`e6q3bxW>cI&s=r2WCuQSzCXrZIiC4oSoc~y7@J#tzXoiVCWF(&5X z8A`Rd|D+5*rr<{snv7-oYe4H8kt44ziGJpQ38$|_r_;>y)na&|pHx`_Mtm!q>p_uuNk5ueDegq&PTb>#(AgerEDOs% z6)SXm%Zj@{NaGpPJ8X7rfTm=@x~TSQ2nh!Gr0Rz|LXa2KMc(NZ^j$UJ0CR?1Tf=bf zYSQU+QZ6OC%0IiUzrSC~sq#)|co1I4up;ZxcvNa>R`A857#lo~O9#bF2j^Vp) zC?8+fg&^Bm8$DAZ;^X60i;F`Nbhhh!cXvQ6hg9bh*M)95{v0xqKiZ3YZ4EY1KXgkHzpQdt11Vao zZew$s-TtNe)gX(s6^+U#?QNj7wYA95BaIF(oim-?nxPnC83qx_WYPCicReKkxjbXx!VV?Dk-lZxjl3@cIs%cF%Q}SS$)P!LPP24I$Zs%5E>t$fHpx z#MMnWZF2XDRvm>B(fzY4a=sZ33I#dUUD@b4B$1%66coIy^k^#IOVN;~rR@5)lQNG% z#pGHSv#A$13n{HGyoFGq+t=35Dlr2ielleN`1$q#>bNUfqRd0nwS(XQDp&JQy5Ue% z>?R)RyNCJVtic<$qpI#QbQ~C=S6Ty~T z)AdPBReqSgnQ8b3A3pRzR92ic0h#Zwk`zBx(D=MCD`@5o1Nag!yp6z9MXpTUiGOKd zsOQFMdmm?MALet2%fyvYrv6@Mv2Ab_R%mXPJl=p&T{PbtTdjGPq`2rx>DZGqLJ2|A lN(`jA{KaSD{J&m?-oyrx(>YxhgE2f*V1H0(U?c4Cxla%F^(X)U literal 0 HcmV?d00001 diff --git a/Downterm/Downterm/Resources/Assets.xcassets/AppIcon.appiconset/icon_16x16.png b/Downterm/Downterm/Resources/Assets.xcassets/AppIcon.appiconset/icon_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..483a76897b0d0ca916a5f0565447db4e65aea588 GIT binary patch literal 735 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uuz(rC1}QWNE&K#jmXa9~Q4-E(HYzo1&C7s~{IQsCFRFRw<*Tq`*pFzr4I$uiRKKzbIYb z(9+UU-@r)U$VeBcLbtdwuOzWTH?LS3VhGF}m(=3qqRfJl%=|nBkhzIT`K2YcN=hJ$ z-~j5*+yb~odBsp)0sW_6kyxN_sAr%LHyNnW2IxmC=c3falKi5O{QMj{kkc~rvWt@w z3sON2w9!Xb0kzUbALI@scR@T276tm+jti(07J_zMn@%Pv0t5A?r;B5Vh2YzugIrAx z0=2vKvJ^!XCFUKns?_+e@TXNsgQOZ9YL(cx15C~^Poq=eh={niDtl)p-} zkZLZNSXBO`pgWbFHF%Or1y@07qEFy~5K%4nyAgjKe#~0-@%O8#69RO##SgA$**~d! f(WhVkI}dPAUF05ol7Yh;lyp2@{an^LB{Ts5#A5H< literal 0 HcmV?d00001 diff --git a/Downterm/Downterm/Resources/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png b/Downterm/Downterm/Resources/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..64cb193c320ad4f51ddf948da418f5e57573fc34 GIT binary patch literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVj%qngc&O}3ikpTk|nMY zCBgY=CFO}lsSM@i<$9TU*~Q6;1*v-ZMd`EO*+>But@m_s42fucdvzn%Ap?P9AL~uK zA517O;1!YaD%a%T>*BLpGTD!>Y4)Ls;V-7`3|{E%`ux!akBNHa(I<{S74MtCQem9r zd(0+=kt?8qNn`;7L+~}<{1f)_GTm4Gd;PatpSF2_RyFmmOYQOQpKCUs+r;x+Mv-OJ zszcTHZ}#t$;E`$EI?cqleanF(Z05h2ub-Y7ew#@_spCX=UKY>mw|Y_nwoUa{U#xe4 b8sETg!>`5kQ%{l;=yV28S3j3^P6h{hN)UyF*x#_T-}>R6d(XZ1bME8Z^SKwpLJ`)M5K906 ztoQE=3TA!@UMWb^|rSeoEu0%Xwo6VaS}O!m`e6q3bxW>cI&s=r2WCuQSzCXrZIiC4oSoc~y7@J#tzXoiVCWF(&5X z8A`Rd|D+5*rr<{snv7-oYe4H8kt44ziGJpQ38$|_r_;>y)na&|pHx`_Mtm!q>p_uuNk5ueDegq&PTb>#(AgerEDOs% z6)SXm%Zj@{NaGpPJ8X7rfTm=@x~TSQ2nh!Gr0Rz|LXa2KMc(NZ^j$UJ0CR?1Tf=bf zYSQU+QZ6OC%0IiUzrSC~sq#)|co1I4up;ZxcvNa>R`A857#lo~O9#bF2j^Vp) zC?8+fg&^Bm8$DAZ;^X60i;F`Nbhhh!cXvQ6hg9bh*M)95{v0xqKiZ3YZ4EY1KXgkHzpQdt11Vao zZew$s-TtNe)gX(s6^+U#?QNj7wYA95BaIF(oim-?nxPnC83qx_WYPCicReKkxjbXx!VV?Dk-lZxjl3@cIs%cF%Q}SS$)P!LPP24I$Zs%5E>t$fHpx z#MMnWZF2XDRvm>B(fzY4a=sZ33I#dUUD@b4B$1%66coIy^k^#IOVN;~rR@5)lQNG% z#pGHSv#A$13n{HGyoFGq+t=35Dlr2ielleN`1$q#>bNUfqRd0nwS(XQDp&JQy5Ue% z>?R)RyNCJVtic<$qpI#QbQ~C=S6Ty~T z)AdPBReqSgnQ8b3A3pRzR92ic0h#Zwk`zBx(D=MCD`@5o1Nag!yp6z9MXpTUiGOKd zsOQFMdmm?MALet2%fyvYrv6@Mv2Ab_R%mXPJl=p&T{PbtTdjGPq`2rx>DZGqLJ2|A lN(`jA{KaSD{J&m?-oyrx(>YxhgE2f*V1H0(U?c4Cxla%F^(X)U literal 0 HcmV?d00001 diff --git a/Downterm/Downterm/Resources/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png b/Downterm/Downterm/Resources/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..77de6eed1a2b971ffdabcc4f8fb625945c7d938f GIT binary patch literal 4366 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 M&?$f3!Smn$3yaXJvH$=8 literal 0 HcmV?d00001 diff --git a/Downterm/Downterm/Resources/Assets.xcassets/AppIcon.appiconset/icon_32x32.png b/Downterm/Downterm/Resources/Assets.xcassets/AppIcon.appiconset/icon_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..72e7deb6d5d77510289b4024c7ba92f3f1527f26 GIT binary patch literal 958 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 M&?$f3!Smn$3yaXJvH$=8 literal 0 HcmV?d00001 diff --git a/Downterm/Downterm/Resources/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png b/Downterm/Downterm/Resources/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..bbf33c8b8cf3c0044cc2e3b5ba551d4ebbab5736 GIT binary patch literal 30060 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 G+y4QVLHcC? literal 0 HcmV?d00001 diff --git a/Downterm/Downterm/Resources/Assets.xcassets/Contents.json b/Downterm/Downterm/Resources/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Downterm/Downterm/Resources/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Downterm/Downterm/Resources/Info.plist b/Downterm/Downterm/Resources/Info.plist index 4710e06..f7eb611 100644 --- a/Downterm/Downterm/Resources/Info.plist +++ b/Downterm/Downterm/Resources/Info.plist @@ -5,15 +5,15 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName - Downterm + CommandNotch CFBundleExecutable - Downterm + CommandNotch CFBundleIdentifier - com.downterm.app + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName - Downterm + CommandNotch CFBundlePackageType APPL CFBundleShortVersionString diff --git a/icons/.DS_Store b/icons/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0~}U&K-G4hE{-7;bKc%P=smfR;n>IH z9~LZGnzJslS=Oq{ZGx1?a@pPKjT1K8FUV_J8++KrrefNO=YN8ooa>I$Dc@8yl%cVl(Gw)Vp1G9Exx?&rm>T)QV%<>k9^FUy>q?8`Uqe!O7J zx5mIu@V0q;*GEZ*NvmeZm#q67@wc~X(UOvtUHdxw*w3@mlj_(eEZMAkwzPVkM%R_Qch?r}jQLz)Ham1>NRZm(mAA8x zy;b|2zR`~PO0?0;kexAMcJsr7gD>kJ4-XHY>Y>7I&Yrb*YDrk=LyLeHQc-z$;->DIo0d!JqA5p-PU=cF3B$#|6jg!Yu2TgTXyZ* zRaS3qY`pn*vDxgazkXG9WFB0=G-KYpYmXi+nshSd?BhU@%%Y-C_UpN{zx`*6JCXL~ zWyilzH7lzvAHK!DklZi&ySgD;+1$zhM|${Y<%Q~Rw7)Ul*;VTvzK*|r-pA`~?Vop9 zhH=;?$8X%v@}|PjetkRtyVsQ~mwamf{%f1)djA`h{hN)UyF*x#_T-}>R6d(XZ1bME8Z^SKwpLJ`)M5K906 ztoQE=3TA!@UMWb^|rSeoEu0%Xwo6VaS}O!m`e6q3bxW>cI&s=r2WCuQSzCXrZIiC4oSoc~y7@J#tzXoiVCWF(&5X z8A`Rd|D+5*rr<{snv7-oYe4H8kt44ziGJpQ38$|_r_;>y)na&|pHx`_Mtm!q>p_uuNk5ueDegq&PTb>#(AgerEDOs% z6)SXm%Zj@{NaGpPJ8X7rfTm=@x~TSQ2nh!Gr0Rz|LXa2KMc(NZ^j$UJ0CR?1Tf=bf zYSQU+QZ6OC%0IiUzrSC~sq#)|co1I4up;ZxcvNa>R`A857#lo~O9#bF2j^Vp) zC?8+fg&^Bm8$DAZ;^X60i;F`Nbhhh!cXvQ6hg9bh*M)95{v0xqKiZ3YZ4EY1KXgkHzpQdt11Vao zZew$s-TtNe)gX(s6^+U#?QNj7wYA95BaIF(oim-?nxPnC83qx_WYPCicReKkxjbXx!VV?Dk-lZxjl3@cIs%cF%Q}SS$)P!LPP24I$Zs%5E>t$fHpx z#MMnWZF2XDRvm>B(fzY4a=sZ33I#dUUD@b4B$1%66coIy^k^#IOVN;~rR@5)lQNG% z#pGHSv#A$13n{HGyoFGq+t=35Dlr2ielleN`1$q#>bNUfqRd0nwS(XQDp&JQy5Ue% z>?R)RyNCJVtic<$qpI#QbQ~C=S6Ty~T z)AdPBReqSgnQ8b3A3pRzR92ic0h#Zwk`zBx(D=MCD`@5o1Nag!yp6z9MXpTUiGOKd zsOQFMdmm?MALet2%fyvYrv6@Mv2Ab_R%mXPJl=p&T{PbtTdjGPq`2rx>DZGqLJ2|A lN(`jA{KaSD{J&m?-oyrx(>YxhgE2f*V1H0(U?c4Cxla%F^(X)U literal 0 HcmV?d00001 diff --git a/icons/Downterm-icon-32.png b/icons/Downterm-icon-32.png new file mode 100644 index 0000000000000000000000000000000000000000..64cb193c320ad4f51ddf948da418f5e57573fc34 GIT binary patch literal 290 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 M&?$f3!Smn$3yaXJvH$=8 literal 0 HcmV?d00001 diff --git a/icons/Downterm-icon-64.png b/icons/Downterm-icon-64.png new file mode 100644 index 0000000000000000000000000000000000000000..f31e0ff9693d015062d50fb059e1f46c477bcae3 GIT binary patch literal 512 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9FLH$a&2SIn{^prB-l zYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&K-ImTE{-7;bKcI}=yf1Z^v(@M~nCa4D1?bzEUW8wc^Cq=x#fQg?CFXyWWn{ zlUefrCX>0ndb^7G1cyuQW;29z9g-O{7^S!!xGzL7L^T{^y1-;2)*!ZEBf}PkUe*Py z89EHOlyJIVo;ls|{p8Mb*6CFm@AjVg-TQcQaBNIm=I*GkM*0%I>G$gT_VpgOy47FP z`+MT?>EUm$WZiq#dQZ*s*4pdgQP=afiyq(Twe-DufrX6L`OizA|JqY=vbZ6%bCHK@ zV20iNYy$}m9_P~Cu}-a=3Z9Mv8ot3xGgsB^_s=xg-B9f3IjKf=dz7x_a}Lq} + + +