g_signal_connect передает параметр функции обратного вызова: ошибка сегментации - PullRequest
0 голосов
/ 03 августа 2020

Это код:

#include <gtk/gtk.h>

typedef struct
{
    GtkWidget *window;
    //other stuff
} MainWindow;

typedef struct
{
    GtkWidget *window;
    //othehr stuff
} ReplacementsWindow;

typedef struct
{
    MainWindow mainWindow;
    ReplacementsWindow replacementsWindow;
    int x;
} UI;

void ui_build(UI *ui, GtkApplication *app);
void ui_signals_connect(UI *ui);
void ui_callback_show_replacements_window(GtkMenuItem *menuitem, gpointer user_data);
void ui_show(UI *ui);


void ui_build(UI *ui, GtkApplication *app)
{

    MainWindow *mw = &ui->mainWindow;

    mw->window = gtk_application_window_new(app);
    //other stuff

    ReplacementsWindow *rw = &ui->replacementsWindow;

    rw->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    //other stuff

    ui->x=10;
}

void ui_signals_connect(UI *ui)
{
    g_signal_connect(ui->mainWindow.replacements_menu_item, "activate", G_CALLBACK(ui_callback_show_replacements_window), (gpointer)ui);
}

void ui_callback_show_replacements_window(GtkMenuItem *menuitem, gpointer user_data)
{
    UI *ui = (UI*)user_data; 
    g_print("%d\n",ui->x);
    gtk_widget_show_all(ui->replacementsWindow.window);
}

void ui_show(UI *ui)
{
    gtk_widget_show_all(ui->mainWindow.window);
}

static void activate(GtkApplication *app, gpointer user_data)
{
    UI ui;

    ui_build(&ui, app);
    ui_signals_connect(&ui);
    ui_show(&ui);
}

int main(int argc, char **argv)
{
    GtkApplication *app;
    int status;

    app = gtk_application_new("it.lorenzomormina.editor", G_APPLICATION_FLAGS_NONE);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
    status = g_application_run(G_APPLICATION(app), argc, argv);
    g_object_unref(app);

    return status;
}

Я получаю ошибку сегментации на gtk_widget_show_all(ui->replacementsWindow.window); и на самом деле x это gibberi sh, но меня озадачивает то, что при отладке адрес ui внутри ui_callback_show_replacements_window то же самое, что и снаружи.

Я пытаюсь показать второе окно, называемое ReplacementsWindow, когда нажимается / активируется GTKMenuItem.

Я думаю, что могу здесь не хватает указателей ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...