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