Combinaison de fenêtres SDL et de fenêtres GTK + dans le même programme

Je crée un programme SDL dans lequel certaines fonctions ouvrent des fenêtres GTK +. La fenêtre principale est une fenêtre SDL et les fenêtres GTK + sont principalement des boîtes de dialog. La fonction main() ouvre normalement la fenêtre SDL et dispose d’une boucle while avec des événements SDL, comme d’habitude dans SDL. Certains événements SDL appellent des fonctions qui ouvrent des fenêtres GTK + telles que les fenêtres GTK + sont généralement ouvertes et qui ont la même structure que la main() dans un programme GTK +.

Toutes les fenêtres s’ouvrent comme il se doit, le problème est de fermer les fenêtres GTK +. Lorsque je ferme une fenêtre GTK +, elle rest ouverte jusqu’à ce que je ferme la fenêtre principale de SDL. La seule chose qui se passe lorsque je ferme la fenêtre GTK + est qu’elle ne fait plus rien après sa fermeture. Ainsi, par exemple, si je la minimise puis que je l’agrandis à nouveau, elle devient vide. Lorsque je la ferme, la fenêtre SDL réagit également comme il se doit aux événements, comme si la fenêtre GTK + n’existait pas. Donc, tout est comme si la fenêtre GTK + était fermée sauf qu’elle était toujours visible. J’ai un g_signal_connect(G_OBJECT(window),"delete-event",G_CALLBACK(gtk_main_quit),NULL); ligne dans chaque fonction qui ouvre une fenêtre GTK +, donc ce n’est pas le problème.

Comment puis-je faire pour que la fenêtre GTK + se ferme mais pas la fenêtre SDL lorsque je clique sur le bouton de fermeture dans la fenêtre GTK +?

Voici la structure du code (la fenêtre GTK est une boîte de dialog À propos de ici):

 #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #ifdef WINDOWS #include  #endif void openGtkWindow(){ GtkWidget *aboutWindow = gtk_about_dialog_new(); //Write things in the About window g_signal_connect(G_OBJECT(aboutWindow),"delete-event",G_CALLBACK(gtk_main_quit),NULL); gtk_widget_show(aboutWindow); gtk_main(); } int main(int argc,char *argv[]){ gtk_init(&argc,&argv); SDL_Surface *screen; SDL_Event event; SDL_Init(SDL_INIT_VIDEO); putenv("SDL_VIDEO_CENTERED=center"); SDL_WM_SetCaption("SDL window",NULL); SDL_WM_SetIcon(IMG_Load("icon.png"),NULL); screen = SDL_SetVideoMode(600,400,32,SDL_HWSURFACE | SDL_DOUBLEBUF); //Draw things in the SDL window SDL_Flip(screen); int continuer = 1; while(continuer){ SDL_WaitEvent(&event); switch(event.type){ case SDL_QUIT: continuer = 0; break; case SDL_MOUSEBUTTONUP: if(event.button.button == SDL_BUTTON_LEFT){ if(/*Test if the mouse is inside the About button*/){ openGtkWindow(); } } break; } } SDL_Quit(); return 0; } 

Je pense que vous devez gérer les événements GTK dans votre boucle while (je suppose que vous n’appelez pas gtk_main et que vous restz dans votre boucle while personnalisée).

Vous pouvez le faire en utilisant quelque chose de similaire à ceci:

 while (running) { while (gtk_events_pending()) // are there GTK events to handle gtk_main_iteration(); // - If so, handle them // Your SDL Code }