Cogs.Core
Monitor.cpp
1#include "Monitor.h"
2
3Cogs::Monitor::List Cogs::Monitor::monitors;
4
5size_t Cogs::Monitor::getCount() {
6 return monitors.size();
7}
8
9const Cogs::Monitor& Cogs::Monitor::get(size_t idx) {
10 return monitors[idx];
11}
12
13const Cogs::Monitor* Cogs::Monitor::findByName(const std::string& name) {
14 for (const Monitor& monitor : monitors) {
15 if (monitor.name == name) {
16 return &monitor;
17 }
18 }
19 return nullptr;
20}
21
22const Cogs::Monitor* Cogs::Monitor::findFromPoint(const glm::ivec2& point) {
23 for (const Monitor& monitor : monitors) {
24 glm::ivec2 br = monitor.position + monitor.size;
25
26 if ((monitor.position.x <= point.x) && (point.x < br.x) && (monitor.position.y <= point.y) && (point.y < br.y)) {
27 return &monitor;
28 }
29 }
30 return nullptr;
31}
32
33const Cogs::Monitor* Cogs::Monitor::findFromRect(const glm::ivec2& tl, const glm::ivec2& br) {
34 int bestIdx = -1;
35 int maxArea = 0;
36
37 for (int idx = 0, count = static_cast<int>(monitors.size()); idx < count; ++idx) {
38 const Monitor& monitor = monitors[idx];
39 glm::ivec2 monitorTL = monitor.position;
40 glm::ivec2 monitorBR = monitor.position + monitor.size;
41 int left = std::max(monitorTL.x, tl.x);
42 int top = std::max(monitorTL.y, tl.y);
43 int right = std::min(monitorBR.x, br.x);
44 int bottom = std::min(monitorBR.y, br.y);
45 int area = std::max(0, right - left) * std::max(0, bottom - top);
46
47 if (area > maxArea) {
48 maxArea = area;
49 bestIdx = idx;
50 }
51 }
52 return (bestIdx >= 0) ? &monitors[bestIdx] : nullptr;
53}
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:40