2012-02-09 19 views
1

我想做一个窗口,将留在lxpanel的顶部。如何真正把一个窗口高于所有其他 - Linux的PyGTK

我装起来的窗口,使用

import gtk 

myWindow = gtk.Window() 

myWindow.set_keep_above(True) 

myWindow.show_all() 

这确实给我留在上面的窗口,它甚至拖累管理上方时LXpanel滑动。当单击其他窗口时,它甚至会保持在最前面,但是当我单击LXpanel本身时,lxpanel跳到顶端,将窗口推向后面。我怎样才能使这个窗口真的保持在最顶端?

回答

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)) 
+0

我想我只能让事情瞬态他们的父母?当我回家时,我急切地等待尝试。 如果是短暂的,那是不是意味着它是唯一可以关注的东西?或者是那种模式? – 2012-02-09 22:53:44

+0

我对如何使用myWindow.set_transient_for(父) 如何引用lxpanel有点困惑如果我正在编写自己的面板,我可以很容易地将它设置为父 - 子关系,但是如何将myWindow成为与同一个程序无关的任何其他窗口的子进程? – 2012-02-10 01:27:56

+0

Fruckubus Crunt:查看更新。 – 2012-02-10 12:05:24

1

reference pagegtk.Window.set_keep_above仅仅是可能不会兑现的窗口管理器的请求,所以我说这是不可能做出在任何情况下这种情况发生。

无论如何,它也给出了一个有趣的信息:

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

也许你可以尝试设置该信号的回调以确保gtk.Window.set_keep_above被尽快调用。

0

,你可以做这样的:

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

这个窗口不应该有一个标题栏 – shyam 2016-10-04 09:35:12

相关问题