ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

x11 – 使用Python的Xlib查找某个X窗口

2019-08-10 02:05:39  阅读:434  来源: 互联网

标签:python x11


我试图在我的X服务器上找到一个未映射的窗口,以便将其映射回来并发送一些EWMH提示.由于窗口未映射,我无法使用EWMH直接询问窗口管理器.所以我试图通过Xlib,但我遇到了问题.整个API对我来说非常混乱.

我正在使用Python的Xlib wrapper.现在让我们来看看以下Python脚本:

import subprocess
from time import sleep
from ewmh import EWMH

subprocess.Popen(['urxvt']) # Run some program, here it is URXVT terminal.
sleep(1) # Wait until the term is ready, 1 second is really enought time.

ewmh = EWMH() # Python has a lib for EWMH, I use it for simplicity here.

# Get all windows?
windows = ewmh.display.screen().root.query_tree().children

# Print WM_CLASS properties of all windows.
for w in windows: print(w.get_wm_class())

什么是脚本的输出?一个打开的URXVT终端就像这样:

None
None
None
None
('xscreensaver', 'XScreenSaver')
('firefox', 'Firefox')
('Toplevel', 'Firefox')
None
('Popup', 'Firefox')
None
('Popup', 'Firefox')
('VIM', 'Vim_xterm')

但是当我运行此命令并单击打开的终端时:

$xprop | grep WM_CLASS
WM_CLASS(STRING) = "urxvt", "URxvt"

WM_NAME属性也是如此.

最后一个问题:为什么脚本输出中没有“URxvt”字符串?

解决方法:

没有字符串“urxvt”,“URxvt”的原因是XWindows处于层次结构中.出于某种原因,在我的桌面上,urxvt窗口不在第一级.

所以必须像这样遍历整棵树:

from Xlib.display import Display

def printWindowHierrarchy(window, indent):
    children = window.query_tree().children
    for w in children:
        print(indent, window.get_wm_class())
        printWindowHierrarchy(w, indent+'-')

display = Display()
root = display.screen().root
printWindowHierrarchy(root, '-')

然后,一行(可能很长)脚本输出:

--- ('urxvt', 'URxvt')

标签:python,x11
来源: https://codeday.me/bug/20190810/1635061.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有