2016-08-05 10 views
2

私は、いくつかの関数がGTK +ウィンドウを開くSDLプログラムを作成しています。メインウィンドウはSDLウィンドウで、GTK +ウィンドウは主にダイアログボックスです。 main()関数は通常SDLウィンドウを開き、通常SDLのようなSDLイベントを伴うwhileループを持ちます。 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

( ) 'mame98のように?もしそうなら、(A) 'GtkWindow'を閉じると、デフォルトで完全に破壊されるはずです。(B)' gtk_main_quit() 'へのコールバックは、あなたが最初に手渡さなかったもの'gtk_main()'を適切に制御してください。あなたが言及した症状はGTK +が実際に 'GtkWindow'を実際に破壊するか、少なくとも再描画するのに十分ではない/十分でないように聞こえるかもしれません - ウィンドウマネージャーには"ゴースト "が残っています。 –

+1

コード全体を確認するのに役立ちますか?また、GTKウィンドウを終了した後も同じループに留まりますか?多分あなたは 'gtk_widget_destroy'を呼び出した後にハンドリングイベントを停止するでしょうか? – mame98

+0

ええ、それは私たちが暗闇の中で推測することを避けるでしょう! –

答えて

0

は、私はあなたがあなたのwhileループで(私はあなたが呼び出すことはありませんasumeをGTKのイベントを処理する必要があると思いますgtk_mainとあなたのカスタムwhileループにとどまります)。

あなたはこれに類似のものを使用してこれを行うことができます。

:)あなたが手動で必要なすべての `gtk_main_iterationを実行して、すべてのGTK +のイベントを処理しているあなたは、他のスレッドでGTK +の私の提案を気に入って見てニース
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'を含む後続のイベントを処理しないために、' iteration'sをたくさん行っているのかもしれません。この場合も、ここで示したパターンが解決策です。それ以外の場合は、あなたが言ったように、より多くのコードが必要です。 –

関連する問題