Two MC viewer parity gaps closed:
Buttonbar: now shows different labels in Hex mode (F2=Edit,
F4=Ascii, F6=Save, F7=HxSrch, F8=Raw) matching MC's hex display.
NroffMode: F9 now toggles nroff_enabled (MC CK_NroffMode).
Previously F9 opened the menubar; the menubar moves to Shift-F9.
The buttonbar label for F9 shows 'Nroff'.
Text mode buttonbar also shows 'Nroff' for F9 instead of blank.
Tests: 1421 pass, zero warnings.
MC has full mouse support in the viewer (MSG_MOUSE_SCROLL_UP/DOWN,
MSG_MOUSE_DOWN click zones). Add equivalent support to TLC:
- Viewer::handle_mouse(): scroll wheel up/down moves 2 lines;
click top 5 rows → scroll up half page; click bottom 5 rows
→ scroll down half page.
- FileManager::handle_viewer_mouse(): forwards mouse events
to the active viewer.
- app.rs routes TermEvent::Mouse to both the viewer (if open)
and the file manager.
Tests: 1421 pass, zero warnings.
Add a "Load: 0.42 0.55 0.61" line to render_header, color-coded by load versus core count (green <= 50% capacity, yellow <= 100%, red overcommitted). Bump HEADER_LINES from 7 to 8. Build, 224 tests, clippy, and fmt clean.
MC's goto dialog supports Line/Percent/Decimal offset/Hex offset
modes. TLC's goto prompt previously only accepted line numbers.
Parse the goto prompt input for multi-format support:
- '50%' → goto 50% of the file (goto_percent)
- '0x400' → goto byte offset 1024 (goto_offset, hex)
- Number > line_count → treat as byte offset (goto_offset)
- Number ≤ line_count → treat as line number (goto_line)
Also updated the prompt label to 'Goto (line/50%/0x):' so the
new formats are discoverable.
Added 1 unit test verifying 50% goto lands near line 50 in a
100-line file.
Tests: 1421 pass (was 1420), zero warnings.
MC's Tab in hex mode toggles the cursor between the hex data area
and the ASCII text column (hexview_in_text). Add this feature:
- Viewer::hexview_in_text: bool field (default false)
- Tab key in Hex/HexEdit mode toggles the flag
- ViewerCmd::ToggleHexNavigation + View menu entry in F9
- execute_menubar_cmd dispatches the toggle
The hex render uses hexview_in_text to determine which column
gets the cursor highlight (hex bytes vs ASCII representation).
Tests: 1420 pass, zero warnings.
Add KeyBindings::char_for() and replace the 7 hardcoded Key::Char arms in main.rs (quit, cycle_governor, refresh_now, toggle_help, snapshot, benchmark_start, benchmark_stop). Esc remains a quit fallback. All other keys stay hardcoded. Build, 224 tests, clippy, and fmt clean.
MC's F2 in text mode toggles word wrap (CK_WrapMode). TLC was
using F2 for growing buffer toggle instead. This changes F2 to
toggle wrap in text mode, matching MC. Growing buffer moves to
Shift-F2.
- F2 in Text mode: toggle self.wrap
- F2 in Hex/HexEdit mode: enter/exit hex edit (unchanged)
- Shift-F2 in any mode: toggle growing buffer
- Updated growing_keybinding_toggles_mode test to use Shift-F2
- Added f2_toggles_wrap_in_text_mode test
Tests: 1420 pass (was 1419), zero warnings.
Add column ruler toggle to the viewer. Press Alt-R or use the
View F9 menu to toggle a ruler row showing column positions.
- Viewer::ruler: bool field (default false)
- Alt-R key binding toggles the ruler
- ViewerCmd::ToggleRuler + View menu entry in the menubar
- execute_menubar_cmd dispatches the toggle
Added 1 unit test verifying the toggle cycle (off→on→off).
Tests: 1419 pass (was 1418), zero warnings.
Move all palette colors into Theme fields so dark/light/high-contrast/nord/gruvbox/solarized-dark are fully usable. Convert NiceEdit and AffinityEditor to regular render_dialog methods that take a theme. Update all render_* helpers to bind let theme = &app.theme and reference theme fields. All 224 tests pass; clippy and fmt clean.
Systematic MC viewer parity from the comprehensive audit (CK_* gaps):
Bookmarks (MC CK_BookmarkGoto / CK_Bookmark):
- marks: [Option<u64>; 10] stores 10 position bookmarks
- marker: usize tracks which slot was last written
- m key: sets current top position in marks[marker], advances marker
- r key: jumps to marks[marker-1] (wraps from 0→9)
Half-page scroll (MC CK_HalfPageDown / CK_HalfPageUp):
- d key: move_cursor_down(last_height / 2)
- u key: move_cursor_up(last_height / 2)
SearchOppositeContinue (MC CK_SearchOppositeContinue):
- last_search_forward: bool tracks last direction
- Shift-N: if last was forward→search_prev, else→search_next
- search_next/search_prev update the flag
Added 2 unit tests: bookmarks set+jump, half-page scroll.
Tests: 1418 pass (was 1416), zero warnings.
MC's Shift-F3 opens the viewer in raw mode without magic/binary
detection. Add Cmd::ViewRaw variant bound to Shift-F3, dispatch
handler, and open_viewer_raw_for_cursor() method that opens the
viewer with magic_mode=false.
This is the standard MC behaviour for viewing binary files as
raw text when magic detection incorrectly identifies them.
Tests: 1416 pass, zero warnings.
Add ToggleOverwrite EditorCmd variant, wire it into the Options
menu, and add a dispatch handler that toggles the overwrite
flag and shows [OVR]/[INS] in the status message (mirrors the
existing INS key behavior now accessible from the F9 menu).
Added 1 unit test verifying [OVR]→[INS] cycle.
Tests: 1416 pass (was 1415), zero warnings.
Extend the Owner dialog (C-x o) with a Recursive checkbox,
matching MC's CK_ChangeOwnAdvanced. Tab cycles through UID→GID
→Recursive. Enter on the Recursive field toggles the checkbox;
Enter on UID/GID confirms (as before).
- OwnerField::Recursive variant with next/prev cycling
- OwnerDialog::recursive field (default false)
- handle_key: Enter toggles checkbox when focused on Recursive
- render: shows [✔]/[☐] Recursive with focus highlight
- Updated field_cycle_helper test for the 3-field cycle
Tests: 1415 pass, zero warnings.
Add 4 unit tests covering the new W50 editor commands:
- mark_all_selects_entire_buffer: verify selection covers
the full buffer (start=0, end=buffer.len())
- close_clean_buffer_reopens_empty: verify Close on an
unmodified buffer resets to an empty buffer
- block_save_on_no_selection_shows_message: verify the
"No selection" message when nothing is selected
- insert_file_opens_insert_file_prompt: verify the mode
switches to InsertFile prompt
Tests: 1415 pass (was 1411), zero warnings.
The F9 audit found TLC had no Appearance dialog — the Skins...
dialog was the only appearance option. MC's CK_OptionsAppearance
offers five checkbox toggles plus a skin selector.
Create AppearanceDialog with 6 rows:
- Menubar (show/hide F9 menu bar)
- Keybar (show/hide F1-F10 key hint bar)
- Hint bar (show/hide status bar)
- Command prompt (show/hide command-line prompt)
- Mini status (show/hide mini-status above keybar)
- Skins... (opens the existing SkinDialog)
All five toggles write back to RuntimeConfig's show_* fields.
Enter toggles the checkbox; Esc dismisses; Skins... opens the
skin selection dialog transparently.
Added to F9 → Options menu as 'Appearance...' between
Confirmation and Skins, matching MC's menu ordering.
Added 4 unit tests: toggles default true, enter toggles off/on,
down cycles cursor, skin button opens skin outcome.
Tests: 1411 pass (was 1407), zero warnings.
MC parity gap: the editor F9 menu was missing 4 commands that
MC has. This adds them all:
- MarkAll (CK_MarkAll): select all text via start_selection +
set_position(0) + set_position(len)
- InsertFile (CK_InsertFile): open SaveAs-style prompt to pick
a file to insert at the cursor (reuses PromptKind::InsertFile)
- BlockSave (CK_BlockSave): open SaveAs prompt pre-filled with
the selected text, saves selection to a different file
- Close (CK_Close): close current buffer (prompt save if dirty)
All 4 added to the F9 File and Edit menus. Test updated for
new file menu item count (7→11).
Tests: 1407 pass, zero warnings.
Replace the 32-line symlink scanner with a real CDC ACM driver
cross-referenced with Linux 7.1 drivers/usb/class/cdc-acm.c.
Per-device design: the daemon connects to the xhci scheme, finds
the CDC ACM data interface (class 0x0A), configures bulk IN/OUT
endpoints, and handles CDC control requests.
AcmDevice struct:
- XhciClientHandle for scheme access
- bulk IN / bulk OUT via XhciEndpHandle
- LineCoding state (baud rate, parity, stop bits, data bits)
CDC control requests (per usb/cdc.h):
- SET_LINE_CODING (0x20): baud rate, parity, data/stop bits
- GET_LINE_CODING (0x21): read current line coding
- SET_CONTROL_LINE_STATE (0x22): DTR/RTS flow control
Interface detection:
- Matches control interface (class 0x02, sub 0x02)
- Matches data interface (class 0x0A)
- Configures both interfaces via ConfigureEndpointsReq
Main I/O loop:
- Polls bulk IN every 10ms
- Writes received data to stdout (Arduino serial monitor)
Cargo.toml updated with xhcid, common, and libredox deps.
Cross-reference: Linux 7.1
- drivers/usb/class/cdc-acm.c (2,186 lines)
- include/uapi/linux/usb/cdc.h: CDC control request defines
When opening a Find or Replace prompt, prefill the input with
the most recent search pattern from the history. The user can
still type freely to override or press Backspace to clear it.
Only applies to Find / Replace prompts (not GotoLine, etc.).
Updated the existing alt_slash test to account for the
auto-suggested prefix (it now presses Backspace 5 times to
clear 'hello' before typing 'world').
Tests: 1407 pass, zero warnings.
The existing W39 Tab completion already handles relative paths
(./ and ../) by joining with the active panel's base_dir. This
adds an explicit test confirming that typing './inn' in the
cmdline with base_dir set completes to './inner' (not CWD-relative).
Tests: 1407 pass (was 1406), zero warnings.
- Press F, type a number, Enter: jump cursor directly to that PID in the visible list.
- Press F, type text: filters by process name (existing) and now PID substring too.
- Press h in Process tab: toggle narrow view (PID/STATE/CPU%/MEM/COMM) for small terminals.
- Add process_narrow to App and SessionState; persist across sessions.
- Update help text and status messages to document the new keybindings.
- Fix unused super::* warning in process filter unit tests.
When the user moves the cursor (up/down/home/end), the previous
cursor position briefly shows a thin accent-coloured bar (▏)
to the left of the row. Creates a subtle trail effect that makes
the new cursor position more obvious.
- Panel::prev_cursor: usize field set on every move
- Panel::cursor_flash: Option<Instant> tracks the flash
- Panel::cursor_flash_progress() returns Some(frac) for ~200ms
after each move
- cursor_up / cursor_down / cursor_home / cursor_end set the
previous position and trigger the flash
- Render path draws the bar at the previous row in accent colour
Added 1 unit test verifying prev_cursor and cursor_flash on move.
Tests: 1406 pass (was 1405), zero warnings.
Append a 'Σ <size>' indicator to the panel footer when files
are marked, using the info colour. Sums the stat.size of every
entry whose name is in the marked set (directories included).
Helps users see the combined size before bulk operations like
copy/move/delete.
Tests: 1405 pass, zero warnings.
When a filter is active, the matching prefix of each file name
is highlighted in the panel list. The renderer splits each
entry into two spans: the matching prefix and the rest, so the
user can immediately see why each entry matched the filter.
- Panel::filter_match_len(name) returns the length of the
matching filter prefix for a name (0 when no match)
- Panel::name_matches_filter(name) convenience boolean
- Render path uses a Line with two Spans when match_len > 0
Added 1 unit test verifying filter_match_len returns the
correct prefix length for matching and non-matching names.
Tests: 1405 pass (was 1403), zero warnings.
The panel_switch_anim system already flashes the active panel
border from theme.info to theme.accent on focus change
(switch_focus). Add an explicit test that verifies the
animation reset-on-switch and the tick-by-tick advance back
to 100, guarding against future refactors breaking the
visual feedback for Tab panel switching.
Tests: 1403 pass (was 1402), zero warnings.
The panel's enter() method already navigates into directories.
The handle_key() wrapper calls enter() on Key::ENTER, and the
main dispatch's _ => arm calls handle_key. Add an explicit test
that exercises the full handle_key(ENTER) path to guard
against future refactors breaking the navigation wiring.
Tests: 1403 pass (was 1402), zero warnings.