Files
fastfetch/src/detection/monitor/monitor_windows.c
T

48 lines
1.6 KiB
C
Raw Normal View History

2023-08-09 16:31:24 +08:00
#include "monitor.h"
2023-08-08 23:19:22 +08:00
#include "common/io/io.h"
#include "util/edidHelper.h"
#include "util/stringUtils.h"
#include "util/windows/registry.h"
#include "util/windows/unicode.h"
#include <windows.h>
#include <setupapi.h>
#include <devguid.h>
static inline void wrapSetupDiDestroyDeviceInfoList(HDEVINFO* hdev)
{
if(*hdev)
SetupDiDestroyDeviceInfoList(*hdev);
}
2023-08-09 16:31:24 +08:00
const char* ffDetectMonitor(FFlist* results)
2023-08-08 23:19:22 +08:00
{
//https://learn.microsoft.com/en-us/windows/win32/power/enumerating-battery-devices
HDEVINFO hdev __attribute__((__cleanup__(wrapSetupDiDestroyDeviceInfoList))) =
SetupDiGetClassDevsW(&GUID_DEVCLASS_MONITOR, 0, 0, DIGCF_PRESENT);
if(hdev == INVALID_HANDLE_VALUE)
return "SetupDiGetClassDevsW(&GUID_DEVCLASS_MONITOR) failed";
SP_DEVINFO_DATA did = { .cbSize = sizeof(did) };
for (DWORD idev = 0; SetupDiEnumDeviceInfo(hdev, idev, &did); ++idev)
{
FF_HKEY_AUTO_DESTROY hKey = SetupDiOpenDevRegKey(hdev, &did, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_QUERY_VALUE);
if (!hKey) continue;
uint8_t edidData[256] = {};
if (!ffRegReadData(hKey, L"EDID", edidData, sizeof(edidData), NULL)) continue;
uint32_t width, height;
2023-08-09 13:25:22 +08:00
ffEdidGetPhysicalResolution(edidData, &width, &height);
2023-08-08 23:19:22 +08:00
if (width == 0 || height == 0) continue;
2023-08-09 16:31:24 +08:00
FFMonitorResult* display = (FFMonitorResult*) ffListAdd(results);
2023-08-08 23:19:22 +08:00
display->width = width;
display->height = height;
2023-08-09 10:52:12 +08:00
ffStrbufInit(&display->name);
ffEdidGetName(edidData, &display->name);
2023-08-09 13:25:22 +08:00
ffEdidGetPhysicalSize(edidData, &display->physicalWidth, &display->physicalHeight);
2023-08-08 23:19:22 +08:00
}
return NULL;
}