From ac213be1879e40c14f165b7eca4aef666a864494 Mon Sep 17 00:00:00 2001 From: Daniel JB Clark Date: Mon, 21 Sep 2026 06:41:00 -0400 Subject: [PATCH 1/5] docs(spec): keep the long-press and keyboard-swipe rows with a screen in 3.0 Both rows sit in the settings catalog's "no screen in 2.x, undecided per row" bucket, but their behaviour is kept by the subsystem documents and each has a user asking for it: a held letter typing its capital is what BlackBerry 10 users expect (#9), and swipe-to-accept has been silently off on every fresh install since the 1.0.2 screen removal (#11). Give each its own Keep/Drop row naming the screen it needs, and point the native-provider decision in the trackpad document at the capture offered in #11. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Daniel JB Clark --- docs/spec/settings-catalog.md | 4 +++- docs/spec/trackpad-caret-nav.md | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/spec/settings-catalog.md b/docs/spec/settings-catalog.md index 79701258..51441080 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`) | Keep, with a screen, if trackpad-caret-nav.md keeps the native provider: Keyboard > "Keyboard swipe", an enable switch, an add-word switch and a distance slider | Since 1.0.2 nothing reachable turns the gesture on (trackpad-caret-nav.md section 3.2), so no 2.x user has exercised the native provider on the Elite; brobata/physiboard#11 tracks the capture that decision needs | +| Rows with no screen in 2.x: bounce keys, overlapping keys, tap latches, accessibility rows, French spacing, swipe-to-delete, `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..be6defef 100644 --- a/docs/spec/trackpad-caret-nav.md +++ b/docs/spec/trackpad-caret-nav.md @@ -1031,7 +1031,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 | 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 (brobata/physiboard#11 offers one from an Elite); if kept, thirds must be measured again and the rows need a screen (settings-catalog.md section 13)st 1080 not 1440 | | 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 | From b00d3cc12355c177451f68707c8a53c2b80d7578 Mon Sep 17 00:00:00 2001 From: Daniel JB Clark Date: Mon, 21 Sep 2026 08:53:04 -0400 Subject: [PATCH 2/5] docs(spec): record the Elite touch layer's measured ranges and the third-boundary defect D2 was carried on the maintainer's word and asked for a getevent capture; here it is from an Elite on V02.00.04 (X 0 to 1079, Y 0 to 599 at the kernel, X 0 to 1079 and Y 0 to 748.75 as Android reports them to the IME). With that measured, the native provider's 1440 px third boundaries are no longer an unverified suspicion: the right third begins at 960 of 1079, so the right-hand suggestion is nearly unreachable (#14). Say so in section 3.3 and the quirks table, and tell 3.0 to take the boundaries from the device's declared range. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Daniel JB Clark --- docs/spec/trackpad-caret-nav.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/spec/trackpad-caret-nav.md b/docs/spec/trackpad-caret-nav.md index be6defef..fed0b57e 100644 --- a/docs/spec/trackpad-caret-nav.md +++ b/docs/spec/trackpad-caret-nav.md @@ -273,7 +273,7 @@ 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` | @@ -330,9 +330,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 +900,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 | From 67e6683b29038895f7d0ff5c3f93e37a4dafe220 Mon Sep 17 00:00:00 2001 From: Daniel JB Clark Date: Mon, 21 Sep 2026 09:26:49 -0400 Subject: [PATCH 3/5] docs(spec): the Elite delivers a key-surface up-swipe as a synthetic DPAD_UP key event Captured on an Elite on V02.00.04 with the native provider enabled: a flick up on the keys never reaches the IME's decor view as touchpad motion. system_server synthesizes KEYCODE_DPAD_UP (scanCode 19, deviceId of the touchPad device, source KEYBOARD) and delivers it to the app and the IME, which is why a flick moves the caret a line today. Record it as D7, note in 3.2 that the motion provider cannot fire on the Elite, and point the Keep/Drop decision at a keycode provider like the existing swipe-to-delete path (#11). Co-Authored-By: Claude Fable 5.1 Signed-off-by: Daniel JB Clark --- docs/spec/trackpad-caret-nav.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/spec/trackpad-caret-nav.md b/docs/spec/trackpad-caret-nav.md index fed0b57e..eab0d166 100644 --- a/docs/spec/trackpad-caret-nav.md +++ b/docs/spec/trackpad-caret-nav.md @@ -278,6 +278,7 @@ The caret badge (section 4) needs the same permission and benefits from the same | 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) an up-swipe on the key surface reaches the focused app and the IME as a synthetic key event: KEYCODE_DPAD_UP, scanCode 19 (equal to the keycode, not the kernel scancode), deviceId of the `touchPad` device, source KEYBOARD (0x101), repeat 0, down then up. A down-swipe is KEYCODE_DPAD_DOWN, scanCode 20. The synthesis happens in system_server (log tags `A85ShortcutFunction`, `AguiKeyboardShortcut`) with Scroll Assistant off. In the same session no SOURCE_TOUCHPAD motion event reached the IME's focused decor view, and `dumpsys input` shows the reader mapping the device with a touch mapper in DIRECT mode bound to the display. | logcat and `dumpsys input`, 2026-09-21 (brobata/physiboard#11) | ### 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 swipe arrives as KEYCODE_DPAD_UP from the `touchPad` device (D7), so the + native provider's motion listener never fires there; a keycode path like the swipe-to-delete + `titan2_keycode` provider is the one that can work, and it cannot know the third. - 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). @@ -1032,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 (brobata/physiboard#11 offers one from an Elite); if kept, thirds must be measured again and the rows need a screen (settings-catalog.md section 13)st 1080 not 1440 | +| Keyboard-surface swipe, native provider | undecided | the touch layer (D1, D2) is real hardware; the capture (D7, brobata/physiboard#11) shows the Elite delivers the swipe as a KEYCODE_DPAD_UP key event, not touchpad motion, so keep a keycode provider (centre slot only) and treat the motion provider as other-device; the rows need a screen either way (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 | From b9f2c0dab2a3f260a26b0fe6731d8ee5ed45ddc6 Mon Sep 17 00:00:00 2001 From: Daniel JB Clark Date: Mon, 21 Sep 2026 09:33:41 -0400 Subject: [PATCH 4/5] docs(spec): correct D7: the Elite delivers key-surface swipes as touchpad motion with Scroll Assistant on The previous D7 attributed a synthetic KEYCODE_DPAD_UP to a flick. It was a drag in Unihertz's double-tap Cursor Assistant mode. A real flick, tested end to end today, reaches the IME's focused decor view as SOURCE_TOUCHPAD motion from the touchPad device, but only while Scroll Assistant is on; with it off nothing arrives. Eleven flicks were accepted and all three thirds reached once the boundaries came from the device's X range. Natural flicks cover 280 to 470 px, so the default 500 px threshold rejects most of them. Record the corrected fact, fix section 3.2, and propose keeping the native provider (#11, #14). Co-Authored-By: Claude Fable 5.1 Signed-off-by: Daniel JB Clark --- docs/spec/trackpad-caret-nav.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/spec/trackpad-caret-nav.md b/docs/spec/trackpad-caret-nav.md index eab0d166..a4581fcc 100644 --- a/docs/spec/trackpad-caret-nav.md +++ b/docs/spec/trackpad-caret-nav.md @@ -278,7 +278,7 @@ The caret badge (section 4) needs the same permission and benefits from the same | 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) an up-swipe on the key surface reaches the focused app and the IME as a synthetic key event: KEYCODE_DPAD_UP, scanCode 19 (equal to the keycode, not the kernel scancode), deviceId of the `touchPad` device, source KEYBOARD (0x101), repeat 0, down then up. A down-swipe is KEYCODE_DPAD_DOWN, scanCode 20. The synthesis happens in system_server (log tags `A85ShortcutFunction`, `AguiKeyboardShortcut`) with Scroll Assistant off. In the same session no SOURCE_TOUCHPAD motion event reached the IME's focused decor view, and `dumpsys input` shows the reader mapping the device with a touch mapper in DIRECT mode bound to the display. | logcat and `dumpsys input`, 2026-09-21 (brobata/physiboard#11) | +| 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 @@ -294,9 +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 swipe arrives as KEYCODE_DPAD_UP from the `touchPad` device (D7), so the - native provider's motion listener never fires there; a keycode path like the swipe-to-delete - `titan2_keycode` provider is the one that can work, and it cannot know the third. +- 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). @@ -1036,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; the capture (D7, brobata/physiboard#11) shows the Elite delivers the swipe as a KEYCODE_DPAD_UP key event, not touchpad motion, so keep a keycode provider (centre slot only) and treat the motion provider as other-device; the rows need a screen either way (settings-catalog.md section 13) | +| 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 | From c98cc59355f1ea1b4fbab9c1d6d28b532d2cf44f Mon Sep 17 00:00:00 2001 From: Daniel JB Clark Date: Mon, 21 Sep 2026 09:44:12 -0400 Subject: [PATCH 5/5] docs(spec): fold swipe-to-delete into the Keyboard swipe screen row swipe_to_delete has the same gap as the up-swipe: off by default with no screen since 1.0.2, and a 500 px distance that measured left flicks on the Elite (170 to 680 px) mostly fail. Put its two rows on the same proposed screen and take it out of the undecided bucket. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Daniel JB Clark --- docs/spec/settings-catalog.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/spec/settings-catalog.md b/docs/spec/settings-catalog.md index 51441080..f142d967 100644 --- a/docs/spec/settings-catalog.md +++ b/docs/spec/settings-catalog.md @@ -1195,8 +1195,8 @@ Each is a JVM test over an in-memory preference store and the asset text. | 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 | | 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`) | Keep, with a screen, if trackpad-caret-nav.md keeps the native provider: Keyboard > "Keyboard swipe", an enable switch, an add-word switch and a distance slider | Since 1.0.2 nothing reachable turns the gesture on (trackpad-caret-nav.md section 3.2), so no 2.x user has exercised the native provider on the Elite; brobata/physiboard#11 tracks the capture that decision needs | -| Rows with no screen in 2.x: bounce keys, overlapping keys, tap latches, accessibility rows, French spacing, swipe-to-delete, `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 | +| 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 |