Select the explicitly configured Android render node for nested KWin 6.8, apply OpenGL settings before Plasma starts, and pin the original signed Mesa 26.2.4 package that passed Thor rendering. Remove build-directory runtime search paths and fail closed on ELF inspection errors.
Native ARM64 build passed. Thor validated a visible nested Wayland terminal, active OpenGL ES/Zink on Turnip, 1280x720 output, and keyboard input. Mesa pin regression tests, launcher and ELF failure controls, shell syntax, and human authorship checks passed. Published desktop pin remains r2; full latest-head CI is pending and maintainer authorized this merge after device validation.
Match the native builder and desktop package override to Arch Linux ARM KWin 6.8.0, pin the official source hash, and port the nested-scaling patch. Check package/source version consistency in both build jobs.
Official source checksum, patch application, live package closure, and shell syntax verified. The published desktop remains pinned to r2; candidate 6.8 device/rendering validation remains pending before any package publication.
Combine trusted source and squash-metadata validation with the exact-head APK compilation result. Preserve automatic trailer cleanup in the installed hooks.
Validated with 10 authorship/hook tests and 9 combined-gate tests.
Install commit and push hooks that remove bot co-author trailers, preserve human credits, and reject bot primary authors. Add a trusted default-branch CI checker and publish its required status on the exact proposed commit. Validate main pushes as well. Ten regression tests pass, including real Git hook tests and the --no-verify case.
* feat: tools/device-smoke.sh checks a build on a real device over plain adb
Installs and launches the app, changes the density and the window size, cycles a foldable's device state, then reads the newest debug session (first frame, last frame rate, memory page size, process exits). It restores the display and the device state it changed. No python needed; complements tools/droiddeck-scenario, which drives games.
* fix: device-smoke.sh restores only what it changed and checks more carefully
Restore the device state by cancelling the override the script made, or
by putting back the override that was already pinned (a test lab pins
one), instead of pinning the committed state. Restore density and size
only after the script changed them. Keep adb's exit status, count only
crashes of the tested app and fail when the crash buffer cannot be read,
compare the top activity after the density change, and exit 2 when an
option value is missing.
* fix: check wm density/size exit statuses and keep restore flags on failure
* fix: verify smoke-test display changes and restoration
* fix: reject false smoke-test launches and quote remote paths
* Run final display cleanup before reporting smoke results
---------
Co-authored-by: ovurrsl <ovurrsl@users.noreply.github.com>
Co-authored-by: xXJsonDeruloXx <danielhimebauch@gmail.com>
On foldables the unfolded-screen controls panel hides whenever a
controller is connected (#829). Phones held in a telescopic controller
still want its trackpads and back grips, so a new setting under
"Controls on the unfolded screen" keeps the panel with a controller.
It is off by default and appears in the launcher settings and the
in-session menu while unfolded controls are on.
The visibility decision moves into SessionDisplay.unfoldedControlsWanted
with unit tests.
Closes#861
Co-authored-by: ovurrsl <ovurrsl@users.noreply.github.com>
Co-authored-by: xXJsonDeruloXx <danielhimebauch@gmail.com>
Track visibility on the activity display
Separate activity visibility from the compositor display so a powered external screen keeps the session visible when the handset is locked. Notify the service as the activity moves between displays and avoid reporting a removed host display before Android moves the activity.
The == STEP lines in session.log now read HH:MM:SS.mmm, so the setup
steps before Steam starts can be timed; with whole seconds most of them
showed the same time.
Co-authored-by: ovurrsl <ovurrsl@users.noreply.github.com>
Co-authored-by: xXJsonDeruloXx <danielhimebauch@gmail.com>
* fix(gamescope): avoid retaining pointer cursor SHM commits
* test(gamescope): verify cursor release and pending window control
* test(gamescope): keep live probe inert during test discovery
* test: match Gamescope process name in cursor probe
* test: clarify cursor-role probe serial behavior
---------
Co-authored-by: siyuan.qsy <siyuan.qsy@alibaba-inc.com>
Co-authored-by: xXJsonDeruloXx <danielhimebauch@gmail.com>
* a11y: give the button-like clickables a Button role for screen readers
33 clickable / combinedClickable modifiers on buttons, tiles, list rows and
rail items had no semantic role, so TalkBack could not announce them as
buttons. Pass role = Role.Button on those. Scrims and pointer-consuming
backdrops are left alone. No visual or focus change.
* a11y: expose selection state for the drawer tabs, driver rows and suggested icons
The three selectable items (drawer page tabs, driver radio rows, suggested app icons) were given a plain Button role. Use selectable with Role.Tab or Role.RadioButton and the selected value so a screen reader announces which one is chosen.
* a11y: the rail's top tabs expose selection to screen readers
The tab cells were plain buttons, so a screen reader could not tell which
section was open. Tabs use selectable with Role.Tab; the link cells keep
the Button role.
* fix: expose selected store header tabs
* Group selectable accessibility controls
---------
Co-authored-by: ovurrsl <ovurrsl@users.noreply.github.com>
Co-authored-by: xXJsonDeruloXx <danielhimebauch@gmail.com>
* feat: itch.io store, library and installs for DRM-free Windows builds (#1064)
* feat: add experimental SDK-free VITURE Pro 2 tracking
* docs: record full-app Pro 2 hardware validation
* docs: record successful Pro 2 user game test
* fix: translate Pro 2 tracking notice for all supported locales
* fix: respect model capabilities for glasses controls
* fix: handle fold configuration during glasses probe
---------
Co-authored-by: kingokksa <47888451+kingokksa@users.noreply.github.com>
Co-authored-by: xXJsonDeruloXx <danielhimebauch@gmail.com>
* feat: a custom Gradient theme with a primary and a secondary colour, picked with a wheel, sliders and a hex box
* Gradient theme: OK waits for a valid hex, deep blues are made paler, button text suits the worse gradient colour
* Gradient theme: nudge only the gradient colour that button text cannot read on
* fix: meet readable contrast across gradient themes
* fix: preserve contrast through gradient interpolation
---------
Co-authored-by: xXJsonDeruloXx <danielhimebauch@gmail.com>
fix: a third-party GitHub mirror can only serve downloads that carry a trusted digest
Downloads without an expected SHA-256 were still sent through gh-proxy,
ghfast and other mirrors, and the first answer was accepted, so a mirror
could swap an AppImage or a Windows component. Downloader.downloadFile
now tries only the original URL when there is no digest. UserApps passes
GitHub's own asset digest, and WinComponents passes the snapshot's
archive digest, so those large files keep their mirror fallback.
Co-authored-by: ovurrsl <ovurrsl@users.noreply.github.com>
Co-authored-by: Kurt Himebauch <136133082+xXJSONDeruloXx@users.noreply.github.com>
* Run FEX-tool games on the chosen game cores
Performance > Game cores reached only the Proton launchers: games started
through "Linux x86 (FEX)" ran on every core, including the slowest cluster.
* Test that SteamVR FEX launches keep the game cores
l10n(tr): translate the Storage page, GPU driver mode and other missing strings
Adds 213 strings and 9 plurals that were missing from values-tr, so the
new Storage page, GPU driver mode UI, SteamGridDB art, downloads source,
VR and latency toggles no longer fall back to English on Turkish devices.
Co-authored-by: ovurrsl <ovurrsl@users.noreply.github.com>
Description:
- Reject bulk delete while another operation is active. Check current operation state at action time, and clear operationJob on completion only when the finishing coroutine still owns it.
- Retain the requested Return directory even when it is unavailable, so Return can display the existing unavailable-directory message while browsing starts from the valid fallback.
- Observe cancellation during the recursive size scan before copying. Remove destination directories created by a cancelled copy, while preserving existing destination directories and ordinary copy-failure behavior.
- After a move's copy commits, finish deleting the source instead of reporting cancellation with both copies left behind. Preserve cancellation before copying and the existing copy-failure path.
- Log permission-restoration failures in staged copies and continue publishing the copied file.
- Exercise cancellation signals during transfers and size scans, directory cleanup, preservation of existing directories, and committed move completion without leftover staging entries.
Why it was needed:
- Overlapping operations could replace the tracked job, and an older completion could clear that reference, allowing navigation before the remaining work stopped.
- Cancellation could leave new partial directory trees or wait through the size scan. Late move cancellation could leave the source behind after publishing its replacement.
- A missing launch directory suppressed Return entirely, and a permission-restoration error could prevent an otherwise successful overwrite.
Validation:
- Debug Kotlin compilation passed with skipRust=true.
- Focused FileOps cancellation, copy, and link suites: 17 passed, 10 platform-dependent cases skipped on Windows, no failures.
- git diff --check passed.
Resolve File Manager conflicts with the upstream copy cancellation and symlink changes. Preserve the original navigation, confirmation, and localization commits. Pass cancellation into move cleanup and retain the upstream empty-file copy behavior.
Description:
- Pass the active coroutine job into copy, move, and delete operations so synchronous file I/O observes cancellation while it is running.
- Check for cancellation between copy chunks and recursive delete entries. Remove a newly created partial copy, and stage overwrites so cancelling a copy or move preserves the previous destination and move source.
- Add focused tests for cancelling a copy, move fallback, and recursive delete.
Why it was needed:
- Accept cancelled the Compose coroutine, but FileOps continued its synchronous I/O work. The confirmation could therefore wait for a large copy or delete to finish instead of stopping it.
- Copy and move must avoid replacing an existing destination with partial data when cancellation occurs.
Copy and move safeguards adapted from upstream commit a74ff3d6 (#1029).
Added and adjusted:
- Added cancellation checks between file transfer chunks and recursive delete entries, including single-file and batch operations.
- Adjusted FileManagerScreen to pass the active job to FileOps and check it during copy progress. Accept now waits for the file operation to stop before Exit, Return, or Back proceeds.
- Adjusted overwrite handling to use a temporary file so cancellation preserves the previous destination; an incomplete new destination is removed and a move source remains intact.
- Added tests for cancelling a new copy, a move fallback with an existing destination, and a recursive delete. The focused debug unit tests passed.
Localization already included on this branch:
- The earlier File Manager update added translations for Exit, Return to start, and the unavailable starting-folder message.
- It also translated the cancel-operation title and warning, plus the Accept and Decline buttons, across all 32 supported locale resource sets alongside the English defaults.
- These strings let localized users understand the navigation controls and the consequences of cancelling an in-progress operation. They were added in the preceding commit 7928effd; this commit makes Accept actually stop the file I/O.
Description:
- Ask for confirmation when Exit, Return to start, Android Back, or the parent-folder controls are used while a file operation is active.
- Accept cancels the active job and waits for it to finish before navigating; Decline keeps the File Manager open and lets the operation continue.
- Track single-file operations as jobs and handle Back from the file picker root through the same navigation guard.
- Translate the existing Exit, Return, and unavailable-folder labels plus the new confirmation dialog in all 32 supported locale resource sets.
Why it was needed:
- Leaving the File Manager while a batch copy, move, or delete is running cancels its composition-bound coroutine, which can stop the batch after only some files are processed without a clear result.
- The new File Manager controls previously appeared in English when the app was set to another supported language.
The component catalog also reads the linux-nightly release of
Droid-Deck/DroidDeck-Components (hourly builds of DXVK, VKD3D-Proton and
FEX for glibc Protons). That release holds all three components, so each
file goes to its list by name: DD-dxvk-, DD-vkd3d-proton-, DD-FEXCore-.
A nightly that matches a stable build (same flavor and version, e.g.
DD-dxvk-3.1.1+153-nightly and dxvk-3.1.1-linux) has no row of its own;
if two nightlies match, the newer one is used. On the components page
the stable row gets a Stable | Nightly switch before Get, styled like
the Get button, one focus stop that flips with A or a tap and reports
its state as a switch. In the in-session drawer's download menus the
row gets Stable and Nightly tabs beside it (the existing TabStrip, now
with optional bumpers/compact), each its own focus stop. Get or A on the
row downloads whichever channel is selected. A nightly without a stable
counterpart keeps its own row, listed below the stable ones.
Downloads are allowed from that repository's releases too. A failed
nightly download says the file may have been replaced and asks for a
refresh. Strings in all locales.
Description:
- Add an Exit button at the right end of the File Manager toolbar. It finishes the File Manager activity from any directory.
- Remember the directory supplied when Game files or Proton prefix opens the File Manager. Show a Return to start button in the toolbar for those launches, and use it to reopen that directory after the user switches storage locations or browses elsewhere.
- When returning, restore the starting storage root and close search or favorites views. Show a message if the starting directory is no longer available.
- Add accessible labels for both buttons while retaining the existing toolbar actions and File Manager styling.
Why it was needed:
- Exiting previously required repeatedly navigating back through directories to the original location.
- Switching from the game's initial directory to Internal storage offered no direct route back, leaving users to find the path manually through Linux system storage.
* perf: FEX's in-root path lookups go through the fast path instead of proot
Android has no openat2, so libblsession walks RESOLVE_IN_ROOT lookups for
FEX one component at a time. Every fstatat, readlinkat and openat in that
walk was a raw syscall that stopped in proot. When libblfastpath is loaded,
the walk now calls its fstatat, readlinkat and openat, which answer without
proot and fall back to the raw syscall themselves. Without it the walk uses
the raw syscalls as before.
One lookup drops from 250-940 us to 26-86 us. A Graveyard Keeper launch
makes 37.5k proot stops instead of 54.0k and reaches its first scene
0.31 s sooner.
* test: count fstatat64 where the preload asks for it
* perf: FEX's own file opens go through the fast path instead of proot
FEX opens host files for the game with syscall(SYS_openat), so every one
stopped in proot even when the fast path could answer it. libblsession's
syscall() now sends SYS_openat to the fast path's openat as well, the same
way the in-root walk does, and makes the raw syscall when the fast path is
not loaded.
A Graveyard Keeper launch makes 28.0k proot stops instead of 37.5k; FEX's
openat stops go from 6,739 to none.
* fix: the fast path's start-up reads don't come back through syscall()
libblsession's syscall() now sends SYS_openat to the fast path. A process
named FEX starts the fast path by reading /proc/self/cmdline with
syscall(SYS_openat), which came straight back into the fast path and
waited on its own pthread_once. Its start-up reads now call libc's
syscall directly.
A process's status read for another process is served read-only, so
Chromium's ReadOnlyFile check no longer kills the browser. Chromium-based
AppImages without chrome-sandbox get --no-sandbox, and Flathub Chromium and
Electron apps skip zypak's spawn portal, which cannot work here.