在同一程序中组合SDL窗口和GTK +窗口

时间:2016-08-05 17:16:56

标签: c gtk sdl

我正在创建和SDL程序,其中一些功能打开GTK +窗口。主窗口是SDL窗口,GTK +窗口主要是对话框。 main()函数正常打开SDL窗口,并且具有SDL事件的while循环,通常在SDL中。一些SDL事件调用打开GTK +窗口的函数,例如GTK +窗口通常是打开的,并且具有与main()在GTK +程序中具有的相同结构。

所有窗口都应该打开,问题在于关闭GTK +窗口。当我关闭GTK +窗口时,它会一直打开,直到我关闭主SDL窗口。当我关闭GTK +窗口时,唯一发生的事情就是它在关闭后不再做任何事情,所以例如如果我最小化它然后再次最大化它,它就会变空。当我关闭它时,SDL窗口也会响应事件,就像GTK +窗口不存在一样。所以一切都好像GTK +窗口关闭了,除了它仍然可见。我在每个函数中都有一个g_signal_connect(G_OBJECT(window),"delete-event",G_CALLBACK(gtk_main_quit),NULL);行打开一个GTK +窗口,所以这不是问题。

当我点击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;
}

1 个答案:

答案 0 :(得分:0)

我认为您需要在while循环中处理GTK事件(我认为您不会调用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
}