git.lucas.co / cce-compositor
Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git

commitb5820cad16e5688260004320a9852ac56c01efc9
parent9e5b92ade2
authorLucas Galante <[email protected]>
date2026-08-01 23:15
fix: skip Windows-path restore commands at session start

Wine/Proton windows record their Windows-side exe path (C:\... or
C:/...) as the saved cmdline; /bin/sh can never run those, so every
login after a wine session burned a silent no-op fork per entry
(Trackmania.exe and explorer.exe in practice). Skip them with a log
line instead.

Co-Authored-By: Claude Fable 5 <[email protected]>

 src/server/window_manager.rs | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/src/server/window_manager.rs b/src/server/window_manager.rs
index 824c501..bad0306 100644
--- a/src/server/window_manager.rs
+++ b/src/server/window_manager.rs
@@ -742,6 +742,24 @@ impl WindowManager {
         std::thread::spawn(move || {
             let mut spawned_any = false;
             for w in restored.into_iter() {
+                // A wine/Proton window records its WINDOWS-side exe path
+                // (C:\... or C:/...) as the command — /bin/sh can never run
+                // it, so each one burns a silent no-op fork per login. Skip
+                // them outright.
+                let cmd_trimmed = w.cmdline.trim();
+                let bytes = cmd_trimmed.as_bytes();
+                let is_windows_path = bytes.len() > 2
+                    && bytes[0].is_ascii_alphabetic()
+                    && bytes[1] == b':'
+                    && (bytes[2] == b'/' || bytes[2] == b'\\');
+                if is_windows_path {
+                    log::info!(
+                        "Skipping unrestorable Windows-path command for {:?}: {}",
+                        w.app_id,
+                        cmd_trimmed
+                    );
+                    continue;
+                }
                 if !w.cmdline.is_empty() {
                     // Small stagger so N clients don't all hit Vulkan device
                     // init at the same instant; restore matching and focus