Окно определения GTK изменяет размер пользователя

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

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

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

Ответы

Ответ 1

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

Отметьте этот пример под Раздел "Перемещение окна". В примере показано, что обратный вызов делает что-то, когда окно перемещается, но событие configure является объектом catch-all для перемещения, изменения размера и событий порядка стека.

Ответ 2

Мне удалось снять это, наблюдая за 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

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

Ответ 4

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

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

Ответ 5

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

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