TurtleGit for Mac

View Markdown source ↗

Log keyboard, focus and message commands

Implementation batch against pinned TortoiseGit 7338078f8ddd924b8cddee35f512f2286072136d. This is a partial Log-family source audit; it does not certify every Log control or the full port.

Source mapping

Source Native behavior
src/Resources/TortoiseProcENG.rc, IDR_ACC_LOGDLG F3 / Ctrl-F Find; F5 / Ctrl-F5 / Shift-F5 Refresh; Ctrl-L / Alt-D focus revision filter; Ctrl-E select revision-filter text; Ctrl-C / Ctrl-Insert Copy; Escape clear filter or close. Cmd-F / Cmd-R / Cmd-L / Cmd-C provide macOS aliases.
src/TortoiseProc/LogDlg.cpp, OnFocusFilter, OnSelectSearchField Both focus the revision search field, retaining focus-only versus select-all semantics. The changed-path filter remains separate.
OnBnClickedRefresh, Refresh(true), OnRefresh Explicit Refresh clears revision search and its validation error. Background reload() retains revision search. Refresh retains the path filter and other history options.
OnExitClearFilter Escape outside editable text clears revision search and focuses its field; Escape with no active search closes. Search-field Escape keeps its native field delegate, clearing that field without closing the window.
OnOK, GitLogListBase.cpp Return behavior Return owned by the revision list is consumed even when its optional comparison is disabled; it cannot activate the default Close button.
OnContextMenu, message pane Copy selection, Copy all and Edit Notes use source icons and groups. Copy all preserves selection and scroll position. Notes uses the existing note read/editor/save/refresh flow, refusing a second open while a draft is owned. Existing link actions and native Select All remain available.
OnEditCopy, CopyChangedSelectionToClipBoard Window-owned Copy dispatches revision details, selected changed paths, or selected message text according to the focused native pane. The injected model pasteboard owns all message copies.

The source Control/Option shortcuts apply outside editable responders. Native editable text keeps Control-F/E/L, Option-D, marked input and its own Copy/Escape behavior; Cmd-L is the explicit revision-filter focus alias while editing. No global key event monitor is installed. Commands require the event's own key Log window and respect active operations, child dialogs and application Quit confirmation.

A message popup captures its document/style request, revision selection, model load generation and popup generation. A single shared receipt permits only one action from that popup. Replaced, stale, busy, child-owned, quitting and retired callbacks cannot copy, navigate or replace a Notes draft. Copying directly to the model pasteboard avoids reading or writing an unrelated clipboard in private tests.

Grouped validation

New fixture: docs/qa/log-source-commands-native-2026-10-18.swift; runner: scripts/test-log-source-commands.py. The fixture uses a private repository, preference suite and pasteboard, closes its windows and waits for owned Log history/note/message operations. It covers source key routes and native aliases, editable ownership, explicit versus background refresh, Escape, Return shielding, revision/message copy, source message menu icons, one-shot/stale/blocked receipts, the actual Notes read flow and draft protection, and unchanged HEAD/index entries/worktree bytes.

The parent Debug build compiles ApplicationDelegate.swift's captured Log confirmingQuit true/reset-false loops and asynchronous shutdown drain path. Both engines pass the new receiver and retained scripts/test-log-message-family.py navigation/message cases: six case/engine passes. The initial fixture query was nondeterministic with default hash search; private Subject-only search and native selection/coordinator settlement preserve all result assertions. Batch evidence records the compile access-boundary repair, failed attempt and affected rechecks. This native-only family reuses existing note, clipboard-details and history operations; it adds no new Git/Core operation.

Remaining scope

This batch does not claim compositor/physical-key parity, VoiceOver acceptance, physical Finder behavior, signed distribution, hosted CI, or complete Log-dialog visual parity. Source accelerators that conflict with macOS editable-text commands intentionally retain native text editing while the field owns focus. Existing Notes mutation validation remains in its original workflow family; this fixture checks the new message-menu entry and protected draft lifetime. Revision-list Blame items are deliberately absent: the source ordinary Log masks those items out; their Blame-hosted consumers require their own audit.