Изменение размера окна обнаружения GTK от пользователя

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

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

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

Ответы на вопрос(5)

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

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

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

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

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

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

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

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

изменяющего размер Gtk.Paned, от пользователя, изменяющего размер всего окна. Оба испустилиnotify::position сигнал.

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

То есть вместо проверки «изменяется ли размер окна»; Я записалbutton-press-event а такжеbutton-release-event"локально, чтобы я мог вместо этого проверить" переместился ли виджет "& quot;

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)

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

ВАШ ОТВЕТ НА ВОПРОС