Add displayinfo_win.cpp — Windows display enumeration using Win32 API

This commit is contained in:
Zac Gaetano 2026-05-06 19:49:34 -04:00
parent d5de1a01c4
commit 7f5cc0d390

View file

@ -0,0 +1,63 @@
// src/wg/displayinfo_win.cpp — Windows implementation of display enumeration.
//
// Uses Win32 API: EnumDisplayMonitors, GetMonitorInfoW, EnumDisplayDevicesW, WideCharToMultiByte.
#include "displayinfo.h"
#ifdef _WIN32
#include <windows.h>
#include <string>
#include <vector>
namespace wg {
// UTF-16 to UTF-8 conversion helper.
static std::string wideToUtf8(const wchar_t *wide) {
if (!wide) return "";
int len = WideCharToMultiByte(CP_UTF8, 0, wide, -1, nullptr, 0, nullptr, nullptr);
if (len <= 0) return "";
std::string utf8(len - 1, '\0');
WideCharToMultiByte(CP_UTF8, 0, wide, -1, &utf8[0], len, nullptr, nullptr);
return utf8;
}
// Monitor enumeration callback.
static BOOL CALLBACK monitorEnumProc(HMONITOR hmon, HDC, LPRECT, LPARAM lParam) {
auto *displays = static_cast<std::vector<DisplayInfo> *>(reinterpret_cast<void *>(lParam));
MONITORINFOEX mi = {};
mi.cbSize = sizeof(mi);
if (!GetMonitorInfoW(hmon, &mi)) {
return TRUE; // Continue enumeration
}
// Get friendly device name via EnumDisplayDevicesW.
DISPLAY_DEVICEW dd = {};
dd.cb = sizeof(dd);
EnumDisplayDevicesW(mi.szDevice, 0, &dd, 0);
DisplayInfo info;
info.name = wideToUtf8(mi.szDevice);
info.friendlyName = wideToUtf8(dd.DeviceString);
if (info.friendlyName.empty()) {
info.friendlyName = info.name;
}
info.width = mi.rcMonitor.right - mi.rcMonitor.left;
info.height = mi.rcMonitor.bottom - mi.rcMonitor.top;
info.isPrimary = (mi.dwFlags & MONITORINFOF_PRIMARY) != 0;
displays->push_back(info);
return TRUE;
}
std::vector<DisplayInfo> enumerateDisplays() {
std::vector<DisplayInfo> displays;
EnumDisplayMonitors(nullptr, nullptr, monitorEnumProc,
reinterpret_cast<LPARAM>(&displays));
return displays;
}
} // namespace wg
#endif // _WIN32