如何为Qt4窗口提供wm_name给X11?
背景
我正在解决一个问题,主要是为了在X11上为一个Qt窗口保留屏幕空间。为此,我使用了PyQt4和Python-Xlib。
情况
我想为的这个应用程序是一个没有边框的Qt窗口,高25像素,宽度占满整个屏幕,实际上它是一个面板。简化后的代码大致如下:
import sys
from PyQt4 import QtGui
from PyQt4 import QtCore
# this module i made myself (see below):
import myXwindow
class QtPanel(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
# here i explicitely name the window:
self.setWindowTitle('QtPanel')
self.resize(QtGui.QDesktopWidget().screenGeometry().width(), 25)
self.move(0,0)
self.setWindowFlags(QtCore.Qt.Widget |
QtCore.Qt.FramelessWindowHint |
QtCore.Qt.WindowStaysOnTopHint)
self.setAttribute(QtCore.Qt.WA_X11NetWmWindowTypeDock)
def main():
app = QtGui.QApplication(sys.argv)
panel = QtPanel()
panel.show()
xwindow = myXwindow.Window(str(panel.windowTitle()))
sys.exit(app.exec_())
if __name__ == '__main__':
main()
现在,为了为这个QtPanel应用程序保留空间,我需要调用xlib。下面我将展示我打算如何从X中“获取”我的窗口。为了获取我面板的X窗口,代码中引入了以下模块:
from Xlib.display import Display
from Xlib import X
class Window(object):
def __init__(self, title):
self._title = title
self._root = Display().screen().root
self._window = self.find_window()
def find_window(self):
my_window = None
display = Display()
windowIDs = self._root.get_full_property(
display.intern_atom('_NET_CLIENT_LIST'),
X.AnyPropertyType).value
print 'looking for windows:'
count = 0
for windowID in windowIDs:
count += 1
window = display.create_resource_object('window', windowID)
title = window.get_wm_name()
print 'window', count, ':', title
if self._title in title:
my_window = window
return my_window
问题
现在,当我运行QtPanel应用程序时,它应该返回一个当前由X显示的所有窗口名称的列表。尽管在代码中已经明确命名(见上文),但QtPanel应用程序要么没有名称(即None或''),要么被命名为'x-nautilus-desktop',以下是返回的示例:
$ python ./Qtpanel.py
looking for windows:
window 1 : Bottom Expanded Edge Panel
window 2 : cairo-dock
window 3 : x-nautilus-desktop
window 4 : ReserveSpace - NetBeans IDE 6.9
window 5 : How to provide X11 with a wm_name for a Qt4 window? - Stack Overflow - Mozilla Firefox
疑问
我该如何给我的Qt应用程序或Qt顶层窗口“命名”,让它在X中正确显示?或者:除了用应用程序的名称,我还有什么其他方法可以在X中识别我的应用程序?
1 个回答
0
虽然我不太清楚这个没有名字的窗口是什么(看起来和启动QtPanel应用程序有关),但是Xlib脚本在显示窗口时找不到这个窗口,因为它是在QApplication._exec()的事件循环之前查询的。可能需要一个线程在主循环外来处理这个问题。