我正在創建和SDL程序,其中一些函數打開GTK +窗口。主窗口是SDL窗口,GTK +窗口大多是對話框。 main()
函數可以正常打開SDL窗口,並且具有SDL事件的while
循環,SDL事件通常在SDL中。一些SDL事件調用打開GTK +窗口的函數,例如GTK +窗口通常打開,並且具有與GTK +程序中的main()
相同的結構。在同一個程序中合併SDL窗口和GTK +窗口
所有的窗戶都應該打開,問題在於關閉GTK +窗口。當我關閉一個GTK +窗口時,它將保持打開狀態,直到關閉主SDL窗口。關閉GTK +窗口時發生的唯一情況是它在關閉後不再做任何事情,例如,如果我將它最小化然後再次最大化它,它將變爲空。當我關閉它時,SDL窗口也會對事件做出反應,就像GTK +窗口不存在一樣。所以,一切都好像GTK +窗口關閉,除非它仍然可見。我在每個打開GTK +窗口的函數中都有一條g_signal_connect(G_OBJECT(window),"delete-event",G_CALLBACK(gtk_main_quit),NULL);
行,所以這不是問題。
當我點擊GTK +窗口中的關閉按鈕時,如何才能使GTK +窗口關閉,而不是SDL窗口?
這是代碼的結構(GTK窗口是一個關於對話框,在這裏):
#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <gtk/gtk.h>
#include <math.h>
#include <time.h>
#include <string.h>
#include <ctype.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_ttf.h>
#include <dirent.h>
#include <unistd.h>
#ifdef WINDOWS
#include <windows.h>
#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;
}
高興見到你喜歡我的GTK +的建議,在其他線程:)你通過手動運行所有必要的'gtk_main_iteration處理所有GTK +的事件( )就像mame98顯示的那樣?如果是這樣的話,那麼(A)關閉'GtkWindow'應該默認使它被完全銷燬,並且(B)回調到'gtk_main_quit()'不能做任何事情(有用)控制任何'gtk_main()'正確。你提到的症狀確實聽起來像GTK +可能沒有獲得任何/足以實際銷燬或至少重繪'GtkWindow' - 所以窗口管理器會留下一個'鬼'。 –
將有助於查看整個代碼。另外,在終止GTK窗口後,你是否保持在SAME循環中?也許你在調用'gtk_widget_destroy'後停止handeling事件? – mame98
是的,這將避免我們不得不在黑暗中進行猜測! –