XGetWindowProperty和ctypes

时间:2019-03-14 23:52:08

标签: python-3.x ctypes x11

问题

我试图为X11报告的每个窗口/客户端找到NET_WM_NAME属性。问题是什么都没有返回-项目数为0,返回的数据导致空字符串。我遍历了github上的多个代码示例以及用C和C ++编写的示例,特别是Why is XGetWindowProperty returning null?Xlib XGetWindowProperty Zero items returned,但是我找不到我的代码的问题所在。似乎一切正常,传递给XGetWindowProperty函数的参数顺序与documentation一致,并且该函数返回成功状态,但结果为空。我的代码在哪里出问题?

代码

下面是我正在使用的代码。问题是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])

0 个答案:

没有答案