XGetWindowProperty и ctypes - PullRequest
       22

XGetWindowProperty и ctypes

1 голос
/ 15 марта 2019

Вопрос

Я пытаюсь найти свойство 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])
...