Как ДЕЙСТВИТЕЛЬНО поставить окно над всеми остальными - Linux PyGTK - PullRequest
1 голос
/ 09 февраля 2012

Я пытаюсь создать окно, которое останется поверх lxpanel.

Я загрузил окно, используя

import gtk

myWindow = gtk.Window()

myWindow.set_keep_above(True)

myWindow.show_all()

Это действительно дает мне окно, которое остаетсяна вершине ему даже удается скользить по LXpanel при перетаскивании.При нажатии на другие окна он будет оставаться на вершине, но когда я нажимаю на саму LXpanel, lxpanel прыгает наверх, толкая мое окно за собой.Как я могу сделать это окно действительно остаться на вершине?

Ответы [ 3 ]

3 голосов
/ 10 февраля 2012

Это поведение контролируется вашим оконным менеджером, и вы не можете ничего с этим поделать.

(В моем тестировании кажется, что Xfwm4 и Fluxbox помещают окна над окнами над окнами док-станции, несмотря на то, что EWMH рекомендует , но, возможно, ваш WM этого не делает.)

Однако существует очень ограниченный обходной путь: если вы предполагаете, что у пользователя никогда не будет более одной док-станции / панели, вы можете установить для этого окна значение transient для этого окна док-станции. Обычно (опять же, в зависимости от оконного менеджера) это будет держать ваше окно над окном док-станции.


Обновление: В X11 вы можете установить переходные окна, даже если они не находятся в одном процессе. Самый простой способ, который я нашел, это использовать libwnck для получения XID окна панели, а затем импортировать его в GDK, используя gdk_window_foreign_new . Конечно, это не будет работать в не-X системах.

import wnck
screen = wnck.screen_get_default()
# BUG: There needs to be a small delay between the previous line and the next;
# otherwise get_windows returns an empty list.
windows = screen.get_windows()
panel = windows[1] # For example
panel_xid = panel.get_xid()

import gtk
window = gtk.Window()
window.show_all()
window.window.set_transient_for(gtk.gdk.window_foreign_new(panel_xid))
1 голос
/ 10 февраля 2012

На справочной странице говорится, что gtk.Window.set_keep_above - это просто запрос к оконному менеджеру, который может не выполняться, поэтому я бы сказал, что вряд ли это произойдет при любых обстоятельствах.

В любом случае, он также дает интересную информацию:

Вы можете отслеживать вышеуказанное состояние с помощью сигнала gtk.Widget "window_state_event".

Возможновы можете попытаться установить обратный вызов для этого сигнала, чтобы убедиться, что gtk.Window.set_keep_above вызывается снова как можно скорее.

0 голосов
/ 04 октября 2016

вы можете сделать это так:

window = gtk.Window(gtk.WINDOW_POPUP)
...