v0.3.0 6800c6a

input.md RawHistoryFolder

Wayland input boundary

Connect binds the optional initial wl_seat. StartReader owns all Wayland callbacks and posts typed Event values. The session loop must call ApplySeat for capability/removal events, InputAdapter.ApplyInput for input events, and translate resulting Input values to the root platformInput later, at the runtime wiring boundary. Callbacks never run the editor, keyboard interpreter, or UI. On shutdown, Window.Close closes unconsumed keymap FDs in its queues. A consumer that drops an event before dispatch must use CloseEventFD.

wl_pointer surface-local fixed-point coordinates are already logical; do not apply window buffer scale. A version 5+ pointer frame becomes one ordered InputFrame. For older pointers events flush individually. Axis deltas preserve their native Wayland units; value120, stop, and source metadata are additional axis events, not extra pixel scroll deltas. Consumers must avoid counting both axis and value120 for the same frame. A button release outside the surface is still delivered, for cancellation of pointer capture.

The bounded input queue evicts old motion first, then coalesces adjacent axis values on the same axis/source (without crossing discrete events). If still full, it discards the queued state and emits one InputReset (Kind == "reset") before later events. The runtime must treat reset as pointer leave + release of all buttons + keyboard focus-out/cancel repeat, then re-sync from later events. The adapter itself drops held keys and repeat on reset but keeps compositor keyboard focus, so later key events apply without a new enter. InputOverflow counts discarded inputs; merging lossless axes does not count.

A keymap event transfers its FD via OwnedFD.Take() from the reader to exactly one loop event; ApplyInput passes it to keyboard.ReplaceFD, which closes it on success or error. Repeat info and focus loss are applied only on the loop. The compositor serial from keyboard enter or key press is exposed for selection ownership. Tick and NextRepeat belong to that same loop, never the reader.

source
1# Wayland input boundary
2
3`Connect` binds the optional initial `wl_seat`. `StartReader` owns all Wayland
4callbacks and posts typed `Event` values. The session loop must call `ApplySeat`
5for capability/removal events, `InputAdapter.ApplyInput` for input events, and
6translate resulting `Input` values to the root `platformInput` later, at the
7runtime wiring boundary. Callbacks never run the editor, keyboard interpreter,
8or UI. On shutdown, `Window.Close` closes unconsumed keymap FDs in its queues.
9A consumer that drops an event before dispatch must use `CloseEventFD`.
10
11`wl_pointer` surface-local fixed-point coordinates are **already logical**;
12do not apply window buffer scale. A version 5+ pointer frame becomes one ordered
13`InputFrame`. For older pointers events flush individually. Axis deltas preserve
14their native Wayland units; `value120`, stop, and source metadata are additional
15axis events, not extra pixel scroll deltas. Consumers must avoid counting both
16axis and value120 for the same frame. A button release outside the surface is
17still delivered, for cancellation of pointer capture.
18
19The bounded input queue evicts old motion first, then coalesces adjacent axis
20values on the same axis/source (without crossing discrete events). If still full,
21it discards the queued state and emits one `InputReset` (`Kind == "reset"`)
22before later events. The runtime must treat reset as pointer leave + release of
23all buttons + keyboard focus-out/cancel repeat, then re-sync from later events.
24The adapter itself drops held keys and repeat on reset but keeps compositor
25keyboard focus, so later key events apply without a new enter.
26`InputOverflow` counts discarded inputs; merging lossless axes does not count.
27
28A keymap event transfers its FD via `OwnedFD.Take()` from the reader to exactly
29one loop event; `ApplyInput` passes it to `keyboard.ReplaceFD`, which closes it
30on success or error. Repeat info and focus loss are applied only on the loop.
31The compositor serial from keyboard enter or key press is exposed for selection
32ownership. `Tick` and `NextRepeat` belong to that same loop, never the reader.

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 1

Tags 12

↑↓ moveenter openesc close