Skip to content

Commit 2b51323

Browse files
committed
Reworked all MSS._set_cfunctions()
1 parent a546e14 commit 2b51323

File tree

3 files changed

+130
-138
lines changed

3 files changed

+130
-138
lines changed

mss/darwin.py

Lines changed: 26 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -94,41 +94,36 @@ def _set_cfunctions(self):
9494
# type: () -> None
9595
""" Set all ctypes functions and attach them to attributes. """
9696

97-
def cfactory(func, argtypes, restype):
98-
# type: (str, List[Any], Any) -> None
99-
""" Factorize ctypes creations. """
100-
self._cfactory(
101-
attr=self.core, func=func, argtypes=argtypes, restype=restype
102-
)
103-
10497
uint32 = ctypes.c_uint32
10598
void = ctypes.c_void_p
10699
pointer = ctypes.POINTER
100+
cfactory = self._cfactory
101+
core = self.core
107102

108-
cfactory(
109-
func="CGGetActiveDisplayList",
110-
argtypes=[uint32, pointer(uint32), pointer(uint32)],
111-
restype=ctypes.c_int32,
112-
)
113-
cfactory(func="CGDisplayBounds", argtypes=[uint32], restype=CGRect)
114-
cfactory(func="CGRectStandardize", argtypes=[CGRect], restype=CGRect)
115-
cfactory(func="CGRectUnion", argtypes=[CGRect, CGRect], restype=CGRect)
116-
cfactory(func="CGDisplayRotation", argtypes=[uint32], restype=ctypes.c_float)
117-
cfactory(
118-
func="CGWindowListCreateImage",
119-
argtypes=[CGRect, uint32, uint32, uint32],
120-
restype=void,
121-
)
122-
cfactory(func="CGImageGetWidth", argtypes=[void], restype=int)
123-
cfactory(func="CGImageGetHeight", argtypes=[void], restype=int)
124-
cfactory(func="CGImageGetDataProvider", argtypes=[void], restype=void)
125-
cfactory(func="CGDataProviderCopyData", argtypes=[void], restype=void)
126-
cfactory(func="CFDataGetBytePtr", argtypes=[void], restype=void)
127-
cfactory(func="CFDataGetLength", argtypes=[void], restype=ctypes.c_uint64)
128-
cfactory(func="CGImageGetBytesPerRow", argtypes=[void], restype=int)
129-
cfactory(func="CGImageGetBitsPerPixel", argtypes=[void], restype=int)
130-
cfactory(func="CGDataProviderRelease", argtypes=[void], restype=void)
131-
cfactory(func="CFRelease", argtypes=[void], restype=void)
103+
# Note: keep it sorted
104+
for func, argtypes, restype in (
105+
("CGDataProviderCopyData", [void], void),
106+
("CGDisplayBounds", [uint32], CGRect),
107+
("CGDisplayRotation", [uint32], ctypes.c_float),
108+
("CFDataGetBytePtr", [void], void),
109+
("CFDataGetLength", [void], ctypes.c_uint64),
110+
("CFRelease", [void], void),
111+
("CGDataProviderRelease", [void], void),
112+
(
113+
"CGGetActiveDisplayList",
114+
[uint32, pointer(uint32), pointer(uint32)],
115+
ctypes.c_int32,
116+
),
117+
("CGImageGetBitsPerPixel", [void], int),
118+
("CGImageGetBytesPerRow", [void], int),
119+
("CGImageGetDataProvider", [void], void),
120+
("CGImageGetHeight", [void], int),
121+
("CGImageGetWidth", [void], int),
122+
("CGRectStandardize", [CGRect], CGRect),
123+
("CGRectUnion", [CGRect, CGRect], CGRect),
124+
("CGWindowListCreateImage", [CGRect, uint32, uint32, uint32], void),
125+
):
126+
cfactory(attr=core, func=func, argtypes=argtypes, restype=restype) # type: ignore
132127

133128
def _monitors_impl(self):
134129
# type: () -> None

mss/linux.py

