112 Display* display = XOpenDisplay(
nullptr);
114 std::cerr <<
"Error opening X display." << std::endl;
118 int screen = DefaultScreen(display);
119 Window root = RootWindow(display, screen);
121 XRRScreenResources* resources = XRRGetScreenResources(display, root);
123 ERROR_LOG <<
"Error getting screen resources.";
124 XCloseDisplay(display);
128 GdkDisplay* gdk_display = gdk_display_get_default();
129 int gdk_num_monitors = gdk_display_get_n_monitors(gdk_display);
130 DEBUG_LOG <<
"GDK Monitors: " << gdk_num_monitors;
132 for (
int i = 0; i < resources->noutput; ++i) {
133 XRROutputInfo* outputInfo =
134 XRRGetOutputInfo(display, resources, resources->outputs[i]);
135 XRRCrtcInfo* crtcInfo =
136 XRRGetCrtcInfo(display, resources, resources->crtcs[i]);
138 if (i < gdk_num_monitors) {
139 GdkMonitor* monitor = gdk_display_get_monitor(gdk_display, i);
140 scale = gdk_monitor_get_scale_factor(monitor) * 100;
142 if (outputInfo && crtcInfo) {
145 size_t mm_width = outputInfo->mm_width > 0
146 ? outputInfo->mm_width
147 : crtcInfo->width * 25.4 / 96.0;
148 size_t mm_height = outputInfo->mm_height > 0
149 ? outputInfo->mm_height
150 : crtcInfo->height * 25.4 / 96.0;
151 DEBUG_LOG <<
"Monitor " << i + 1 <<
":";
152 DEBUG_LOG <<
" Name: " << outputInfo->name;
153 DEBUG_LOG <<
" Connection: "
154 << (outputInfo->connection == RR_Connected
156 :
"Disconnected/Unknown");
157 DEBUG_LOG <<
" Physical Size (mm): " << mm_width <<
" x " << mm_height;
158 DEBUG_LOG <<
" Resolution: " << crtcInfo->width <<
" x "
160 DEBUG_LOG <<
" Scale: " <<
scale;
161 if (outputInfo->connection == RR_Connected && crtcInfo->width > 0 &&
162 crtcInfo->height > 0) {
164 crtcInfo->width, crtcInfo->height,
165 crtcInfo->width, crtcInfo->height,
scale});
168 XRRFreeOutputInfo(outputInfo);
169 XRRFreeCrtcInfo(crtcInfo);
172 XRRFreeScreenResources(resources);
173 XCloseDisplay(display);
176 EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, 0);
178 std::vector<DISPLAYCONFIG_PATH_INFO> paths;
179 std::vector<DISPLAYCONFIG_MODE_INFO> modes;
180 UINT32 flags = QDC_ONLY_ACTIVE_PATHS;
181 LONG isError = ERROR_INSUFFICIENT_BUFFER;
183 UINT32 pathCount, modeCount;
184 isError = GetDisplayConfigBufferSizes(flags, &pathCount, &modeCount);
188 paths.resize(pathCount);
189 modes.resize(modeCount);
192 isError = QueryDisplayConfig(flags, &pathCount, paths.data(), &modeCount,
193 modes.data(),
nullptr);
196 paths.resize(pathCount);
197 modes.resize(modeCount);
201 for (
int i = 0; i < paths.size(); i++) {
203 DISPLAYCONFIG_TARGET_DEVICE_NAME targetName = {};
204 targetName.header.adapterId = paths[i].targetInfo.adapterId;
205 targetName.header.id = paths[i].targetInfo.id;
206 targetName.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME;
207 targetName.header.size =
sizeof(targetName);
208 isError = DisplayConfigGetDeviceInfo(&targetName.header);
211 if (targetName.flags.friendlyNameFromEdid) {
212 std::wstring ws(targetName.monitorFriendlyDeviceName);
213 std::wstring ws1(targetName.monitorDevicePath);
214 DEBUG_LOG <<
"Monitor found: " << std::string(ws.begin(), ws.end())
215 <<
" - " << std::string(ws1.begin(), ws1.end());
225 CGDirectDisplayID displayArray[32];
226 uint32_t displayCount;
227 CGGetOnlineDisplayList(32, displayArray, &displayCount);
229 for (uint32_t i = 0; i < displayCount; ++i) {
230 CGDirectDisplayID displayID = displayArray[i];
231 CGSize displayPhysicalSize = CGDisplayScreenSize(displayID);
232 int width = CGDisplayModeGetWidth(CGDisplayCopyDisplayMode(displayID));
233 int height = CGDisplayModeGetHeight(CGDisplayCopyDisplayMode(displayID));
235 CGDisplayModeGetPixelWidth(CGDisplayCopyDisplayMode(displayID));
237 CGDisplayModeGetPixelHeight(CGDisplayCopyDisplayMode(displayID));
238 DEBUG_LOG <<
"Display " << i + 1 <<
":";
239 DEBUG_LOG <<
" Physical Size: " << displayPhysicalSize.width <<
"x"
240 << displayPhysicalSize.height <<
" mm";
241 DEBUG_LOG <<
" Resolution: " << width <<
"x" << height <<
" pixels";
242 DEBUG_LOG <<
" Pixel resolution: " << pixel_width <<
"x" << pixel_height
245 {std::to_string(i + 1),
static_cast<size_t>(displayPhysicalSize.width),
246 static_cast<size_t>(displayPhysicalSize.height),
247 static_cast<size_t>(width),
static_cast<size_t>(height),
248 static_cast<size_t>(pixel_width),
static_cast<size_t>(pixel_height),
258 {
"Dummy monitor", 340, 190, 1920, 1080, 1920, 1080, 100});
261 DEBUG_LOG <<
"Number of monitors: " << g_num_monitors;
262 DEBUG_LOG <<
"Monitor info:";
264 DEBUG_LOG <<
"Monitor: " << monitor.name <<
" " << monitor.width_mm <<
"x"
265 << monitor.height_mm <<
"mm " << monitor.width <<
"x"
266 << monitor.height <<
"DIP " << monitor.width_px <<
"x"
267 << monitor.height_px <<
"px " << monitor.scale <<
"%";