From 8ecb7d4382a6ebb30e70ae45c77fb0b34e8bc5e4 Mon Sep 17 00:00:00 2001 From: Harvey Zuccon Date: Fri, 13 Mar 2026 20:25:18 +1100 Subject: [PATCH] Fix command modified keys. Add plan for splitscreen --- .../CommandNotch.xcodeproj/project.pbxproj | 908 +++++++++--------- .../UserInterfaceState.xcuserstate | Bin 42772 -> 42772 bytes .../xcschemes/CommandNotch.xcscheme | 51 +- .../xcschemes/Release-CommandNotch.xcscheme | 57 +- .../TerminalCommandArrowBehavior.swift | 31 + .../CommandNotch/Models/TerminalSession.swift | 28 + .../TerminalCommandArrowBehaviorTests.swift | 57 ++ Downterm/project.yml | 43 +- docs/workspace-split-pane-plan.md | 351 +++++++ 9 files changed, 1044 insertions(+), 482 deletions(-) create mode 100644 Downterm/CommandNotch/Components/TerminalCommandArrowBehavior.swift create mode 100644 Downterm/CommandNotchTests/TerminalCommandArrowBehaviorTests.swift create mode 100644 docs/workspace-split-pane-plan.md diff --git a/Downterm/CommandNotch.xcodeproj/project.pbxproj b/Downterm/CommandNotch.xcodeproj/project.pbxproj index 7fe8ece..9cb5476 100644 --- a/Downterm/CommandNotch.xcodeproj/project.pbxproj +++ b/Downterm/CommandNotch.xcodeproj/project.pbxproj @@ -3,321 +3,344 @@ archiveVersion = 1; classes = { }; - objectVersion = 63; + objectVersion = 77; objects = { /* Begin PBXBuildFile section */ - 0F4A88A33D93B6E100A1C001 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0F4A88A33D93B6E100A1C002 /* Assets.xcassets */; }; - A10000000000000000000001 /* AppSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = A20000000000000000000001 /* AppSettings.swift */; }; - A10000000000000000000002 /* AppSettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A20000000000000000000002 /* AppSettingsController.swift */; }; - A10000000000000000000003 /* AppSettingsStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = A20000000000000000000003 /* AppSettingsStore.swift */; }; - A10000000000000000000004 /* WorkspaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A20000000000000000000004 /* WorkspaceController.swift */; }; - A10000000000000000000005 /* WorkspaceRegistry.swift in Sources */ = {isa = PBXBuildFile; fileRef = A20000000000000000000005 /* WorkspaceRegistry.swift */; }; - A10000000000000000000006 /* WorkspaceSummary.swift in Sources */ = {isa = PBXBuildFile; fileRef = A20000000000000000000006 /* WorkspaceSummary.swift */; }; - A10000000000000000000007 /* AppSettingsStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A20000000000000000000008 /* AppSettingsStoreTests.swift */; }; - A10000000000000000000008 /* WorkspaceRegistryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A20000000000000000000009 /* WorkspaceRegistryTests.swift */; }; - A10000000000000000000009 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A2000000000000000000000A /* XCTest.framework */; }; - A1000000000000000000000B /* ScreenContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2000000000000000000000B /* ScreenContext.swift */; }; - A1000000000000000000000C /* ScreenRegistryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2000000000000000000000C /* ScreenRegistryTests.swift */; }; - A1000000000000000000000D /* ScreenRegistry.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2000000000000000000000D /* ScreenRegistry.swift */; }; - A1000000000000000000000E /* WorkspaceStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2000000000000000000000E /* WorkspaceStore.swift */; }; - A1000000000000000000000F /* WorkspaceStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2000000000000000000000F /* WorkspaceStoreTests.swift */; }; - A10000000000000000000010 /* NotchOrchestrator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A20000000000000000000010 /* NotchOrchestrator.swift */; }; - A10000000000000000000011 /* NotchOrchestratorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A20000000000000000000011 /* NotchOrchestratorTests.swift */; }; - A10000000000000000000012 /* ScreenContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A20000000000000000000012 /* ScreenContextTests.swift */; }; - A10000000000000000000013 /* WindowCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A20000000000000000000013 /* WindowCoordinator.swift */; }; - A10000000000000000000014 /* WindowFrameCalculatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A20000000000000000000014 /* WindowFrameCalculatorTests.swift */; }; - A10000000000000000000015 /* SettingsBindings.swift in Sources */ = {isa = PBXBuildFile; fileRef = A20000000000000000000015 /* SettingsBindings.swift */; }; - A10000000000000000000016 /* GeneralSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A20000000000000000000016 /* GeneralSettingsView.swift */; }; - A10000000000000000000017 /* AppearanceSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A20000000000000000000017 /* AppearanceSettingsView.swift */; }; - A10000000000000000000018 /* AnimationSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A20000000000000000000018 /* AnimationSettingsView.swift */; }; - A10000000000000000000019 /* TerminalSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A20000000000000000000019 /* TerminalSettingsView.swift */; }; - A1000000000000000000001A /* HotkeySettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2000000000000000000001A /* HotkeySettingsView.swift */; }; - A1000000000000000000001B /* AboutSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2000000000000000000001B /* AboutSettingsView.swift */; }; - A1000000000000000000001C /* AppSettingsControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2000000000000000000001C /* AppSettingsControllerTests.swift */; }; - A1000000000000000000001D /* WorkspaceSwitcherView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2000000000000000000001D /* WorkspaceSwitcherView.swift */; }; - A1000000000000000000001E /* WorkspacesSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2000000000000000000001E /* WorkspacesSettingsView.swift */; }; - A1000000000000000000001F /* CommandNotchUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2000000000000000000001F /* CommandNotchUITests.swift */; }; - A10000000000000000000020 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A2000000000000000000000A /* XCTest.framework */; }; - 2213F430F3D8A88033607CD2 /* NotchSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA6359CF9DDF89413440300D /* NotchSettings.swift */; }; - 247C6F84E7ADE7AED43381E2 /* CommandNotchApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B671125208055E5334CB85E /* CommandNotchApp.swift */; }; - 295653929D5B9C0E6C90D6D7 /* SwiftTerm in Frameworks */ = {isa = PBXBuildFile; productRef = 032AECA58EA4C274BE9F3320 /* SwiftTerm */; }; - 37FC0A7CEEA37C9DCC6A8351 /* TerminalSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B598809B19C892470DE7268 /* TerminalSession.swift */; }; - 3A1F0C4BE9D84A5C8E2B7101 /* TerminalTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A1F0C4AE9D84A5C8E2B7101 /* TerminalTheme.swift */; }; - 4566E6B87CB62AF5C8D4B9D8 /* NotchShape.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FC09C538CBE7C2D072008B2 /* NotchShape.swift */; }; - 4D5125E11B4DDBDB3DFACBAF /* HotkeyManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B72743F178231E0B06DD3DE /* HotkeyManager.swift */; }; - 5B14FC23928E817FEB8D2A74 /* NotchWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02FEFF9074A85F02C43D9408 /* NotchWindow.swift */; }; - 7BD705CA6A34117929B362EC /* HotkeyRecorderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 490C53139360D970099D8F3D /* HotkeyRecorderView.swift */; }; - 7DE94234DC42EAB79896E176 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5CB3313B230019D0E988AFE /* SettingsView.swift */; }; - 7EA51C3720BED7E6189E057D /* TabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F009B75D078A5070B5EA9738 /* TabBar.swift */; }; - 81A912E3E16165D999882078 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C0779490DE9020FBBC464BE /* AppDelegate.swift */; }; - 888C45C650327089EBD39B2E /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20BA7F4716DA3909DA8BC381 /* ContentView.swift */; }; - 88EBFBB2292659EA7C42A8F9 /* HotkeyBinding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BB81B6DA7126E1F5FBCC8B8 /* HotkeyBinding.swift */; }; - 8FC731CF99AB4C1C10C16FAB /* PopoutWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA1CD1DE020F0467AFB98DE3 /* PopoutWindowController.swift */; }; - A70FDB7EEEB895D475ED96E8 /* NotchState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C5C99B7CD7F60E55844E40C /* NotchState.swift */; }; - BE5E64222CF5689AC7088683 /* ScreenManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15A290D4D21D6C01A583A372 /* ScreenManager.swift */; }; - C4C93F2911B41BC19A2AE934 /* SettingsWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A973877BCE6084D0EBBBDBD /* SettingsWindowController.swift */; }; - CC26C1677258E44F0D7B106A /* SwiftTermView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E47000112562615C7E59489 /* SwiftTermView.swift */; }; - E9A064422790735E033E534F /* TerminalManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA6843B571B41986DE386F5F /* TerminalManager.swift */; }; - EA604F3F38D6638C7236CDC2 /* LaunchAtLoginHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B567F3B5D006D2B35630CFF /* LaunchAtLoginHelper.swift */; }; - F0130A88D1453CD199FA65D7 /* NSScreen+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0CED6A0F25A6E57D8AA308A /* NSScreen+Extensions.swift */; }; + 088FE22B3308AAB25027E086 /* NotchShape.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F57837A7115DEEE11E14B40 /* NotchShape.swift */; }; + 0DE8E7F29FBAA7E2B613E221 /* AppearanceSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B3C8C11834931A9D53BC2B6 /* AppearanceSettingsView.swift */; }; + 0F133E8A88D2E313D90C32AD /* WindowFrameCalculatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D288132700770C4A625A15F6 /* WindowFrameCalculatorTests.swift */; }; + 12F68EDA880030DAB644FF5F /* LaunchAtLoginHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8210D7783A614FD7190F5DDD /* LaunchAtLoginHelper.swift */; }; + 154F363D434A26105C5999B5 /* WorkspaceRegistryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 591FCE91AF83A8A8E44E1625 /* WorkspaceRegistryTests.swift */; }; + 187F4B521BFC3BD29ADA79E3 /* HotkeyManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEB7FE2BDE5C25B7E599F340 /* HotkeyManager.swift */; }; + 1AB4A0F1BE668D3130EFBA93 /* TerminalTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFE9E5BADB0C427903A0D874 /* TerminalTheme.swift */; }; + 2089566A2BBAA65EA82119B3 /* NotchOrchestratorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF6D136A0B3FC79DDE12A826 /* NotchOrchestratorTests.swift */; }; + 2375B9DA559A0777FE558A8B /* WorkspaceStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FA62DFE9AD003F4C5B55F14 /* WorkspaceStoreTests.swift */; }; + 23E2DDCF36D0DAB2EA72C39C /* NotchState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B352301BC9CAD7C9D8B7AA9 /* NotchState.swift */; }; + 26AE379040149CBE05B314BB /* WorkspacesSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70A31EFACF23DD9262A040E /* WorkspacesSettingsView.swift */; }; + 278010607B0D552DCC8996C5 /* CommandNotchUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 726B935606FD961FD7E8C2BE /* CommandNotchUITests.swift */; }; + 2DF22798D3A7514E2A9183FC /* WorkspaceSummary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B2BCA543CE54DAB1DB80E43 /* WorkspaceSummary.swift */; }; + 34AF69BF7AF8DC78ADE3774A /* GeneralSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E7EEEDFBD8D9CEB8FD86A5 /* GeneralSettingsView.swift */; }; + 3B69CB3CDEC2E5F2DCE600F9 /* NotchSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297BA3E5B837FBDDEED9DE66 /* NotchSettings.swift */; }; + 4CFA0C79095ACE0A327A2469 /* WorkspaceRegistry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E97758F68FACCFFACA895B7 /* WorkspaceRegistry.swift */; }; + 4D335F67B71F7DD977B6AEF9 /* AppSettingsStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6C98C406899F4B242075AF /* AppSettingsStore.swift */; }; + 4E0AD14B7427532271E485AA /* NotchWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFAC70814C72BAF76D90B9DF /* NotchWindow.swift */; }; + 507A67E770DEFAF5BC321FCF /* WindowCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9220E02B6D470DD05CA540C /* WindowCoordinator.swift */; }; + 5379DF2FACE924BDDB584377 /* SwiftTerm in Frameworks */ = {isa = PBXBuildFile; productRef = C921E6435A64AA07A0FEA4D5 /* SwiftTerm */; }; + 5A3FDFCF30A1AAFE070290E9 /* SettingsWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 728B3125F7F7FDB7313D2DC6 /* SettingsWindowController.swift */; }; + 5F3534F66A5DBE4E081AFFA6 /* SwiftTermView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C55F29B779DA0E5C5FC8627 /* SwiftTermView.swift */; }; + 65C7DB7296C6C6A77598A1F4 /* TerminalSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E37A6DCD9C5DE1FE11C4C1CD /* TerminalSettingsView.swift */; }; + 6624A60CB121A22A03365071 /* WorkspaceSwitcherView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF0FFBC96F2446687D6474F4 /* WorkspaceSwitcherView.swift */; }; + 6A18F6635B509FF58669F505 /* HotkeySettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03D042117E59DCA9D553844 /* HotkeySettingsView.swift */; }; + 6DD4DAE72E5C3858B230D94C /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7A8DCFA77626F9999B432FE /* AppDelegate.swift */; }; + 6F249EDFA2D654457DF385F1 /* TerminalManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 567E85A2ED628460CEC760DB /* TerminalManager.swift */; }; + 771088361F981A9AAE976F3C /* SettingsBindings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 900F0476BE9E3600FBD371BB /* SettingsBindings.swift */; }; + 787477BB6D2F8AC723EEDA7D /* ScreenContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7181BB1F3926B457445105E5 /* ScreenContext.swift */; }; + 7A69B5AAC686174BCA54D0F0 /* TerminalSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49E1791BB45E1505500ACC67 /* TerminalSession.swift */; }; + 7A7D3455D50D041CF698E786 /* AppSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74463E4EAB78F56345360CD5 /* AppSettings.swift */; }; + 7AB14019B5CC6ED84B96FA47 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6ADD641A088A5005DD0EB4A6 /* Assets.xcassets */; }; + 7D5F3C3B5E173B6F06901812 /* AppSettingsStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39CA6F2C2CA32D0AA58F6C43 /* AppSettingsStoreTests.swift */; }; + 86BB4A41E8EC44A5F45CE995 /* WorkspaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CB1DFD6FCDF64B4DF24230A /* WorkspaceController.swift */; }; + 88113BA9B217DA579C36BEBE /* TabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72A1D3D12BAC593838B3125C /* TabBar.swift */; }; + 88D87155D79C493D8956AA3B /* AnimationSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE99DBAB656EA80A117D2EE1 /* AnimationSettingsView.swift */; }; + 8A1B2A4CD61B0D9A4BAB075B /* ScreenRegistryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEC7F7D8D15A1BC4EE43DDDB /* ScreenRegistryTests.swift */; }; + 9F535B9516A4AE9FB536B1BD /* HotkeyBinding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BB1C403BC2157756F572ACF /* HotkeyBinding.swift */; }; + A74E14B8AD19C53820853D8E /* NSScreen+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DDC7451F0E7ACFE0BEC5473 /* NSScreen+Extensions.swift */; }; + AE8215538D4B026A00BAD241 /* WorkspaceStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B957BD1F6120D2592613ED /* WorkspaceStore.swift */; }; + B406183CC7B5DCE76989A066 /* AppSettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB28950392C0198E69F3564B /* AppSettingsController.swift */; }; + B605A9311557251A85183383 /* AboutSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48198AFE5473B0F7AECAB3FB /* AboutSettingsView.swift */; }; + C84FA3100884649FE92BF5DD /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A64A11F27E65B342B991629A /* ContentView.swift */; }; + CFBBE994BA6BAD4658AAB9CB /* TerminalCommandArrowBehaviorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0D19729317029008D81F361 /* TerminalCommandArrowBehaviorTests.swift */; }; + D088BC850F37E717844761C6 /* CommandNotchApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5159CB9DBE2BAA0D2E201C39 /* CommandNotchApp.swift */; }; + D2468B19D6F0A2C1DFDFE2B7 /* ScreenContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A770A63582CF9834F4E7F058 /* ScreenContextTests.swift */; }; + D4CEB4B895F75D91FA892A06 /* PopoutWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB593A2546BF2C0BE8E40387 /* PopoutWindowController.swift */; }; + DAD3AB4A0DAADA32C02D959E /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3125FD3DC55420122CF85D80 /* SettingsView.swift */; }; + DCFD5B03E64A46783F46726B /* TerminalCommandArrowBehavior.swift in Sources */ = {isa = PBXBuildFile; fileRef = F22AA47452CF798A977A6F47 /* TerminalCommandArrowBehavior.swift */; }; + E63FD5862C0EC54E284F6A0F /* ScreenRegistry.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAF23753B5A0CAF04D7566A3 /* ScreenRegistry.swift */; }; + E792411FA82E79E810F4B4C3 /* HotkeyRecorderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B81432CECBDB61D21EE4DC3 /* HotkeyRecorderView.swift */; }; + EE72479BA5A25FF31BACCC50 /* NotchOrchestrator.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC7912AF01E1600B8619AF31 /* NotchOrchestrator.swift */; }; + F8ED522FDC96B1F9AD8933F7 /* ScreenManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CB8AF76C0F728897A26D7EF /* ScreenManager.swift */; }; + F8F8DE2F26608259D72635B7 /* AppSettingsControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F5FF5623898FA150C3B70D4 /* AppSettingsControllerTests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - A60000000000000000000001 /* PBXContainerItemProxy */ = { + 13E720E97D079D298D124BBE /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = F72A983360EF3F99042A4895 /* Project object */; + containerPortal = E99C2EDB39F7B64C1540BCA8 /* Project object */; proxyType = 1; - remoteGlobalIDString = 1485207FA11756EC2DF4F08B; + remoteGlobalIDString = D5585E5732CD067DF6EF0C69; remoteInfo = CommandNotch; }; - A60000000000000000000002 /* PBXContainerItemProxy */ = { + 9D6387038E18398CA764147F /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = F72A983360EF3F99042A4895 /* Project object */; + containerPortal = E99C2EDB39F7B64C1540BCA8 /* Project object */; proxyType = 1; - remoteGlobalIDString = 1485207FA11756EC2DF4F08B; + remoteGlobalIDString = D5585E5732CD067DF6EF0C69; remoteInfo = CommandNotch; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 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 = ""; }; - A20000000000000000000001 /* AppSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSettings.swift; sourceTree = ""; }; - A20000000000000000000002 /* AppSettingsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSettingsController.swift; sourceTree = ""; }; - A20000000000000000000003 /* AppSettingsStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSettingsStore.swift; sourceTree = ""; }; - A20000000000000000000004 /* WorkspaceController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkspaceController.swift; sourceTree = ""; }; - A20000000000000000000005 /* WorkspaceRegistry.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkspaceRegistry.swift; sourceTree = ""; }; - A20000000000000000000006 /* WorkspaceSummary.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkspaceSummary.swift; sourceTree = ""; }; - A20000000000000000000007 /* CommandNotchTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CommandNotchTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - A20000000000000000000008 /* AppSettingsStoreTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSettingsStoreTests.swift; sourceTree = ""; }; - A20000000000000000000009 /* WorkspaceRegistryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkspaceRegistryTests.swift; sourceTree = ""; }; - A2000000000000000000000A /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = System/Library/Frameworks/XCTest.framework; sourceTree = SDKROOT; }; - A2000000000000000000000B /* ScreenContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenContext.swift; sourceTree = ""; }; - A2000000000000000000000C /* ScreenRegistryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenRegistryTests.swift; sourceTree = ""; }; - A2000000000000000000000D /* ScreenRegistry.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenRegistry.swift; sourceTree = ""; }; - A2000000000000000000000E /* WorkspaceStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkspaceStore.swift; sourceTree = ""; }; - A2000000000000000000000F /* WorkspaceStoreTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkspaceStoreTests.swift; sourceTree = ""; }; - A20000000000000000000010 /* NotchOrchestrator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotchOrchestrator.swift; sourceTree = ""; }; - A20000000000000000000011 /* NotchOrchestratorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotchOrchestratorTests.swift; sourceTree = ""; }; - A20000000000000000000012 /* ScreenContextTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenContextTests.swift; sourceTree = ""; }; - A20000000000000000000013 /* WindowCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowCoordinator.swift; sourceTree = ""; }; - A20000000000000000000014 /* WindowFrameCalculatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowFrameCalculatorTests.swift; sourceTree = ""; }; - A20000000000000000000015 /* SettingsBindings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsBindings.swift; sourceTree = ""; }; - A20000000000000000000016 /* GeneralSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeneralSettingsView.swift; sourceTree = ""; }; - A20000000000000000000017 /* AppearanceSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppearanceSettingsView.swift; sourceTree = ""; }; - A20000000000000000000018 /* AnimationSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnimationSettingsView.swift; sourceTree = ""; }; - A20000000000000000000019 /* TerminalSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalSettingsView.swift; sourceTree = ""; }; - A2000000000000000000001A /* HotkeySettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HotkeySettingsView.swift; sourceTree = ""; }; - A2000000000000000000001B /* AboutSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutSettingsView.swift; sourceTree = ""; }; - A2000000000000000000001C /* AppSettingsControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSettingsControllerTests.swift; sourceTree = ""; }; - A2000000000000000000001D /* WorkspaceSwitcherView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkspaceSwitcherView.swift; sourceTree = ""; }; - A2000000000000000000001E /* WorkspacesSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkspacesSettingsView.swift; sourceTree = ""; }; - A2000000000000000000001F /* CommandNotchUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommandNotchUITests.swift; sourceTree = ""; }; - A20000000000000000000020 /* CommandNotchUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CommandNotchUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 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 = ""; }; - 20BA7F4716DA3909DA8BC381 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; - 2C5C99B7CD7F60E55844E40C /* NotchState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotchState.swift; sourceTree = ""; }; - 3B72743F178231E0B06DD3DE /* HotkeyManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HotkeyManager.swift; sourceTree = ""; }; - 490C53139360D970099D8F3D /* HotkeyRecorderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HotkeyRecorderView.swift; sourceTree = ""; }; - 4B671125208055E5334CB85E /* CommandNotchApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommandNotchApp.swift; sourceTree = ""; }; - 4BB81B6DA7126E1F5FBCC8B8 /* HotkeyBinding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HotkeyBinding.swift; sourceTree = ""; }; - 5C0779490DE9020FBBC464BE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 665CFC051CF185B71199608D /* CommandNotch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CommandNotch.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 7B598809B19C892470DE7268 /* TerminalSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalSession.swift; sourceTree = ""; }; - 3A1F0C4AE9D84A5C8E2B7101 /* TerminalTheme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalTheme.swift; sourceTree = ""; }; - 9547A79F60E46F4521A70674 /* CommandNotch.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = CommandNotch.entitlements; sourceTree = ""; }; - AA6359CF9DDF89413440300D /* NotchSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotchSettings.swift; sourceTree = ""; }; - BA6843B571B41986DE386F5F /* TerminalManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalManager.swift; sourceTree = ""; }; - C5CB3313B230019D0E988AFE /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; - EA1CD1DE020F0467AFB98DE3 /* PopoutWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopoutWindowController.swift; sourceTree = ""; }; - F009B75D078A5070B5EA9738 /* TabBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBar.swift; sourceTree = ""; }; - F0CED6A0F25A6E57D8AA308A /* NSScreen+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSScreen+Extensions.swift"; sourceTree = ""; }; + 0E97758F68FACCFFACA895B7 /* WorkspaceRegistry.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkspaceRegistry.swift; sourceTree = ""; }; + 27E7EEEDFBD8D9CEB8FD86A5 /* GeneralSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeneralSettingsView.swift; sourceTree = ""; }; + 297BA3E5B837FBDDEED9DE66 /* NotchSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotchSettings.swift; sourceTree = ""; }; + 2B81432CECBDB61D21EE4DC3 /* HotkeyRecorderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HotkeyRecorderView.swift; sourceTree = ""; }; + 3125FD3DC55420122CF85D80 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; + 35CBC14E11EBD8486457CE91 /* CommandNotchTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CommandNotchTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 39CA6F2C2CA32D0AA58F6C43 /* AppSettingsStoreTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSettingsStoreTests.swift; sourceTree = ""; }; + 3CB1DFD6FCDF64B4DF24230A /* WorkspaceController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkspaceController.swift; sourceTree = ""; }; + 3F57837A7115DEEE11E14B40 /* NotchShape.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotchShape.swift; sourceTree = ""; }; + 3F5FF5623898FA150C3B70D4 /* AppSettingsControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSettingsControllerTests.swift; sourceTree = ""; }; + 48198AFE5473B0F7AECAB3FB /* AboutSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutSettingsView.swift; sourceTree = ""; }; + 496267F03E261FEC9EBD5A9D /* CommandNotchUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CommandNotchUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 49E1791BB45E1505500ACC67 /* TerminalSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalSession.swift; sourceTree = ""; }; + 4B352301BC9CAD7C9D8B7AA9 /* NotchState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotchState.swift; sourceTree = ""; }; + 4FA62DFE9AD003F4C5B55F14 /* WorkspaceStoreTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkspaceStoreTests.swift; sourceTree = ""; }; + 5159CB9DBE2BAA0D2E201C39 /* CommandNotchApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommandNotchApp.swift; sourceTree = ""; }; + 567E85A2ED628460CEC760DB /* TerminalManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalManager.swift; sourceTree = ""; }; + 591FCE91AF83A8A8E44E1625 /* WorkspaceRegistryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkspaceRegistryTests.swift; sourceTree = ""; }; + 5DDC7451F0E7ACFE0BEC5473 /* NSScreen+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSScreen+Extensions.swift"; sourceTree = ""; }; + 6ADD641A088A5005DD0EB4A6 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 7181BB1F3926B457445105E5 /* ScreenContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenContext.swift; sourceTree = ""; }; + 726B935606FD961FD7E8C2BE /* CommandNotchUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommandNotchUITests.swift; sourceTree = ""; }; + 728B3125F7F7FDB7313D2DC6 /* SettingsWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsWindowController.swift; sourceTree = ""; }; + 72A1D3D12BAC593838B3125C /* TabBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBar.swift; sourceTree = ""; }; + 74463E4EAB78F56345360CD5 /* AppSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSettings.swift; sourceTree = ""; }; + 7B2BCA543CE54DAB1DB80E43 /* WorkspaceSummary.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkspaceSummary.swift; sourceTree = ""; }; + 8210D7783A614FD7190F5DDD /* LaunchAtLoginHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchAtLoginHelper.swift; sourceTree = ""; }; + 8796768C84519077354A95C7 /* CommandNotch.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = CommandNotch.entitlements; sourceTree = ""; }; + 8B3C8C11834931A9D53BC2B6 /* AppearanceSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppearanceSettingsView.swift; sourceTree = ""; }; + 8BB1C403BC2157756F572ACF /* HotkeyBinding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HotkeyBinding.swift; sourceTree = ""; }; + 8CB8AF76C0F728897A26D7EF /* ScreenManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenManager.swift; sourceTree = ""; }; + 900F0476BE9E3600FBD371BB /* SettingsBindings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsBindings.swift; sourceTree = ""; }; + 9C55F29B779DA0E5C5FC8627 /* SwiftTermView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftTermView.swift; sourceTree = ""; }; + 9E6C98C406899F4B242075AF /* AppSettingsStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSettingsStore.swift; sourceTree = ""; }; + A64A11F27E65B342B991629A /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + A770A63582CF9834F4E7F058 /* ScreenContextTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenContextTests.swift; sourceTree = ""; }; + AAF23753B5A0CAF04D7566A3 /* ScreenRegistry.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenRegistry.swift; sourceTree = ""; }; + B5AA68DC0DD3FE07B56EB6EC /* CommandNotch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CommandNotch.app; sourceTree = BUILT_PRODUCTS_DIR; }; + C0D19729317029008D81F361 /* TerminalCommandArrowBehaviorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalCommandArrowBehaviorTests.swift; sourceTree = ""; }; + CB593A2546BF2C0BE8E40387 /* PopoutWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopoutWindowController.swift; sourceTree = ""; }; + CFE9E5BADB0C427903A0D874 /* TerminalTheme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalTheme.swift; sourceTree = ""; }; + D03D042117E59DCA9D553844 /* HotkeySettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HotkeySettingsView.swift; sourceTree = ""; }; + D288132700770C4A625A15F6 /* WindowFrameCalculatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowFrameCalculatorTests.swift; sourceTree = ""; }; + DC7912AF01E1600B8619AF31 /* NotchOrchestrator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotchOrchestrator.swift; sourceTree = ""; }; + DF0FFBC96F2446687D6474F4 /* WorkspaceSwitcherView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkspaceSwitcherView.swift; sourceTree = ""; }; + E37A6DCD9C5DE1FE11C4C1CD /* TerminalSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalSettingsView.swift; sourceTree = ""; }; + E7A8DCFA77626F9999B432FE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + EB28950392C0198E69F3564B /* AppSettingsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSettingsController.swift; sourceTree = ""; }; + EEB7FE2BDE5C25B7E599F340 /* HotkeyManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HotkeyManager.swift; sourceTree = ""; }; + EEC7F7D8D15A1BC4EE43DDDB /* ScreenRegistryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenRegistryTests.swift; sourceTree = ""; }; + EFAC70814C72BAF76D90B9DF /* NotchWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotchWindow.swift; sourceTree = ""; }; + F22AA47452CF798A977A6F47 /* TerminalCommandArrowBehavior.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalCommandArrowBehavior.swift; sourceTree = ""; }; + F3B957BD1F6120D2592613ED /* WorkspaceStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkspaceStore.swift; sourceTree = ""; }; + F70A31EFACF23DD9262A040E /* WorkspacesSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkspacesSettingsView.swift; sourceTree = ""; }; + F9220E02B6D470DD05CA540C /* WindowCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowCoordinator.swift; sourceTree = ""; }; + FE99DBAB656EA80A117D2EE1 /* AnimationSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnimationSettingsView.swift; sourceTree = ""; }; + FF6D136A0B3FC79DDE12A826 /* NotchOrchestratorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotchOrchestratorTests.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 6085DF2BDFFB2A99C4ABD514 /* Frameworks */ = { + F3D057FF4247F13A1BBAE547 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 295653929D5B9C0E6C90D6D7 /* SwiftTerm in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - A40000000000000000000001 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - A10000000000000000000009 /* XCTest.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - A40000000000000000000003 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - A10000000000000000000020 /* XCTest.framework in Frameworks */, + 5379DF2FACE924BDDB584377 /* SwiftTerm in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0EF94ED46B4860C241540F0A /* Resources */ = { + 00BC30DD7FA5C3C26404733B /* Models */ = { isa = PBXGroup; children = ( - 0F4A88A33D93B6E100A1C002 /* Assets.xcassets */, - 9547A79F60E46F4521A70674 /* CommandNotch.entitlements */, - ); - path = Resources; - sourceTree = ""; - }; - 27C90448ECAC906F0DA429C0 /* Managers */ = { - isa = PBXGroup; - children = ( - 3B72743F178231E0B06DD3DE /* HotkeyManager.swift */, - 0B567F3B5D006D2B35630CFF /* LaunchAtLoginHelper.swift */, - EA1CD1DE020F0467AFB98DE3 /* PopoutWindowController.swift */, - 15A290D4D21D6C01A583A372 /* ScreenManager.swift */, - 0A973877BCE6084D0EBBBDBD /* SettingsWindowController.swift */, - A20000000000000000000013 /* WindowCoordinator.swift */, - ); - path = Managers; - sourceTree = ""; - }; - 792DD4F8C079680683D8FF7A /* Products */ = { - isa = PBXGroup; - children = ( - 665CFC051CF185B71199608D /* CommandNotch.app */, - A20000000000000000000007 /* CommandNotchTests.xctest */, - A20000000000000000000020 /* CommandNotchUITests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - A30000000000000000000001 /* CommandNotchTests */ = { - isa = PBXGroup; - children = ( - A20000000000000000000008 /* AppSettingsStoreTests.swift */, - A2000000000000000000001C /* AppSettingsControllerTests.swift */, - A20000000000000000000012 /* ScreenContextTests.swift */, - A2000000000000000000000C /* ScreenRegistryTests.swift */, - A20000000000000000000011 /* NotchOrchestratorTests.swift */, - A20000000000000000000014 /* WindowFrameCalculatorTests.swift */, - A20000000000000000000009 /* WorkspaceRegistryTests.swift */, - A2000000000000000000000F /* WorkspaceStoreTests.swift */, - ); - path = CommandNotchTests; - sourceTree = ""; - }; - A30000000000000000000002 /* CommandNotchUITests */ = { - isa = PBXGroup; - children = ( - A2000000000000000000001F /* CommandNotchUITests.swift */, - ); - path = CommandNotchUITests; - sourceTree = ""; - }; - 869AD33E1CDEB9CBAD401BA6 /* Models */ = { - isa = PBXGroup; - children = ( - A20000000000000000000001 /* AppSettings.swift */, - A20000000000000000000002 /* AppSettingsController.swift */, - A20000000000000000000003 /* AppSettingsStore.swift */, - 4BB81B6DA7126E1F5FBCC8B8 /* HotkeyBinding.swift */, - AA6359CF9DDF89413440300D /* NotchSettings.swift */, - 2C5C99B7CD7F60E55844E40C /* NotchState.swift */, - A20000000000000000000010 /* NotchOrchestrator.swift */, - A2000000000000000000000B /* ScreenContext.swift */, - A2000000000000000000000D /* ScreenRegistry.swift */, - BA6843B571B41986DE386F5F /* TerminalManager.swift */, - 7B598809B19C892470DE7268 /* TerminalSession.swift */, - 3A1F0C4AE9D84A5C8E2B7101 /* TerminalTheme.swift */, - A20000000000000000000004 /* WorkspaceController.swift */, - A20000000000000000000005 /* WorkspaceRegistry.swift */, - A20000000000000000000006 /* WorkspaceSummary.swift */, - A2000000000000000000000E /* WorkspaceStore.swift */, + 74463E4EAB78F56345360CD5 /* AppSettings.swift */, + EB28950392C0198E69F3564B /* AppSettingsController.swift */, + 9E6C98C406899F4B242075AF /* AppSettingsStore.swift */, + 8BB1C403BC2157756F572ACF /* HotkeyBinding.swift */, + DC7912AF01E1600B8619AF31 /* NotchOrchestrator.swift */, + 297BA3E5B837FBDDEED9DE66 /* NotchSettings.swift */, + 4B352301BC9CAD7C9D8B7AA9 /* NotchState.swift */, + 7181BB1F3926B457445105E5 /* ScreenContext.swift */, + AAF23753B5A0CAF04D7566A3 /* ScreenRegistry.swift */, + 567E85A2ED628460CEC760DB /* TerminalManager.swift */, + 49E1791BB45E1505500ACC67 /* TerminalSession.swift */, + CFE9E5BADB0C427903A0D874 /* TerminalTheme.swift */, + 3CB1DFD6FCDF64B4DF24230A /* WorkspaceController.swift */, + 0E97758F68FACCFFACA895B7 /* WorkspaceRegistry.swift */, + F3B957BD1F6120D2592613ED /* WorkspaceStore.swift */, + 7B2BCA543CE54DAB1DB80E43 /* WorkspaceSummary.swift */, ); path = Models; sourceTree = ""; }; - 8D95E0324E6AFC9E4DC0C087 /* Extensions */ = { + 618799FE544A4373B457DCDA /* Extensions */ = { isa = PBXGroup; children = ( - F0CED6A0F25A6E57D8AA308A /* NSScreen+Extensions.swift */, + 5DDC7451F0E7ACFE0BEC5473 /* NSScreen+Extensions.swift */, ); path = Extensions; sourceTree = ""; }; - 9E1CA4816F67033BBD52D8A3 /* CommandNotch */ = { + 7043235A31A4023478DA1302 = { isa = PBXGroup; children = ( - 5C0779490DE9020FBBC464BE /* AppDelegate.swift */, - 20BA7F4716DA3909DA8BC381 /* ContentView.swift */, - 4B671125208055E5334CB85E /* CommandNotchApp.swift */, - F32F526005A2589010E63C76 /* Components */, - 8D95E0324E6AFC9E4DC0C087 /* Extensions */, - 27C90448ECAC906F0DA429C0 /* Managers */, - 869AD33E1CDEB9CBAD401BA6 /* Models */, - 0EF94ED46B4860C241540F0A /* Resources */, - C2B8955F4D0A1DAA7E60326A /* Views */, + 84740FA9CF6A18B35EC82623 /* CommandNotch */, + A2F9603AB9C86C4EA62FFA59 /* CommandNotchTests */, + E6C841E864A0CC68B9B05BAC /* CommandNotchUITests */, + B269158E04E8E603B61448F0 /* Products */, + ); + sourceTree = ""; + }; + 84740FA9CF6A18B35EC82623 /* CommandNotch */ = { + isa = PBXGroup; + children = ( + E7A8DCFA77626F9999B432FE /* AppDelegate.swift */, + 5159CB9DBE2BAA0D2E201C39 /* CommandNotchApp.swift */, + A64A11F27E65B342B991629A /* ContentView.swift */, + D3C008AD1EFEF08E3417396F /* Components */, + 618799FE544A4373B457DCDA /* Extensions */, + D87DBBE2E8779343A36F3490 /* Managers */, + 00BC30DD7FA5C3C26404733B /* Models */, + C2F0251EB52960C9F437154D /* Resources */, + DEE792769214DF028395EA86 /* Views */, ); path = CommandNotch; sourceTree = ""; }; - C2B8955F4D0A1DAA7E60326A /* Views */ = { + A2F9603AB9C86C4EA62FFA59 /* CommandNotchTests */ = { isa = PBXGroup; children = ( - A2000000000000000000001B /* AboutSettingsView.swift */, - A20000000000000000000017 /* AppearanceSettingsView.swift */, - A20000000000000000000018 /* AnimationSettingsView.swift */, - A20000000000000000000016 /* GeneralSettingsView.swift */, - A2000000000000000000001A /* HotkeySettingsView.swift */, - A20000000000000000000015 /* SettingsBindings.swift */, - C5CB3313B230019D0E988AFE /* SettingsView.swift */, - A20000000000000000000019 /* TerminalSettingsView.swift */, - A2000000000000000000001E /* WorkspacesSettingsView.swift */, - A2000000000000000000001D /* WorkspaceSwitcherView.swift */, + 3F5FF5623898FA150C3B70D4 /* AppSettingsControllerTests.swift */, + 39CA6F2C2CA32D0AA58F6C43 /* AppSettingsStoreTests.swift */, + FF6D136A0B3FC79DDE12A826 /* NotchOrchestratorTests.swift */, + A770A63582CF9834F4E7F058 /* ScreenContextTests.swift */, + EEC7F7D8D15A1BC4EE43DDDB /* ScreenRegistryTests.swift */, + C0D19729317029008D81F361 /* TerminalCommandArrowBehaviorTests.swift */, + D288132700770C4A625A15F6 /* WindowFrameCalculatorTests.swift */, + 591FCE91AF83A8A8E44E1625 /* WorkspaceRegistryTests.swift */, + 4FA62DFE9AD003F4C5B55F14 /* WorkspaceStoreTests.swift */, ); - path = Views; + path = CommandNotchTests; sourceTree = ""; }; - F32F526005A2589010E63C76 /* Components */ = { + B269158E04E8E603B61448F0 /* Products */ = { isa = PBXGroup; children = ( - 490C53139360D970099D8F3D /* HotkeyRecorderView.swift */, - 1FC09C538CBE7C2D072008B2 /* NotchShape.swift */, - 02FEFF9074A85F02C43D9408 /* NotchWindow.swift */, - 1E47000112562615C7E59489 /* SwiftTermView.swift */, - F009B75D078A5070B5EA9738 /* TabBar.swift */, + B5AA68DC0DD3FE07B56EB6EC /* CommandNotch.app */, + 35CBC14E11EBD8486457CE91 /* CommandNotchTests.xctest */, + 496267F03E261FEC9EBD5A9D /* CommandNotchUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + C2F0251EB52960C9F437154D /* Resources */ = { + isa = PBXGroup; + children = ( + 6ADD641A088A5005DD0EB4A6 /* Assets.xcassets */, + 8796768C84519077354A95C7 /* CommandNotch.entitlements */, + ); + path = Resources; + sourceTree = ""; + }; + D3C008AD1EFEF08E3417396F /* Components */ = { + isa = PBXGroup; + children = ( + 2B81432CECBDB61D21EE4DC3 /* HotkeyRecorderView.swift */, + 3F57837A7115DEEE11E14B40 /* NotchShape.swift */, + EFAC70814C72BAF76D90B9DF /* NotchWindow.swift */, + 9C55F29B779DA0E5C5FC8627 /* SwiftTermView.swift */, + 72A1D3D12BAC593838B3125C /* TabBar.swift */, + F22AA47452CF798A977A6F47 /* TerminalCommandArrowBehavior.swift */, ); path = Components; sourceTree = ""; }; - FC6F23514BFE2235BD4154E8 = { + D87DBBE2E8779343A36F3490 /* Managers */ = { isa = PBXGroup; children = ( - 9E1CA4816F67033BBD52D8A3 /* CommandNotch */, - A30000000000000000000001 /* CommandNotchTests */, - A30000000000000000000002 /* CommandNotchUITests */, - 792DD4F8C079680683D8FF7A /* Products */, + EEB7FE2BDE5C25B7E599F340 /* HotkeyManager.swift */, + 8210D7783A614FD7190F5DDD /* LaunchAtLoginHelper.swift */, + CB593A2546BF2C0BE8E40387 /* PopoutWindowController.swift */, + 8CB8AF76C0F728897A26D7EF /* ScreenManager.swift */, + 728B3125F7F7FDB7313D2DC6 /* SettingsWindowController.swift */, + F9220E02B6D470DD05CA540C /* WindowCoordinator.swift */, ); + path = Managers; + sourceTree = ""; + }; + DEE792769214DF028395EA86 /* Views */ = { + isa = PBXGroup; + children = ( + 48198AFE5473B0F7AECAB3FB /* AboutSettingsView.swift */, + FE99DBAB656EA80A117D2EE1 /* AnimationSettingsView.swift */, + 8B3C8C11834931A9D53BC2B6 /* AppearanceSettingsView.swift */, + 27E7EEEDFBD8D9CEB8FD86A5 /* GeneralSettingsView.swift */, + D03D042117E59DCA9D553844 /* HotkeySettingsView.swift */, + 900F0476BE9E3600FBD371BB /* SettingsBindings.swift */, + 3125FD3DC55420122CF85D80 /* SettingsView.swift */, + E37A6DCD9C5DE1FE11C4C1CD /* TerminalSettingsView.swift */, + F70A31EFACF23DD9262A040E /* WorkspacesSettingsView.swift */, + DF0FFBC96F2446687D6474F4 /* WorkspaceSwitcherView.swift */, + ); + path = Views; + sourceTree = ""; + }; + E6C841E864A0CC68B9B05BAC /* CommandNotchUITests */ = { + isa = PBXGroup; + children = ( + 726B935606FD961FD7E8C2BE /* CommandNotchUITests.swift */, + ); + path = CommandNotchUITests; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 1485207FA11756EC2DF4F08B /* CommandNotch */ = { + 036FDAECD12C0A679DA1F5D6 /* CommandNotchTests */ = { isa = PBXNativeTarget; - buildConfigurationList = 74CB98309F5464CDCB00C63A /* Build configuration list for PBXNativeTarget "CommandNotch" */; + buildConfigurationList = 983C618ACECB88BD023F005E /* Build configuration list for PBXNativeTarget "CommandNotchTests" */; buildPhases = ( - F3C6D5CD1247D246A3F6F7AB /* Sources */, - 6085DF2BDFFB2A99C4ABD514 /* Frameworks */, - 0F4A88A33D93B6E100A1C003 /* Resources */, + 4108B7D3B592DEBB95C689C4 /* Sources */, + ); + buildRules = ( + ); + dependencies = ( + 316871D68B87C00F5A8FEECC /* PBXTargetDependency */, + ); + name = CommandNotchTests; + packageProductDependencies = ( + ); + productName = CommandNotchTests; + productReference = 35CBC14E11EBD8486457CE91 /* CommandNotchTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 1C8D00CBB29219BD347E9CC4 /* CommandNotchUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = CEAE976FCC3F5BD54E57E585 /* Build configuration list for PBXNativeTarget "CommandNotchUITests" */; + buildPhases = ( + 1215938A5211847A086CC444 /* Sources */, + ); + buildRules = ( + ); + dependencies = ( + F9E4A521E345300B08E257EA /* PBXTargetDependency */, + ); + name = CommandNotchUITests; + packageProductDependencies = ( + ); + productName = CommandNotchUITests; + productReference = 496267F03E261FEC9EBD5A9D /* CommandNotchUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; + D5585E5732CD067DF6EF0C69 /* CommandNotch */ = { + isa = PBXNativeTarget; + buildConfigurationList = E599EC932C075AF0FD763A0E /* Build configuration list for PBXNativeTarget "CommandNotch" */; + buildPhases = ( + D5B7874B63551D908A4B76C8 /* Sources */, + 3BD8FCDCDA6E37ED22A35CA5 /* Resources */, + F3D057FF4247F13A1BBAE547 /* Frameworks */, ); buildRules = ( ); @@ -325,60 +348,28 @@ ); name = CommandNotch; packageProductDependencies = ( - 032AECA58EA4C274BE9F3320 /* SwiftTerm */, + C921E6435A64AA07A0FEA4D5 /* SwiftTerm */, ); productName = CommandNotch; - productReference = 665CFC051CF185B71199608D /* CommandNotch.app */; + productReference = B5AA68DC0DD3FE07B56EB6EC /* CommandNotch.app */; productType = "com.apple.product-type.application"; }; - A50000000000000000000001 /* CommandNotchTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = A90000000000000000000001 /* Build configuration list for PBXNativeTarget "CommandNotchTests" */; - buildPhases = ( - A40000000000000000000002 /* Sources */, - A40000000000000000000001 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - A70000000000000000000001 /* PBXTargetDependency */, - ); - name = CommandNotchTests; - packageProductDependencies = ( - ); - productName = CommandNotchTests; - productReference = A20000000000000000000007 /* CommandNotchTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - A50000000000000000000002 /* CommandNotchUITests */ = { - isa = PBXNativeTarget; - buildConfigurationList = A90000000000000000000002 /* Build configuration list for PBXNativeTarget "CommandNotchUITests" */; - buildPhases = ( - A40000000000000000000004 /* Sources */, - A40000000000000000000003 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - A70000000000000000000002 /* PBXTargetDependency */, - ); - name = CommandNotchUITests; - packageProductDependencies = ( - ); - productName = CommandNotchUITests; - productReference = A20000000000000000000020 /* CommandNotchUITests.xctest */; - productType = "com.apple.product-type.bundle.ui-testing"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - F72A983360EF3F99042A4895 /* Project object */ = { + E99C2EDB39F7B64C1540BCA8 /* Project object */ = { isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; LastUpgradeCheck = 1600; + TargetAttributes = { + 1C8D00CBB29219BD347E9CC4 = { + DevelopmentTeam = G698BP272N; + TestTargetID = D5585E5732CD067DF6EF0C69; + }; + }; }; - buildConfigurationList = D1C4019FEAFC83BB053C9E6E /* Build configuration list for PBXProject "CommandNotch" */; + buildConfigurationList = C47A3896770C98F2A3E62B7A /* Build configuration list for PBXProject "CommandNotch" */; compatibilityVersion = "Xcode 14.0"; developmentRegion = en; hasScannedForEncodings = 0; @@ -386,144 +377,159 @@ Base, en, ); - mainGroup = FC6F23514BFE2235BD4154E8; + mainGroup = 7043235A31A4023478DA1302; minimizedProjectReferenceProxies = 1; packageReferences = ( - 80F03B77566BF59C9941EAD4 /* XCRemoteSwiftPackageReference "SwiftTerm" */, + 28377BE3F9997892D4929B6E /* XCRemoteSwiftPackageReference "SwiftTerm" */, ); + preferredProjectObjectVersion = 77; projectDirPath = ""; projectRoot = ""; targets = ( - 1485207FA11756EC2DF4F08B /* CommandNotch */, - A50000000000000000000001 /* CommandNotchTests */, - A50000000000000000000002 /* CommandNotchUITests */, + D5585E5732CD067DF6EF0C69 /* CommandNotch */, + 036FDAECD12C0A679DA1F5D6 /* CommandNotchTests */, + 1C8D00CBB29219BD347E9CC4 /* CommandNotchUITests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 0F4A88A33D93B6E100A1C003 /* Resources */ = { + 3BD8FCDCDA6E37ED22A35CA5 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 0F4A88A33D93B6E100A1C001 /* Assets.xcassets in Resources */, + 7AB14019B5CC6ED84B96FA47 /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - A40000000000000000000002 /* Sources */ = { + 1215938A5211847A086CC444 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - A10000000000000000000007 /* AppSettingsStoreTests.swift in Sources */, - A1000000000000000000001C /* AppSettingsControllerTests.swift in Sources */, - A10000000000000000000012 /* ScreenContextTests.swift in Sources */, - A1000000000000000000000C /* ScreenRegistryTests.swift in Sources */, - A10000000000000000000011 /* NotchOrchestratorTests.swift in Sources */, - A10000000000000000000014 /* WindowFrameCalculatorTests.swift in Sources */, - A10000000000000000000008 /* WorkspaceRegistryTests.swift in Sources */, - A1000000000000000000000F /* WorkspaceStoreTests.swift in Sources */, + 278010607B0D552DCC8996C5 /* CommandNotchUITests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - A40000000000000000000004 /* Sources */ = { + 4108B7D3B592DEBB95C689C4 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - A1000000000000000000001F /* CommandNotchUITests.swift in Sources */, + F8F8DE2F26608259D72635B7 /* AppSettingsControllerTests.swift in Sources */, + 7D5F3C3B5E173B6F06901812 /* AppSettingsStoreTests.swift in Sources */, + 2089566A2BBAA65EA82119B3 /* NotchOrchestratorTests.swift in Sources */, + D2468B19D6F0A2C1DFDFE2B7 /* ScreenContextTests.swift in Sources */, + 8A1B2A4CD61B0D9A4BAB075B /* ScreenRegistryTests.swift in Sources */, + CFBBE994BA6BAD4658AAB9CB /* TerminalCommandArrowBehaviorTests.swift in Sources */, + 0F133E8A88D2E313D90C32AD /* WindowFrameCalculatorTests.swift in Sources */, + 154F363D434A26105C5999B5 /* WorkspaceRegistryTests.swift in Sources */, + 2375B9DA559A0777FE558A8B /* WorkspaceStoreTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - F3C6D5CD1247D246A3F6F7AB /* Sources */ = { + D5B7874B63551D908A4B76C8 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - A10000000000000000000001 /* AppSettings.swift in Sources */, - A10000000000000000000002 /* AppSettingsController.swift in Sources */, - A10000000000000000000003 /* AppSettingsStore.swift in Sources */, - 81A912E3E16165D999882078 /* AppDelegate.swift in Sources */, - 888C45C650327089EBD39B2E /* ContentView.swift in Sources */, - 247C6F84E7ADE7AED43381E2 /* CommandNotchApp.swift in Sources */, - 88EBFBB2292659EA7C42A8F9 /* HotkeyBinding.swift in Sources */, - 4D5125E11B4DDBDB3DFACBAF /* HotkeyManager.swift in Sources */, - 7BD705CA6A34117929B362EC /* HotkeyRecorderView.swift in Sources */, - EA604F3F38D6638C7236CDC2 /* LaunchAtLoginHelper.swift in Sources */, - F0130A88D1453CD199FA65D7 /* NSScreen+Extensions.swift in Sources */, - 2213F430F3D8A88033607CD2 /* NotchSettings.swift in Sources */, - 4566E6B87CB62AF5C8D4B9D8 /* NotchShape.swift in Sources */, - A70FDB7EEEB895D475ED96E8 /* NotchState.swift in Sources */, - A10000000000000000000010 /* NotchOrchestrator.swift in Sources */, - 5B14FC23928E817FEB8D2A74 /* NotchWindow.swift in Sources */, - 8FC731CF99AB4C1C10C16FAB /* PopoutWindowController.swift in Sources */, - A1000000000000000000000B /* ScreenContext.swift in Sources */, - A1000000000000000000000D /* ScreenRegistry.swift in Sources */, - BE5E64222CF5689AC7088683 /* ScreenManager.swift in Sources */, - 7DE94234DC42EAB79896E176 /* SettingsView.swift in Sources */, - C4C93F2911B41BC19A2AE934 /* SettingsWindowController.swift in Sources */, - CC26C1677258E44F0D7B106A /* SwiftTermView.swift in Sources */, - 7EA51C3720BED7E6189E057D /* TabBar.swift in Sources */, - E9A064422790735E033E534F /* TerminalManager.swift in Sources */, - 37FC0A7CEEA37C9DCC6A8351 /* TerminalSession.swift in Sources */, - 3A1F0C4BE9D84A5C8E2B7101 /* TerminalTheme.swift in Sources */, - A10000000000000000000013 /* WindowCoordinator.swift in Sources */, - A10000000000000000000004 /* WorkspaceController.swift in Sources */, - A10000000000000000000005 /* WorkspaceRegistry.swift in Sources */, - A10000000000000000000006 /* WorkspaceSummary.swift in Sources */, - A1000000000000000000000E /* WorkspaceStore.swift in Sources */, - A1000000000000000000001B /* AboutSettingsView.swift in Sources */, - A10000000000000000000017 /* AppearanceSettingsView.swift in Sources */, - A10000000000000000000018 /* AnimationSettingsView.swift in Sources */, - A10000000000000000000016 /* GeneralSettingsView.swift in Sources */, - A1000000000000000000001A /* HotkeySettingsView.swift in Sources */, - A10000000000000000000015 /* SettingsBindings.swift in Sources */, - A10000000000000000000019 /* TerminalSettingsView.swift in Sources */, - A1000000000000000000001E /* WorkspacesSettingsView.swift in Sources */, - A1000000000000000000001D /* WorkspaceSwitcherView.swift in Sources */, + B605A9311557251A85183383 /* AboutSettingsView.swift in Sources */, + 88D87155D79C493D8956AA3B /* AnimationSettingsView.swift in Sources */, + 6DD4DAE72E5C3858B230D94C /* AppDelegate.swift in Sources */, + 7A7D3455D50D041CF698E786 /* AppSettings.swift in Sources */, + B406183CC7B5DCE76989A066 /* AppSettingsController.swift in Sources */, + 4D335F67B71F7DD977B6AEF9 /* AppSettingsStore.swift in Sources */, + 0DE8E7F29FBAA7E2B613E221 /* AppearanceSettingsView.swift in Sources */, + D088BC850F37E717844761C6 /* CommandNotchApp.swift in Sources */, + C84FA3100884649FE92BF5DD /* ContentView.swift in Sources */, + 34AF69BF7AF8DC78ADE3774A /* GeneralSettingsView.swift in Sources */, + 9F535B9516A4AE9FB536B1BD /* HotkeyBinding.swift in Sources */, + 187F4B521BFC3BD29ADA79E3 /* HotkeyManager.swift in Sources */, + E792411FA82E79E810F4B4C3 /* HotkeyRecorderView.swift in Sources */, + 6A18F6635B509FF58669F505 /* HotkeySettingsView.swift in Sources */, + 12F68EDA880030DAB644FF5F /* LaunchAtLoginHelper.swift in Sources */, + A74E14B8AD19C53820853D8E /* NSScreen+Extensions.swift in Sources */, + EE72479BA5A25FF31BACCC50 /* NotchOrchestrator.swift in Sources */, + 3B69CB3CDEC2E5F2DCE600F9 /* NotchSettings.swift in Sources */, + 088FE22B3308AAB25027E086 /* NotchShape.swift in Sources */, + 23E2DDCF36D0DAB2EA72C39C /* NotchState.swift in Sources */, + 4E0AD14B7427532271E485AA /* NotchWindow.swift in Sources */, + D4CEB4B895F75D91FA892A06 /* PopoutWindowController.swift in Sources */, + 787477BB6D2F8AC723EEDA7D /* ScreenContext.swift in Sources */, + F8ED522FDC96B1F9AD8933F7 /* ScreenManager.swift in Sources */, + E63FD5862C0EC54E284F6A0F /* ScreenRegistry.swift in Sources */, + 771088361F981A9AAE976F3C /* SettingsBindings.swift in Sources */, + DAD3AB4A0DAADA32C02D959E /* SettingsView.swift in Sources */, + 5A3FDFCF30A1AAFE070290E9 /* SettingsWindowController.swift in Sources */, + 5F3534F66A5DBE4E081AFFA6 /* SwiftTermView.swift in Sources */, + 88113BA9B217DA579C36BEBE /* TabBar.swift in Sources */, + DCFD5B03E64A46783F46726B /* TerminalCommandArrowBehavior.swift in Sources */, + 6F249EDFA2D654457DF385F1 /* TerminalManager.swift in Sources */, + 7A69B5AAC686174BCA54D0F0 /* TerminalSession.swift in Sources */, + 65C7DB7296C6C6A77598A1F4 /* TerminalSettingsView.swift in Sources */, + 1AB4A0F1BE668D3130EFBA93 /* TerminalTheme.swift in Sources */, + 507A67E770DEFAF5BC321FCF /* WindowCoordinator.swift in Sources */, + 86BB4A41E8EC44A5F45CE995 /* WorkspaceController.swift in Sources */, + 4CFA0C79095ACE0A327A2469 /* WorkspaceRegistry.swift in Sources */, + AE8215538D4B026A00BAD241 /* WorkspaceStore.swift in Sources */, + 2DF22798D3A7514E2A9183FC /* WorkspaceSummary.swift in Sources */, + 6624A60CB121A22A03365071 /* WorkspaceSwitcherView.swift in Sources */, + 26AE379040149CBE05B314BB /* WorkspacesSettingsView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - A70000000000000000000001 /* PBXTargetDependency */ = { + 316871D68B87C00F5A8FEECC /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 1485207FA11756EC2DF4F08B /* CommandNotch */; - targetProxy = A60000000000000000000001 /* PBXContainerItemProxy */; + target = D5585E5732CD067DF6EF0C69 /* CommandNotch */; + targetProxy = 13E720E97D079D298D124BBE /* PBXContainerItemProxy */; }; - A70000000000000000000002 /* PBXTargetDependency */ = { + F9E4A521E345300B08E257EA /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 1485207FA11756EC2DF4F08B /* CommandNotch */; - targetProxy = A60000000000000000000002 /* PBXContainerItemProxy */; + target = D5585E5732CD067DF6EF0C69 /* CommandNotch */; + targetProxy = 9D6387038E18398CA764147F /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 0B8C784EF064E46C44076D6B /* Release */ = { + 15F1D354AC7D5666A8317E25 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; - CLANG_USE_OPTIMIZATION_PROFILE = YES; CODE_SIGN_ENTITLEMENTS = CommandNotch/Resources/CommandNotch.entitlements; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; COMBINE_HIDPI_IMAGES = YES; - "DEVELOPMENT_TEAM[sdk=macosx*]" = G698BP272N; INFOPLIST_FILE = CommandNotch/Resources/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = CommandNotch; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 0.0.3; PRODUCT_BUNDLE_IDENTIFIER = com.commandnotch.app; PRODUCT_NAME = CommandNotch; SDKROOT = macosx; }; + name = Debug; + }; + 4C713B8FE8B6293021AB974F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + COMBINE_HIDPI_IMAGES = YES; + GENERATE_INFOPLIST_FILE = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.commandnotch.CommandNotchTests; + PRODUCT_NAME = CommandNotchTests; + SDKROOT = macosx; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CommandNotch.app/Contents/MacOS/CommandNotch"; + }; name = Release; }; - 3595A9212275B9AEC4448C64 /* Debug */ = { + 7D032F3A06E313F1F92D39EC /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -587,108 +593,24 @@ }; name = Debug; }; - 7020C02C1BDF63690CC9A3AC /* Debug */ = { + 860E4EAD454534A04683E7DD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; - CLANG_USE_OPTIMIZATION_PROFILE = YES; CODE_SIGN_ENTITLEMENTS = CommandNotch/Resources/CommandNotch.entitlements; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; COMBINE_HIDPI_IMAGES = YES; - "DEVELOPMENT_TEAM[sdk=macosx*]" = G698BP272N; INFOPLIST_FILE = CommandNotch/Resources/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = CommandNotch; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 0.0.3; PRODUCT_BUNDLE_IDENTIFIER = com.commandnotch.app; PRODUCT_NAME = CommandNotch; SDKROOT = macosx; }; - name = Debug; - }; - A80000000000000000000001 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@loader_path/../Frameworks", - "@executable_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 14.0; - PRODUCT_BUNDLE_IDENTIFIER = com.commandnotch.CommandNotchTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_VERSION = 5.10; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CommandNotch.app/Contents/MacOS/CommandNotch"; - TEST_TARGET_NAME = CommandNotch; - }; - name = Debug; - }; - A80000000000000000000002 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@loader_path/../Frameworks", - "@executable_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 14.0; - PRODUCT_BUNDLE_IDENTIFIER = com.commandnotch.CommandNotchTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SWIFT_VERSION = 5.10; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CommandNotch.app/Contents/MacOS/CommandNotch"; - TEST_TARGET_NAME = CommandNotch; - }; name = Release; }; - A80000000000000000000003 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - "DEVELOPMENT_TEAM[sdk=macosx*]" = G698BP272N; - GENERATE_INFOPLIST_FILE = YES; - MACOSX_DEPLOYMENT_TARGET = 14.0; - PRODUCT_BUNDLE_IDENTIFIER = com.commandnotch.CommandNotchUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_VERSION = 5.10; - TEST_TARGET_NAME = CommandNotch; - }; - name = Debug; - }; - A80000000000000000000004 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - "DEVELOPMENT_TEAM[sdk=macosx*]" = G698BP272N; - GENERATE_INFOPLIST_FILE = YES; - MACOSX_DEPLOYMENT_TARGET = 14.0; - PRODUCT_BUNDLE_IDENTIFIER = com.commandnotch.CommandNotchUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SWIFT_VERSION = 5.10; - TEST_TARGET_NAME = CommandNotch; - }; - name = Release; - }; - BC741C4C821EA399B645E547 /* Release */ = { + 87EEF9DE40EE78121DC1E68B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -745,41 +667,97 @@ }; name = Release; }; + C9CA7CD89BF1C9A9BC98C4CF /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = G698BP272N; + GENERATE_INFOPLIST_FILE = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.commandnotch.CommandNotchUITests; + PRODUCT_NAME = CommandNotchUITests; + SDKROOT = macosx; + TEST_TARGET_NAME = CommandNotch; + }; + name = Debug; + }; + E52824EDC7F4752F43B6301A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + COMBINE_HIDPI_IMAGES = YES; + GENERATE_INFOPLIST_FILE = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.commandnotch.CommandNotchTests; + PRODUCT_NAME = CommandNotchTests; + SDKROOT = macosx; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CommandNotch.app/Contents/MacOS/CommandNotch"; + }; + name = Debug; + }; + F697F3FF95C1EB110FC25A5C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = G698BP272N; + GENERATE_INFOPLIST_FILE = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.commandnotch.CommandNotchUITests; + PRODUCT_NAME = CommandNotchUITests; + SDKROOT = macosx; + TEST_TARGET_NAME = CommandNotch; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 74CB98309F5464CDCB00C63A /* Build configuration list for PBXNativeTarget "CommandNotch" */ = { + 983C618ACECB88BD023F005E /* Build configuration list for PBXNativeTarget "CommandNotchTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - 7020C02C1BDF63690CC9A3AC /* Debug */, - 0B8C784EF064E46C44076D6B /* Release */, + E52824EDC7F4752F43B6301A /* Debug */, + 4C713B8FE8B6293021AB974F /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; - A90000000000000000000001 /* Build configuration list for PBXNativeTarget "CommandNotchTests" */ = { + C47A3896770C98F2A3E62B7A /* Build configuration list for PBXProject "CommandNotch" */ = { isa = XCConfigurationList; buildConfigurations = ( - A80000000000000000000001 /* Debug */, - A80000000000000000000002 /* Release */, + 7D032F3A06E313F1F92D39EC /* Debug */, + 87EEF9DE40EE78121DC1E68B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; - A90000000000000000000002 /* Build configuration list for PBXNativeTarget "CommandNotchUITests" */ = { + CEAE976FCC3F5BD54E57E585 /* Build configuration list for PBXNativeTarget "CommandNotchUITests" */ = { isa = XCConfigurationList; buildConfigurations = ( - A80000000000000000000003 /* Debug */, - A80000000000000000000004 /* Release */, + C9CA7CD89BF1C9A9BC98C4CF /* Debug */, + F697F3FF95C1EB110FC25A5C /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; - D1C4019FEAFC83BB053C9E6E /* Build configuration list for PBXProject "CommandNotch" */ = { + E599EC932C075AF0FD763A0E /* Build configuration list for PBXNativeTarget "CommandNotch" */ = { isa = XCConfigurationList; buildConfigurations = ( - 3595A9212275B9AEC4448C64 /* Debug */, - BC741C4C821EA399B645E547 /* Release */, + 15F1D354AC7D5666A8317E25 /* Debug */, + 860E4EAD454534A04683E7DD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; @@ -787,7 +765,7 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ - 80F03B77566BF59C9941EAD4 /* XCRemoteSwiftPackageReference "SwiftTerm" */ = { + 28377BE3F9997892D4929B6E /* XCRemoteSwiftPackageReference "SwiftTerm" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/migueldeicaza/SwiftTerm.git"; requirement = { @@ -798,12 +776,12 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 032AECA58EA4C274BE9F3320 /* SwiftTerm */ = { + C921E6435A64AA07A0FEA4D5 /* SwiftTerm */ = { isa = XCSwiftPackageProductDependency; - package = 80F03B77566BF59C9941EAD4 /* XCRemoteSwiftPackageReference "SwiftTerm" */; + package = 28377BE3F9997892D4929B6E /* XCRemoteSwiftPackageReference "SwiftTerm" */; productName = SwiftTerm; }; /* End XCSwiftPackageProductDependency section */ }; - rootObject = F72A983360EF3F99042A4895 /* Project object */; + rootObject = E99C2EDB39F7B64C1540BCA8 /* Project object */; } diff --git a/Downterm/CommandNotch.xcodeproj/project.xcworkspace/xcuserdata/harvmaster.xcuserdatad/UserInterfaceState.xcuserstate b/Downterm/CommandNotch.xcodeproj/project.xcworkspace/xcuserdata/harvmaster.xcuserdatad/UserInterfaceState.xcuserstate index 0087c70aeeafac6a66d6ecce8608e2c7363afb84..feeeadf5c41895763b7c1db535a6da9e905cdb78 100644 GIT binary patch delta 1496 zcmYL}eQZ-@6vpp8+wCW;y=82}0b60G0^Ar5hgj332-TuPm#?gr% zX4rglW3dJCIc2deyyGNG(X^LX9VR@ek~qc38hdj*wA3sPxmP-4&o&C!NtN`uwI&?Ie614U01 zJ@<&$ks=lGk0kNpEn1Oc7BU93DcKgEE?2M-ez2^{9?<0)U9KH}MrMKJ$}B{FZ8`Gk zOoCEFxxd^ir;PLE$7R7rk?r;`&PMiCU0%kcW^q z*pKM)QPZxhmt0C8e!rzg*p;_Y_MC0c^{oxlLGnSr@Po9rA|d z(|BAL*h&5wLV*nb+7dRF2=eK7X!0! zF@LsJI`KxJAE)%kDn#Ib4ufW(?V{weeJKKCBG7gTaTO!+hc3BL$m0wBb z^Xf#g;6Kn|o5|ZJNiKUf0s{%b+jCLop*)rl{FOwd;F|@%2YJHFlKFz)tHZvhd>nxU z0?DLz7V_;VJ0P;Wp}Az;x{mnjjlGGUu-pA$?%kXNyKBSycYSl^I`wQ~DdSACT3kLH z#;N{oUnEkG=Z+gv(=|4&!Oz^5Umb&YzIMpX6_@ON1|5VvSun?3|!FR z;`kXma54u@Hqp#@801L-k9+>v6C#~CLWSYrjUFxjm#uv#7_bwOd3fup=3E(K~|B~Bu=)G zFUYUtck)EDYfdd&%hw9EnOdn9)Rr304UO50fGX5MC(tbFrUi5soli??IbBGrXbla} QrL>-|r+bVi`=>kq130+jLjV8( delta 1473 zcmYL{e@s$;ob|JOFvu-FSje3fDK5E z2IpvNx^zxnr76%1n?IVV*Q2m(Hf`xvl(m~#7UdYVmNlHV?4N2q?}6q0= zeV+3kxDE%d!`Vw@-cwKtWv~uB;DuVKgAg?7Uy=n$;{E=P#uMz`oR~P>zjk9(KR)-Z z1WVD2;o{|m?xn0&3Xp7e+m^xF9aeTxT9DK%d@oF>P8eNR2Do;eC7uo~8=XVr76&QAOLEKn}kp#mz| zuhiv?#f3gWg(|2H)io%Jw_*gUgq?AyLC<>h{G+(MFO5NkijLl9f_KF%#EA|1Nc~TwKfA_?J7rv^IYqN#LTL^xKU|o%o^8?BsQEsns zrTw2XDgMN_78Iv2U&tlRAh2vglQG8 zatl+=`c8ouH0{JqH2W)fsXsOHz$o=PsbnhyM$`~S4P(>`0ltJCfog&b;_Qnc-yS4r zkT}!f4my8Br(AD<()dpTnKM<`n?f>Q4J_8+ zF{74wKf3$Ty|2lD5274Ed9mr?YRresL%16AVO}pESMx{Hx+J_M(1UZ9giCo~uLgZa zpyi5Sw|v9{!#vP(73DP^80K?Mge!?9XeH{X2D{mKG>cV4@;JXogS`fCohR6>sR;B& zIB(5BnThgbg!AK(b)0YD{F}&ARvgXZ{2>hv&+sh>L=cEZUHQmwLfHzH8|oSgy1QFj zHg4~Vbox_Lrk72n4-HiL2M>NSenWBWP-FV}Xa(U@y@ONzyJ;;?J*L6TWwu_xm{Cj( zv>L76M|lxtPb+UV+`11q`GK*IEEWivS>xsfcxT|U23KY;vJEG*;bi@7Ji>;9+4x{f z+IU25+v92C^q%-Yg5I~o4gBwsEdA1JotEs_{hgmrO=$_|O{WW~le#FSxwMX|^lkbs9iyMp&*;~5f=<#q^e@>a&ymyQ9QjdsvAjfHDleB; z$VGCc9Mm7_AG78rD57Fh<|xTZisDrAl|rRRaVx8pa>b)~mGw%k(x;rz9}F%^`VVwV B-@yO? diff --git a/Downterm/CommandNotch.xcodeproj/xcshareddata/xcschemes/CommandNotch.xcscheme b/Downterm/CommandNotch.xcodeproj/xcshareddata/xcschemes/CommandNotch.xcscheme index 3a52823..44204b0 100644 --- a/Downterm/CommandNotch.xcodeproj/xcshareddata/xcschemes/CommandNotch.xcscheme +++ b/Downterm/CommandNotch.xcodeproj/xcshareddata/xcschemes/CommandNotch.xcscheme @@ -1,11 +1,11 @@ + runPostActionsOnFailure = "NO"> @@ -28,7 +28,42 @@ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "YES" - shouldAutocreateTestPlan = "YES"> + onlyGenerateCoverageForSpecifiedTargets = "NO"> + + + + + + + + + + + + + + + + + + + + diff --git a/Downterm/CommandNotch.xcodeproj/xcshareddata/xcschemes/Release-CommandNotch.xcscheme b/Downterm/CommandNotch.xcodeproj/xcshareddata/xcschemes/Release-CommandNotch.xcscheme index b983be5..a26f8ae 100644 --- a/Downterm/CommandNotch.xcodeproj/xcshareddata/xcschemes/Release-CommandNotch.xcscheme +++ b/Downterm/CommandNotch.xcodeproj/xcshareddata/xcschemes/Release-CommandNotch.xcscheme @@ -1,11 +1,11 @@ + runPostActionsOnFailure = "NO"> @@ -28,13 +28,48 @@ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "YES" - shouldAutocreateTestPlan = "YES"> + onlyGenerateCoverageForSpecifiedTargets = "NO"> + + + + + + + + + + + + + + + + + + + + diff --git a/Downterm/CommandNotch/Components/TerminalCommandArrowBehavior.swift b/Downterm/CommandNotch/Components/TerminalCommandArrowBehavior.swift new file mode 100644 index 0000000..946be93 --- /dev/null +++ b/Downterm/CommandNotch/Components/TerminalCommandArrowBehavior.swift @@ -0,0 +1,31 @@ +import AppKit +import Carbon.HIToolbox +import SwiftTerm + +enum TerminalCommandArrowBehavior { + private static let relevantModifiers: NSEvent.ModifierFlags = [.command, .control, .option, .shift] + private static let lineKill: [UInt8] = [0x15] + private static let clearScreen: [UInt8] = [0x0c] + + static func sequence( + for modifierFlags: NSEvent.ModifierFlags, + keyCode: UInt16, + applicationCursor: Bool + ) -> [UInt8]? { + let flags = modifierFlags.intersection(relevantModifiers) + guard flags == [.command] else { return nil } + + switch Int(keyCode) { + case kVK_LeftArrow: + return applicationCursor ? EscapeSequences.moveHomeApp : EscapeSequences.moveHomeNormal + case kVK_RightArrow: + return applicationCursor ? EscapeSequences.moveEndApp : EscapeSequences.moveEndNormal + case kVK_Delete: + return lineKill + case kVK_ANSI_L: + return clearScreen + default: + return nil + } + } +} diff --git a/Downterm/CommandNotch/Models/TerminalSession.swift b/Downterm/CommandNotch/Models/TerminalSession.swift index f75f651..cd4fdc4 100644 --- a/Downterm/CommandNotch/Models/TerminalSession.swift +++ b/Downterm/CommandNotch/Models/TerminalSession.swift @@ -9,6 +9,7 @@ class TerminalSession: NSObject, ObservableObject, LocalProcessDelegate, @precon let id = UUID() let terminalView: TerminalView private var process: LocalProcess? + private var keyEventMonitor: Any? private let backgroundColor = NSColor.black private let configuredShellPath: String @@ -26,10 +27,17 @@ class TerminalSession: NSObject, ObservableObject, LocalProcessDelegate, @precon let font = NSFont.monospacedSystemFont(ofSize: fontSize, weight: .regular) terminalView.font = font applyTheme(theme) + installCommandArrowMonitor() startShell() } + deinit { + if let keyEventMonitor { + NSEvent.removeMonitor(keyEventMonitor) + } + } + // MARK: - Shell management private func startShell() { @@ -58,6 +66,26 @@ class TerminalSession: NSObject, ObservableObject, LocalProcessDelegate, @precon return ProcessInfo.processInfo.environment["SHELL"] ?? "/bin/zsh" } + private func installCommandArrowMonitor() { + keyEventMonitor = NSEvent.addLocalMonitorForEvents(matching: .keyDown) { [weak self] event in + guard let self else { return event } + guard let window = self.terminalView.window else { return event } + guard event.window === window else { return event } + guard window.firstResponder === self.terminalView else { return event } + + guard let sequence = TerminalCommandArrowBehavior.sequence( + for: event.modifierFlags, + keyCode: event.keyCode, + applicationCursor: self.terminalView.getTerminal().applicationCursor + ) else { + return event + } + + self.terminalView.send(data: sequence[...]) + return nil + } + } + func updateFontSize(_ size: CGFloat) { terminalView.font = NSFont.monospacedSystemFont(ofSize: size, weight: .regular) } diff --git a/Downterm/CommandNotchTests/TerminalCommandArrowBehaviorTests.swift b/Downterm/CommandNotchTests/TerminalCommandArrowBehaviorTests.swift new file mode 100644 index 0000000..abe2b98 --- /dev/null +++ b/Downterm/CommandNotchTests/TerminalCommandArrowBehaviorTests.swift @@ -0,0 +1,57 @@ +import AppKit +import Carbon.HIToolbox +import XCTest +import SwiftTerm +@testable import CommandNotch + +final class TerminalCommandArrowBehaviorTests: XCTestCase { + func testCommandLeftUsesHomeSequence() { + let sequence = TerminalCommandArrowBehavior.sequence( + for: [.command], + keyCode: UInt16(kVK_LeftArrow), + applicationCursor: false + ) + + XCTAssertEqual(sequence, EscapeSequences.moveHomeNormal) + } + + func testCommandRightUsesApplicationEndSequence() { + let sequence = TerminalCommandArrowBehavior.sequence( + for: [.command], + keyCode: UInt16(kVK_RightArrow), + applicationCursor: true + ) + + XCTAssertEqual(sequence, EscapeSequences.moveEndApp) + } + + func testOptionLeftKeepsSwiftTermWordNavigationPath() { + let sequence = TerminalCommandArrowBehavior.sequence( + for: [.option], + keyCode: UInt16(kVK_LeftArrow), + applicationCursor: false + ) + + XCTAssertNil(sequence) + } + + func testCommandDeleteUsesLineKillSequence() { + let sequence = TerminalCommandArrowBehavior.sequence( + for: [.command], + keyCode: UInt16(kVK_Delete), + applicationCursor: false + ) + + XCTAssertEqual(sequence, [0x15]) + } + + func testCommandLUsesClearScreenSequence() { + let sequence = TerminalCommandArrowBehavior.sequence( + for: [.command], + keyCode: UInt16(kVK_ANSI_L), + applicationCursor: false + ) + + XCTAssertEqual(sequence, [0x0c]) + } +} diff --git a/Downterm/project.yml b/Downterm/project.yml index 0546e40..6ba04cf 100644 --- a/Downterm/project.yml +++ b/Downterm/project.yml @@ -14,6 +14,45 @@ packages: SwiftTerm: url: https://github.com/migueldeicaza/SwiftTerm.git from: "1.2.0" +schemes: + CommandNotch: + build: + targets: + CommandNotch: all + test: + config: Debug + targets: + - CommandNotchTests + - CommandNotchUITests + run: + config: Debug + profile: + config: Release + analyze: + config: Debug + archive: + config: Release + management: + shared: true + Release-CommandNotch: + build: + targets: + CommandNotch: all + test: + config: Debug + targets: + - CommandNotchTests + - CommandNotchUITests + run: + config: Release + profile: + config: Release + analyze: + config: Debug + archive: + config: Release + management: + shared: true targets: CommandNotch: type: application @@ -29,9 +68,9 @@ targets: properties: CFBundleName: CommandNotch CFBundleDisplayName: CommandNotch - CFBundleIdentifier: com.commandnotch.app + CFBundleIdentifier: "$(PRODUCT_BUNDLE_IDENTIFIER)" CFBundleVersion: "1" - CFBundleShortVersionString: "0.2.0" + CFBundleShortVersionString: "0.0.3" CFBundlePackageType: APPL CFBundleExecutable: CommandNotch LSMinimumSystemVersion: "14.0" diff --git a/docs/workspace-split-pane-plan.md b/docs/workspace-split-pane-plan.md new file mode 100644 index 0000000..a534020 --- /dev/null +++ b/docs/workspace-split-pane-plan.md @@ -0,0 +1,351 @@ +# Workspace Split Pane Plan + +## Purpose + +Capture the agreed design for workspace-owned split terminals so the feature can be implemented later without redoing scope and architecture decisions. + +## Agreed Scope + +- Split layouts belong to the workspace, not the screen. +- A workspace may only be actively presented on one screen at a time. +- Split layouts should be visible the same way when that workspace is opened on another monitor. +- Nested splits are supported. +- Any two tabs may be joined into a split. +- Closing a pane causes its sibling to expand. +- Split layout must survive relaunch. + +## Non-Goals + +- Simultaneous live rendering of the same workspace on multiple screens. +- Full multi-user or collaborative state sync. +- Arbitrary freeform pane layout. The model is tree-based binary splits. +- Solving all interaction polish in the first pass. + +## Current Constraint + +The current workspace model is flat: + +- `WorkspaceController` owns `[TerminalSession]` +- one tab is active at a time +- `ContentView` renders exactly one active `SwiftTermView` + +This means split panes are not an additive UI feature. They require a workspace model refactor. + +## Recommended Model + +Do not model splits as "adjacent tabs with special behavior" internally. + +Instead: + +1. A workspace owns ordered top-level tabs. +2. Each top-level tab owns a pane tree. +3. Pane tree leaves own `TerminalSession` instances. +4. Pane tree internal nodes represent binary splits. +5. The tab bar can visually present grouped/joined tabs based on the active tab's pane composition. + +This keeps the domain model clean while still allowing the desired visual metaphor. + +## Proposed Domain Types + +```swift +typealias WorkspaceTabID = UUID +typealias PaneID = UUID + +struct WorkspaceTab: Identifiable, Equatable, Codable { + var id: WorkspaceTabID + var rootPane: PaneNode + var selectedPaneID: PaneID? + var titleMode: WorkspaceTabTitleMode +} + +enum PaneNode: Equatable, Codable, Identifiable { + case leaf(PaneLeaf) + case split(PaneSplit) + + var id: PaneID { ... } +} + +struct PaneLeaf: Equatable, Codable, Identifiable { + var id: PaneID + var sessionID: UUID +} + +struct PaneSplit: Equatable, Codable, Identifiable { + var id: PaneID + var axis: SplitAxis + var ratio: Double + var first: PaneNode + var second: PaneNode +} + +enum SplitAxis: String, Codable { + case horizontal + case vertical +} +``` + +Notes: + +- `ratio` should be persisted so user-adjusted divider positions survive relaunch. +- `selectedPaneID` allows focus-based commands such as split active pane, close active pane, and move focus. +- The persisted model should store session identity separately from runtime AppKit/SwiftTerm objects. + +## Runtime Ownership + +Global: + +- workspace summaries +- workspace ordering +- workspace-to-screen assignment +- hotkeys + +Workspace: + +- ordered top-level tabs +- active top-level tab +- per-tab pane tree +- active/selected pane +- terminal sessions for pane leaves + +Screen: + +- which workspace is assigned +- notch open/close state +- geometry and transitions + +This remains aligned with the existing workspace architecture. + +## Persistence Strategy + +Split layout must survive relaunch, so workspace persistence needs to grow beyond summary metadata. + +Recommended approach: + +1. Keep `WorkspaceSummary` for list metadata only. +2. Introduce a persisted `WorkspaceDocument` or `WorkspaceSnapshot` per workspace. +3. Persist: + - top-level tabs + - pane tree + - active tab ID + - selected pane ID + - divider ratios +4. Do not attempt to persist shell process contents. +5. On relaunch, recreate sessions for pane leaves and restore layout structure only. + +Important distinction: + +- layout persistence is required +- terminal process continuity is not + +## UI Model + +### Main Content + +The active top-level tab renders as a recursive split tree. + +- leaf node -> one `SwiftTermView` +- split node -> `HSplitView`/`VSplitView` equivalent SwiftUI container with draggable divider + +### Tab Bar + +Top-level tabs remain the primary navigation unit. + +Visual behavior: + +- a normal unsplit tab looks like today +- a joined/split tab should look grouped +- grouped tabs should expose child pane titles visually inside the tab item + +Recommended first-pass appearance: + +- one outer tab pill per top-level tab +- inside that pill, show compact child title chips for each leaf pane +- highlight the selected pane's chip + +This gives the "tabs are joined" feel without making pane leaves first-class top-level tabs in the data model. + +## Command Model + +New actions likely needed: + +- split active pane horizontally +- split active pane vertically +- focus next pane +- focus previous pane +- close active pane +- resize focused split divider +- join tab A into tab B +- detach pane into new top-level tab + +Semantics: + +- joining any two tabs merges one tab's root pane into the other's tree +- the source top-level tab is removed +- the destination top-level tab remains +- sibling expansion on close is standard tree collapse + +## Join Semantics + +Joining any two tabs should work as: + +1. Choose destination tab. +2. Choose source tab. +3. Replace destination root with a new split node: + - first child = old destination root + - second child = source root +4. Remove source tab from workspace order. +5. Select a predictable pane, preferably the source pane that was just added. + +An explicit split axis should be required for the join action. + +## Close Semantics + +When closing a pane: + +- if the pane has a sibling, the sibling expands into the parent's position +- if the pane was the only leaf in a top-level tab: + - close the whole top-level tab if more than one tab exists + - otherwise create a replacement shell pane, matching current single-tab safety behavior + +## Focus Semantics + +Pane focus must become explicit. + +Recommended rules: + +- mouse click focuses that pane +- splitting focuses the new pane +- joining focuses the moved-in pane +- closing a pane focuses the surviving sibling +- top-level tab switch restores the previously selected pane in that tab + +## Migration Path + +Implement in stages to reduce risk. + +### Stage 1: Domain Refactor + +- Replace flat workspace tabs with top-level tab objects. +- Introduce pane tree types. +- Keep only one leaf per tab initially so behavior is unchanged. + +### Stage 2: Runtime Layout Rendering + +- Render pane trees recursively in `ContentView`. +- Add active pane selection. +- Keep persistence off until runtime behavior is stable. + +### Stage 3: Split Actions + +- Split active pane horizontally/vertically. +- Close pane with sibling expansion. +- Basic focus movement. + +### Stage 4: Joined Tab UI + +- Update tab bar to show grouped child pane chips. +- Surface active pane clearly. + +### Stage 5: Join / Unjoin Flows + +- Join any two tabs with explicit axis choice. +- Support promoting a pane back to its own top-level tab if needed. + +### Stage 6: Persistence + +- Persist pane trees and top-level tab state. +- Recreate sessions on launch. + +### Stage 7: Hotkeys and Polish + +- Add pane-focused shortcuts. +- Add divider dragging polish. +- Improve visual grouped-tab affordances. + +## Main Risks + +### 1. Model complexity + +The current flat `[TerminalSession]` model is simple. Tree-based layout introduces more state, more edge cases, and more focus semantics. + +Mitigation: + +- refactor the data model before touching complex UI +- keep top-level tabs and pane leaves distinct + +### 2. SwiftTerm view ownership + +`TerminalView` cannot be mounted in multiple places safely. + +Mitigation: + +- preserve current rule: only one active presenting screen per workspace +- keep one runtime `TerminalSession` per pane leaf + +### 3. Persistence mismatch + +Persisting layout is easy compared with persisting process state. + +Mitigation: + +- persist layout and selection only +- recreate shell sessions on launch + +### 4. Joined-tab UX ambiguity + +If grouped tabs are also used as pane chips, the interaction model can get confusing. + +Mitigation: + +- preserve top-level tabs as the real navigation unit +- use internal chips only as secondary indicators/actions + +## Recommended First Implementation Boundary + +The first deliverable should include: + +- nested binary split trees +- active pane focus +- split and close pane actions +- sibling expansion +- grouped tab appearance +- join any two tabs +- persisted layout across relaunch +- same workspace layout when moved to another screen + +The first deliverable should not include: + +- simultaneous same-workspace rendering on multiple screens +- drag-and-drop tree editing +- restoring running shell process contents + +## Files Likely Impacted + +- `Downterm/CommandNotch/Models/WorkspaceController.swift` +- `Downterm/CommandNotch/Models/WorkspaceRegistry.swift` +- `Downterm/CommandNotch/Models/WorkspaceStore.swift` +- `Downterm/CommandNotch/ContentView.swift` +- `Downterm/CommandNotch/Components/TabBar.swift` +- `Downterm/CommandNotch/Models/TerminalSession.swift` +- workspace-related tests + +Likely new files: + +- pane tree domain types +- persisted workspace document types +- split-pane rendering view(s) +- pane-focused command helpers + +## Decision Summary + +The feature is feasible. + +The correct architecture is: + +- workspace-owned split tree +- top-level tabs remain the primary unit +- grouped tab visuals are a UI layer over the pane tree +- one presenting screen per workspace +- persisted layout, not persisted process contents + +That is the implementation direction to use when this work is resumed.