Lines changed: 77 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -277,88 +277,104 @@ def _set_cfunctions(self):
277277
See https://tronche.com/gui/x/xlib/function-index.html for details.
278278
"""
279279

280-
def cfactory(func, argtypes, restype, attr=self.xlib):
281-
# type: (str, List[Any], Any, Any) -> None
282-
""" Factorize ctypes creations. """
283-
self._cfactory(
284-
attr=attr,
285-
errcheck=validate,
286-
func=func,
287-
argtypes=argtypes,
288-
restype=restype,
289-
)
290-
291280
void = ctypes.c_void_p
292281
c_int = ctypes.c_int
293282
uint = ctypes.c_uint
294283
ulong = ctypes.c_ulong
295284
c_long = ctypes.c_long
296285
char_p = ctypes.c_char_p
297286
pointer = ctypes.POINTER
287+
cfactory = self._cfactory
288+
xlib = self.xlib
289+
xrandr = self.xrandr
298290

299-
cfactory("XSetErrorHandler", [void], c_int)
300-
cfactory("XGetErrorText", [pointer(Display), c_int, char_p, c_int], void)
301-
cfactory("XOpenDisplay", [char_p], pointer(Display))
302-
cfactory("XDefaultRootWindow", [pointer(Display)], pointer(XWindowAttributes))
303-
cfactory(
304-
"XGetWindowAttributes",
305-
[pointer(Display), pointer(XWindowAttributes), pointer(XWindowAttributes)],
306-
c_int,
307-
)
308-
cfactory(
309-
"XGetImage",
310-
[
311-
pointer(Display),
312-
pointer(Display),
313-
c_int,
291+
# Note: keep it sorted
292+
for attr, func, argtypes, restype in (
293+
(
294+
xlib,
295+
"XDefaultRootWindow",
296+
[pointer(Display)],
297+
pointer(XWindowAttributes),
298+
),
299+
(xlib, "XDestroyImage", [pointer(XImage)], void),
300+
(xlib, "XGetErrorText", [pointer(Display), c_int, char_p, c_int], void),
301+
(
302+
xlib,
303+
"XGetImage",
304+
[
305+
pointer(Display),
306+
pointer(Display),
307+
c_int,
308+
c_int,
309+
uint,
310+
uint,
311+
ulong,
312+
c_int,
313+
],
314+
pointer(XImage),
315+
),
316+
(
317+
xlib,
318+
"XGetWindowAttributes",
319+
[
320+
pointer(Display),
321+
pointer(XWindowAttributes),
322+
pointer(XWindowAttributes),
323+
],
314324
c_int,
325+
),
326+
(xlib, "XOpenDisplay", [char_p], pointer(Display)),
327+
(
328+
xlib,
329+
"XQueryExtension",
330+
[
331+
pointer(Display),
332+
char_p,
333+
pointer(c_int),
334+
pointer(c_int),
335+
pointer(c_int),
336+
],
315337
uint,
316-
uint,
317-
ulong,
318-
c_int,
319-
],
320-
pointer(XImage),
321-
)
322-
cfactory("XDestroyImage", [pointer(XImage)], void)
323-
cfactory(
324-
"XQueryExtension",
325-
[pointer(Display), char_p, pointer(c_int), pointer(c_int), pointer(c_int)],
326-
uint,
327-
)
338+
),
339+
(xlib, "XSetErrorHandler", [void], c_int),
340+
(xrandr, "XRRFreeCrtcInfo", [pointer(XRRCrtcInfo)], void),
341+
(xrandr, "XRRFreeScreenResources", [pointer(XRRScreenResources)], void),
342+
(
343+
xrandr,
344+
"XRRGetCrtcInfo",
345+
[pointer(Display), pointer(XRRScreenResources), c_long],
346+
pointer(XRRCrtcInfo),
347+
),
348+
):
349+
cfactory(
350+
attr=attr,
351+
errcheck=validate,
352+
func=func,
353+
argtypes=argtypes,
354+
restype=restype,
355+
) # type: ignore
328356

329357
# A simple benchmark calling 10 times those 2 functions:
330358
# XRRGetScreenResources(): 0.1755971429956844 s
331359
# XRRGetScreenResourcesCurrent(): 0.0039125580078689 s
332360
# The second is faster by a factor of 44! So try to use it first.
333361
try:
334362
cfactory(
335-
"XRRGetScreenResourcesCurrent",
336-
[pointer(Display), pointer(Display)],
337-
pointer(XRRScreenResources),
338-
attr=self.xrandr,
363+
attr=xrandr,
364+
func="XRRGetScreenResourcesCurrent",
365+
errcheck=validate,
366+
argtypes=[pointer(Display), pointer(Display)],
367+
restype=pointer(XRRScreenResources),
339368
)
340369
except AttributeError:
341370
cfactory(
342-
"XRRGetScreenResources",
343-
[pointer(Display), pointer(Display)],
344-
pointer(XRRScreenResources),
345-
attr=self.xrandr,
371+
attr=xrandr,
372+
func="XRRGetScreenResources",
373+
errcheck=validate,
374+
argtypes=[pointer(Display), pointer(Display)],
375+
restype=pointer(XRRScreenResources),
346376
)
347-
self.xrandr.XRRGetScreenResourcesCurrent = self.xrandr.XRRGetScreenResources
348-
349-
cfactory(
350-
"XRRGetCrtcInfo",
351-
[pointer(Display), pointer(XRRScreenResources), c_long],
352-
pointer(XRRCrtcInfo),
353-
attr=self.xrandr,
354-
)
355-
cfactory(
356-
"XRRFreeScreenResources",
357-
[pointer(XRRScreenResources)],
358-
void,
359-
attr=self.xrandr,
360-
)
361-
cfactory("XRRFreeCrtcInfo", [pointer(XRRCrtcInfo)], void, attr=self.xrandr)
377+
xrandr.XRRGetScreenResourcesCurrent = xrandr.XRRGetScreenResources
362378

363379
def get_error_details(self):
364380
# type: () -> Optional[Dict[str, Any]]

mss/windows.py

Lines changed: 27 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -114,53 +114,34 @@ def _set_cfunctions(self):
114114

115115
void = ctypes.c_void_p
116116
pointer = ctypes.POINTER
117+
cfactory = self._cfactory
118+
gdi32 = self.gdi32
119+
user32 = self.user32
117120

118-
self._cfactory(
119-
attr=self.user32, func="GetSystemMetrics", argtypes=[INT], restype=INT
120-
)
121-
self._cfactory(
122-
attr=self.user32,
123-
func="EnumDisplayMonitors",
124-
argtypes=[HDC, void, self.monitorenumproc, LPARAM],
125-
restype=BOOL,
126-
)
127-
self._cfactory(
128-
attr=self.user32, func="GetWindowDC", argtypes=[HWND], restype=HDC
129-
)
130-
131-
self._cfactory(
132-
attr=self.gdi32, func="GetDeviceCaps", argtypes=[HWND, INT], restype=INT
133-
)
134-
self._cfactory(
135-
attr=self.gdi32, func="CreateCompatibleDC", argtypes=[HDC], restype=HDC
136-
)
137-
self._cfactory(
138-
attr=self.gdi32,
139-
func="CreateCompatibleBitmap",
140-
argtypes=[HDC, INT, INT],
141-
restype=HBITMAP,
142-
)
143-
self._cfactory(
144-
attr=self.gdi32,
145-
func="SelectObject",
146-
argtypes=[HDC, HGDIOBJ],
147-
restype=HGDIOBJ,
148-
)
149-
self._cfactory(
150-
attr=self.gdi32,
151-
func="BitBlt",
152-
argtypes=[HDC, INT, INT, INT, INT, HDC, INT, INT, DWORD],
153-
restype=BOOL,
154-
)
155-
self._cfactory(
156-
attr=self.gdi32, func="DeleteObject", argtypes=[HGDIOBJ], restype=INT
157-
)
158-
self._cfactory(
159-
attr=self.gdi32,
160-
func="GetDIBits",
161-
argtypes=[HDC, HBITMAP, UINT, UINT, void, pointer(BITMAPINFO), UINT],
162-
restype=BOOL,
163-
)
121+
# Note: keep it sorted
122+
for attr, func, argtypes, restype in (
123+
(gdi32, "BitBlt", [HDC, INT, INT, INT, INT, HDC, INT, INT, DWORD], BOOL),
124+
(gdi32, "CreateCompatibleBitmap", [HDC, INT, INT], HBITMAP),
125+
(gdi32, "CreateCompatibleDC", [HDC], HDC),
126+
(gdi32, "DeleteObject", [HGDIOBJ], INT),
127+
(gdi32, "GetDeviceCaps", [HWND, INT], INT),
128+
(
129+
gdi32,
130+
"GetDIBits",
131+
[HDC, HBITMAP, UINT, UINT, void, pointer(BITMAPINFO), UINT],
132+
BOOL,
133+
),
134+
(gdi32, "SelectObject", [HDC, HGDIOBJ], HGDIOBJ),
135+
(
136+
user32,
137+
"EnumDisplayMonitors",
138+
[HDC, void, self.monitorenumproc, LPARAM],
139+
BOOL,
140+
),
141+
(user32, "GetSystemMetrics", [INT], INT),
142+
(user32, "GetWindowDC", [HWND], HDC),
143+
):
144+
cfactory(attr=attr, func=func, argtypes=argtypes, restype=restype) # type: ignore
164145

165146
def _set_dpi_awareness(self):
166147
""" Set DPI aware to capture full screen on Hi-DPI monitors. """

0 commit comments

Comments
 (0)