Вопрос
Я пытаюсь найти свойство NET_WM_NAME
для каждого окна / клиента, о котором сообщает X11.Проблема в том, что ничего не возвращается - количество элементов равно 0, а возвращаемые данные приводят к пустой строке.Я рассмотрел несколько примеров кода через github и примеры, написанные на C и C ++, в частности Почему XGetWindowProperty возвращает ноль? , а также Xlib XGetWindowProperty Нулевые элементы возвращали , однако я не могунайти, где проблема с моим кодом.Вроде бы все нормально, порядок параметров, передаваемых в функцию XGetWindowProperty
, соответствует документации , и функция возвращает статус успеха, но результаты пусты.Где проблема с моим кодом?
Код
Ниже приведен код, с которым я работаю.Проблема в xgetwindowproperty
функции.Другие части под ним работают нормально и предоставляются только для полноты.
#! /usr/bin/env python3
import sys
from ctypes import *
def xgetwindowproperty(display,w):
actual_type_return = c_ulong()
actual_format_return = c_int()
nitems_return = c_ulong()
bytes_after_return = c_ulong()
prop_return = POINTER(c_ubyte)()
wm_name = Xlib.XInternAtom(display,'_NET_WM_NAME',False)
utf8atom = Xlib.XInternAtom(display,'UTF8_STRING',False)
print('_NET_WM_NAME',wm_name, 'UTF8_STRING',utf8atom)
# AnyPropertyType = c_long(0)
status = Xlib.XGetWindowProperty(
display,
w,
wm_name,
0,
65536,
False,
utf8atom,
byref(actual_type_return),
byref(actual_format_return),
byref(nitems_return),
byref(bytes_after_return),
byref(prop_return)
)
print(nitems_return.value) # returns 0
# empty string as result
print( 'Prop', ''.join([ chr(c) for c in prop_return[:bytes_after_return.value] ]) )
Xlib.XFree(prop_return)
print('@'*10)
# -------
Xlib = CDLL("libX11.so.6")
display = Xlib.XOpenDisplay(None)
if display == 0:
sys.exit(2)
w = Xlib.XRootWindow(display, c_int(0))
root = c_ulong()
children = POINTER(c_ulong)()
parent = c_ulong()
nchildren = c_uint()
Xlib.XQueryTree(display, w, byref(root), byref(parent), byref(children), byref(nchildren))
for i in range(nchildren.value):
print("Child:",children[i])
xgetwindowproperty(display,children[i])