После некоторых исследований я нашел решение, используя Python-Xlib .
В коде, который генерирует окно, можно получить идентификатор окна, который является ссылкой для окна в X. В зависимости от используемого набора графического интерфейса способ получения этого идентификатора может отличаться. Qt4 предоставляет QWidget.winId()
, Gtk + 2 имеет свои собственные средства для резервирования места для окна, и я не пробовал с Gtk + 3, но мне сказали, что должен быть атрибут window_id
.
Поскольку вызов X для резервирования пространства для окна может быть выполнен только после отображения окна, в большинстве случаев необходимо будет выполнить запрос после того, как был введен основной цикл событий.
Пример ниже показывает пример случая с Qt4, использующим PyQt4. Чтобы получить окно после его отображения, поток запускается до того, как QApplication входит в его основной цикл, и этот поток продолжает опрашивать X, пока ему не удастся «захватить» окно. В следующем примере пространство зарезервировано в верхней части экрана с высотой, эквивалентной высоте QWidget, для которой мы резервируем пространство.
def fix_window(self):
set = False
while set == False:
try:
window = myXwindow.Window(self.parent().winId())
if window != None:
height = self.parent().height()
window.reserve_space(0, 0, height, 0)
set = True
else:
self.sleep(1)
except:
raise
В приведенном выше примере myXwindow
- это пользовательский модуль, использующий Python-Xlib. Ниже приводится содержимое модуля, где Xlib запрашивает X для Display () и затем создает объект окна, который является абстрактной моделью для ссылки на наше окно, отображаемое X. После изменения атрибутов этой модели мы можем отобразить (). sync (), чтобы применить изменения. Для резервирования места используется метод change_property()
, при котором ряд аргументов передается в соответствии со стандартами Freedesktop.org .
Окно класса (объект):
def __init__(self, windowID):
self._display = Display()
self._window = self._display.create_resource_object('window', windowID)
def reserve_space(self, left=0, right=0, top=0, bottom=0):
LEFT = left
RIGHT = right
TOP = top
BOTTOM = bottom
self._window.change_property(self._display.intern_atom('_NET_WM_STRUT'),
self._display.intern_atom('CARDINAL'),
32, [LEFT, RIGHT, TOP, BOTTOM])
self._display.sync()
Примечание: важно сохранить тот же экземпляр Display (), который создал объект окна, для изменения свойств окна, поэтому он сохраняется в переменной.