2010-02-24 87 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()。這將顯示該窗口,將其解除圖標並將其一次性移動到當前桌面。