Cogs.Core
Monitor.cpp
1#include "Monitor.h"
2
3Cogs::Monitor::List Cogs::Monitor::monitors;
4
5Cogs::Monitor::Monitor(const glm::ivec2& p, const glm::ivec2& s) : position(p), size(s) {
6}
7
8size_t Cogs::Monitor::getCount() {
9 return monitors.size();
10}
11
12const Cogs::Monitor& Cogs::Monitor::get(size_t idx) {
13 static Monitor dummy(glm::ivec2(40, 40), glm::ivec2(1200, 675));
14
15 if (idx < monitors.size()) {
16 return monitors[idx];
17 }
18 return dummy;
19}
20
21const Cogs::Monitor* Cogs::Monitor::findByName(const std::string& name) {
22 for (const Monitor& monitor : monitors) {
23 if (monitor.name == name) {
24 return &monitor;
25 }
26 }
27 return nullptr;
28}
29
30const Cogs::Monitor* Cogs::Monitor::findFromPoint(const glm::ivec2& point) {
31 for (const Monitor& monitor : monitors) {
32 glm::ivec2 br = monitor.position + monitor.size;
33
34 if ((monitor.position.x <= point.x) && (point.x < br.x) && (monitor.position.y <= point.y) && (point.y < br.y)) {
35 return &monitor;
36 }
37 }
38 return nullptr;
39}
40
41const Cogs::Monitor* Cogs::Monitor::findFromRect(const glm::ivec2& tl, const glm::ivec2& br) {
42 int bestIdx = -1;
43 int maxArea = 0;
44
45 for (int idx = 0, count = static_cast<int>(monitors.size()); idx < count; ++idx) {
46 const Monitor& monitor = monitors[idx];
47 glm::ivec2 monitorTL = monitor.position;
48 glm::ivec2 monitorBR = monitor.position + monitor.size;
49 int left = std::max(monitorTL.x, tl.x);
50 int top = std::max(monitorTL.y, tl.y);
51 int right = std::min(monitorBR.x, br.x);
52 int bottom = std::min(monitorBR.y, br.y);
53 int area = std::max(0, right - left) * std::max(0, bottom - top);
54
55 if (area > maxArea) {
56 maxArea = area;
57 bestIdx = idx;
58 }
59 }
60 return (bestIdx >= 0) ? &monitors[bestIdx] : nullptr;
61}
Helper class for enumerating available displays on the host computer.
Definition: Monitor.h:19
glm::ivec2 position
Position of this monitor in desktop coordinates.
Definition: Monitor.h:45