[idd] all: add default refresh rate setting support

This commit is contained in:
Geoffrey McRae
2026-06-02 19:17:27 +10:00
committed by Geoffrey McRae
parent c2add993ac
commit 65005c0dc0
7 changed files with 36 additions and 12 deletions

View File

@@ -46,6 +46,7 @@ struct LGPipeMsg
{ {
uint32_t width; uint32_t width;
uint32_t height; uint32_t height;
uint32_t refresh;
} }
displayMode; displayMode;
}; };

View File

@@ -202,7 +202,7 @@ void CIndirectDeviceContext::OnAssignSwapChain()
if (m_doSetMode) if (m_doSetMode)
{ {
m_doSetMode = false; m_doSetMode = false;
g_pipe.SetDisplayMode(m_setMode.width, m_setMode.height); //FIXME: refresh g_pipe.SetDisplayMode(m_setMode.width, m_setMode.height, m_setMode.refresh);
} }
} }
@@ -300,7 +300,7 @@ void CIndirectDeviceContext::SetResolution(int width, int height)
{ {
m_setMode.width = width; m_setMode.width = width;
m_setMode.height = height; m_setMode.height = height;
m_setMode.refresh = 120; //FIXME m_setMode.refresh = g_settings.GetDefaultRefresh();
m_setMode.preferred = true; m_setMode.preferred = true;
g_settings.SetExtraMode(m_setMode); g_settings.SetExtraMode(m_setMode);

View File

@@ -162,15 +162,16 @@ void CPipeServer::SetCursorPos(uint32_t x, uint32_t y)
WriteMsg(msg); WriteMsg(msg);
} }
void CPipeServer::SetDisplayMode(uint32_t width, uint32_t height) void CPipeServer::SetDisplayMode(uint32_t width, uint32_t height, uint32_t refresh)
{ {
if (!m_connected) if (!m_connected)
return; return;
LGPipeMsg msg; LGPipeMsg msg;
msg.size = sizeof(msg); msg.size = sizeof(msg);
msg.type = LGPipeMsg::SETDISPLAYMODE; msg.type = LGPipeMsg::SETDISPLAYMODE;
msg.displayMode.width = width; msg.displayMode.width = width;
msg.displayMode.height = height; msg.displayMode.height = height;
msg.displayMode.refresh = refresh;
WriteMsg(msg); WriteMsg(msg);
} }

View File

@@ -54,7 +54,7 @@ class CPipeServer
void DeInit(); void DeInit();
void SetCursorPos(uint32_t x, uint32_t y); void SetCursorPos(uint32_t x, uint32_t y);
void SetDisplayMode(uint32_t width, uint32_t height); void SetDisplayMode(uint32_t width, uint32_t height, uint32_t refresh);
}; };
extern CPipeServer g_pipe; extern CPipeServer g_pipe;

View File

@@ -166,6 +166,26 @@ bool CSettings::GetExtraMode(DisplayMode& mode)
return ParseModeString(extraMode, mode); return ParseModeString(extraMode, mode);
} }
unsigned CSettings::GetDefaultRefresh() const
{
DWORD refresh = 60;
DWORD cb = sizeof(refresh);
HKEY hKey = nullptr;
LONG st = RegOpenKeyExW(HKEY_LOCAL_MACHINE, LGIDD_REGKEY, 0, KEY_QUERY_VALUE, &hKey);
if (st == ERROR_SUCCESS)
{
DWORD type = 0;
st = RegGetValueW(hKey, nullptr, L"DefaultRefresh", RRF_RT_REG_DWORD, &type, &refresh, &cb);
RegCloseKey(hKey);
}
if (st != ERROR_SUCCESS || refresh < 30 || refresh > 1000)
return 60;
return refresh;
}
bool CSettings::ReadModesValue(std::vector<std::wstring> &out) const bool CSettings::ReadModesValue(std::vector<std::wstring> &out) const
{ {
HKEY hKey = nullptr; HKEY hKey = nullptr;

View File

@@ -41,6 +41,7 @@ class CSettings
const DisplayModes& GetDisplayModes() { return m_displayModes; } const DisplayModes& GetDisplayModes() { return m_displayModes; }
void SetExtraMode(const DisplayMode & mode); void SetExtraMode(const DisplayMode & mode);
bool GetExtraMode(DisplayMode & mode); bool GetExtraMode(DisplayMode & mode);
unsigned GetDefaultRefresh() const;
private: private:
DisplayModes m_displayModes; DisplayModes m_displayModes;

View File

@@ -290,10 +290,11 @@ void CPipeClient::HandleSetCursorPos(const LGPipeMsg& msg)
void CPipeClient::HandleSetDisplayMode(const LGPipeMsg& msg) void CPipeClient::HandleSetDisplayMode(const LGPipeMsg& msg)
{ {
DEVMODE dm = {}; DEVMODE dm = {};
dm.dmSize = sizeof(dm); dm.dmSize = sizeof(dm);
dm.dmPelsWidth = msg.displayMode.width; dm.dmPelsWidth = msg.displayMode.width;
dm.dmPelsHeight = msg.displayMode.height; dm.dmPelsHeight = msg.displayMode.height;
dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; dm.dmDisplayFrequency = msg.displayMode.refresh;
dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY;
LONG result = ChangeDisplaySettingsEx(NULL, &dm, NULL, CDS_UPDATEREGISTRY, NULL); LONG result = ChangeDisplaySettingsEx(NULL, &dm, NULL, CDS_UPDATEREGISTRY, NULL);
if (result != DISP_CHANGE_SUCCESSFUL) if (result != DISP_CHANGE_SUCCESSFUL)