Cogs.Core
Monitor.Linux.cpp
1#include "Monitor.h"
2
3#include "../Logging/Logger.h"
4
5#include "X11Module.h"
6#include "XineramaModule.h"
7
8#include <string>
9#include <vector>
10
11namespace {
13 std::vector<Cogs::Monitor> monitors;
14}
15
16void Cogs::Monitor::enumerate() {
17 monitors.clear();
18
19 X11Module& x11 = X11Module::instance();
20 ::Display* display = x11.XOpenDisplay(nullptr);
21 int screenCount = 0;
22 XineramaScreenInfo* screens = XineramaModule::instance().XineramaQueryScreens(display, &screenCount);
23
24 LOG_DEBUG(logger, "Enumerating monitors...");
25
26 monitors.resize(screenCount);
27 for (int idx = 0; idx < screenCount; ++idx) {
28 const XineramaScreenInfo* screen = screens + idx;
29 Monitor& monitor = monitors[idx];
30
31 monitor.identifier = reinterpret_cast<void*>(screen->screen_number);
32 monitor.name = std::to_string(screen->screen_number);
33 monitor.position = glm::ivec2(screen->x_org, screen->y_org);
34 monitor.size = glm::ivec2(screen->width, screen->height);
35
36 LOG_DEBUG(logger, "Monitor %d: %d,%d %dx%d.", screen->screen_number, screen->x_org, screen->y_org, screen->width, screen->height);
37
38 // This is nothing more than a guess...
39 if ((screen->x_org == 0) && (screen->y_org == 0)) {
40 monitor.primary = true;
41 }
42 }
43 x11.XFree(screens);
44 x11.XCloseDisplay(display);
45}
Log implementation class.
Definition: LogManager.h:140
constexpr Log getLogger(const char(&name)[LEN]) noexcept
Definition: LogManager.h:181