Skip to content

feat(desktop): add configurable quit shortcut confirmation - #9076

Merged
juliusmarminge merged 4 commits into
mainfrom
t3code/add-quit-double-click-mode
Sep 1, 2026
Merged

juliusmarminge merged 4 commits into
mainfrom
t3code/add-quit-double-click-mode

fix(desktop): preserve double press across modifier

edbbb40
Select commit
Loading
Failed to load commit list.
MacroscopeApp / Macroscope - UI Consistency succeeded Sep 1, 2026 in 1m 0s

UI Consistency: All clear

All clear

Details

Note

Your check run agent prompt is: .macroscope/check-run-agents/ui-consistency.md
More information about how Check Run Agents work can be found in our Help Center.

Reviewed the in-scope web files at head edbbb40:

  • apps/web/src/components/QuitHoldOverlay.tsx — the hint now derives its mode from the main-process hint event rather than unhydrated client settings, and double-press hints hide on the up event (which the main process now emits only when the 500 ms acceptance window closes or the attempt is cancelled), while hold hints keep the 1200 ms linger matching QUIT_HOLD_DURATION_MS. The previously flagged linger/window mismatch is resolved.
  • apps/web/src/components/settings/SettingsPanels.tsx — the new quit-shortcut control uses the shared Select/SelectTrigger/SelectPopup/SelectItem primitives with the same w-full sm:w-40, align="end" alignItemWithTrigger={false}, hideIndicator, and aria-label conventions as the adjacent enum settings rows; no primitive geometry, focus, or state overrides added.
  • apps/web/src/components/settings/settingsSearch.ts — title and search terms stay in sync with the row's new wording and the restore-summary label.

No CSS ownership, theme variant, scroll/mask, or environment-routing changes are present in scope.


🔍 Agent activity — 6 tool calls

💭 I'm checking the current state of QuitHoldOverlay.tsx, SettingsPanels.tsx, and settingsSearch.ts. The earlier issue with QuitHoldOverlay looks resolved now—the main process keeps the double-press hint alive until the window closes and emits an "up" event, while the renderer hides the hint immediately on that event, so the behavior is consistent. I want to pull the current files to confirm.

1. browse_code — apps/web/src/components/QuitHoldOverlay.tsx

2. browse_code — apps/desktop/src/window/QuitHold.ts

💭 I'm checking the overlay logic: it shows on press with the mode, and hides immediately if it detects a double-click during release, otherwise the main process handles hiding via watchdog timeout or cancellation. The watchdog's default cancel behavior looks fine, and the pressedMode closure variable seems safely scoped without consistency issues. Now I want to compare the select component usage in SettingsPanels.tsx against the shared Select primitive's conventions elsewhere in the file, so I'm pulling up that section to check.

3. browse_code — apps/web/src/components/settings/SettingsPanels.tsx

4. git_tools — SelectTrigger className

💭 The Select usage matches existing conventions. Now I want to check the settingsSearch.ts item where the title changed to "Quit shortcut" - I need to verify whether that title is pulled elsewhere in the UI, like in the SettingsRow, and confirm the search item id and title stay consistent.

5. browse_code — apps/web/src/components/settings/settingsSearch.ts

6. git_tools — confirmQuit

💭 I'm double-checking that the Switch and Select imports are still valid, and confirming the hold-mode hint logic works correctly since the main process now sends the "up" event only at window end, matching the linger comment's intent. Checking a few other small things: pressedMode defaults safely, the overlay naming is a minor nit but not a real issue, and the accessibility role handles mode changes fine. The labels across the Select, search title, and restore list stay consistent, and the QUIT_CONFIRMATION_MODE_LABELS pattern matches the existing ENVIRONMENT_IDENTIFICATION_LABELS convention, so nothing in the web scope needs flagging. Given the schema requires JSON output rather than a plain string, I'll produce a success response with summary "All clear" to satisfy both the instruction and the schema. There's also no unresolved thread left to address since the QuitHoldOverlay comment was already resolved, so the final answer is simply a success state with "All clear".


Agent Credits: 61 credits

Token usage: 8 uncached input · 174,312 cache-read input · 66,385 cache-write input · 2,784 output
Agent Credits may also include non-token charges from external tools such as web research.