From 197df3298f9837d6e2735edb384b79f09291b258 Mon Sep 17 00:00:00 2001 From: BigMarc Date: Tue, 16 Jun 2026 14:59:15 +0200 Subject: [PATCH] Customizable shortcuts, app icon, restore-clipboard preference - Shortcuts screen now records custom global hotkeys (Fix + Ask), persisted and re-registered live via Preferences + Combine. - Add branded AppIcon.icns (gold nib on ink), wired into Info.plist + build.sh. - "Restore my clipboard after a fix" preference now drives the clipboard fallback. Co-Authored-By: Claude Opus 4.8 (1M context) --- AppSupport/AppIcon.icns | Bin 0 -> 107547 bytes AppSupport/Info.plist | 4 + Sources/GrammaGem/App/AppState.swift | 25 +++++- .../App/MainWindow/SystemViews.swift | 78 +++++++++++++----- .../GrammaGem/Preferences/Preferences.swift | 14 ++++ Sources/GrammaGem/System/HotkeyCombo.swift | 61 ++++++++++++++ Sources/GrammaGem/System/TextCapture.swift | 8 +- scripts/build.sh | 2 +- scripts/make-icon.swift | 67 +++++++++++++++ 9 files changed, 236 insertions(+), 23 deletions(-) create mode 100644 AppSupport/AppIcon.icns create mode 100644 Sources/GrammaGem/System/HotkeyCombo.swift create mode 100644 scripts/make-icon.swift diff --git a/AppSupport/AppIcon.icns b/AppSupport/AppIcon.icns new file mode 100644 index 0000000000000000000000000000000000000000..f05354e070826bc3566c45fcc165805e8bbcf7f6 GIT binary patch literal 107547 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 z z=O{D3Zbc?~7SKb#stE;T2>WY}Hx?ESgK(gs@ZB6`G~QWGFg*T5j`tx*0wSFv2;c)L zI2pzv|J=o3wvg7TAp{tw2}D$F*q1t43!_L)qfzHByTgH;R)L zYuQIpKq~^=e#;e(NeYIar03M%G=7%;S`LQR#ux}Lq=W|1P1&MG=KDk&70+e28Ay7^ z-oHgakM9K0(9xJcfuEkRV=a-J(XaBAeo8a|J(}Yn=^rb8g`y!2q9MoSgaDFh?Tx-> zgsm`=i@7HHH5q^dki2+^6^fgo7SdER)q%56`F4jz>=PUS!E;_^wQ*I69cnWqiZm2M zfm@23=4b_q`Cneaq;=c;7NqFcPyqo>V{RxpO>Nm4%X_RYAc8q!3PHALoe#kxAEz-s zeOb=5O^6!DGV%EpEifj4Z5qu>ZC69VYDpm0A(ADB>J>S$%8u7a!+j&T;KahqVj57^ zQwIto*QCDcuy;JSLYxpwP#{H2h%<-|b}`@vEY-gRvQQ6i@jhG$Ty93hpSSqQe2)jf z$PE9=XP4hn6VW4`1Ua5gPGK_op%$9e4e{0>x?bPjqtEwWh+f!B1n&xF_4O?@?Ks6D zpg8_dCY7EMwqV1ZuMM*)cpCXgJ`qnbL!`kS+dj|vj9P?t6mxf$Rd^vmG|N#U8Ru@d;qz5o7$>jq zi3Y(?b{7VEZaoOO+s6WWF8%!D7|3@w9uBKn#25_CRMXN|2V42x&N{7$|FOy7A;zSo z&YN2)`Sat8FTM%i;Ja4%G59oI+a19~wo&C63I-5%N%jT{_j-G=gm1bYQlxu0wJ&vbYKRf6a)IpXI>HWKfarX08=&qG>cEXhNC^;|^XJXlAQ>j}K$4Niz2 zHm|KQXSDqO27l#e!_qsQ^d;|IQy$cj(yGGbD9LPE!Fda+OMqLO*DNP-mFJ!H?dFF)Q$xsu|0eYd^f<|{(Sk>%amGR5REw7pE%nd5+%V020R$yab1 z;{rn~rM~isU_2s^xw5+ugNB8GnWp(M+CH3CypB&FzjeB%tvq`>6bV9#u)fP++iWqf zgi16Aymq>%FrPCFqIpf)r3PMdZD0g$lC7#NXl=*qh5~;0g%4J!utUq|FjwyJ#{#{M z_R*xtdIUiGm_bT3{$%9QLXHe1E!jbE8?0S5;1a3Dmc&g9c5C!{wC4V|HY3~px-)UD50c~3=qxHsbx9M4^#;$S9b%_lSu5YA#KvX1*Fl%Cwr&80gqxQ z?~PJ|uYDX$%EvIT7y6Yj2(oJJdw-JWf3e>rJXl-ns?I3Im1H|qtlGE8^oN|(P|g18 zV7c~pz0GGPjVHER5jWfT%;PY@=&oG|B6WV6Vw5^gcE%}{@XkkiEf~~#8epu14p=wm z5Ek@ZOBp7-w>Ip}1Wtp-y%R1~$?0LZ@9yce`AO{YoeH_7sV91u?x*EB2(d`(-#=i1 zzfG^*dpEfFV#$tesWHUy1P7JN(*V1TT$hz)G@ZDzG`j8+W@*K2jt?}a_F+z$k0F~; znI$@gtoDrIHP--@Mwi3-zAjB

9N6K6Sp4Cb94w4-^UaLglgJmsx*x4lb@_)MEkk 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 q?K3TO)>oiuJe~?RuGq6j{E@cI}o~AIP)#_ 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 literal 0 HcmV?d00001 diff --git a/AppSupport/Info.plist b/AppSupport/Info.plist index dd71d27..8b4ef3c 100644 --- a/AppSupport/Info.plist +++ b/AppSupport/Info.plist @@ -25,6 +25,10 @@ com.grammagem.app CFBundleExecutable GrammaGem + CFBundleIconFile + AppIcon + CFBundleIconName + AppIcon CFBundlePackageType APPL CFBundleShortVersionString diff --git a/Sources/GrammaGem/App/AppState.swift b/Sources/GrammaGem/App/AppState.swift index fbd5219..0c131c5 100644 --- a/Sources/GrammaGem/App/AppState.swift +++ b/Sources/GrammaGem/App/AppState.swift @@ -1,6 +1,7 @@ import Foundation import AppKit import SwiftUI +import Combine /// Root application model. Owns the engines, managers, and the system-wide /// coordinator, wires the global hotkeys, and presents the on-demand windows. @@ -35,6 +36,7 @@ final class AppState: ObservableObject { private var onboardingWindow: NSWindow? private var askWindow: NSWindow? private var mainWindow: NSWindow? + private var cancellables = Set() private init() { let harper = HarperEngine() @@ -64,7 +66,19 @@ final class AppState: ObservableObject { hotkeys.onAction = { [weak self] action in Task { await self?.handle(action) } } - hotkeys.registerDefaults() + reregisterHotkeys() + + // Live-apply preference changes. + capture.restoreClipboard = preferences.restoreClipboard + preferences.$restoreClipboard + .sink { [weak self] value in self?.capture.restoreClipboard = value } + .store(in: &cancellables) + preferences.$fixHotkey.dropFirst() + .sink { [weak self] _ in self?.reregisterHotkeys() } + .store(in: &cancellables) + preferences.$askHotkey.dropFirst() + .sink { [weak self] _ in self?.reregisterHotkeys() } + .store(in: &cancellables) permissions.refresh() appAwareEnabled = gate.appAwareEnabled @@ -80,6 +94,15 @@ final class AppState: ObservableObject { // MARK: - Hotkey handling + /// (Re)register the global hotkeys from the current preferences. + func reregisterHotkeys() { + hotkeys.unregisterAll() + hotkeys.register(id: 1, keyCode: preferences.fixHotkey.keyCode, + modifiers: preferences.fixHotkey.carbonModifiers, action: .fix) + hotkeys.register(id: 2, keyCode: preferences.askHotkey.keyCode, + modifiers: preferences.askHotkey.carbonModifiers, action: .ask) + } + func handle(_ action: HotkeyManager.Action) async { switch action { case .fix: diff --git a/Sources/GrammaGem/App/MainWindow/SystemViews.swift b/Sources/GrammaGem/App/MainWindow/SystemViews.swift index a3f9707..9ee64af 100644 --- a/Sources/GrammaGem/App/MainWindow/SystemViews.swift +++ b/Sources/GrammaGem/App/MainWindow/SystemViews.swift @@ -3,45 +3,85 @@ import SwiftUI // MARK: - Shortcuts struct ShortcutsView: View { + @EnvironmentObject private var prefs: Preferences + var body: some View { DetailScaffold( title: "Shortcuts", - subtitle: "Global hotkeys that work in every app." + subtitle: "Global hotkeys that work in every app. Click a shortcut to change it." ) { Card { - shortcutRow(name: "Fix selection", keys: ["⌘", ";"], detail: "Grammar + clarity, in place") + shortcutRow( + name: "Fix selection", + detail: "Grammar + clarity, in place", + combo: $prefs.fixHotkey) Divider() - shortcutRow(name: "Ask GrammaGem", keys: ["⌘", "'"], detail: "Rewrite with an instruction") - } - Card { - Label("Custom shortcuts", systemImage: "wand.and.stars") - .font(.headline) - Text("A built-in recorder for fully customizable shortcuts is on the roadmap. For now the defaults above are active system-wide.") - .font(.callout).foregroundStyle(.secondary) + shortcutRow( + name: "Ask GrammaGem", + detail: "Rewrite with an instruction", + combo: $prefs.askHotkey) } + Text("Tip: include at least one modifier (⌘, ⌥, ⌃, ⇧). Press Esc while recording to cancel.") + .font(.caption).foregroundStyle(.secondary) } } - private func shortcutRow(name: String, keys: [String], detail: String) -> some View { + private func shortcutRow(name: String, detail: String, combo: Binding) -> some View { HStack { VStack(alignment: .leading, spacing: 2) { Text(name).fontWeight(.medium) Text(detail).font(.caption).foregroundStyle(.secondary) } Spacer() - HStack(spacing: 4) { - ForEach(keys, id: \.self) { k in - Text(k) - .font(.system(.body, design: .monospaced)) - .padding(.horizontal, 8).padding(.vertical, 4) - .background(Color(nsColor: .controlColor), in: RoundedRectangle(cornerRadius: 6)) - .overlay(RoundedRectangle(cornerRadius: 6).stroke(Color.primary.opacity(0.12))) - } - } + ShortcutRecorder(combo: combo) } } } +/// A small click-to-record control that captures the next modifier+key combo. +struct ShortcutRecorder: View { + @Binding var combo: HotkeyCombo + @State private var recording = false + @State private var monitor: Any? + + var body: some View { + Button { + recording ? stop() : start() + } label: { + Text(recording ? "Press keys…" : combo.display) + .font(.system(.body, design: .monospaced)) + .frame(minWidth: 76) + .padding(.horizontal, 10).padding(.vertical, 5) + .background( + RoundedRectangle(cornerRadius: 7) + .fill(recording ? GG.emerald.opacity(0.15) : Color(nsColor: .controlColor))) + .overlay( + RoundedRectangle(cornerRadius: 7) + .stroke(recording ? GG.emerald : Color.primary.opacity(0.12))) + } + .buttonStyle(.plain) + .onDisappear(perform: stop) + } + + private func start() { + recording = true + monitor = NSEvent.addLocalMonitorForEvents(matching: .keyDown) { event in + if event.keyCode == 53 { stop(); return nil } // Esc cancels + if let captured = HotkeyCombo.from(event: event) { + combo = captured + stop() + return nil + } + return event // ignore bare keys (no modifier) + } + } + + private func stop() { + recording = false + if let monitor { NSEvent.removeMonitor(monitor); self.monitor = nil } + } +} + // MARK: - AI Model struct ModelView: View { diff --git a/Sources/GrammaGem/Preferences/Preferences.swift b/Sources/GrammaGem/Preferences/Preferences.swift index 9bb7700..e685d1b 100644 --- a/Sources/GrammaGem/Preferences/Preferences.swift +++ b/Sources/GrammaGem/Preferences/Preferences.swift @@ -27,6 +27,9 @@ final class Preferences: ObservableObject { @Published var appearance: Appearance { didSet { d.set(appearance.rawValue, forKey: "pref.appearance"); applyAppearance() } } @Published var menuBarStyle: MenuBarStyle { didSet { d.set(menuBarStyle.rawValue, forKey: "pref.menuBarStyle") } } + @Published var fixHotkey: HotkeyCombo { didSet { persist(fixHotkey, "pref.fixHotkey") } } + @Published var askHotkey: HotkeyCombo { didSet { persist(askHotkey, "pref.askHotkey") } } + init() { launchAtLogin = SMAppService.mainApp.status == .enabled playSounds = d.object(forKey: "pref.playSounds") as? Bool ?? true @@ -34,6 +37,17 @@ final class Preferences: ObservableObject { restoreClipboard = d.object(forKey: "pref.restoreClipboard") as? Bool ?? true appearance = Appearance(rawValue: d.string(forKey: "pref.appearance") ?? "") ?? .system menuBarStyle = MenuBarStyle(rawValue: d.string(forKey: "pref.menuBarStyle") ?? "") ?? .icon + fixHotkey = Preferences.load("pref.fixHotkey") ?? .defaultFix + askHotkey = Preferences.load("pref.askHotkey") ?? .defaultAsk + } + + private func persist(_ combo: HotkeyCombo, _ key: String) { + if let raw = try? JSONEncoder().encode(combo) { d.set(raw, forKey: key) } + } + + private static func load(_ key: String) -> HotkeyCombo? { + guard let raw = UserDefaults.standard.data(forKey: key) else { return nil } + return try? JSONDecoder().decode(HotkeyCombo.self, from: raw) } private func applyLaunchAtLogin() { diff --git a/Sources/GrammaGem/System/HotkeyCombo.swift b/Sources/GrammaGem/System/HotkeyCombo.swift new file mode 100644 index 0000000..f0561c9 --- /dev/null +++ b/Sources/GrammaGem/System/HotkeyCombo.swift @@ -0,0 +1,61 @@ +import Foundation +import AppKit +import Carbon.HIToolbox + +/// A user-configurable keyboard shortcut: a key code plus Carbon modifier mask, +/// with a human-readable display string (e.g. "⌘;"). +struct HotkeyCombo: Codable, Equatable { + var keyCode: UInt32 + var carbonModifiers: UInt32 + var display: String + + static let defaultFix = HotkeyCombo( + keyCode: AppConfig.Hotkey.defaultKeyCode, + carbonModifiers: AppConfig.Hotkey.defaultModifiers, + display: "⌘;") + + static let defaultAsk = HotkeyCombo( + keyCode: AppConfig.Hotkey.askKeyCode, + carbonModifiers: AppConfig.Hotkey.askModifiers, + display: "⌘'") + + /// Build a combo from a recorded key-down event. Requires at least one + /// modifier so the shortcut is safe to register globally. + static func from(event: NSEvent) -> HotkeyCombo? { + let flags = event.modifierFlags.intersection(.deviceIndependentFlagsMask) + var carbon: UInt32 = 0 + if flags.contains(.command) { carbon |= UInt32(cmdKey) } + if flags.contains(.shift) { carbon |= UInt32(shiftKey) } + if flags.contains(.option) { carbon |= UInt32(optionKey) } + if flags.contains(.control) { carbon |= UInt32(controlKey) } + guard carbon != 0 else { return nil } + + let symbol = keySymbol(for: event) + var display = "" + if flags.contains(.control) { display += "⌃" } + if flags.contains(.option) { display += "⌥" } + if flags.contains(.shift) { display += "⇧" } + if flags.contains(.command) { display += "⌘" } + display += symbol + return HotkeyCombo(keyCode: UInt32(event.keyCode), carbonModifiers: carbon, display: display) + } + + private static func keySymbol(for event: NSEvent) -> String { + switch Int(event.keyCode) { + case kVK_Space: return "Space" + case kVK_Return: return "↩" + case kVK_Tab: return "⇥" + case kVK_Delete: return "⌫" + case kVK_Escape: return "⎋" + case kVK_LeftArrow: return "←" + case kVK_RightArrow: return "→" + case kVK_UpArrow: return "↑" + case kVK_DownArrow: return "↓" + default: + if let chars = event.charactersIgnoringModifiers, !chars.isEmpty { + return chars.uppercased() + } + return "key" + } + } +} diff --git a/Sources/GrammaGem/System/TextCapture.swift b/Sources/GrammaGem/System/TextCapture.swift index 71821f4..eeb0cec 100644 --- a/Sources/GrammaGem/System/TextCapture.swift +++ b/Sources/GrammaGem/System/TextCapture.swift @@ -34,6 +34,10 @@ final class TextCapture { private let pasteboard = NSPasteboard.general + /// When true (default), the clipboard-fallback path restores the user's + /// previous clipboard after pasting the correction. Driven by Preferences. + var restoreClipboard = true + // MARK: - Capture /// Try AX first; on empty/unavailable, fall back to the clipboard path. @@ -104,8 +108,8 @@ final class TextCapture { writeClipboard(newText) sendCommandKey(CGKeyCode(kVK_ANSI_V)) Thread.sleep(forTimeInterval: 0.10) - // Restore the user's previous clipboard contents. - if let saved = savedClipboard { + // Restore the user's previous clipboard contents (if they want that). + if restoreClipboard, let saved = savedClipboard { Thread.sleep(forTimeInterval: 0.05) writeClipboard(saved) } diff --git a/scripts/build.sh b/scripts/build.sh index 6367ce7..2672e5f 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -20,7 +20,7 @@ mkdir -p "${DIST}/${APP}/Contents/MacOS" "${DIST}/${APP}/Contents/Resources" cp "${BUILD_DIR}/GrammaGem" "${DIST}/${APP}/Contents/MacOS/GrammaGem" cp "AppSupport/Info.plist" "${DIST}/${APP}/Contents/Info.plist" -# cp "AppSupport/AppIcon.icns" "${DIST}/${APP}/Contents/Resources/" # TODO: add an icon +cp "AppSupport/AppIcon.icns" "${DIST}/${APP}/Contents/Resources/AppIcon.icns" echo "==> Built ${DIST}/${APP}" echo " Run with: open \"${DIST}/${APP}\" (grant Accessibility on first launch)" diff --git a/scripts/make-icon.swift b/scripts/make-icon.swift new file mode 100644 index 0000000..81c0e3c --- /dev/null +++ b/scripts/make-icon.swift @@ -0,0 +1,67 @@ +#!/usr/bin/env swift +// Generates AppIcon.iconset (PNGs) for GrammaGem — a gold pen-nib on the ink +// brand square. Run from mac/: swift scripts/make-icon.swift +// Then: iconutil -c icns AppIcon.iconset -o AppSupport/AppIcon.icns +import AppKit +import Foundation + +let ink = NSColor(red: 0x10 / 255.0, green: 0x23 / 255.0, blue: 0x1B / 255.0, alpha: 1) +let gold = NSColor(red: 0xC9 / 255.0, green: 0xA2 / 255.0, blue: 0x4B / 255.0, alpha: 1) + +func png(size: Int) -> Data { + let S = CGFloat(size) + let rep = NSBitmapImageRep( + bitmapDataPlanes: nil, pixelsWide: size, pixelsHigh: size, + bitsPerSample: 8, samplesPerPixel: 4, hasAlpha: true, isPlanar: false, + colorSpaceName: .deviceRGB, bytesPerRow: 0, bitsPerPixel: 0)! + let ctx = NSGraphicsContext(bitmapImageRep: rep)! + NSGraphicsContext.saveGraphicsState() + NSGraphicsContext.current = ctx + let g = ctx.cgContext + + // Brand square (rounded). + let rrect = CGPath(roundedRect: CGRect(x: 0, y: 0, width: S, height: S), + cornerWidth: S * 0.22, cornerHeight: S * 0.22, transform: nil) + g.addPath(rrect); g.setFillColor(ink.cgColor); g.fillPath() + + // Gold nib (downward triangle), coordinates are y-up. + let tri = CGMutablePath() + tri.move(to: CGPoint(x: 0.18 * S, y: 0.78 * S)) + tri.addLine(to: CGPoint(x: 0.82 * S, y: 0.78 * S)) + tri.addLine(to: CGPoint(x: 0.50 * S, y: 0.10 * S)) + tri.closeSubpath() + g.addPath(tri); g.setFillColor(gold.cgColor); g.fillPath() + + // Center slit. + g.setStrokeColor(ink.cgColor) + g.setLineWidth(max(1, S * 0.05)); g.setLineCap(.round) + g.move(to: CGPoint(x: 0.50 * S, y: 0.20 * S)) + g.addLine(to: CGPoint(x: 0.50 * S, y: 0.60 * S)) + g.strokePath() + + // Vent hole. + g.setFillColor(ink.cgColor) + let r = S * 0.055 + g.addEllipse(in: CGRect(x: 0.50 * S - r, y: 0.64 * S - r, width: 2 * r, height: 2 * r)) + g.fillPath() + + NSGraphicsContext.restoreGraphicsState() + return rep.representation(using: .png, properties: [:])! +} + +let fm = FileManager.default +let dir = "AppIcon.iconset" +try? fm.removeItem(atPath: dir) +try! fm.createDirectory(atPath: dir, withIntermediateDirectories: true) + +let specs: [(String, Int)] = [ + ("icon_16x16", 16), ("icon_16x16@2x", 32), + ("icon_32x32", 32), ("icon_32x32@2x", 64), + ("icon_128x128", 128), ("icon_128x128@2x", 256), + ("icon_256x256", 256), ("icon_256x256@2x", 512), + ("icon_512x512", 512), ("icon_512x512@2x", 1024), +] +for (name, size) in specs { + try! png(size: size).write(to: URL(fileURLWithPath: "\(dir)/\(name).png")) +} +print("wrote \(specs.count) icon images to \(dir)")