Monitors   A
last analyzed

Complexity

Total Complexity 24

Size/Duplication

Total Lines 93
Duplicated Lines 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
dl 0
loc 93
rs 10
c 3
b 0
f 0
wmc 24

6 Methods

Rating   Name   Duplication   Size   Complexity  
A __init__() 0 6 1
B update_monitors() 0 28 4
B get_monitor_at() 0 9 6
B update_display_modes() 0 32 6
A get_primary_monitor() 0 5 4
A _find_matching_mode() 0 7 3
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