From c7fc85e94395595d8428e9617f67046ee74138ff Mon Sep 17 00:00:00 2001 From: Nils Pukropp Date: Thu, 8 Oct 2026 10:25:04 +0200 Subject: [PATCH] fix(gui): create the state dir before the tray and app use it (B194) On a fresh install only the daemon and the CLI created ~/.local/state/proton-drive-linux. The app starts the tray before the first sign-in, so the tray failed to bind its single-instance socket and exited, and the Takeout page could not remember staged archives (#29). - gui: pdfs-tray and pdfs-app call AppDirs::ensure at start, which also makes the directories owner-only - docs: B194 in the bug ledger, changelog entry --- crates/pdfs-gui/src/app/main.rs | 5 +++++ crates/pdfs-gui/src/main.rs | 4 ++++ docs/BUGS.md | 27 ++++++++++++++++++++++++++- docs/CHANGELOG.md | 6 ++++++ 4 files changed, 41 insertions(+), 1 deletion(-) diff --git a/crates/pdfs-gui/src/app/main.rs b/crates/pdfs-gui/src/app/main.rs index e2b8a16..4fa54e7 100644 --- a/crates/pdfs-gui/src/app/main.rs +++ b/crates/pdfs-gui/src/app/main.rs @@ -303,6 +303,11 @@ fn build_window(app: &adw::Application) { return; } }; + // On a fresh install the daemon has not run yet to make these, and the + // Takeout page keeps its staged archives in the state dir (B194). + if let Err(e) = dirs.ensure() { + tracing::warn!("cannot create the app's directories: {e}"); + } let stack = adw::ViewStack::new(); let (login_page, login_widgets) = build_login_page(); diff --git a/crates/pdfs-gui/src/main.rs b/crates/pdfs-gui/src/main.rs index 3d7d2f6..27ae2d0 100644 --- a/crates/pdfs-gui/src/main.rs +++ b/crates/pdfs-gui/src/main.rs @@ -485,6 +485,10 @@ fn main() -> Result<()> { return Ok(()); } + // The socket lives in the state dir, which nothing has made yet when the app + // starts the tray on a fresh install (B194). + dirs.ensure().context("create the app's directories")?; + // Ensure only one instance of the tray runs. let tray_sock = dirs.tray_socket(); if std::os::unix::net::UnixStream::connect(&tray_sock).is_ok() { diff --git a/docs/BUGS.md b/docs/BUGS.md index a4de421..1317e94 100644 --- a/docs/BUGS.md +++ b/docs/BUGS.md @@ -47,7 +47,7 @@ original wording. it in the index in the same change. ```markdown -### B194 — What the user sees, in one line +### B195 — What the user sees, in one line **Status:** Open **Found:** 2026-10-06, how it was found @@ -214,6 +214,7 @@ a live account since. | Entry | Title | |---|---| +| [B194](#b194--on-a-fresh-install-the-tray-exits-and-the-takeout-page-cannot-remember-its-archives) | On a fresh install the tray exits and the Takeout page cannot remember its archives | | [B192](#b192--a-new-file-closed-empty-reaches-drive-only-half-a-minute-later) | A new file closed empty reaches Drive only half a minute later | | [B181](#b181--the-app-shows-a-queued-edit-kept-as-a-conflict-copy-in-english) | The app shows a queued edit kept as a conflict copy in English | | [B180](#b180--a-stop-waits-10-s-for-a-drain-worker-that-slept-through-it) | A stop waits 10 s for a drain worker that slept through it | @@ -296,6 +297,30 @@ a live account since. Newest first. +### B194 — On a fresh install the tray exits and the Takeout page cannot remember its archives + +**Status:** Fixed. +**Found:** 2026-10-07, in the log of [#29](https://github.com/narrrl/proton-drive-linux/issues/29): +`failed to bind tray single-instance socket: No such file or directory` and +`cannot remember staged Takeout archives: No such file or directory`. +**Where:** `crates/pdfs-gui/src/main.rs`, `build_window` in `crates/pdfs-gui/src/app/main.rs` + +**Repro:** Start `pdfs-app` with no `~/.local/state/proton-drive-linux`, as on a fresh install. The +tray is gone, and staging a Takeout archive logs the warning. + +**Cause.** Both write to the state directory, and only the daemon and the CLI made it +(`AppDirs::ensure`). The app starts the tray before the first sign-in, so before the daemon has +ever run. + +**Fix.** `pdfs-tray` and `pdfs-app` call `AppDirs::ensure` at start, which also makes the +directories owner-only (B6). + +**Verified:** 2026-10-08, `pdfs-tray` with `XDG_STATE_HOME`, `XDG_CONFIG_HOME` and +`XDG_CACHE_HOME` pointing at an empty directory. It exited with the error before the fix, and +afterwards ran with `tray.sock` in a `0700` state directory. + +--- + ### B193 — Deleting a file whose create failed can trash a file of the user's on Drive **Status:** Fixed (unverified). diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index bd8f5a9..5f33256 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -11,6 +11,12 @@ scratch (user data in `staging/` and `recovery/` is never touched by this). ## [Unreleased] +### Fixed +- **On a fresh install the tray icon did not start.** The tray and the app now create their state + directory themselves instead of waiting for the service to do it. This also lets the Takeout + page remember staged archives before the first mount. + ([#29](https://github.com/narrrl/proton-drive-linux/issues/29)) + ## [3.1.1] — 2026-10-07 Schema: **42**, unchanged.