Как предоставить X11 имя wm_name для окна Qt4? - PullRequest
2 голосов
/ 02 июня 2011

Фон

Я собираюсь решить еще одну проблему , которая заключается в резервировании экранного пространства для окна Qt на X11.Для этого я использую PyQt4 и Python-Xlib .

Ситуация

Приложение, для которого я хочу сэкономить место на экране, представляет собой Qt Window без рамки, высотой 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. Следующий код импортируется в приведенный здесь код, чтобы получить Xwindow моей панели:

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 голосов
/ 02 июня 2011

Хотя я не совсем знаю, что такое безымянное окно (и, похоже, оно связано с запуском приложения QtPanel, сценарий Xlib не может найти отображаемое окно, поскольку оно запрашивается до цикла событий QApplication._exec ( ). Поток может потребоваться сделать это вне основного цикла.

...