Функция обратного вызова для сигнала «delete-event» передает неверные значения переменных - PullRequest
0 голосов
/ 17 сентября 2018

Всякий раз, когда я передаю что-либо в функцию обратного вызова, когда "delete-event" запускается с намерением очистить что-либо, когда окно закрывается, значения, которые я отправляю, портятся.

Например, вот небольшая программа, которая иллюстрирует эту проблему:

#include <gtk/gtk.h>

void window_quit(GtkWidget *window, int *v) 
{
        g_print("%d\n", *v);
        gtk_main_quit();
}

void normal_function(int *v) 
{
        g_print("%d\n", *v);
}

int main(int argc, char **argv)
{
        gtk_init(&argc, &argv);
        GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_widget_show(window);
        int v = 5;
        normal_function(&v);
        g_signal_connect(window, "delete-event", G_CALLBACK(window_quit), &v);
        gtk_main();
}

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

1 Ответ

0 голосов
/ 17 сентября 2018

Ваш обработчик сигнала неверного типа для "delete-event". Справочное руководство для GTK3 указано, что оно должно быть:

gboolean
user_function (GtkWidget *widget,
               GdkEvent  *event,
               gpointer   user_data)

Твой явно не тот. Результатом, вероятно, является связка неопределенного поведения. Поврежденные данные, которые вы видите, скорее всего, наказывают GdkEvent как int. Вы также не возвращаете никакого значения, несмотря на то, что фреймворк ожидает, что ваша функция что-то вернет.

Поскольку G_CALLBACK является приведением, а затем структура возвращается к ожидаемому типу указателя на функцию, это императив , и вы привыкли читать руководство для сигналов, которые вы подключаете. Здесь нет безопасности типов, и компилятор не может перехватить эти типы ошибок.

...