diff --git a/docs/spec/settings-catalog.md b/docs/spec/settings-catalog.md index 79701258..f142d967 100644 --- a/docs/spec/settings-catalog.md +++ b/docs/spec/settings-catalog.md @@ -1194,7 +1194,9 @@ Each is a JVM test over an in-memory preference store and the asset text. | Backing up `embedded_adb` and `physiboard_toolbox` | Drop from the archive | A pairing secret and undo journals are not settings; restoring them onto another phone is wrong | | Legacy mirror rows `show_status_bar`, `status_bar_slot_*` | Drop; importer maps them into the visibility and slot arrays | Only existed for pre-1.2.2 readers | | `modifier_indicator_mode`, `pastierina_*`, `swipe_incremental_threshold`, `global_variation_layout_override`, assignment-mode and light/dark theme slots, `keyboard_theme_software`, every `software_keyboard_*` row, `titan2_layout_enabled`, `physical_keyboard_profile_override`, every `clicks_*` and `static_variation_bar_*` row | Drop | Dead, on-screen-keyboard only, or other-device only | -| Rows with no screen in 2.x: bounce keys, overlapping keys, tap latches, long-press modifier, accessibility rows, French spacing, swipe-to-delete, strip gestures and thresholds, `trackpad_provider`, clipboard rows, `toast_on_layout_switch`, `alt_ctrl_speech_shortcut`, `fn_speech_scan_code`, `keyboard_layout_list`, `software_keyboard_mode_toggle_toasts`, debug logging rows | Undecided per row; drop the row unless its subsystem document keeps the behavior | A setting without a screen is a constant; keep the behavior, not the row | +| Long-press modifier and threshold (`long_press_modifier`, `long_press_threshold`) | Keep, with a screen: Keyboard > "Long Press behaviour", a hold-time slider (50 to 1000 ms) and a picker for Alt / Shift / Variations / Sym | keys-and-modifiers.md section 8 keeps every mode, and `shift` is what BlackBerry 10 users expect from a held letter (brobata/physiboard#9); the 2.x screen went with the Modifiers page, so the row has been a constant nobody chose | +| Keyboard-surface swipe rows (`trackpad_gestures_enabled`, `trackpad_gesture_add_word_enabled`, `trackpad_suggestion_swipe_threshold`, `swipe_to_delete`, `trackpad_delete_swipe_threshold`) | Keep, with a screen: Keyboard > "Keyboard swipe", an enable switch, an add-word switch, a swipe-to-delete switch and the two distance sliders; lower both distance defaults (a natural flick on the Elite covers 280 to 470 px up and 170 to 680 px left, so 500 rejects most) | Since 1.0.2 nothing reachable turns either gesture on (trackpad-caret-nav.md section 3.2); with Scroll Assistant on both work on the Elite (D7, brobata/physiboard#11) | +| Rows with no screen in 2.x: bounce keys, overlapping keys, tap latches, accessibility rows, French spacing, `trackpad_provider`, clipboard rows, `toast_on_layout_switch`, `alt_ctrl_speech_shortcut`, `fn_speech_scan_code`, `keyboard_layout_list`, `software_keyboard_mode_toggle_toasts`, debug logging rows | Undecided per row; drop the row unless its subsystem document keeps the behavior | A setting without a screen is a constant; keep the behavior, not the row | | Settings search catalog | Keep, regenerate from the screen map so titles and targets cannot drift | Four entries already point at the wrong place | | Hub structure: home tiles, T2E Tools, Keyboard, Extras, Settings with maintenance rows and About | Keep | The 2.0 walkthrough settled it with the maintainer | | "More Customization" container | Drop | An empty page whose only job is hosting | diff --git a/docs/spec/trackpad-caret-nav.md b/docs/spec/trackpad-caret-nav.md index 6ceda0c7..a4581fcc 100644 --- a/docs/spec/trackpad-caret-nav.md +++ b/docs/spec/trackpad-caret-nav.md @@ -273,11 +273,12 @@ The caret badge (section 4) needs the same permission and benefits from the same | # | Fact | Evidence | |---|---|---| | D1 | The Titan 2 Elite's physical keys carry a capacitive touch layer exposed as a separate input device named `touchPad` at `/dev/input/event4`, distinct from the key matrix (`TitanKey`, `/dev/input/event5`), the touchscreen (`fts_ts`, `/dev/input/event6`) and `ff_key` (`/dev/input/event7`). | DEVICE.md, "Companion devices" | -| D2 | The touch layer reports multitouch absolute coordinates (ABS_MT) over a 1080 by 600 range, is flagged as a direct input surface (INPUT_PROP_DIRECT) and samples at about 90 Hz. | Stated in the brief for this document from the maintainer's capture; not yet recorded in DEVICE.md. Needs a `getevent -p /dev/input/event4` capture added to DEVICE.md before 3.0 builds on it. | +| D2 | The touch layer reports multitouch absolute coordinates (ABS_MT) over a 1080 by 600 range, is flagged as a direct input surface (INPUT_PROP_DIRECT) and samples at about 90 Hz. | `getevent -p /dev/input/event4` on a Titan 2 Elite, `Titan 2 Elite_V02.00.04`, Android 16 (brobata/physiboard#14): ABS_MT_POSITION_X 0 to 1079, ABS_MT_POSITION_Y 0 to 599, ABS_MT_TOUCH_MAJOR 0 to 255, INPUT_PROP_DIRECT; the same node also declares KEY events for BTN_TOUCH, the D-pad and a handful of letters. `dumpsys input` shows Android hands it to apps as sources KEYBOARD \| TOUCHPAD with X 0 to 1079 and Y 0 to 748.75. Sample rate not measured. Still to be copied into DEVICE.md. | | D3 | Sym arrives as keycode 63 (scancode 253); Fn arrives as Ctrl repeats with scancode 251 and never sends a key-up. | keys document; DEVICE.md scancode map and Fn delivery model | | D4 | Upstream Pastiera's Titan 2 (non-Elite) trackpad device is `/dev/input/event7`, moved to `/dev/input/event6` from firmware V01.00.14. The Elite identifies its keyboard as `titan2elite_qwerty`, not `titan2`, so the firmware rule never applies to it and the legacy path is chosen. | commits 60bd83b "Select Titan 2 trackpad device by firmware", 867330f "Limit Titan 2 trackpad remap to V01.00.14"; device identification rules | | D5 | The vendor firmware can deliver keyboard-surface swipes as key events: keycodes 322 and 404 are treated as "swipe to delete" keys. Whether the Elite firmware actually emits them, and for which gesture, has not been captured. | commit 625b185 "Support alternate swipe delete keycode"; swipe-to-delete provider `titan2_keycode` | | D6 | The Android input stack, on a Titan 2 running Android 16, can deliver the touch layer to the keyboard's own window as motion events from a device named `touchPad` with the touchpad source. | commits 82e0e48 "Add native Titan 2 trackpad gestures", ae06398 "Enable native trackpad gestures on Titan 2 Elite" | +| D7 | On the Elite (`Titan 2 Elite_V02.00.04`, Android 16) the key surface reaches the IME's focused decor view as SOURCE_TOUCHPAD (0x100008) motion events from the `touchPad` device only while Unihertz's Scroll Assistant (Settings > Gestures > Keyboard gestures) is on; with it off nothing arrives at the IME. Event X spans 0 to 1079. Event Y is not the 0 to 748.75 that `dumpsys input` reports for the axis: flicks started at y 907 to 987 and ended at 516 to 685 on the 1080 by 1200 display, so a natural up-flick covers about 280 to 470 px in 80 to 150 ms (2.5 to 4.3 px/ms). Double-tap Cursor Assistant mode is different: it synthesizes KEYCODE_DPAD_* key events for drags (scanCode equal to the keycode, deviceId of `touchPad`, source KEYBOARD), and those are not flicks. | logcat with the native provider on, 2026-09-21: 11 accepted flicks, all three thirds reached with the device-range boundaries (brobata/physiboard#11, #14) | ### 3.2 Status on the Elite @@ -293,6 +294,9 @@ superseded; its detector code remains, disabled, for upstream parity"). What rem - The default provider is `native_ime`, which needs no Shizuku. - The Shizuku provider would read `/dev/input/event7` on the Elite (D4), which is `ff_key`, not the touch layer, so it can never see a swipe there. +- On the Elite the native provider works, but only while Scroll Assistant is on (D7). The + default `trackpad_suggestion_swipe_threshold` of 500 px rejects most natural flicks there + (280 to 470 px); 270 accepts them. - PhysiBoard does not use the Elite's keyboard-surface scroll gestures for cursor movement at all. Cursor movement is the screen trackpad (section 2) and nav mode (section 5). @@ -330,9 +334,10 @@ capture as a "candidate" and does nothing. A gesture that qualifies within 250 m (wall-clock) of the previously accepted gesture is recorded as "debounced" and dropped. Third for an accepted up-swipe: start x clamped to 0..1440, then left third below 480, -centre below 960, right otherwise. The 1440 width is upstream's Titan 2 value; against the -Elite's 1080 range (D2) the right third can only be reached by starting at x >= 960 of 1080, -which would need device confirmation. +centre below 960, right otherwise. The 1440 width is upstream's Titan 2 value; on the Elite Android reports X from 0 to 1079 +(D2), so the right third only begins at x >= 960 of 1079, the rightmost tenth of the keys +(brobata/physiboard#14). 3.0 should take the boundaries from the X range the event's device +declares. ### 3.4 The Shizuku provider: gesture detection @@ -899,7 +904,7 @@ D1 to D6 are in section 3.1. Additional: | Strip dips for a "Text box under the bar" app while the pad is open | the pad stays open | the dip is not a real window hide | | Sym chosen as trigger | hold-Sym-for-assistant never arms | two things would fight over one hold | | Trackpad reader (Shizuku provider) on the Elite | never sees a swipe | it opens `/dev/input/event7`, which is `ff_key` on the Elite (D4) | -| Native provider third calculation | uses a 1440 px surface on a 1080 px layer | inherited from upstream; the right third needs x >= 960 (D2 unverified) | +| Native provider third calculation | uses a 1440 px surface on a layer Android reports as 0 to 1079 | inherited from upstream; the right third needs x >= 960 of 1079 (D2, brobata/physiboard#14) | | Keycodes 322 and 404 on a fresh install | swallowed silently | `swipe_to_delete` off by default; they are consumed either way | | Trackpad debug activity | unreachable from the app | its launcher is never invoked | | Trackpad debug overlay service | cannot start | not in the manifest | @@ -1031,7 +1036,7 @@ trackpad, "map" the Fn Layer map. | Keep-screen-on on the overlay | keep | free | | Trackpad debug activity and overlay service | drop | unreachable and unregistered | | Keyboard-surface swipe, Shizuku provider | drop | reads the wrong device on the Elite; Shizuku is gone from the app | -| Keyboard-surface swipe, native provider | undecided | the touch layer (D1, D2) is real hardware nobody has used from the IME on the Elite; needs a capture on the phone before deciding; if kept, thirds must be measured against 1080 not 1440 | +| Keyboard-surface swipe, native provider | keep (proposed) | works on the Elite with Scroll Assistant on (D7, brobata/physiboard#11); the thirds must come from the device's X range (D2, #14) and the default threshold needs lowering to the Elite's flick lengths; the rows need a screen (settings-catalog.md section 13) | | Add-word gesture rule | drop unless the native provider is kept | it has no other trigger | | Firmware swipe keycodes 322 / 404 | undecided | needs a capture of what the Elite firmware sends | | Caret badge | keep | the reason the LED strip is off by default |