Как что-то сделать с изменением размера окна в Vala?

Я пишу приложение Vala. И я хочу, чтобы какая-то функция выполнялась при изменении размера окна. Я попытался переписать пример C с обратным вызовом изменения размера окна, он, кажется, работает (я имею в виду компиляцию), но когда я запускаю свою программу, она segfaults.

Вот мой код:

Gtk.Widget toplevel = this.get_toplevel();
Gtk.Window window = (Gtk.Window)toplevel;

....

Signal.connect(window, "size-allocate", (GLib.Callback)this.callback, null);

а функция callback():

private bool callback(Gtk.Widget* window, Gtk.Allocation? a,  char * data )
{       
    resizeAllImages(window->get_allocated_width());
    return false;
}

Я попытался переписать это (http://osdir.com/ml/gtk-list/2010-01/msg00092.html) учебник по Vala, но, похоже, я делаю что-то не так. Вы можете помочь мне с этим?


person serge1peshcoff    schedule 10.01.2015    source источник


Ответы (1)


Вам не нужно использовать connect напрямую. Имеется встроенная обработка сигналов. Сигналы имеют то же имя с заменой тире на подчеркивание (например, Gtk. Widget.size_allocate).

Для подключения просто добавьте его в обработчик сигнала следующим образом:

widget.size_allocate.connect(this.callback);

Ваш обработчик сигнала должен выглядеть так:

private bool callback(Gtk.Widget sender, Gtk.Allocation? a) { ...

Причина, по которой ваш метод не работает, заключается в том, что вы передаете null обработчику:

Signal.connect(window, "size-allocate", (GLib.Callback)this.callback, this);

Vala проводит различие между делегатами с контекстом (т. е. замыканиями) и делегатами без контекста (т. е. указателями на функции, также известными как «статические делегаты»). Если вы посмотрите на Gtk.Callback, вы заметите, что has_target = false. Это делает его статическим делегатом, поэтому вам нужно передать понтер данных с чем-то, что необходимо вашему обратному вызову.

person apmasell    schedule 10.01.2015