2010-02-24 84 views
2

我有一个gtk应用程序,它具有一个托盘图标,如果用户单击该图标,窗口的可见性在与窗口位于同一工作区时切换。当他在另一个工作区时,窗口移动到另一个工作区。GTK/GDK如何找出一个窗口是否被另一个窗口覆盖?

现在,如果应用程序和用户在同一个屏幕上,并且应用程序完全被另一个屏幕覆盖,我想提升窗口的顶部,而不是先隐藏它,然后放在下一个托盘图标上再次点击显示。

我迄今为止代码:

def inOverlayed(self): 
    windows = self.window.get_screen().get_toplevel_windows() 
    win = self.window.get_window() 
    x, y, w, h, b = win.get_geometry() 
    for i in windows: 
     if win != i: 
      x2, y2, w2, h2, b2 = i.get_geometry() 
      if x >= x2 and x + w <= x2 + w2: 
       if y >= y2 and y + h <= y2 + h2: 
        return True 

    return False 

最大的问题是似乎没有办法确定一个窗口的Z级,但没有一个分不清如果窗口只是里面一个又一个或如果它被一个重叠覆盖。

所以我的问题是,我怎么找了一个窗口的Z级(该文档不说这事),或者是有这个问题

回答

1

你不能简单的解决方案,因为z级完全由窗口管理员决定。 GDK可​​以向窗口管理器发送有关提升或降低堆栈中窗口的提示,但窗口管理器可以自由忽略它们。

你想要什么的好替代品可能是检查gtk.Window.is_active();如果属实,隐藏窗口,否则请致电gtk.Window.present()。这将显示该窗口,将其解除图标并将其一次性移动到当前桌面。