diff --git a/src/wg/displayinfo_win.cpp b/src/wg/displayinfo_win.cpp new file mode 100644 index 0000000..ac69297 --- /dev/null +++ b/src/wg/displayinfo_win.cpp @@ -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 +#include +#include + +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 *>(reinterpret_cast(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 enumerateDisplays() { + std::vector displays; + EnumDisplayMonitors(nullptr, nullptr, monitorEnumProc, + reinterpret_cast(&displays)); + return displays; +} + +} // namespace wg + +#endif // _WIN32