1
|
|
|
|
2
|
|
|
import sdl2 as sdl |
3
|
|
|
|
4
|
|
|
|
5
|
|
|
class DisplayMode(object): |
6
|
|
|
def __init__(self): |
7
|
|
|
self.width = None |
8
|
|
|
self.height = None |
9
|
|
|
self.format = None |
10
|
|
|
self.refresh_rate = None |
11
|
|
|
|
12
|
|
|
|
13
|
|
|
class Monitor(object): |
14
|
|
|
def __init__(self): |
15
|
|
|
self.supportedModes = None |
16
|
|
|
self.displayMode = None |
17
|
|
|
self.primary = None |
18
|
|
|
|
19
|
|
|
# Current rect info |
20
|
|
|
self.right = None |
21
|
|
|
self.left = None |
22
|
|
|
self.bottom = None |
23
|
|
|
self.top = None |
24
|
|
|
|
25
|
|
|
self.id = None |
26
|
|
|
|
27
|
|
|
|
28
|
|
|
def _sdl2_mode_convert(sdlMode): |
29
|
|
|
mode = DisplayMode() |
30
|
|
|
|
31
|
|
|
# mode.format = sdlMode.format |
32
|
|
|
mode.width = sdlMode.w |
33
|
|
|
mode.height = sdlMode.h |
34
|
|
|
mode.refresh_rate = sdlMode.refresh_rate |
35
|
|
|
|
36
|
|
|
return mode |
37
|
|
|
|
38
|
|
|
|
39
|
|
|
def _sdl2_mode_init(): |
40
|
|
|
dispMode = sdl.SDL_DisplayMode() |
41
|
|
|
|
42
|
|
|
dispMode.format = sdl.SDL_PIXELFORMAT_UNKNOWN |
43
|
|
|
dispMode.w = 0 |
44
|
|
|
dispMode.h = 0 |
45
|
|
|
dispMode.refresh_rate = 0 |
46
|
|
|
|
47
|
|
|
return dispMode |
48
|
|
|
|
49
|
|
|
|
50
|
|
|
def _cmp_displ_modes(mode1, mode2): |
51
|
|
|
return (mode1.width == mode2.width and |
52
|
|
|
mode1.height == mode2.heigt and |
53
|
|
|
mode1.refresh_rate == mode2.refresh_rate and |
54
|
|
|
mode1.format == mode2.format) |
55
|
|
|
|
56
|
|
|
|
57
|
|
|
class Monitors(object): |
58
|
|
|
def __init__(self): |
59
|
|
|
self.monitors = None |
60
|
|
|
self.monitorCount = None |
61
|
|
|
self.displayModes = [] |
62
|
|
|
self.update_monitors() |
63
|
|
|
self.update_display_modes() |
64
|
|
|
|
65
|
|
|
def _find_matching_mode(self, mode): |
66
|
|
|
modeMatch = None |
67
|
|
|
for dispMode in self.displayModes: |
68
|
|
|
if _cmp_displ_modes(dispMode, mode): |
69
|
|
|
modeMatch = dispMode |
70
|
|
|
break |
71
|
|
|
return modeMatch |
72
|
|
|
|
73
|
|
|
def update_display_modes(self): |
74
|
|
|
'''Re-aquire display mode data from sdl2''' |
75
|
|
|
for dis in self.monitors: |
76
|
|
|
modeCount = sdl.SDL_GetNumDisplayModes(dis.id) |
77
|
|
|
dis.supportedModes = [] |
78
|
|
|
|
79
|
|
|
for modeID in range(modeCount): |
80
|
|
|
|
81
|
|
|
dispMode = _sdl2_mode_init() |
82
|
|
|
|
83
|
|
|
sdl.SDL_GetDisplayMode(dis.id, modeID, dispMode) |
84
|
|
|
|
85
|
|
|
mode = _sdl2_mode_convert(dispMode) |
86
|
|
|
|
87
|
|
|
for disMode in self.displayModes: |
88
|
|
|
if _cmp_displ_modes(disMode, mode): |
89
|
|
|
dis.supportedModes.append(disMode) |
90
|
|
|
continue |
91
|
|
|
else: |
92
|
|
|
dis.supportedModes.append(mode) |
93
|
|
|
self.displayModes.append(mode) |
94
|
|
|
|
95
|
|
|
if not self.displayModes: |
96
|
|
|
dis.supportedModes.append(mode) |
97
|
|
|
self.displayModes.append(mode) |
98
|
|
|
|
99
|
|
|
currDisplay = _sdl2_mode_init() |
100
|
|
|
|
101
|
|
|
sdl.SDL_GetCurrentDisplayMode(dis.id, currDisplay) |
102
|
|
|
|
103
|
|
|
currMode = _sdl2_mode_convert(currDisplay) |
104
|
|
|
dis.displayMode = self._find_matching_mode(currMode) |
105
|
|
|
|
106
|
|
|
def update_monitors(self): |
107
|
|
|
'''Re-aquire monitor data from sdl2''' |
108
|
|
|
|
109
|
|
|
self.monitorCount = sdl.SDL_GetNumVideoDisplays() |
110
|
|
|
|
111
|
|
|
monitors = [] |
112
|
|
|
|
113
|
|
|
for i in range(self.monitorCount): |
114
|
|
|
|
115
|
|
|
rect = sdl.SDL_Rect() |
116
|
|
|
sdl.SDL_GetDisplayBounds(i, rect) |
117
|
|
|
|
118
|
|
|
monitor = Monitor() |
119
|
|
|
monitor.id = i |
120
|
|
|
|
121
|
|
|
monitor.left = rect.x |
122
|
|
|
monitor.right = rect.x + rect.w |
123
|
|
|
monitor.top = rect.y |
124
|
|
|
monitor.bottom = rect.y + rect.h |
125
|
|
|
|
126
|
|
|
if monitor.left == 0 and monitor.top == 0: |
127
|
|
|
monitor.primary = True |
128
|
|
|
else: |
129
|
|
|
monitor.primary = False |
130
|
|
|
|
131
|
|
|
monitors.append(monitor) |
132
|
|
|
|
133
|
|
|
self.monitors = monitors |
134
|
|
|
|
135
|
|
|
def get_monitor_at(self, xPos, yPos): |
136
|
|
|
""" Returns a monitor based on a single point """ |
137
|
|
|
monitorFound = None |
138
|
|
|
for monitor in self.monitors: |
139
|
|
|
if xPos <= monitor.right and xPos >= monitor.left: |
140
|
|
|
if yPos <= monitor.bottom and yPos >= monitor.top: |
141
|
|
|
monitorFound = monitor |
142
|
|
|
|
143
|
|
|
return monitorFound |
144
|
|
|
|
145
|
|
|
def get_primary_monitor(self): |
146
|
|
|
'''Get the monitor located at 0 0. This is the primary.''' |
147
|
|
|
for monitor in self.monitors: |
148
|
|
|
if monitor.left == 0 and monitor.top == 0: |
149
|
|
|
return monitor |
150
|
|
|
|
151
|
|
|
# Currently not possible with sdl2 with the public api. |
152
|
|
|
# def set_monitor_defaults(self, monitor): |
153
|
|
|
# '''Switch monitor back to default display mode''' |
154
|
|
|
# mode = sdl.SDL_DisplayMode() |
155
|
|
|
# sdl.SDL_GetDesktopDisplayMode(monitor.id, mode) |
156
|
|
|
|