我有一个Python / Linux应用程序,它在GTK窗口中显示我需要的信息。为了便于讨论,它的行为应完全像坞站一样- 存在于所有虚拟桌面上,并且最大化的窗口不与之重叠。
第一点很容易,但是我花了几天的时间在显示器上砸头,以求得到第二点- 防止重叠。如果另一个窗口最大化,我的应用程序将不被覆盖。仅将“始终放在顶部”是不够的,因为其他窗口仅位于我的信息栏后面,而不是停在其边缘。
简而言之:使用停靠/面板样式窗口,如何防止其他窗口最大化/超过它?
更新:通过vsemenov解决了问题
使用_NET_WM_STRUT和_NET_WM_STRUT_PARTIAL(为了向后兼容)属性在X Window System桌面的边缘保留空间。
_NET_WM_STRUT
_NET_WM_STRUT_PARTIAL
使用PyGtk,您可以像这样设置这些属性,假设self.window是gtk.Window的实例:
self.window.get_toplevel().show() # must call show() before property_change() self.window.get_toplevel().window.property_change("_NET_WM_STRUT", "CARDINAL", 32, gtk.gdk.PROP_MODE_REPLACE, [0, 0, 0, bottom_width])
澄清上面的data参数[0, 0, 0, bottom_width]:
[0, 0, 0, bottom_width]
此参数按以下顺序指定桌面屏幕每个边框上保留空间的宽度:[left, right, top, bottom]。因此,[0, 0, 0, 50]将在桌面屏幕底部为小部件保留50个像素。
[left, right, top, bottom]
[0, 0, 0, 50]
这是一个简单的工作示例:
import gtk class PyGtkWidgetDockExample: def __init__(self): self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.window.set_default_size(100, gtk.gdk.screen_height()) self.window.move(gtk.gdk.screen_width()-100, 0) self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DOCK) self.window.show() self.window.window.property_change("_NET_WM_STRUT", "CARDINAL", 32, gtk.gdk.PROP_MODE_REPLACE, [0, 100, 0, 0]) app = PyGtkWidgetDockExample() gtk.main()