6

GTK ウィンドウに必要な情報を表示する Python/Linux アプリケーションがあります。この説明では、ドックとまったく同じように動作する必要があります。すべての仮想デスクトップに存在し、最大化されたウィンドウがドックに重なることはありません。

最初のポイントは非常に簡単ですが、オーバーラップを防ぐために 2 番目のポイントを取得しようとして、モニターに頭を打ち付けるのに何日も費やしました。別のウィンドウが最大化されている場合、私のアプリはカバーされるべきではありません。他のウィンドウは、端で停止するのではなく、情報バーの後ろに座っているだけなので、「常に一番上」に設定するだけでは不十分です。

要するに、ドック/パネル スタイルのウィンドウで、他のウィンドウがその上/下で最大化するのをどのように防ぐことができますか?

更新: vsemenov のおかげで問題が解決しました

4

1 に答える 1

12

_NET_WM_STRUTand (下位互換性のため) プロパティを使用_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()
于 2010-10-04T22:10:23.647 に答える