mirror of
https://github.com/gnif/LookingGlass.git
synced 2026-08-22 15:11:31 +00:00
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.
113 lines
3.7 KiB
C++
113 lines
3.7 KiB
C++
/**
|
|
* Looking Glass
|
|
* Copyright © 2017-2026 The Looking Glass Authors
|
|
* https://looking-glass.io
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the Free
|
|
* Software Foundation; either version 2 of the License, or (at your option)
|
|
* any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc., 59
|
|
* Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <windows.h>
|
|
#include <stdint.h>
|
|
|
|
#include "CPipeEndpoint.h"
|
|
#include "CClipboardChannel.h"
|
|
#include "CSRWLock.h"
|
|
#include "PipeMsg.h"
|
|
|
|
class CPipeClient : private IPipeEndpointHandler,
|
|
public IClipboardChannelDoorbell
|
|
{
|
|
private:
|
|
CPipeEndpoint m_endpoint;
|
|
CClipboardChannel m_clipboard;
|
|
CSRWLock m_clipboardSetupLock;
|
|
HANDLE m_clipboardMapping = nullptr;
|
|
uint64_t m_clipboardEpoch = 0;
|
|
uint64_t m_clipboardEpochCounter = 0;
|
|
uint64_t m_clipboardMappingId[2] = {};
|
|
uint64_t m_clipboardAuthorityId[2] = {};
|
|
bool m_clipboardEnabled = false;
|
|
CSRWLock m_displayLock;
|
|
|
|
CSRWLock m_displayModeLock;
|
|
HANDLE m_displayModeStop = nullptr;
|
|
HANDLE m_displayModeWake = nullptr;
|
|
HANDLE m_displayModeThread = nullptr;
|
|
LGPipeMsg m_displayMode = {};
|
|
uint64_t m_displayModeSerial = 0;
|
|
bool m_hasDisplayMode = false;
|
|
|
|
bool m_recoveryActive = false;
|
|
bool m_hasRecoveryStatus = false;
|
|
LGPipeMsg m_recoveryStatus = {};
|
|
|
|
void WriteMsg(const LGPipeMsg& msg);
|
|
|
|
bool SetActiveDesktop(bool quiet = false);
|
|
|
|
static DWORD WINAPI DisplayModeThreadProc(void * context);
|
|
void DisplayModeThread();
|
|
bool StartDisplayModeThread();
|
|
void StopDisplayModeThread();
|
|
bool ApplyDisplayMode(const LGPipeMsg& msg, LONG& result);
|
|
|
|
bool EnsureOnlyDisplayLocked(uint32_t * error = nullptr,
|
|
bool logResult = true);
|
|
uint32_t RestoreSavedTopologyLocked() const;
|
|
uint32_t RestoreLGTopologyLocked(bool logResult = true);
|
|
|
|
void HandleSetCursorPos(const LGPipeMsg& msg);
|
|
void HandleSetDisplayMode(const LGPipeMsg& msg);
|
|
void HandleGPUStatus(const LGPipeMsg& msg);
|
|
void HandleResolutionRejected(const LGPipeMsg& msg);
|
|
void HandleSetRecovery(const LGPipeMsg& msg);
|
|
bool PrepareClipboardMappingLocked();
|
|
void ResetClipboardSetupLocked();
|
|
|
|
void OnPipeConnected() override;
|
|
void OnPipeDisconnected() override;
|
|
bool ShouldReconnect() override;
|
|
bool PipeServerIsAuthorized(HANDLE pipe) override;
|
|
bool PipeClientHelloRequired() const override { return true; }
|
|
bool BuildPipeClientHello(void * message, size_t size) override;
|
|
bool OnPipeMessage(const void * message, size_t size) override;
|
|
|
|
public:
|
|
~CPipeClient() { DeInit(); }
|
|
|
|
static bool IsLGIddDeviceAttached();
|
|
|
|
bool Init();
|
|
void DeInit();
|
|
void SetClipboardMappingId(uint64_t high, uint64_t low)
|
|
{
|
|
m_clipboardMappingId[0] = high;
|
|
m_clipboardMappingId[1] = low;
|
|
}
|
|
bool IsRunning() { return m_endpoint.IsRunning(); }
|
|
|
|
CClipboardChannel& Clipboard() { return m_clipboard; }
|
|
void EnableClipboard() { m_clipboardEnabled = true; }
|
|
bool ClipboardKick(uint64_t epoch) override;
|
|
void ClipboardResetPeer(uint64_t epoch, uint32_t reason) override;
|
|
|
|
void ReloadSettings();
|
|
bool EnsureOnlyDisplay();
|
|
};
|
|
|
|
extern CPipeClient g_pipe;
|