Не могу понять как правильно отправлять запросы на 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)
Вот литература которой я пользовался во время написания этого кода(Больше всего пользовался статьёй из Хабра):
- https://dims.petrsu.ru/posob/X/literature.html
- https://habr.com/ru/articles/712376/
- https://www.x.org/releases/X11R7.6/doc/xproto/x11protocol.html