From dcc7bffa74ffc2a4e3a88d727e848f6e55a0b666 Mon Sep 17 00:00:00 2001 From: Joshua Elsasser Date: Fri, 12 Sep 2025 14:48:12 -0600 Subject: [PATCH] Implement Window methods to set large property values. Similar to Window's get_full_property() and get_full_text_property(), change_full_property() and change_full_text_property() may be used to set an X11 property value which is too large for a single X11 request. --- Xlib/xobject/drawable.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/Xlib/xobject/drawable.py b/Xlib/xobject/drawable.py index f8e625f..94f79fe 100644 --- a/Xlib/xobject/drawable.py +++ b/Xlib/xobject/drawable.py @@ -435,6 +435,25 @@ def change_property(self, property, property_type, format, data, type = property_type, data = (format, data)) + def change_full_property(self, property, property_type, format, data, onerror = None): + maxlen = (self.display.info.max_request_length << 2) \ + - request.ChangeProperty._request.static_size + mode = X.PropModeReplace + if maxlen >= len(data): + self.change_property(property, property_type, format, + data, mode, onerror) + else: + off = 0 + self.display.grab_server() + try: + while off < len(data) - 1: + self.change_property(property, property_type, format, + data[off:off + maxlen], mode, onerror) + mode = X.PropModeAppend + off += maxlen + finally: + self.display.ungrab_server() + def change_text_property(self, property, property_type, data, mode = X.PropModeReplace, onerror = None): if not isinstance(data, bytes): @@ -445,6 +464,14 @@ def change_text_property(self, property, property_type, data, self.change_property(property, property_type, 8, data, mode=mode, onerror=onerror) + def change_full_text_property(self, property, property_type, data, onerror = None): + if not isinstance(data, bytes): + if property_type == Xatom.STRING: + data = data.encode(self._STRING_ENCODING) + elif property_type == self.display.get_atom('UTF8_STRING'): + data = data.encode(self._UTF8_STRING_ENCODING) + self.change_property(property, property_type, 8, data, onerror=onerror) + def delete_property(self, property, onerror = None): request.DeleteProperty(display = self.display, onerror = onerror,