Как в Gtk4 получить уведомление об изменении размера виджета?

Пытаюсь переписать свое старое приложение для просмотра картинок с Gtk3 на Gtk4. Если раньше можно было спокойно подключиться к сигналу size_allocate, то в gtk4 этот сигнал удалили и теперь я не могу понять как узнать когда у виджета меняются размеры.


Ответы (1 шт):

Автор решения: Bleser

После некоторых экспериментов, я нашел решение которое меня устраивает.
Возможно есть более красивые варианты, но я их не знаю.

class MyAppWindow: Gtk.ApplicationWindow {

    public int windowWidth {
        get { return get_width(); }
        set {
            Idle.add(() => {
                print(@"window width: $value\n");
                return Source.REMOVE;
            });
        }
    }

    public bool isMaximized {
        get { return maximized; }
        set {
            Idle.add(() => {
                print(@"window maximized: $isMaximized; width: $(get_width())\n");
                return Source.REMOVE;
            });
        }
    }

    public MyAppWindow(Gtk.Application app) {
        Object(application: app);
        this.bind_property("default-width", this, "windowWidth", BindingFlags.DEFAULT | BindingFlags.SYNC_CREATE);
        this.bind_property("maximized", this, "isMaximized", BindingFlags.DEFAULT | BindingFlags.SYNC_CREATE);
    }
}

Здесь я свойства default_width и maximized которые есть в Gtk.ApplicationWindow подключаю к свойствам windowWidth и isMaximized.

При обычном растягивании окна вызывается setter в windowWidth, где мы можем вызвать сигнал или другой метод.
isMaximized сработает только при максимизации окна и это нужно для получения размера окна т.к. в этом случаее windowWidth не сработает.

В Gtk.Widget подобное у меня не получилось сделать, но можно попробовать реализовать методы measure, size_allocate, get_request_mode и в size_allocate перехватывать изменения размера виджета.

В Gtk4 добавили бредовые LayoutManager, хотя может они и полезны, но мне пока только мешают.
Если в виджет добавить LayoutManager, то методы measure, size_allocate, get_request_mode которые вы переопределите в классе виджета не будут вызываться.

→ Ссылка