From e59f4e7e45ea0f820b6bc42b6030a6fa639bad4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 5 Oct 2022 19:52:16 +0800 Subject: [PATCH] Resolution: add support for Windows --- CMakeLists.txt | 3 +- .../displayserver/displayserver_windows.c | 38 +++++++++++++++---- src/detection/wmtheme/wmtheme_linux.c | 2 +- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a57e34519..495d2794c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -311,7 +311,7 @@ if(WIN_MSYS) src/detection/bios/bios_windows.cpp src/detection/board/board_windows.cpp src/detection/os/os_linux.c - src/detection/gpu/gpu_linux.c + src/detection/gpu/gpu_windows.cpp src/detection/battery/battery_linux.c src/detection/displayserver/displayserver_windows.c src/detection/terminalfont/terminalfont_linux.c @@ -448,6 +448,7 @@ elseif(WIN_MSYS) PRIVATE "-lwbemuuid" PRIVATE "-lole32" PRIVATE "-loleaut32" + PRIVATE "-ldwmapi" ) endif() diff --git a/src/detection/displayserver/displayserver_windows.c b/src/detection/displayserver/displayserver_windows.c index 8427c7cb2..a990e2e82 100644 --- a/src/detection/displayserver/displayserver_windows.c +++ b/src/detection/displayserver/displayserver_windows.c @@ -1,14 +1,38 @@ #include "displayserver.h" +#include +#include + void ffConnectDisplayServerImpl(FFDisplayServerResult* ds, const FFinstance* instance) { FF_UNUSED(instance); - ffStrbufInitA(&ds->wmProcessName, 0); - ffStrbufInitA(&ds->wmPrettyName, 0); - ffStrbufInitA(&ds->wmProtocolName, 0); - ffStrbufInitA(&ds->deProcessName, 0); - ffStrbufInitA(&ds->dePrettyName, 0); - ffStrbufInitA(&ds->deVersion, 0); - ffListInitA(&ds->resolutions, sizeof(FFResolutionResult), 0); + BOOL enabled; + if(SUCCEEDED(DwmIsCompositionEnabled(&enabled)) && enabled == TRUE) + { + ffStrbufInitS(&ds->wmProcessName, "dwm.exe"); + ffStrbufInitS(&ds->wmPrettyName, "Desktop Window Manager"); + } + else + { + ffStrbufInitS(&ds->wmProcessName, "internal"); + ffStrbufInitS(&ds->wmPrettyName, "internal"); + } + ffStrbufInit(&ds->wmProtocolName); + ffStrbufInit(&ds->deProcessName); + ffStrbufInit(&ds->dePrettyName); + ffStrbufInit(&ds->deVersion); + ffListInit(&ds->resolutions, sizeof(FFResolutionResult)); + + DISPLAY_DEVICEW displayDevice = { .cb = sizeof(DISPLAY_DEVICEW) }; + for(DWORD devNum = 0; EnumDisplayDevicesW(NULL, devNum, &displayDevice, 0) != 0; ++devNum) + { + if(!(displayDevice.StateFlags & DISPLAY_DEVICE_ACTIVE)) + continue; + DEVMODEW devMode = { .dmSize = sizeof(DEVMODEW) }; + if(EnumDisplaySettingsW(displayDevice.DeviceName, ENUM_CURRENT_SETTINGS, &devMode) == 0) + continue; + + ffdsAppendResolution(ds, devMode.dmPelsWidth, devMode.dmPelsHeight, devMode.dmDisplayFrequency); + } } diff --git a/src/detection/wmtheme/wmtheme_linux.c b/src/detection/wmtheme/wmtheme_linux.c index 0650d2f4a..19765c79a 100644 --- a/src/detection/wmtheme/wmtheme_linux.c +++ b/src/detection/wmtheme/wmtheme_linux.c @@ -224,6 +224,6 @@ bool ffDetectWmTheme(FFinstance* instance, FFstrbuf* themeOrError) return detectOpenbox(instance, &wm->dePrettyName, themeOrError); ffStrbufAppendS(themeOrError, "Unknown WM: "); - ffStrbufAppend(themeOrError, &wm->dePrettyName); + ffStrbufAppend(themeOrError, &wm->wmPrettyName); return false; }