Изменение размера окна обнаружения GTK от пользователя - PullRequest
17 голосов
/ 29 июня 2009

В GTK (или pygtk или gtkmm ...)

Как я могу определить, что окно приложения было вручную изменено пользователем, как это обычно делается перетаскиванием края окна?

Мне нужно найти способ отличить размеры вручную от размеров, которые происходят от gtk, например, изменения в содержимом окна.

Ответы [ 5 ]

8 голосов
/ 12 августа 2009

Вы пытались подключиться к событию GDK_CONFIGURE?

Проверьте этот пример под Раздел «Перемещение окна». В этом примере показано, как обратный вызов делает что-то, когда окно перемещается, но событие configure является универсальным для событий перемещения, изменения размера и порядка стека.

7 голосов
/ 26 августа 2009

Мне удалось это проверить, наблюдая за сигналами size_allocate и size_request на GtkWindow. Если size_request уменьшится, я позвоню resize(1,1). Если size_allocate был больше, чем ожидалось, я выключил систему.

Одной вещью, которую я убедился, было size_request возвращение большим, затем маленьким, и size_allocate было большим, а затем маленьким. Я не знаю, возможно ли это, но я исправил это, убедившись, что ожидаемые значения для size_allocate уменьшаются только тогда, когда я получаю size_allocate меньшего размера, а не когда size_request.

меньше.

Убедитесь, что ваш обработчик size_request идет после обработчика базового класса, чтобы вы получили правильные значения. Я сделал это, переопределив метод, а затем вызвав метод базового класса.

Я пробовал это как в 1, так и в 2 измерениях, и, похоже, это работает в любом случае.

3 голосов
/ 08 июля 2016

В моем случае я пытался отличить пользователя, изменяющего размер 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)

Эффективно по записи, когда пользователь начинал и заканчивал взаимодействовать с моим виджетом напрямую, я мог предположить, что остальное время было связано с изменением размера окна. (Пока не найду больше дел)

3 голосов
/ 29 июня 2009

В PyGTK я всегда следил за expose_event для изменения размера окна, затем использовал метод get_allocation, чтобы получить новый размер.

0 голосов
/ 13 августа 2009

Вы можете создать что-то вместе, используя gdk_window_get_root_origin , чтобы получить левый верхний угол окна, и gdk_window_get_geometry , чтобы получить ширину и высоту. Затем вы можете подключить функцию обратного вызова к GDK_BUTTON_PRESS_MASK и проверить, происходит ли нажатие кнопки вблизи или на одном из краев окна.

Конечно, это кажется довольно хакерским, и меня действительно беспокоит, что я не смог найти какой-то простой способ в документации для GdkWindow сделать это. Существует функция gdk_window_begin_resize_drag , которая действительно заставляет меня думать, что есть более чистый способ сделать это, но я не увидел ничего более очевидного, чем мой ответ.

...