v0.1.0 47aaa0f

ime.md RawHistoryFolder

text-input v3 adapter

NewIME optionally binds zwp_text_input_manager_v3 and creates one text-input object per seat. nil means unavailable: ordinary xkb text remains active. A session posts reader callbacks as IMEEvents, invokes ApplyIME on the UI loop, and passes only the completed edit.IMEBatch to the editor. Ordinary xkb text stays active while text-input is enabled, so enabling it without a running input method does not block typing. An input method that grabs the keyboard receives keys instead of wl_keyboard. For an input method that does not grab, keys reaching wl_keyboard are typed except while its preedit is shown; the input method owns that text until it commits. Enable requested before enter is deferred until the surface gains text-input focus; leave drops the pending composition.

Every successfully sent zwp_text_input_v3.commit increments the per-object commit count. The protocol's done.serial is this count, not the keyboard serial. The text-input-v3 XML says a mismatched done still applies its preedit, commit and delete batch normally, but the client must not modify the protocol object's current state; pending surrounding/content/rectangle updates are held until a matching done arrives. ApplyIME implements this rule. Requests are double-buffered by protocol commits. The cursor rectangle is surface-local logical pixels; with negotiated v2 it is applied on the next surface commit. A password sends sensitive+hidden hints, password purpose, and empty surrounding text (the editor owns that privacy decision).

Surrounding text is limited to 4000 UTF-8 bytes and clipped around the cursor at rune boundaries. Reader callbacks never touch editor state. NeferWL does not expose text-input-v3; tests use a socketpair fake server only.

source
1# text-input v3 adapter
2
3`NewIME` optionally binds `zwp_text_input_manager_v3` and creates one
4text-input object per seat. `nil` means unavailable: ordinary xkb text remains
5active. A session posts reader callbacks as `IMEEvent`s, invokes `ApplyIME` on
6the UI loop, and passes only the completed `edit.IMEBatch` to the editor.
7Ordinary xkb text stays active while text-input is enabled, so enabling it
8without a running input method does not block typing. An input method that
9grabs the keyboard receives keys instead of `wl_keyboard`. For an input method
10that does not grab, keys reaching `wl_keyboard` are typed except while its
11preedit is shown; the input method owns that text until it commits.
12`Enable` requested before `enter` is deferred until the
13surface gains text-input focus; leave drops the pending composition.
14
15Every successfully sent `zwp_text_input_v3.commit` increments the per-object
16commit count. The protocol's `done.serial` is this **count**, not the keyboard
17serial. The text-input-v3 XML says a mismatched done still applies its preedit,
18commit and delete batch normally, but the client must not modify the protocol
19object's current state; pending surrounding/content/rectangle updates are
20held until a matching done arrives. `ApplyIME` implements this rule. Requests
21are double-buffered by protocol commits. The cursor rectangle is surface-local
22logical pixels; with negotiated v2 it is applied on the next surface commit.
23A password sends sensitive+hidden hints, password purpose, and empty
24surrounding text (the editor owns that privacy decision).
25
26Surrounding text is limited to 4000 UTF-8 bytes and clipped around the cursor
27at rune boundaries. Reader callbacks never touch editor state. NeferWL does
28not expose text-input-v3; tests use a socketpair fake server only.

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