[idd] helper: retry topology after desktop access failure
Some checks failed
build / client (Debug, map[cc:clang cxx:clang++], libdecor) (push) Has been cancelled
build / client (Debug, map[cc:clang cxx:clang++], xdg-shell) (push) Has been cancelled
build / client (Debug, map[cc:gcc cxx:g++], libdecor) (push) Has been cancelled
build / client (Debug, map[cc:gcc cxx:g++], xdg-shell) (push) Has been cancelled
build / client (Release, map[cc:clang cxx:clang++], libdecor) (push) Has been cancelled
build / client (Release, map[cc:clang cxx:clang++], xdg-shell) (push) Has been cancelled
build / client (Release, map[cc:gcc cxx:g++], libdecor) (push) Has been cancelled
build / client (Release, map[cc:gcc cxx:g++], xdg-shell) (push) Has been cancelled
build / module (push) Has been cancelled
build / host-linux (push) Has been cancelled
build / host-windows-cross (push) Has been cancelled
build / host-windows-native (push) Has been cancelled
build / idd (push) Has been cancelled
build / obs (clang) (push) Has been cancelled
build / obs (gcc) (push) Has been cancelled
build / docs (push) Has been cancelled

The interactive Helper can start when the console user token exists but
before WinSta0\Default is ready. SetDisplayConfig then returns
ERROR_ACCESS_DENIED while recovery exit caches the failure and keeps
topology enforcement suppressed.

Keep the recovery request pending while desktop access is transient.
Move the pipe worker to the input desktop and retry without caching
intermediate failures. Leave an exhausted access failure uncached so a
later replay can recover.

Restore the periodic enforcement timer and retry topology without
reapplying a display mode that Windows has already accepted.
This commit is contained in:
Geoffrey McRae
2026-08-21 01:02:10 +10:00
parent e2ee9244ed
commit 82c59cecf2
3 changed files with 238 additions and 57 deletions

View File

@@ -57,7 +57,7 @@ private:
void WriteMsg(const LGPipeMsg& msg);
void SetActiveDesktop();
bool SetActiveDesktop(bool quiet = false);
static DWORD WINAPI DisplayModeThreadProc(void * context);
void DisplayModeThread();
@@ -65,9 +65,10 @@ private:
void StopDisplayModeThread();
bool ApplyDisplayMode(const LGPipeMsg& msg, LONG& result);
bool EnsureOnlyDisplayLocked();
bool EnsureOnlyDisplayLocked(uint32_t * error = nullptr,
bool logResult = true);
uint32_t RestoreSavedTopologyLocked() const;
uint32_t RestoreLGTopologyLocked();
uint32_t RestoreLGTopologyLocked(bool logResult = true);
void HandleSetCursorPos(const LGPipeMsg& msg);
void HandleSetDisplayMode(const LGPipeMsg& msg);