diff --git a/CMakeLists.txt b/CMakeLists.txt index 88e07948..42071614 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -671,6 +671,7 @@ elseif(WIN32) PRIVATE "dxgi" PRIVATE "wtsapi32" PRIVATE "powrprof" + PRIVATE "dxva2" ) if(USE_WIN_NTAPI) target_compile_definitions(libfastfetch PRIVATE FF_USE_WIN_NTAPI) diff --git a/src/detection/displayserver/displayserver_windows.c b/src/detection/displayserver/displayserver_windows.c index 988d790a..a7f0d9b7 100644 --- a/src/detection/displayserver/displayserver_windows.c +++ b/src/detection/displayserver/displayserver_windows.c @@ -1,8 +1,35 @@ #include "displayserver.h" #include "detection/os/os.h" +#include "util/mallocHelper.h" #include #include +#include +#include + +static WINBOOL enumMonitorProc(HMONITOR hMonitor, FF_UNUSED_PARAM HDC hDC, FF_UNUSED_PARAM LPRECT rc, LPARAM data) +{ + MONITORINFOEXW mi = { .cbSize = sizeof(mi) }; + DISPLAY_DEVICEW* displayDevice = (DISPLAY_DEVICEW *) data; + if(GetMonitorInfoW(hMonitor, (MONITORINFO *)&mi) && wcscmp(mi.szDevice, displayDevice->DeviceName) == 0) + { + DWORD arraySize; + if(GetNumberOfPhysicalMonitorsFromHMONITOR(hMonitor, &arraySize) && arraySize > 0) + { + PHYSICAL_MONITOR* FF_AUTO_FREE physicalMonitorArray = malloc(arraySize * sizeof(*physicalMonitorArray)); + if(GetPhysicalMonitorsFromHMONITOR(hMonitor, arraySize, physicalMonitorArray)) + { + DWORD minValue, currentValue, maxValue; + if(GetMonitorBrightness(physicalMonitorArray[0].hPhysicalMonitor, &minValue, ¤tValue, &maxValue)) + displayDevice->StateFlags = currentValue * 100 / maxValue; + + DestroyPhysicalMonitors(arraySize, physicalMonitorArray); + } + } + return FALSE; + } + return TRUE; +} void ffConnectDisplayServerImpl(FFDisplayServerResult* ds, const FFinstance* instance) { @@ -34,7 +61,10 @@ void ffConnectDisplayServerImpl(FFDisplayServerResult* ds, const FFinstance* ins if(EnumDisplaySettingsW(displayDevice.DeviceName, ENUM_CURRENT_SETTINGS, &devMode) == 0) continue; - ffdsAppendResolution(ds, devMode.dmPelsWidth, devMode.dmPelsHeight, devMode.dmDisplayFrequency, -1); + displayDevice.StateFlags = (DWORD) -1; + EnumDisplayMonitors(NULL, NULL, enumMonitorProc, (LPARAM)(void*) &displayDevice); + + ffdsAppendResolution(ds, devMode.dmPelsWidth, devMode.dmPelsHeight, devMode.dmDisplayFrequency, (int) displayDevice.StateFlags); } //https://github.com/hykilpikonna/hyfetch/blob/master/neofetch#L2067