-
Notifications
You must be signed in to change notification settings - Fork 3
/
glfw_utilities.h
73 lines (53 loc) · 1.65 KB
/
glfw_utilities.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#ifndef GLC_GLFW_UTILITIES_H
#define GLC_GLFW_UTILITIES_H
#include "gl.h"
#define GLC_MAX(a, b) (((a) < (b)) ? (b) : (a))
#define GLC_MIN(a, b) (((b) < (a)) ? (b) : (a))
void glcCenterWindow(GLFWwindow *window, GLFWmonitor *monitor)
{
if (!monitor)
return;
const GLFWvidmode *mode = glfwGetVideoMode(monitor);
if (!mode)
return;
int monitorX, monitorY;
glfwGetMonitorPos(monitor, &monitorX, &monitorY);
int windowWidth, windowHeight;
glfwGetWindowSize(window, &windowWidth, &windowHeight);
glfwSetWindowPos(window,
monitorX + (mode->width - windowWidth) / 2,
monitorY + (mode->height - windowHeight) / 2);
}
GLFWmonitor* glcGetBestMonitor(GLFWwindow *window)
{
int monitorCount;
GLFWmonitor **monitors = glfwGetMonitors(&monitorCount);
if (!monitors)
return NULL;
int windowX, windowY, windowWidth, windowHeight;
glfwGetWindowSize(window, &windowWidth, &windowHeight);
glfwGetWindowPos(window, &windowX, &windowY);
GLFWmonitor *bestMonitor = NULL;
int bestArea = 0;
for (int i = 0; i < monitorCount; ++i)
{
GLFWmonitor *monitor = monitors[i];
int monitorX, monitorY;
glfwGetMonitorPos(monitor, &monitorX, &monitorY);
const GLFWvidmode *mode = glfwGetVideoMode(monitor);
if (!mode)
continue;
int areaMinX = GLC_MAX(windowX, monitorX);
int areaMinY = GLC_MAX(windowY, monitorY);
int areaMaxX = GLC_MIN(windowX + windowWidth, monitorX + mode->width);
int areaMaxY = GLC_MIN(windowY + windowHeight, monitorY + mode->height);
int area = (areaMaxX - areaMinX) * (areaMaxY - areaMinY);
if (area > bestArea)
{
bestArea = area;
bestMonitor = monitor;
}
}
return bestMonitor;
}
#endif