Skip to content

Release 2.5.4: login access to the display, Flatpak permission request, legacy fixes, GPL - #48

Merged
DXVSI merged 27 commits into
productionfrom
development
Nov 13, 2026
Merged

DXVSI merged 27 commits into
productionfrom
development

Conversation

@DXVSI

@DXVSI DXVSI commented Nov 13, 2026

Copy link
Copy Markdown
Owner

Release 2.5.4.

Yuna404 and others added 27 commits October 5, 2026 19:25
add nix support for tryx panorama manager
qmllint in Qt 6.12 reports an id that has the same name as a property of
the object it is assigned to (id-shadows-member). quick-check runs qmllint
with -W 0, so the Arch package build, which now gets Qt 6.12, failed on
five test doubles such as `controller: controller`. Name them with the Mock
suffix the other QML tests already use.
Build the flake added in #33 with a pinned install-nix-action and check
that its output has both binaries at the release version, the runtime, the
udev rules, the user unit pointing at the store path with KillMode=mixed,
and an ffmpeg with libx264 on the runtime's PATH. Tagged releases skip the
job, so a change in nixpkgs cannot block a release build.
Add the flake input and the NixOS configuration that enables the package,
its udev rules and the user service, based on the configuration the flake
contributor tested with a display.
The Panorama layout test has the same shadowing ids. Qt 6.12 qmllint did
not print its warnings when it linted all files together and only exited
with 255, so the first fix missed it. All QML files now lint clean with Qt
6.12 qmllint -W 0, and the QML tests pass under Qt 6.12.
Build the Nix flake in CI, document NixOS, fix qmllint on Qt 6.12
… code

Releases up to and including 2.5.3 stay under MIT. LICENSES/MIT.txt keeps that notice verbatim and every package installs it next to the GPL text.
The runtime closed the USB portal request after two minutes and then had no
device access until it was restarted. After boot the dialog is easily
missed: the runtime has no window, so the dialog is not attached to the app
and can open behind it. A user who found it later could not allow access
any more (#37).

The request now stays open until the user allows or denies access, while
the status keeps saying that a request is waiting in the portal. After two
minutes the runtime only logs acquire_still_pending once.
… v2.0.6

With a carousel of still images the display stops answering after half an hour to several hours, and only a power-off recovers it; one still image ran for more than 10 hours on the same setup (#37).
A Loop of two videos ran for more than 10 hours on the same Panorama SE firmware v2.0.6 where a still-image carousel stalled after 34 minutes (#37).
logind grants the seat ACL on the usbfs node a moment after login and emits no udev event for it. A runtime that started first saw permission-denied and waited for the next USB event, so the display stayed on "Waiting for Device" until a system update replayed udev events (#41).

While the only TRYX node is denied, the monitor watches its /dev/bus/usb directory, which reports attribute changes of its entries, and rechecks with a backoff from 1 to 30 s for up to 5 minutes.
The access rules matched only add and change events. The kernel sends a
bind event right after add, so the device's current tags lost uaccess, and
logind, which grants the seat ACL at login only to devices that still carry
the tag, skipped the display. Users outside the lp group then stayed in
permission-denied after every boot until some later change event, such as a
package update that reloads udev, granted the ACL.

Match every event except remove in both rule files, and make the package
check reject rules that narrow the action again.
The legacy ADB and media helpers built shell command strings for popen()
and system(). escape_shell_arg() left a line feed unquoted, so an argument
such as a file name could start another local command, and
quote_for_shell() put a literal backslash before '!' (#44).

Start adb and ffmpeg with posix_spawnp() and an argument vector instead.
Commands for the device shell behind `adb shell` are passed as one argument
with every word single-quoted. Device media names must be plain names
inside the media directory, and the reboot no longer goes through a shell
pipeline; it only runs when a TRYX serial is found.

A legacy cm01 handshake that got no usable reply was never retried, so the
display stayed disconnected until something reconnected it (#45). Retry it
up to three times, 300 ms apart, in Auto discovery and in the session, and
after a success that needed a retry wait for late replies and discard them
so the next command does not read one as its own.
Keep the Flatpak USB permission request open; document the Loop/Shuffle stall
Pick up USB access granted after the runtime started
The release keeps the uaccess tag on every udev event so logind grants the
seat ACL at login, notices access granted after the runtime started, keeps
the Flatpak USB permission request open, runs adb and ffmpeg without a shell
and retries the cm01 handshake, and moves the project to GPL-3.0-or-later.
Add the 2.5.4 entries to every changelog and the AppStream metadata, point
the README install commands at the new package names, and describe how to
apply the new udev rule without a reboot.
Keep the uaccess tag on every udev event
Run adb and ffmpeg without a shell; retry the legacy handshake
@DXVSI
DXVSI merged commit 7209a76 into production Nov 13, 2026
18 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants