Это код:
#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.
Я думаю, что могу здесь не хватает указателей ...