diff --git a/CHANGELOG.md b/CHANGELOG.md index 8aedde98..681e2b45 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ See Git checking messages for full history. ## 10.0.0 (2024-xx-xx) - removed support for Python 3.8 - added support for Python 3.14 +- Linux: fixed a threadding issue in `.close()` when calling `XCloseDisplay()` (#251) +- Linux: minor optimization when checking for a X extension status (#251) - :heart: contributors: @ ## 9.0.2 (2024-09-01) diff --git a/src/mss/linux.py b/src/mss/linux.py index d357e3be..20f85507 100644 --- a/src/mss/linux.py +++ b/src/mss/linux.py @@ -329,6 +329,14 @@ def __init__(self, /, **kwargs: Any) -> None: self._handles.drawable = cast(self._handles.root, POINTER(Display)) def close(self) -> None: + # Clean-up + if self._handles.display: + with lock: + self.xlib.XCloseDisplay(self._handles.display) + self._handles.display = None + self._handles.drawable = None + self._handles.root = None + # Remove our error handler if self._handles.original_error_handler: # It's required when exiting MSS to prevent letting `_error_handler()` as default handler. @@ -339,24 +347,17 @@ def close(self) -> None: self.xlib.XSetErrorHandler(self._handles.original_error_handler) self._handles.original_error_handler = None - # Clean-up - if self._handles.display: - self.xlib.XCloseDisplay(self._handles.display) - self._handles.display = None - self._handles.drawable = None - self._handles.root = None - # Also empty the error dict _ERROR.clear() def _is_extension_enabled(self, name: str, /) -> bool: """Return True if the given *extension* is enabled on the server.""" - with lock: - major_opcode_return = c_int() - first_event_return = c_int() - first_error_return = c_int() + major_opcode_return = c_int() + first_event_return = c_int() + first_error_return = c_int() - try: + try: + with lock: self.xlib.XQueryExtension( self._handles.display, name.encode("latin1"), @@ -364,9 +365,9 @@ def _is_extension_enabled(self, name: str, /) -> bool: byref(first_event_return), byref(first_error_return), ) - except ScreenShotError: - return False - return True + except ScreenShotError: + return False + return True def _set_cfunctions(self) -> None: """Set all ctypes functions and attach them to attributes."""