SDL2 - 无法重新打开窗口

时间:2017-04-02 20:10:31

标签: c++ sdl sdl-2

我正在编写一个带有2个窗口的简单SDL2应用程序。

第一个窗口(window变量)在应用程序启动时显示,第二个窗口(window2变量)被隐藏。

预期行为:

我点击第一个窗口,弹出第二个窗口,然后关闭第二个窗口。

我可以尽可能多地关闭并重新打开窗口。

观察到的行为:

关闭第二个窗口后,如果我在第一个窗口中退回,则第二个窗口不会按预期显示。

my comment所述:窗口不会出现在我的窗口管理器(即Wayland)中。

代码:

#include <SDL2/SDL.h>

int main()
{
    SDL_Window* window, *window2 = NULL;

    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        return 1;
    } else {
        window = SDL_CreateWindow("ONE", SDL_WINDOWPOS_UNDEFINED,
                     SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN);
        window2 = SDL_CreateWindow("TWO", SDL_WINDOWPOS_UNDEFINED, 
                      SDL_WINDOWPOS_UNDEFINED, 320, 240, SDL_WINDOW_HIDDEN);

        if (window == NULL || window2 == NULL) {
            SDL_DestroyWindow(window);
            SDL_DestroyWindow(window2);
            return 1;
        }

        bool running = true;

        while(running) {
            SDL_Event event;
            while (SDL_PollEvent(&event)) {
                if (event.type == SDL_WINDOWEVENT) {
                    if (event.window.event == SDL_WINDOWEVENT_CLOSE) {
                        if (SDL_GetWindowID(window) == event.window.windowID) {
                            running = false;
                        } else {
                            SDL_HideWindow(window2);
                        }
                    }
                } else if (event.type == SDL_MOUSEBUTTONDOWN) {
                    SDL_ShowWindow(window2);
                }
            }
        }
    }

    SDL_DestroyWindow(window);
    SDL_DestroyWindow(window2);

    SDL_Quit();

    return 0;
}

2 个答案:

答案 0 :(得分:2)

SDL bug this patch 可能 <{3}}。

答案 1 :(得分:0)

您应该调用SDL_RaiseWindow将第二个窗口置于另一个窗口之上。 来自lazyfoo's传奇的SDL教程:

void LWindow::focus() 
{ 
//Restore window if needed 
if( !mShown ) 
    SDL_ShowWindow( mWindow ); 

//Move window forward
SDL_RaiseWindow( mWindow ); 
}