GPD Pocket 4: out-of-the-box touchscreen rotation, autorotation, and boot orientation #9032
Replies: 10 comments
|
Correction / appendix to §3 — the Limine menu itself CAN be rotated Limine ≥ v10 supports On this machine (Limine 12.6.0, So the complete rotation story for the GPD Pocket 4 is:
For an |
|
Addendum — §4: Fingerprint sensor (FocalTech FT9362, USB The fingerprint reader is the last piece that needs hardware-specific work on the GPD Pocket 4. Current state and a working solution: Situation
Arch-specific blocker The blob imports six libgusb symbols under the old version node Solution: version-node shim I published a small shim that defines a patchelf --add-needed libfpgusb-compat.so libfprint-2.so.2.0.0The repo includes a complete For an The blob itself can't be shipped (unfree, DMCA-tainted source), but Omarchy could ship or reference:
|
|
Implementation notes for the integrator + verification checklist Consolidating the remaining findings from getting this machine fully working, since they materially affect anyone building 1. Touch transform: set it explicitly, don't rely on output-binding inheritanceHyprland #3538 documents that a touch device bound via hl.device({ name = "nvtk0603:00-0603:f001", output = "eDP-1", transform = 3 })The integrator should always write the explicit transform (and update monitor + touch transforms together in the rotation daemon). 2. Runtime rotation must use
|
|
§5: On-screen keyboard + touch gestures (tablet-mode usability) For a convertible integrator, the OSK story matters as much as rotation. Findings from daily-driving this unit:
|
|
Addendum to the fingerprint section — on-device template DB quirk The FT9362 keeps enrolled templates in its own on-device NVM, and fprintd-side deletion ( Working sequence when this hits: fprintd-delete $USER -f <finger>
fprintd-verify # fails with "NoEnrolledPrints" — but the claim purges the orphan device template
fprintd-enroll -f <finger> # now succeedsWorth handling (or at least documenting) in whatever packaging/integrator flow lands for this device. |
|
Addendum — two-finger scrolling on the touchscreen (tablet-mode experience) With touch mapping and autorotation working (§1, §2), the last missing piece of the touchscreen experience is scrolling: Hyprland pointer-emulates touchscreen input, so finger drags move the cursor instead of scrolling — apps never see scrollable touch. This is a compositor limitation, not a driver one:
Solution: a small userspace daemon — https://github.com/ekollof/hyprland-touchscroll (MIT, Python stdlib only). It reads the touchscreen's raw evdev stream, detects two-finger drags, and injects fractional Notable digitizer quirks it works around (NVTK0603 on this unit):
Two integration details worth copying:
Setup (udev uaccess rule for |
|
Addendum to the scrolling section — the daemon has matured Two updates to https://github.com/ekollof/hyprland-touchscroll since the comment above:
This completes the touchscreen story for the |
|
Upstreamed the core of this proposal as #9160 — the What was left out, and why:
|
|
§5/scroll addendum — solved properly, in-compositor: omarchy-osk Since the upstreaming comment deferred two-finger touch scrolling pending a hyprgrass AUR entry: that whole block now has a better answer. I built a compositor plugin that owns the touchscreen experience end to end (touch→pointer emulation, two-finger scrolling, and the on-screen keyboard), and it retires the userspace scroll daemon from the earlier addendum:
|
|
Correction to the §2 Two things in the copy-paste example were wrong on current Hyprland / PyGObject:
This is the same fix as in #9160 ( |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Omarchy 4.0.1 on a GPD Pocket 4 needs three hardware-specific tweaks to be fully usable. All three are verified working on kernel 7.1.9-arch1-2 / Hyprland 0.56.2. Since Omarchy already ships device integrators (e.g.
omarchy hw dell xps haptic touchpad), I'd like to propose anomarchy hw gpd pocket 4integration covering them.Hardware: 8.8" 1600x2560 portrait panel mounted landscape (used at Hyprland
transform 3, scale 2), NVTK0603 I2C touchscreen (nvtk0603:00-0603:f001), mxc4005 accelerometer, Limine bootloader with LUKS.1. Touchscreen coordinate rotation
Touch events work but the digitizer frame is unrotated relative to the landscape display, so touch lands 90° off. Fix in
~/.config/hypr/input.lua:The
transformmust match the monitor transform (also documented on the ArchWiki GPD Pocket 4 page).2. Autorotation
The mxc4005 accelerometer is detected by the kernel, but
iio-sensor-proxyis not installed, so nothing bridges it to the session. After installing it, a small user daemon (claims the accelerometer on the system bus and followsAccelerometerOrientation→hyprctl evalmonitor + touch transforms) provides full rotation, including keeping the touch transform in sync with the monitor.Important calibration note: on this unit, laptop mode reports
right-up, notnormalas the ArchWiki GPD Pocket 4 page claims — the orientation→transform mapping had to be shifted 90°:normal→0, left-up→1, bottom-up→2, right-up→3. A generic integrator should treat this mapping as per-unit calibration (or detect the laptop orientation once at first run).autorotate.py+ systemd user unit (as running on this machine)3. Boot console / LUKS prompt orientation
Without kernel params the initramfs LUKS prompt and TTYs render sideways (panel is physically portrait). Fix via
/etc/default/limine+limine-update:fbcon=rotate:1= 90° clockwise (per kernel fbcon docs), matching the panel mounting → fixes the text LUKS prompt and TTYsvideo=eDP-1:panel_orientation=right_side_upsets the DRM panel-orientation property → covers plymouth/DRM-based renderers. Hyprland ignores the property, so there's no double rotation in the session.Proposal
Add an
omarchy hw gpd pocket 4command (or a generic autorotate feature with per-device orientation calibration) that applies:omarchy pkg add iio-sensor-proxy+ the rotation user service from §2Debug log (
omarchy debug --no-sudo --print) available on request.All reactions