2016-08-05 110 views
2

我正在創建和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; 
} 
+0

高興見到你喜歡我的GTK +的建議,在其他線程:)你通過手動運行所有必要的'gtk_main_iteration處理所有GTK +的事件( )就像mame98顯示的那樣?如果是這樣的話,那麼(A)關閉'GtkWindow'應該默認使它被完全銷燬,並且(B)回調到'gtk_main_quit()'不能做任何事情(有用)控制任何'gtk_main()'正確。你提到的症狀確實聽起來像GTK +可能沒有獲得任何/足以實際銷燬或至少重繪'GtkWindow' - 所以窗口管理器會留下一個'鬼'。 –

+1

將有助於查看整個代碼。另外,在終止GTK窗口後,你是否保持在SAME循環中?也許你在調用'gtk_widget_destroy'後停止handeling事件? – mame98

+0

是的,這將避免我們不得不在黑暗中進行猜測! –

回答

0

我認爲你需要處理的GTK事件while循環(我asume你不叫gtk_main,你留在你的自定義while循環)。

您可以通過使用類似於這樣做:

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

    // Your SDL Code 
} 
+1

確實,這是處理它的通常方法。但是,如果OP的窗戶顯示出來,人們會認爲他們已經給GTK +的主要循環時間去做事了......對吧? –

+0

是的好點;) – mame98

+1

也許他們正在做一堆'迭代'以使窗口顯示,但不處理任何後續事件,包括'delete-event'。在這種情況下,您再次顯示的模式就是解決方案。否則,就像你說的,需要更多的代碼。 –