Commit Graph

122 Commits

Author SHA1 Message Date
Kataoka Katsuki 2e8cc9060d fix(ui): anchor the host cursor to modal name inputs (#2569)
* fix(ui): anchor the host cursor to modal name inputs

IMEs draw their composition preview at the host terminal cursor. The rename
and new-worktree dialogs drew a block glyph instead of setting one, so the
frame carried no cursor and the client kept the position the focused pane
last reported. Japanese composition appeared behind the dialog and only
reached the field on Enter.

Set the cursor to the caret column instead, counting wide characters as two
cells.

refs #1755

* fix(ui): keep the clamped caret cell blank

A name that fills the field left the clamped caret sitting on the last
rendered glyph. A terminal inverts the cell under its cursor and an IME
composes there, so the glyph was hidden and composition overlapped it.

Render the text one column short of the field. The field is still cleared
in full, so the clamped caret always lands on a blank cell.

refs #1755

---------

Co-authored-by: kataokatsuki <kataokatsuki@users.noreply.github.com>
Co-authored-by: Can Celik <ogulcancelik@gmail.com>
2026-08-10 14:34:51 +03:00
David Heinemeier Hansson 6c6ddcd493 fix: center tab labels for symmetric highlight padding (#2570)
* fix: center tab labels for symmetric highlight padding

* docs: note centered tab labels in the changelog

* fix: center tab labels by display width, not char count
2026-08-10 05:32:06 +03:00
David Heinemeier Hansson f5067ed829 feat: add move tab keybind actions (#2561)
* feat: add move tab keybind actions

Add optional keys.move_tab_previous/move_tab_next actions that reorder
the active tab one position, wrapping at either end. Reuses the
existing tab.move runtime path that mouse drag reordering already
drives.

* fix: exit navigate mode on single-tab move attempts
2026-08-10 01:55:28 +03:00
Can Celik e48d83067a feat: add configurable tab bar status (#2586)
* feat: show a zoom indicator in the desktop tab bar

Reserve the right edge of the tab row for a ZOOM pill while the
focused pane is zoomed, matching the accent style of the mode bars.
The per-tab Z suffix stays; the pill makes the zoomed state visible
at a glance like tmux's status-right flag.

* feat: optionally show the hostname in the desktop tab bar

Add ui.tab_bar_hostname to display the machine's hostname at the right
edge of the tab row, like tmux's #h in status-right. The value resolves
where the server renders, so remote sessions show the remote host. Off
by default.

* fix: strip control characters from the tab bar hostname

* fix: hide the hostname when it would squeeze out the tab strip

* feat: add configurable tab bar status

* fix: harden tab bar status updates

* fix: terminate tab bar status process trees

* fix: disable status commands on unsupported platforms

* fix: skip unchanged status command renders

* fix: keep tab bar status opt-in by default

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-08-10 01:20:09 +03:00
Ogulcan Celik e2aa86a9e8 test: guard pane-scaled render performance
refs #2550
2026-08-09 20:36:11 +03:00
David Heinemeier Hansson 4e31084495 feat: add direct pane resize keybindings (#2558) 2026-08-09 19:10:52 +03:00
akbash e7c38ab37f perf(ui): avoid full pane mode reads for scrollbars (#2554) 2026-08-09 14:50:11 +03:00
Can Celik 97f8140f37 fix(ui): reclaim scrollbar gutter in alternate screen (#2538) 2026-08-09 04:17:28 +03:00
David Heinemeier Hansson 36a8d36a72 feat: make outer pane borders configurable (#2535) 2026-08-09 01:37:57 +03:00
Ian Ker-Seymer 2d011c39b4 fix(sidebar): highlight active agent in collapsed sidebar (#2382)
The collapsed sidebar renders agent rows with an unconditional
Style::default().fg(p.overlay0), so the active agent is
indistinguishable from the others. The workspace list directly above
it, and render_agent_detail in the expanded sidebar, both mark the
active entry.

Reuse the existing active treatment: resolve the active entry with the
same is_active_pane call the expanded agent panel uses, then paint the
row background with surface_dim and the position number with text, the
same tokens the collapsed workspace rows already use.

Assisted-By: devx/717e5259-915f-4a7b-af07-6abe46da5b90
2026-08-06 00:55:58 +03:00
Ogulcan Celik add6c14f1e feat(theme): add optional sidebar background 2026-08-05 04:07:11 +03:00
Can Celik cc9fa47540 feat(ui): add distinct status indicators (#2282)
refs #2260
2026-08-04 17:26:30 +03:00
akbash d78e3d3b51 fix(ui): keep collapsed workspace status visible (#2239)
refs #2216

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: Can Celik <ogulcancelik@gmail.com>
2026-08-04 00:51:23 +03:00
Can Celik 10eb0bc744 fix: propagate host color scheme to pane apps (#2214)
refs #714
2026-08-03 02:05:27 +03:00
Can Celik f6031f7fb0 feat(ui): make pane scrollbars optional (#2166)
refs #2167
2026-08-01 17:25:43 +03:00
Ogulcan Celik 8d190eddda chore: remove experiments from settings tui 2026-08-01 03:36:11 +03:00
Ogulcan Celik 7db744ab47 fix(sidebar): keep worktree groups packed 2026-07-31 15:40:20 +03:00
Ogulcan Celik e27a4ea427 perf: skip rendering hidden pty updates 2026-07-28 23:29:11 +03:00
Ogulcan Celik e16d7d8c07 fix: preserve linked worktree workspace labels 2026-07-28 15:34:13 +03:00
Ogulcan Celik 81f355fada perf: replace agent spinners with static status marks 2026-07-28 14:56:53 +03:00
Can Celik 8843bbb0c4 fix: improve sidebar worktree hierarchy and reordering (#1873)
* fix: clarify sidebar worktree hierarchy

refs #1694

* feat: reorder worktree groups as a unit

refs #1694
2026-07-26 02:45:44 +03:00
joonhwan 6cfaa079a9 feat: switch IME to ASCII in prefix mode on Windows (Korean IME) (#1823)
* feat: switch IME to ASCII in prefix mode on Windows

Extend switch_ascii_input_source_in_prefix to Windows: detect IME state
via WM_IME_CONTROL and toggle to ASCII with SendInput for the Korean IME.
Other IME languages are detected and left unchanged.

refs #1802

* docs: clarify Windows (Korean IME) support for prefix ASCII switching

Follow-up to the Windows prefix ASCII switch, which extended
switch_ascii_input_source_in_prefix to Windows but left the surrounding
text describing macOS only.

- Settings row label: "(macOS)" -> "(macOS/Windows)", plus its test.
- Generalize the Windows behavior wording to "switches the IME to
  English (ASCII) input" in the config-reference.json entry and the
  model.rs doc comment, and state that Windows support is currently
  limited to the Korean IME.
- Add a :::caution aside noting the Korean-IME-only limitation to the
  en/ja/zh preview docs, keeping the three translations in sync.

refs #1802

* fix: warn when prefix IME toggle injection is incomplete

SendInput can queue fewer events than requested (for example when blocked
by UIPI), which would otherwise leave the IME silently stuck in ASCII or
native mode. Log a warning with the sent and expected counts so the failure
is diagnosable.

refs #1802

* fix: guard prefix IME restore and correct open-status naming

Address maintainer review on the Windows prefix ASCII switch:

- Restore only when safe: store the foreground window at switch time and,
  before toggling back, require that the same window is still focused and
  the IME is still in English. This stops restore from toggling another
  application or overriding a manual return to Hangul during prefix mode.
- Report injection success from send_vk_tap and only arm restoration when
  the initial toggle landed; on a partial injection retry the dropped
  key-up so a key is not left logically held down. The injection policy is
  split into send_vk_tap_with(inject) so the success, partial, and failure
  branches are unit-tested without the real SendInput.
- Correct the WM_IME_CONTROL sub-command naming: 0x0005 is IMC_GETOPENSTATUS
  (IME open state), not IMC_GETCONVERSIONMODE. Behavior is unchanged; the
  constant, comments, and tests now describe the open-status read.

refs #1802

* fix: bound IME open-status read with a timeout

The prefix IME switch reads IMC_GETOPENSTATUS via WM_IME_CONTROL, which
crosses into the terminal-emulator process. A plain SendMessageW would block
herdr's client thread until that process responds, indefinitely if it hangs.
Read through SendMessageTimeoutW with SMTO_ABORTIFHUNG and a short timeout
instead; on timeout the switch is skipped and restore does nothing, so a hung
host process can no longer freeze prefix-mode entry or exit.

refs #1802

* fix: preserve windows ime restoration after partial injection

refs #1802

---------

Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
2026-07-25 20:52:45 +03:00
Can Celik d4e0dd3d90 perf: eliminate repeated workspace git discovery (#1842)
* perf: eliminate repeated workspace git discovery

refs #1838

* fix: keep workspace labels current without extra redraws

refs #1838

* fix: retain discovered workspace git metadata

refs #1838
2026-07-25 04:26:55 +03:00
corrius 38d2b0780c feat: filter keybind help (#1832)
* feat: filter keybind help

refs #1825

* fix: recognize shifted slash in keybind help

---------

Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
2026-07-24 22:52:17 +03:00
akbash 503613c8ec fix: inherit host palette in pane queries (#1759)
refs #1752

Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
2026-07-24 01:28:35 +03:00
Ogulcan Celik d30ab1b54f feat: add plugin-driven agent views and startup hooks 2026-07-20 00:55:36 +03:00
Ogulcan Celik 08409d167d fix: show current workspace name in close confirmation
refs #1364
2026-07-19 22:11:31 +03:00
Ogulcan Celik a26a654351 feat: connected tree glyphs, workspace grouping, and search auto-select in navigator
refs #1611
2026-07-19 20:44:44 +03:00
Ogulcan Celik e298e45890 feat: add optional workspace name prompt 2026-07-18 01:55:46 +03:00
Ogulcan Celik 8dcb75a5c0 refactor: extract active tab surface rendering 2026-07-16 22:47:10 +03:00
Ogulcan Celik b16465afbb feat: add configurable sidebar token styles 2026-07-16 03:21:36 +03:00
Ogulcan Celik 2c7c8beb07 feat: add floating popup panes
refs #1125
2026-07-15 04:02:14 +03:00
Ogulcan Celik 5b91dae12f feat: configure sidebar entry gaps 2026-07-14 20:41:20 +03:00
Ogulcan Celik 3a8490f651 fix: show renamed single tabs in agents sidebar
refs #1369
2026-07-13 17:27:54 +03:00
akbash 75ed6abc62 fix: reap detached custom command children (#1384)
* fix: reap detached custom command children

refs #1360

* test: harden child cleanup and sidebar metrics

refs #1360

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
2026-07-13 17:25:52 +03:00
Ogulcan Celik 5cfe5e5e73 feat: add configurable sidebar metadata tokens 2026-07-13 03:30:13 +03:00
Ogulcan Celik 0cd0b1aef0 fix: number collapsed agent rows by list position
refs #1344
2026-07-12 15:04:26 +03:00
Ogulcan Celik 3e8f9df14e fix: improve config diagnostic delivery 2026-07-10 17:28:31 +03:00
Ogulcan Celik c8850a2e3e feat: add copy mode search and tmux word motions
refs #1230
2026-07-10 04:22:10 +03:00
akbash 552aa8ca22 fix: align collapsed sidebar agent rows (#1182)
refs #1168

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
2026-07-08 15:22:57 +03:00
Bryan Lee 1e1d06328c fix: preserve navigator search commands (#1140)
Navigator search treated Escape as either modal close or query reset,
which left no way to return to command mode while keeping the filtered
row set. `/` also rebuilt search mode by clearing the query, so a user
could not resume editing the same filter after backing out.

Make Escape leave search focus only, reserve command-mode Escape for
closing the picker, and let `/` refocus the existing query. The footer
now lists the shortcuts for the active mode so command keys are not
advertised while text input owns them.

refs #1115
2026-07-07 20:54:42 +03:00
Ogulcan Celik 17e2b2b878 fix: honor prefix in copy mode
refs #681

Based on PR #1092 by @reobin.

Co-authored-by: Robin Gagnon <me@reobin.dev>
2026-07-07 01:20:13 +03:00
Ogulcan Celik 2a1a8d64de feat: hide single-tab tab row
refs #448
2026-06-30 14:10:12 +03:00
Ogulcan Celik f54d8e8c0a feat: add hidden collapsed sidebar mode
refs #842
2026-06-30 04:00:33 +03:00
Ogulcan Celik 5fffc59cd8 fix: remove focused pane title border marker 2026-06-29 19:00:36 +03:00
Ogulcan Celik bc764c83cb fix: keep active auto-named tab readable
refs #829
2026-06-27 02:19:40 +03:00
Ogulcan Celik 32e3d7b7fd fix: compact indexed keybind help ranges
refs #817
2026-06-26 18:13:31 +03:00
Ogulcan Celik b44ca3b39e fix: measure ui labels by display width
refs #810
2026-06-26 14:11:27 +03:00
Ogulcan Celik 14d8e93391 feat: render worktrees as a tree in the mobile switcher 2026-06-25 23:36:31 +03:00
Ogulcan Celik db1ef28d64 feat: agents-first mobile switcher with global header summary 2026-06-25 22:05:11 +03:00