GTK (または pygtk または gtkmm...) で
通常はウィンドウの端をドラッグすることで行われるように、アプリケーション ウィンドウがユーザーによって手動でサイズ変更されたことを検出するにはどうすればよいですか?
ウィンドウの内容の変更など、gtk に起因するサイズ変更と手動のサイズ変更を区別する方法を見つける必要があります。
GDK_CONFIGURE イベントに接続してみましたか?
「ウィンドウの移動」セクションの下にあるこの例を確認してください。この例では、ウィンドウが移動されたときに何かを実行するコールバックを示していますが、構成イベントは、移動、サイズ変更、およびスタック順序イベントのキャッチオールです。
size_allocateとsize_requestの信号を監視することで、なんとかこれをやってのけることができましたGtkWindow。小さくなったらsize_request、私は電話しresize(1,1)ました。予想よりも大きかった場合size_allocateは、システムをオフにしました。
私が確実に処理したことの 1 つはsize_request、大きく戻ってから小さくsize_allocateなり、大きくなってから小さくなることです。これが可能かどうかはわかりませんが、 が小さくなったときではなく、 がsize_allocate小さくなったときにのみ期待値を減らすようにして修正しました。size_allocatesize_request
size_request適切な値を取得できるように、ハンドラーが基本クラスのハンドラーの後にあることを確認してください。メソッドをオーバーライドしてから、基本クラスのメソッドを最初に呼び出すことでこれを行いました。
これを 1 次元と 2 次元の両方で試しましたが、どちらの方法でも機能するようです。
私の場合、Gtk.Paned のサイズを変更しているユーザーとウィンドウ全体のサイズを変更しているユーザーを区別しようとしていました。どちらもnotify::position信号を発しました。
私の解決策は、ユーザーがウィジェットからウィンドウのサイズを変更しているかどうかがわからないため、知りたいことを逆にすることでした。ユーザーがウィジェットを再配置したかどうかを記録し、ユーザーがウィジェットで開始していない場合は更新を無視します。
つまり、「ウィンドウのサイズが変更された場合」をテストする代わりに、「ウィジェットが再配置された場合」をテストできるようにローカルbutton-press-eventに記録しました。button-release-event
from gi.repository import Gtk
class MyPaned(Gtk.Paned):
    _user_activated = False
    def on_position(self, _, gparamspec):
        if self._user_activated:
            # widget touched
        else:
            # window resized (probably)
    def on_button_press(self, *_):
        self._user_activated = True
    def on_button_release(self, *_):
        self._user_activated = False
    dev __init__(self, *args):
        super(MyPaned, self).__init__(*args)
        self.connect('notify::position', self.on_position)
        self.connect('button-press-event', self.on_button_press)
        self.connect('button-release-event', self.on_button_release)
ユーザーがウィジェットとの直接の対話を開始および終了した時間を効果的に記録することで、残りの時間はウィンドウのサイズ変更が原因であると推測できました。(もっと事例が見つかるまで)
expose_eventPyGTK では、ウィンドウのサイズ変更を常に監視してから、get_allocationメソッドを使用して新しいサイズを取得します。
gdk_window_get_root_originを使用してウィンドウの左上隅を取得し、gdk_window_get_geometryを使用して幅と高さを取得することで、何かを一緒に投げることができる場合があります。次に、コールバックを GDK_BUTTON_PRESS_MASK にフックし、ボタンの押下がウィンドウの端の近くまたは端で発生するかどうかを確認できます。
もちろん、これは非常にハックなようで、GdkWindow のドキュメントでこれを行うための簡単な方法を見つけることができなかったことが本当に気になります。gdk_window_begin_resize_drag関数があり、これを行うためのよりクリーンな方法があると本当に思いますが、私の答えよりも明白なものは見当たりませんでした。