Не могу понять как правильно отправлять запросы на XServer

Недавно начал разбираться с графическим интерфейсом Linux и попробовал написать код для взаимодействия с X-сервером. Подключение проходит успешно, но при отправке других запросов (например, DestroyWindow) получаю неожиданный ответ: в первых байтах ответа от сервера всегда 0.

Вот мой код:

import socket
import struct
import subprocess

SOCKET_FILE = "/tmp/.X11-unix/X0"

ROOT_WINDOW = 0x...

AUTH_PROTO = b"MIT-MAGIC-COOKIE-1"
AUTH_DATA = subprocess.run(["xauth", "list"], capture_output=True).stdout.split(AUTH_PROTO)[-1].strip().split()[-1]
AUTH_DATA = bytes.fromhex(AUTH_DATA.decode())

AUTH_PACKET = authentification_packet = struct.pack(
        "< B B H H H H H",
        0x6c,
        0x00,
        11,
        0,
        len(AUTH_PROTO),
        len(AUTH_DATA),
        0
    ) + AUTH_PROTO + b"\x00" * (3 - (len(AUTH_PROTO) % 4)) + AUTH_DATA + b"\x00" * (3 - (len(AUTH_DATA) % 4))

class XServerInterface:
    def __init__(self):
        self.XSocket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
        self.XSocket.connect(SOCKET_FILE)

    def init_connection(self):
        self.XSocket.send(AUTH_PACKET)

        response_bytes = self.XSocket.recv(8)
        if response_bytes[0] != 0x00 and not (response_full_length := struct.unpack('= B B H H H', response_bytes)[-1]) < 20:
            response_bytes += self.XSocket.recv(response_full_length)

            return response_bytes
        elif response_bytes[0] == 0x00:
            n = struct.unpack('= B B', response_bytes[:2])[-1]

            response_bytes += self.XSocket.recv(n)

            print(response_bytes)

            exit()

    def destroy_window(self, wid):
        packet = struct.pack('< B B H I', 0x03, 0x00, 0x0002, wid)

        self.XSocket.send(packet)

        response = self.XSocket.recv(32)
        if response[0] == 0x00:
            print(struct.unpack('= B B H 28B', response))

    def __del__(self):
        self.XSocket.close()

if __name__ == "__main__":
    a = XServerInterface()
    auth_response = a.init_connection()

    resource_id_base, resource_id_mask = struct.unpack('= B B H H H I I I', auth_response[:20])[6:]

    wid = 0x... # Пример окна

    a.destroy_window(wid)
    

Вот то что выводит в терминале:

(0, 255, 0, 0, 0, 0, 0, 0, 78, 5, 0, 0, 4, 8, 0, 1, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 0, 0, 0, 0)

Вот литература которой я пользовался во время написания этого кода(Больше всего пользовался статьёй из Хабра):

  1. https://dims.petrsu.ru/posob/X/literature.html
  2. https://habr.com/ru/articles/712376/
  3. https://www.x.org/releases/X11R7.6/doc/xproto/x11protocol.html

Ответы (0 шт):