fix: cold start, double fallback add (#95)

This commit is contained in:
Nguyen Duy
2026-05-14 16:34:10 +07:00
parent 0d6ddcb24d
commit 7e98eb6638
+18 -4
View File
@@ -142,8 +142,16 @@ namespace ParsecVDisplay
// Runs on a background thread so the tray construction doesn't block. // Runs on a background thread so the tray construction doesn't block.
Task.Run(() => Task.Run(() =>
{ {
if (Vdd.Controller.WaitForReady(10000)) if (!Vdd.Controller.WaitForReady(10000))
RestoreDisplays(); return;
RestoreDisplays();
// Headless boot has no displays, so DisplaySettingsChanged never
// fires — meaning the fallback evaluator would never run. Kick
// it once explicitly so a fallback display gets added when the
// host comes up with zero physical monitors. (#95)
FallbackTimer?.Change(0, Timeout.Infinite);
}); });
Invoke(async () => Invoke(async () =>
@@ -316,12 +324,12 @@ namespace ParsecVDisplay
if (!Config.FallbackDisplay) return; if (!Config.FallbackDisplay) return;
if (Vdd.Controller.IsSuspended) return; if (Vdd.Controller.IsSuspended) return;
var parsecs = Vdd.Core.GetDisplays();
int physical = Vdd.Core.CountPhysicalDisplays(); int physical = Vdd.Core.CountPhysicalDisplays();
// Drop a stale tracked index if the user removed the display manually // Drop a stale tracked index if the user removed the display manually
if (FallbackDriverIndex >= 0) if (FallbackDriverIndex >= 0)
{ {
var parsecs = Vdd.Core.GetDisplays();
bool stillThere = false; bool stillThere = false;
foreach (var d in parsecs) foreach (var d in parsecs)
if (d.DisplayIndex == FallbackDriverIndex) { stillThere = true; break; } if (d.DisplayIndex == FallbackDriverIndex) { stillThere = true; break; }
@@ -329,7 +337,10 @@ namespace ParsecVDisplay
FallbackDriverIndex = -1; FallbackDriverIndex = -1;
} }
if (physical == 0 && FallbackDriverIndex < 0) // Only add a fallback when there is NO display of any kind — physical
// or virtual. Otherwise we'd double up when Restore or the user has
// already brought a Parsec display online.
if (physical == 0 && parsecs.Count == 0)
{ {
try try
{ {
@@ -340,6 +351,9 @@ namespace ParsecVDisplay
} }
else if (physical > 0 && FallbackDriverIndex >= 0) else if (physical > 0 && FallbackDriverIndex >= 0)
{ {
// Physical returned; remove only our auto-added fallback. User-
// added / restored displays stay (FallbackDriverIndex == -1
// means we didn't add them).
try { Vdd.Controller.RemoveDisplay(FallbackDriverIndex); } try { Vdd.Controller.RemoveDisplay(FallbackDriverIndex); }
catch { } catch { }
FallbackDriverIndex = -1; FallbackDriverIndex = -1;