【问题标题】:Preventing window overlap in GTK防止 GTK 中的窗口重叠
【发布时间】:2011-04-21 00:25:37
【问题描述】:

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

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

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

更新:感谢 vsemenov 解决了问题

【问题讨论】:

    标签: python gtk x11 dock ewmh


    【解决方案1】:

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

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

    【讨论】:

    • 这是一个巨大的帮助,并澄清了我在尝试解决此问题时在 PyPanel 中找到的一些代码。我看到文档显示为 property_change(property, type, format, mode, data) 你能澄清正在发送的数据吗?我知道了高度,你能告诉我零点吗?
    • 嗯,谢谢您的回复。我正在使用 screen = gtk.gdk.screen_get_default() root = screen.get_root_window() root.property_change("_NET_WM_STRUT", "CARDINAL", 32, gtk.gdk.PROP_MODE_REPLACE, [0, 0, 0, 64])没有运气。这是你指的根窗口对吧?还是我的应用程序窗口?无论哪种方式,我都没有运气。
    • 更改属性应用程序窗口时相同。没有错误但没有明显效果
    • @Josh:您想在应用的顶层窗口中调用property_change,您可以使用self.window.get_toplevel().window.property_change() 从任何gtk.Window 中引用它。如果你走gtk.gdk.screen_get_default().get_root_window()的路线,它会返回所有的gtk应用程序,你必须循环找到你自己的应用程序,即:for i in gtk.gdk.screen_get_default().get_root_window().get_children()。我用一个工作示例更新了我的帖子,希望您可以在您的应用程序中使用此功能。
    • 您是否可以使用不支持这些属性的窗口管理器进行测试?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多