我有一个 Python/Linux 应用程序,可以在 GTK 窗口中显示我需要的一些信息。出于本次讨论的目的,它的行为应该与扩展坞完全相同 - 存在于所有虚拟桌面上,并且最大化的窗口不会与其重叠。

第一点很简单,但我花了几天时间用头撞显示器,试图得到第二点——防止重叠。如果另一个窗口最大化,我的应用程序不应被覆盖。设置“始终在顶部”是不够的,因为其他窗口只是位于我的信息栏后面,而不是停在其边缘。

简而言之:使用停靠/面板样式窗口,如何防止其他窗口在其上方/下方最大化?

更新:感谢 vsemenov 解决了问题

有帮助吗?

解决方案

使用 _NET_WM_STRUT_NET_WM_STRUT_PARTIAL (为了向后兼容)在 X Window 系统桌面边缘保留空间的属性。

使用 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]) 

数据参数说明 [0, 0, 0, bottom_width] 在上面:

该参数依次指定桌面屏幕各边框预留空间的宽度: [left, right, top, bottom]. 。所以 [0, 0, 0, 50] 会在桌面屏幕底部为您的小部件保留 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()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top