我正在尝试制作一个能够保持在lxpanel之上的窗口。
我使用
加载了窗口import gtk
myWindow = gtk.Window()
myWindow.set_keep_above(True)
myWindow.show_all()
这确实给了我一个保持在顶部的窗口,它甚至设法在拖动时滑过LXpanel。当点击其他窗口时它甚至会保持在顶部,但是当我点击LXpanel本身时,lxpanel会跳到顶部,将窗口推到后面。如何让这个窗口真的保持在最顶层?
答案 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)