如何真正把窗口放在其他所有窗口之上 - Linux PyGTK

时间:2012-02-09 17:22:45

标签: python gtk window layer

我正在尝试制作一个能够保持在lxpanel之上的窗口。

我使用

加载了窗口
import gtk

myWindow = gtk.Window()

myWindow.set_keep_above(True)

myWindow.show_all()

这确实给了我一个保持在顶部的窗口,它甚至设法在拖动时滑过LXpanel。当点击其他窗口时它甚至会保持在顶部,但是当我点击LXpanel本身时,lxpanel会跳到顶部,将窗口推到后面。如何让这个窗口真的保持在最顶层?

3 个答案:

答案 0 :(得分:3)

此行为由您的窗口管理器控制,您无法真正做很多事情。

(在我的测试中,似乎Xfwm4和Fluxbox将上面的窗口放在停靠/面板窗口之上,尽管EWMH recommends,但也许你的WM没有。)

但是,解决方法非常有限:如果您假设用户永远不会有多个停靠/面板,则可以将窗口设置为该停靠窗口的transient。通常(再次,取决于窗口管理器),这将使您的窗口保持在停靠窗口之上。


更新:在X11中,您可以设置瞬态窗口,即使它们不在同一个进程中。我发现最简单的方法是使用libwnck获取面板窗口的XID,然后使用gdk_window_foreign_new将其导入GDK。当然,这在非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 :(得分:1)

reference page中,gtk.Window.set_keep_above只是对窗口管理员的请求,可能不会受到尊重,所以我认为在所有情况下都不太可能实现这一点。

无论如何,它还提供了一条有趣的信息:

  

您可以通过gtk.Widget“window_state_event”信号跟踪上述状态。

也许您可以尝试为该信号设置回调,以确保尽快再次调用gtk.Window.set_keep_above

答案 2 :(得分:0)

你可以这样做:

window = gtk.Window(gtk.WINDOW_POPUP)