macOS Space๋ณ ์ปจํ ์คํธ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ํ๋กํ ์์ ฏ. ์ฌ๋ฌ ํ๋ก์ ํธ๋ฅผ Space๋ณ๋ก ๋๋ ์ฐ๋ ํ๋ฆ์์, ๊ธฐ๋ณธ Dock์ด ํ์ฌ Space์ ์์ ๋งฅ๋ฝ์ ์ถฉ๋ถํ ๋ณด์ฌ์ฃผ์ง ๋ชปํ๋ ๋ฌธ์ ๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ์์ํ ํ๋ก์ ํธ์ ๋๋ค.
ํ์ฌ Space์ ๋ฒํธ์ ์ปจํ
์คํธ ๋ผ๋ฒจ, ํด๋น Space์์ ์์
์ค์ธ ์ฑ ๋ชฉ๋ก์ ํ๋จ ํจ๋์ ํ์ํ๊ณ , ์ํ๋ฅผ state.json์ผ๋ก ๊ธฐ๋กํฉ๋๋ค.
mac์ ์ฐ๋ฉด์ ์์ฆ API ๊ธฐ๋ฐ ํ๋ก์ ํธ๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ณ๋ ฌ๋ก ๋ค๋ฃจ๋ฉด, ์์ฐ์ค๋ฝ๊ฒ Space๋ฅผ ํ๋ก์ ํธ ๋จ์ ์์ ์ปจํ ์คํธ๋ก ์ฐ๊ฒ ๋ฉ๋๋ค. ๋ฌธ์ ๋ ๊ธฐ๋ณธ Dock์ด ํ์ฌ Space ๊ธฐ์ค์ ๋งฅ๋ฝ์ ๋ช ํํ ๋ณด์ฌ์ฃผ์ง ๋ชปํ๋ค๋ ์ ์ ๋๋ค.
SpaceWidget์ ์ด ์ง์ ์ ๋ณด์ํฉ๋๋ค.
- ์ง๊ธ ๋ด๊ฐ ์ด๋ Space์์ ์์ ์ค์ธ์ง ๋ฐ๋ก ๋ณด์ด๊ฒ ํ๊ณ
- ๊ทธ Space์ ์ปจํ ์คํธ ๋ผ๋ฒจ์ ์ง์ ๋ถ์ผ ์ ์๊ฒ ํ๊ณ
- ํ์ฌ ์์ ์ค์ธ ์ฑ๋ง ๋น ๋ฅด๊ฒ ํ๊ณ ๋ค์ ์ ํํ ์ ์๊ฒ ํฉ๋๋ค
- ํ์ฌ ํ์ฑ Space ๋ฒํธ์ ์ปจํ ์คํธ ๋ผ๋ฒจ์ ์ขํ๋จ ํ๋กํ ๋ฐ์ ํ์
- Space ์ ํ ์ ์๋ ๊ฐ์ง ๋ฐ ๊ฐฑ์
- ๋ผ๋ฒจ ์์ญ ํด๋ฆญ์ผ๋ก ์ธ๋ผ์ธ ๋ผ๋ฒจ ํธ์ง
- non-desktop space (fullscreen, overlay, tiled) ์๋ ํํฐ๋ง
- ์ฐ๊ฒฐ๋ ๋์คํ๋ ์ด๋ง๋ค ๋ ๋ฆฝ ํจ๋ ์๋ ์์ฑ
- ๋ฏธ๋ฌ๋ง: ์ฃผ ๋์คํ๋ ์ด์ ๋์ผํ๊ฒ ๋์
- ํ์ฅ ๋์คํ๋ ์ด: ๋ณ๋ Space๋ก ์ธ์, per-display ordinal๋ก Space ๋ฒํธ ํ์, ๋ ๋ฆฝ ๋ผ๋ฒจ ๊ด๋ฆฌ
- ๋์คํ๋ ์ด ์ฐ๊ฒฐ/๋ถ๋ฆฌ ์ ํจ๋ ์๋ ์ถ๊ฐ/์ ๊ฑฐ
- ๋ผ๋ฒจ์ ์์ ์ ์ธ spaceID์ ๊ณ ์ (Space ์์ ๋ณ๊ฒฝ/ํ์คํฌ๋ฆฐ ์ ํ ์์๋ ๋ผ๋ฒจ ์ ์ง)
- Space ์์ ๋ณ๊ฒฝ ์ ordinal ์๋ ์ฌ๋ฐ์ธ๋ฉ
- v1 ๋ง์ด๊ทธ๋ ์ด์
:
__main__sentinel entry๋ก ordinal ๊ธฐ๋ฐ ๊ตฌ ๋ผ๋ฒจ ๋ณด์กด - Dead-display fallback (Tier 0): ์ฃผ ๋์คํ๋ ์ด๊ฐ ๋ถ๋ฆฌ๋์ด ๋จ์ผ-๋์คํ๋ ์ด ๋ชจ๋๊ฐ ๋๋ฉด, ๋จ์ ๋์คํ๋ ์ด์ ์ฐ๊ฒฐ์ด ๋๊ธด ๋์คํ๋ ์ด์ ๋ผ๋ฒจ์ ordinal ๊ธฐ๋ฐ์ผ๋ก shadow ํ์
- Tier 0 write-back: shadow ์ํ์์ ํธ์ง ์ ์๋ณธ(๋ถ๋ฆฌ๋) ๋์คํ๋ ์ด์ entry๋ฅผ ๊ฐฑ์ ํด ์ฌ์ฐ๊ฒฐ ์ ํธ์ง ๋ด์ฉ ๋ณต์
- ์ ํ ์์ ์ฑ: tiebreaker๋ก dead-display ์ ํ์ ๊ฒฐ์ ์ ์ผ๋ก ์ฒ๋ฆฌํด ์ค๋ณต ๋ฎ์ด์ฐ๊ธฐ ๋ฐฉ์ง
- ํ์ฌ Space์์ ์คํ ์ค์ธ ์ฑ์ ์์งํด ์์ด์ฝ ๋ชฉ๋ก์ผ๋ก ๋ ๋๋ง
- ์ฑ๋ณ ์๋์ฐ ์ ์ง๊ณ
- ํฌ์ปค์ค๋ ์ฑ ํ์ด๋ผ์ดํธ ํ์
- ์จ๊น/์ต์ํ๋ ์ฑ ๊ฐ์ง ๋ฐ ํ์
- ์์ด์ฝ ํด๋ฆญ์ผ๋ก ์ฑ ํ์ฑํ (์ต์ํ/์จ๊น ์ํ ํด์ ํฌํจ)
- ์ต๋ 20๊ฐ ์ฑ ํ์
- ํ์ด์ง๋น ์์ด์ฝ ์ ์ค์ ๊ฐ๋ฅ (5~10๊ฐ, ๊ธฐ๋ณธ 5)
- ์ข์ฐ ์ค์์ดํ๋ก ํ์ด์ง ์ ํ
- ๊ฒฝ๊ณ์์ ๋ฌ๋ฒ๋ฐด๋ ํจ๊ณผ
- ํ๋จ ํ์ด์ง ์ธ๋์ผ์ดํฐ ๋ํธ
- ํฌ์ปค์ค๋ ์ฑ์ด ์๋ ํ์ด์ง๋ก ์๋ ์ด๋
- ์ฑ ์์ด์ฝ ์ฐํด๋ฆญ ์ ๋งํ์ ํํ์ ์ปจํ ์คํธ ๋ฉ๋ด ํ์
- New Window: ์ ์ฐฝ ์ด๊ธฐ (AX API ๋ฉ๋ด ํ์ โ CGEvent Cmd+N ํด๋ฐฑ)
- Close from Space: ํ์ฌ Space์ ํด๋น ์ฑ ์๋์ฐ๋ง ๋ซ๊ธฐ (sticky ์๋์ฐ ์ ์ธ)
- Quit: ์ฑ ์ข ๋ฃ
- ํ๋ฉด ๋ฐ ๋ฐฉ์ง ํด๋จํ
๋จ์ถํค๋ก ์ฐฝ์ ํ๋ฉด์ ํน์ ์์ญ์ ๋ฐฐ์น:
| ๋์ | ๊ธฐ๋ณธ ๋จ์ถํค |
|---|---|
| ์ผ์ชฝ ์ ๋ฐ | Cmd+Ctrl+โ |
| ์ค๋ฅธ์ชฝ ์ ๋ฐ | Cmd+Ctrl+โ |
| ์ต๋ํ | Cmd+Ctrl+Enter |
| ์ต์ํ | Cmd+Ctrl+Esc |
| ์ฒซ ๋ฒ์งธ 1/3 | Cmd+Ctrl+D |
| ๊ฐ์ด๋ฐ 1/3 | Cmd+Ctrl+F |
| ๋ง์ง๋ง 1/3 | Cmd+Ctrl+G |
| ์ฒซ ๋ฒ์งธ 2/3 | Cmd+Ctrl+E |
| ๊ฐ์ด๋ฐ 2/3 | Cmd+Ctrl+V |
| ๋ง์ง๋ง 2/3 | Cmd+Ctrl+T |
๋ชจ๋ ๋จ์ถํค๋ Preferences์์ ์ปค์คํฐ๋ง์ด์ฆ ๊ฐ๋ฅํฉ๋๋ค.
- ์๋์ฐ ๋ ์ด์์ ํ ํ๋ฆฟ ์์ฑ/ํธ์ง/์ญ์ /๋ณต์
- ํ ํ๋ฆฟ์ ์๋์ฐ ๋ฐฐ์น ์กด(zone) ์ ์ (WindowAction ๊ธฐ๋ฐ)
- ์กด๋ณ ์ฑ bundle ID ํ ๋น
- ํ ํ๋ฆฟ๋ณ ํค๋ณด๋ ๋จ์ถํค ์ง์
- Space๋ณ Auto-Apply: Space ์ ํ ์ ์๋์ผ๋ก ํ ํ๋ฆฟ ์ ์ฉ
- Launch Closed Apps: ํ ํ๋ฆฟ ์ ์ฉ ์ ์คํ๋์ง ์์ ์ฑ ์๋ ์คํ
Hidden Apps
- Preferences โ Hidden Apps ํญ์์ ์์ ฏ ๋ฐ์ ํ์ํ์ง ์์ ์ฑ ๊ด๋ฆฌ
- SpaceWidget์ ๊ธฐ๋ณธ ์ ์ธ ํญ๋ชฉ (์ญ์ ๋ถ๊ฐ)
- Add App ๋ฒํผ์ผ๋ก ์ค์น๋ ์ฑ(.app) ์ ํํ์ฌ ์ ์ธ ๋ชฉ๋ก์ ์ถ๊ฐ
- ์คํฌ๋ฆฐ ์บก์ฒ ๋๊ตฌ(Flameshot ๋ฑ) ์ฌ์ฉ ์ ์์ ฏ ํจ๋์ด ์บก์ฒ์ ํฌํจ๋์ง ์์
- Space ๋ฒํธ ํด๋ฆญ ์ ํด๋น ๋์คํ๋ ์ด์ ์ ์ฒด ๋ฐ์คํฌํ ๋ชฉ๋ก ํ์ ํ์
- ๋ชฉ๋ก์์ ๋ฐ์คํฌํ ์ ํ ์ CGEvent dock-swipe ํฉ์ฑ์ผ๋ก ์ฆ์ ์ ํ
- Ctrl+N ํค๋ณด๋ ๋จ์ถํค ํด๋ฐฑ (์์คํ ์ค์ ์์ ํ์ฑํ๋ ๊ฒฝ์ฐ)
- ๋ฉํฐ ๋์คํ๋ ์ด: active display ๊ฒ์ฆ ๊ฐ๋๋ก ์๋ชป๋ ๋์คํ๋ ์ด ์ ํ ๋ฐฉ์ง
- ์ ํ ํ ์ค์ Space ๋ณ๊ฒฝ ๊ฒ์ฆ (์คํจ ์ ์๋ ํด๋ฐฑ)
- Dock๊ณผ ์์ ฏ ๋ฐ๊ฐ ๊ฒน์น ๋ ํ์ด์ง๋น ์์ด์ฝ ์๋ฅผ ์๋์ผ๋ก ์ถ์
- ์ค์ :
enabled(ํ์ฑํ),min_icons(์ต์ ์์ด์ฝ ์ 210),2)reduce_step(์ถ์ ๋จ์ 1 - Dock ์์น/ํฌ๊ธฐ ๋ณ๊ฒฝ ์ ์ค์๊ฐ ์ฌ๊ณ์ฐ
- ์ถ์ํด๋ ๊ฒน์นจ์ด ํด์๋์ง ์์ผ๋ฉด ์๋ ์ค์ ์ ์ง
- ๋ฐ ์๋ ์จ๊น ๋ชจ๋ ํ ๊ธ
- ๋ง์ฐ์ค๋ฅผ ๋ฐ ์์ญ์ ์ฌ๋ฆฌ๋ฉด ํ์, ๋ ๋๋ฉด 0.3์ด ํ ์จ๊น
- Hot Zone ๊ฐ์ง ์์ญ์ผ๋ก ๋ง์ฐ์ค ์ง์ /์ดํ ์ถ์
macOS Dock ๋์ ์ ์ด (CoreDock private framework ์ฌ์ฉ):
| ๋ชจ๋ | ์ค๋ช |
|---|---|
| Auto Hide | ๊ธฐ๋ณธ macOS ์๋ ์จ๊น ๋์ |
| Always Hide | ์๊ตฌ ์จ๊น (๋๊ธฐ ์๊ฐ ๊ทน๋ํ) |
| Always Show | ํญ์ ํ์ |
์ฑ ์ข ๋ฃ ์ ์๋ Dock ์ค์ ๋ณต์.
๋ฉ๋ด๋ฐ ์์ด์ฝ์ผ๋ก ๋น ๋ฅธ ์ค์ ์ ๊ทผ:
- Auto Hide ํ ๊ธ
- Icons per Page ์ค์ (5~10)
- Dock ๋ชจ๋ ์ ํ
- Layout ํ ํ๋ฆฟ ๋ชฉ๋ก ๋ฐ ์ ์ฉ
- Auto-Apply ํ ๊ธ
- Preferences ์ด๊ธฐ
- Quit SpaceWidget
- Shortcuts ํญ: ์๋์ฐ ์ค๋ ๋จ์ถํค ํ์ฑํ/๋นํ์ฑํ, ์ ๋จ์ถํค ๋ นํ, ๊ธฐ๋ณธ๊ฐ ๋ณต์
- Layouts ํญ: ๋ ์ด์์ ํ ํ๋ฆฟ ์์ฑ/ํธ์ง/์ญ์ , ์ฑ ํ ๋น, Space๋ณ Auto-Apply ์ค์
- Hidden Apps ํญ: ์์ ฏ ๋ฐ์์ ์ ์ธํ ์ฑ ๊ด๋ฆฌ (๊ธฐ๋ณธ ํญ๋ชฉ + ์ฌ์ฉ์ ์ถ๊ฐ)
~/.config/space-dock/state.json์ ํ์ฌ ์ํ ๊ธฐ๋ก- ๋ด์ฉ:
current_space,space_id,space_label,apps๋ฐฐ์ด - 1์ด ๋๋ฐ์ด์ค๋ก ๊ณผ๋ํ ์ฐ๊ธฐ ๋ฐฉ์ง
- CLI ์คํฌ๋ฆฝํธ ๋ฐ ์ธ๋ถ ์๋ํ ์ฐ๋์ฉ
space-widget/
โโโ Sources/SpaceWidget/
โ โโโ App/
โ โ โโโ SpaceWidgetApp.swift โ ์ฑ ์ง์
์ , ์์กด์ฑ ์กฐ๋ฆฝ
โ โ โโโ MenuBarController.swift โ ๋ฉ๋ด๋ฐ ์์ด์ฝ + ์ค์ ๋ฉ๋ด
โ โ โโโ PreferencesWindowController.swift โ ์ค์ ์ฐฝ ๋ผ์ดํ์ฌ์ดํด
โ โ โโโ DockController.swift โ macOS Dock ๋์ ์ ์ด (CoreDock)
โ โโโ Config/
โ โ โโโ ConfigManager.swift โ ์ค์ ๋ก๋/์ ์ฅ (labels, ignored apps, shortcuts ๋ฑ)
โ โ โโโ Logger.swift โ ํ์ผ + stderr ๋ก๊ทธ
โ โ โโโ Migrator.swift โ sketchybar โ space-dock ๋ง์ด๊ทธ๋ ์ด์
โ โ โโโ StateWriter.swift โ state.json ๊ธฐ๋ก
โ โ โโโ OverlapDetection.swift โ Dock-์์ ฏ ๊ฒน์นจ ๊ฐ์ง/์์ด์ฝ ์ ์ถ์ ๊ณ์ฐ
โ โ โโโ ShortcutBinding.swift โ ๋จ์ถํค ๋ฐ์ธ๋ฉ ๋ชจ๋ธ
โ โโโ Engine/
โ โ โโโ SpaceMonitor.swift โ ์ ์ฒด ๋์คํ๋ ์ด Space ๊ฐ์ง
โ โ โโโ WindowListProvider.swift โ ์ฑ ๋ชฉ๋ก ์์ง (ํ๋ฉด๋ณ ํํฐ๋ง)
โ โ โโโ SpaceEngine.swift โ ๋ฉํฐ ๋์คํ๋ ์ด snapshot ํ์ดํ๋ผ์ธ
โ โ โโโ CGSPrivate.swift โ CGS private API bridge
โ โ โโโ AppActions.swift โ ์ฑ ์ก์
(new window, close, activate)
โ โ โโโ SpaceSwitcher.swift โ CGEvent dock-swipe ๊ธฐ๋ฐ Space ์ ํ
โ โ โโโ CoreDockBridge.swift โ CoreDock private API bridge
โ โ โโโ DockGeometry.swift โ Dock ์์น/ํฌ๊ธฐ ๊ณ์ฐ
โ โ โโโ WindowMoveObserver.swift โ ์๋์ฐ ์ด๋/๋ฆฌ์ฌ์ด์ฆ ๊ฐ์ง
โ โโโ Panel/
โ โ โโโ SpacePanel.swift โ ํฌ๋ช
NSPanel (์คํฌ๋ฆฐ ์บก์ฒ ์ ์ธ)
โ โ โโโ SpacePanelController.swift โ ๋ฉํฐ ํจ๋ ์์ฑ/์
๋ฐ์ดํธ/์ ๊ฑฐ
โ โ โโโ BalloonMenuPanel.swift โ ์ฐํด๋ฆญ ๋งํ์ ๋ฉ๋ด
โ โ โโโ DesktopListMenuContent.swift โ ๋ฐ์คํฌํ ๋ฆฌ์คํธ ํ์
UI
โ โ โโโ AutoHideManager.swift โ ๋ฐ ์๋ ์จ๊น ์ํ ๊ด๋ฆฌ
โ โโโ Views/
โ โ โโโ SpaceBarView.swift โ SwiftUI ๋ฐ UI
โ โ โโโ PreferencesView.swift โ ์ค์ UI (Shortcuts, Layouts, Hidden Apps ํญ)
โ โ โโโ ShortcutRecorderView.swift โ ๋จ์ถํค ๋
นํ ๋ทฐ
โ โ โโโ LayoutTemplatesView.swift โ ๋ ์ด์์ ํ
ํ๋ฆฟ ํธ์ง ๋ทฐ
โ โ โโโ WindowActionIcon.swift โ ์๋์ฐ ๋ฐฐ์น ์๊ฐํ ์์ด์ฝ
โ โโโ Models/
โ โ โโโ ActiveSpace.swift
โ โ โโโ DockItem.swift
โ โ โโโ DockSnapshot.swift
โ โโโ WindowManagement/
โ โ โโโ WindowShortcutController.swift โ ์๋์ฐ ์ค๋
๋จ์ถํค ๊ด๋ฆฌ
โ โ โโโ WindowSnapManager.swift โ AX API ๊ธฐ๋ฐ ์๋์ฐ ์กฐ์
โ โ โโโ WindowElement.swift โ AX ์๋์ฐ ๋ํผ
โ โ โโโ WindowCalculation.swift โ ์ขํ ๊ณ์ฐ (AX โ Cocoa)
โ โ โโโ WindowAction.swift โ ์๋์ฐ ๋ฐฐ์น ์ก์
์ ์
โ โ โโโ ScreenGeometry.swift โ ํ๋ฉด ์ง์ค๋ฉํธ๋ฆฌ ์ ํธ
โ โ โโโ LayoutApplier.swift โ ๋ ์ด์์ ํ
ํ๋ฆฟ ์ ์ฉ
โ โ โโโ LayoutTemplate.swift โ ๋ ์ด์์ ํ
ํ๋ฆฟ ๋ชจ๋ธ
โ โ โโโ LayoutTemplateStore.swift โ ํ
ํ๋ฆฟ ์ ์ฅ์
โ โ โโโ SpaceLayoutBridge.swift โ Space ์ ํ โ ๋ ์ด์์ ์๋ ์ ์ฉ
โ โ โโโ HotKeyManager.swift โ ์ ์ญ ๋จ์ถํค ๋ฑ๋ก (Carbon)
โ โโโ Resources/
โ โโโ icon.png โ ๋ฉ๋ด๋ฐ ์์ด์ฝ
โโโ RunSpaceWidget.app โ ํฐ๋ฏธ๋ ์์ด ์คํ๋๋ Finder ๋ฐ์ฒ
โโโ RunSpaceWidget.command โ ํฐ๋ฏธ๋ ๊ธฐ๋ฐ ๋ฐ์ฒ
โโโ Makefile
โโโ README.md
ConfigManager
โโ ignored apps, space labels
โโ shortcuts, templates
โโ settings (icons per page)
SpaceMonitor (per-display)
โโ displaySpaces: [DisplayID: ActiveSpace]
WindowListProvider
โโ fetchItems (screen-filtered + space-aware)
SpaceEngine
โโ publishes snapshots: [DisplayID: DockSnapshot]
โโ reacts to space changes (all displays)
โโ reacts to app activate / launch / terminate / hide
Subscribers
โโ StateWriter โ state.json (main display only)
โโ SpacePanelController โ N SpacePanels (1 per display)
โโ SpaceLayoutBridge โ auto-apply templates on space change
| Component | ์ญํ |
|---|---|
ConfigManager |
์ค์ ๋๋ ํฐ๋ฆฌ ๊ด๋ฆฌ, ๊ธฐ๋ณธ ํ์ผ ์์ฑ, ๋ชจ๋ ์ค์ ๋ก๋/์ ์ฅ |
SpaceMonitor |
์ ์ฒด ๋์คํ๋ ์ด์ ํ์ฑ Space ๊ฐ์ง, per-display ordinal ๊ณ์ฐ |
WindowListProvider |
ํ๋ฉด์ ์ฑ ๋ชฉ๋ก ์์ง, ํ๋ฉด๋ณ ํํฐ๋ง, bundle ๋จ์ dedupe |
SpaceEngine |
๋์คํ๋ ์ด๋ณ DockSnapshot ์์ , refresh scheduling, stale drop |
StateWriter |
state.json debounce ๊ธฐ๋ก (์ฃผ ๋์คํ๋ ์ด) |
SpacePanelController |
๋์คํ๋ ์ด๋ณ ํจ๋ ์์ฑ/์ ๊ฑฐ/๋ฆฌ์ฌ์ด์ฆ, snapshot ๊ธฐ๋ฐ UI ๊ฐฑ์ |
SpaceSwitcher |
CGEvent dock-swipe ํฉ์ฑ์ผ๋ก Space ์ ํ, Ctrl+N ํด๋ฐฑ |
SpaceBarView |
Space ๋ผ๋ฒจ/์ฑ ์์ด์ฝ ๋ ๋๋ง, ์ค์์ดํ, ์ฑ ํ์ฑํ |
MenuBarController |
๋ฉ๋ด๋ฐ ์์ด์ฝ + ์ ์ฒด ์ค์ ๋ฉ๋ด |
WindowShortcutController |
์๋์ฐ ์ค๋ ์ ์ญ ๋จ์ถํค ๊ด๋ฆฌ |
LayoutApplier |
๋ ์ด์์ ํ ํ๋ฆฟ ์ ์ฉ (์ฑ ๋ฐ์น + ์๋์ฐ ๋ฐฐ์น) |
SpaceLayoutBridge |
Space ์ ํ ์ ๋ ์ด์์ ์๋ ์ ์ฉ |
AutoHideManager |
๋ฐ ์๋ ์จ๊น ์ํ ๊ด๋ฆฌ |
DockController |
macOS Dock ๋์ ์ ์ด (CoreDock) |
OverlapDetection |
Dock-์์ ฏ ๊ฒน์นจ ๊ฐ์ง ๋ฐ ์์ด์ฝ ์ ์ถ์ ๊ณ์ฐ |
WindowMoveObserver |
์๋์ฐ ์ด๋/๋ฆฌ์ฌ์ด์ฆ ๊ฐ์ง |
# ๋๋ฒ๊ทธ ๋น๋
swift build
# ๋ฐ๋ก ์คํ
./.build/debug/SpaceWidget
# ํฐ๋ฏธ๋ ๋ฐ์ฒ ์ฌ์ฉ
./RunSpaceWidget.command
# Finder์์ ๋๋ธํด๋ฆญ ์คํ
open RunSpaceWidget.appRunSpaceWidget.app์ ํฐ๋ฏธ๋ ์ฐฝ ์์ด ์คํ๋๋ Finder์ฉ ๋ฐ์ฒ์
๋๋ค.
# ๋ฆด๋ฆฌ์ฆ ๋น๋
make build
# /usr/local/bin/SpaceWidget ์ค์น
make install
# ์ค์น ํ ์คํ
/usr/local/bin/SpaceWidget
# ์ค์น ํ Finder ๋ฐ์ฒ ์ฌ์ฉ
open RunSpaceWidget.app๊ธฐ๋ณธ ์ค์ ๋๋ ํฐ๋ฆฌ: ~/.config/space-dock/
| ํ์ผ | ์ค๋ช |
|---|---|
space_labels.json |
Space ๋ผ๋ฒจ ({"1": "Work", "2": "Browse", "displayID:1": "Extended"}) |
ignored_apps.json |
๋ฐ์์ ์ ์ธํ ์ฑ ๋ชฉ๋ก |
app_actions.json |
์ฑ๋ณ ์ปค์คํ ์ก์ (new window, quit ํธ๋ค๋ฌ) |
settings.json |
์ผ๋ฐ ์ค์ (icons_per_page) |
shortcuts.json |
์๋์ฐ ์ค๋ ๋จ์ถํค ๋ฐ์ธ๋ฉ |
templates.json |
๋ ์ด์์ ํ ํ๋ฆฟ ์ ์ |
space_assignments.json |
Space โ ํ ํ๋ฆฟ ๋งคํ, auto-apply ์ค์ |
| ํ์ผ | ์ค๋ช |
|---|---|
state.json |
ํ์ฌ Space ์ํ (์ธ๋ถ ์คํฌ๋ฆฝํธ ์ฐ๋์ฉ) |
spacewidget.log |
์ฑ ๋ก๊ทธ (๋งค ์คํ ์ ์ด๊ธฐํ) |
SpaceWidget --version # ๋ฒ์ ์ถ๋ ฅ (0.1.0)
SpaceWidget --help # ๋์๋ง
SpaceWidget --migrate # sketchybar ์ค์ ๋ง์ด๊ทธ๋ ์ด์
SpaceWidget --migrate --force # ๊ธฐ์กด ํ์ผ ๋ฎ์ด์ฐ๊ธฐ
SpaceWidget --config-dir PATH # ์ค์ ๋๋ ํฐ๋ฆฌ ์ง์ - Space ๋ผ๋ฒจ ๊ธฐ๋ณธ๊ฐ:
"1" โ "Work","2" โ "Browse" - ํ์ด์ง๋น ์์ด์ฝ ์: 5 (๋ฒ์: 5~10)
- ์ต๋ ๋ ๋๋ง ์ฑ ์: 20
- Fallback ๋ผ๋ฒจ:
"Untitled"
SpaceWidget์ macOS์ ๊ณต๊ฐ๋์ง ์์ API๋ฅผ ์ฌ์ฉํฉ๋๋ค:
CGS (Core Graphics Server):
CGSMainConnectionID()โ CGS ์ฐ๊ฒฐ ํ๋CGSCopyManagedDisplaySpaces()โ ๋์คํ๋ ์ด๋ณ Space ์ด๊ฑฐCGSManagedDisplayGetCurrentSpace()โ ๋์คํ๋ ์ด๋ณ ํ์ฌ Space ์กฐํCGSSpaceGetType()โ Space ํ์ ํ๋ณ (desktop/fullscreen/system/tiled)CGSCopySpacesForWindows()โ ์๋์ฐ๊ฐ ์ํ Space ์กฐํCGSCopyActiveMenuBarDisplayIdentifier()โ ํ์ฑ ๋ฉ๋ด๋ฐ ๋์คํ๋ ์ด ์๋ณ
CGEvent Gesture Synthesis:
- dock-swipe ํฉ์ฑ ์ด๋ฒคํธ๋ก Space ์ ํ (CGEventField 55, 110, 119, 123, 124, 129, 130, 132, 135, 139)
CoreDock:
CoreDockGetAutoHideEnabled/CoreDockSetAutoHideEnabledโ Dock ์๋ ์จ๊น ์ ์ด
Accessibility (AX):
- ์๋์ฐ ์ด๊ฑฐ, ์์น/ํฌ๊ธฐ ์กฐ์, ๋ฉ๋ด ํ์, ์ํ ์กฐํ
- macOS 14.0 (Sonoma) ์ด์
- Swift 5.9+
- Accessibility ๊ถํ ํ์ (์๋์ฐ ์กฐ์, ๋ฉ๋ด ํ์, ๋จ์ถํค ๊ฐ์ง)
- ์ธ๋ถ ์์กด์ฑ ์์ (Foundation, AppKit, Combine, ApplicationServices๋ง ์ฌ์ฉ)
swift build # ๋๋ฒ๊ทธ ๋น๋
make build # ๋ฆด๋ฆฌ์ฆ ๋น๋
make install # ์ค์น
make uninstall # ์ ๊ฑฐ
make migrate # ์ค์ ๋ง์ด๊ทธ๋ ์ด์
make clean # ํด๋ฆฐ๋ค์ ์คํ์์ค ํ๋ก์ ํธ์ ๊ตฌํ์ ์ฐธ๊ณ ํ์ต๋๋ค:
| ํ๋ก์ ํธ | ์ฐธ๊ณ ๋ด์ฉ |
|---|---|
| WhichSpace | CGEvent dock-swipe ํฉ์ฑ์ ํตํ Space ์ ํ ๊ธฐ๋ฒ. ๋น๊ณต๊ฐ CGEventField ์ธ๋ฑ์ค์ gesture phase ์ํ์ค ์ฐธ์กฐ |
| yabai | CGS private API ์ฌ์ฉ ํจํด (CGSCopyManagedDisplaySpaces, CGSSpaceGetType ๋ฑ) |
| Rectangle | AX API ๊ธฐ๋ฐ ์๋์ฐ ์ค๋ ๋ฐ ํ๋ฉด ์์ญ ๊ณ์ฐ ๋ก์ง ์ฐธ์กฐ |
- macOS ์ ์ฉ ํ๋ก์ ํธ์ ๋๋ค.
- SwiftPM ๊ธฐ๋ฐ์ผ๋ก ๋น๋ํฉ๋๋ค.
- CGS private API๋ฅผ ์ฌ์ฉํ๋ฏ๋ก macOS ๋ด๋ถ ๋์ ๋ณํ์ ์ํฅ์ ๋ฐ์ ์ ์์ต๋๋ค.
- ์ฑ์
.accessoryํ์ฑํ ์ ์ฑ ์ผ๋ก ์คํ๋์ด Dock ์์ด์ฝ ๋ฐ Cmd+Tab์ ํ์๋์ง ์์ต๋๋ค.

