Repository navigation
feat: GPUI native app on in-process Rust backend (patchops-core) - #53
boggedbrush wants to merge 17 commits into
Conversation
Restyle the GPUI client after the Electron renderer (theme tokens, nav, header, game directory bar, cards, activity log, Lucide icons), and have the native binary supervise a bundled PyInstaller backend. Package self-contained Linux/Windows archives and attach them to releases.
Extract PR #40's operations into a toolkit-independent patchops-core crate in a native/ workspace, replace the Python/HTTP supervisor with an in-process dispatcher that keeps the existing request/response shapes, port the September 2026 EXE build and T7 release-asset fixes from main, and ship native archives without Python.
Compositor blur is unavailable on current KWin and GNOME, so remove the backdrop model and its env hooks. Rounded client-side corners on X11 still use a transparent surface for the cut-outs.
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 51d74f1bf7
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| ROOT / "presets.json", | ||
| ROOT / "PatchOpsIII.ico", | ||
| ROOT / "website" / "assets" / "img" / "icon-512.png", | ||
| ROOT / "native" / "gpui" / "assets" / "icons" / "LICENSE-lucide.txt", |
There was a problem hiding this comment.
Add the required Lucide license file
This required path is not present anywhere in the repository, so every call to archive_manifest raises FileNotFoundError. Running python3 -m unittest scripts/test_gpui.py fails in PackagingTests.test_archive_contains_one_rust_executable_and_no_python_backend, and the new build workflow runs that test before building or uploading either native archive, blocking both CI and release jobs.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Fixed in 88377be: the root .gitignore *.txt rule was excluding the file; it's now explicitly un-ignored and committed. Verified packaging from a clean git archive export.
| )) | ||
| .child(quick_row( | ||
| "Refresh Rate", | ||
| self.number_control(cx, "refresh", "RefreshRate", 1, 1000), |
There was a problem hiding this comment.
Align the refresh-rate input with backend validation
For refresh rates from 241 through 1000, this control accepts the value and stages the operation, but config_input rejects RefreshRate above 240. This makes legitimate interaction with the newly advertised range end in a backend failure; use the same maximum in both layers or extend the core validation.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Fixed in 77d57ab: the control now uses 1–240, matching patchops-core, the Python backend and the Electron UI.
| .on_click(cx.listener(|view, _: &ClickEvent, window, cx| { | ||
| view.choose_directory("dump", window, cx) | ||
| })), |
There was a problem hiding this comment.
Allow the Enhanced browser to select DUMP.zip
When a user clicks Browse intending to select the advertised DUMP.zip source, this calls choose_directory, whose PathPromptOptions explicitly permits directories only. ZIP sources therefore cannot be selected through the browse workflow and require manual entry or drag-and-drop despite being presented as a supported browse source; use a file-capable picker for this action.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Fixed in 77d57ab: added a separate "Browse DUMP.zip" file picker next to "Browse Folder" (platform pickers can't offer files and folders in one dialog). Validate Source moved to its own row so the buttons fit at 800px.
Match the core/Python/Electron RefreshRate range (1-240) so the control no longer stages values the backend rejects, and add a file picker for the Enhanced dump source alongside the folder picker.
GPUI 0.2.2 requires a wl_seat, which weston's headless backend does not advertise; wlroots/sway always creates one. Detect the compositor's auto-named socket instead of assuming a fixed name.
The managed manifest stored a canonical game path but compared it with the caller's path verbatim, so Windows 8.3 short names, the \\?\ prefix, or a case difference made PatchOpsIII refuse its own DXVK install.
Summary
Makes the native GPUI app the primary PatchOpsIII desktop client, running on an in-process Rust backend (
patchops-core, extracted from the Tauri migration in #40). The result is one Rust process: no Chromium, no WebView, no Python, no HTTP. Electron and the Python backend are left untouched for now as the legacy fallback.Supersedes #52 (this branch includes its commit).
Changes
Rust backend (
native/core)native/Cargo workspace with a toolkit-independentpatchops-corecrate containing the operations ported in migrate(backend): operations into in-process Tauri Rust #40 (Steam, T7, DXVK, Enhanced, EXE swapper, file ops), with no Tauri dependency.native/gpui/src/backend.rsnow dispatches requests to the core in-process on a worker thread, keeping the existing request/JSON shapes, so the UI's calls are unchanged. The core also streams log and progress events to the UI.mainthat migrate(backend): operations into in-process Tauri Rust #40 was missing: the September 2026 Steam EXE build (fix(exe-swapper): recognize September 2026 Steam build #43) and versioned/renamed T7 release assets (fix(t7patch): resolve versioned release archive assets #46, fix(t7patch): discover renamed assets from latest release #47). Improve AppImage compatibility and update support #50 and fix(AppImage): Firejail launch and prepare v1.3.4 #51 only affect Electron's AppImage packaging.localconfig.vdf: formatting and rolling backup;native/core/src/enhanced.rs:243.Parity tests
scripts/gen_parity_fixtures.pyrecords what the Python backend onmaindoes on 31 hermetic fixture game directories.native/core/tests/parity.rschecks that the Rust core produces the same responses and resulting files. All 31 pass. The reference files were not edited to accept Rust behaviour, apart from a narrow allowlist for the DXVK adoption files (documented innative/core/tests/parity/RESULTS.md).GPUI frontend (
native/gpui)Packaging and CI
gpui-build.ymlchecks formatting, runs clippy with-D warnings, runs the core, parity and GPUI tests, builds release archives, and runs smoke tests on an X11 display (Xvfb) and on Wayland (headless Weston).gpui:build,gpui:build:releaseandgpui:runscripts inpackage.json. README and docs present GPUI as primary.Testing
Run locally on Linux (KDE Plasma 6, Wayland):
cargo fmt --all --check: passescargo clippy --locked --workspace --all-targets -- -D warnings: cleancargo test --locked --workspace: 100 core, 31 parity and 3 GPUI tests passpython3 -m unittest scripts/test_gpui.py: 8 passpython3 scripts/gen_parity_fixtures.py --check: the reference files are reproducible and currentNot yet verified / follow-ups
ext_background_effect_v1.