最小化后无法恢复SDL窗口

时间:2014-03-07 13:17:12

标签: c++ linux ubuntu window sdl

时出现问题
SDL_RestoreWindow(gameWindow);
在最小化窗口上调用

。窗口不会重新出现。

我做了一个虚拟程序,模拟我的主程序正在调用的SDL调用类型,并且问题再现了。这是代码:

#include <SDL.h>

int main(int argn, char **argv)
{
    // The windows    
    SDL_Window *gameWindow;           

    // Initialise
    SDL_Init(SDL_INIT_EVERYTHING);             

    // Create window
    gameWindow = SDL_CreateWindow(
        "Game Window",                 
        SDL_WINDOWPOS_UNDEFINED,           
        SDL_WINDOWPOS_UNDEFINED,           
        640,                               
        480,                               
        SDL_WINDOW_OPENGL                  
    );

    // Minimise/ hide or whatever?
    SDL_MinimizeWindow(gameWindow);

    // Wait
    SDL_Delay(1000);

    // Attempt to bring back the window
    SDL_RestoreWindow(gameWindow);

    // program would run here
    SDL_Delay(1000);

    // quit out
    SDL_DestroyWindow(gameWindow);

    // Clean up
    SDL_Quit();
    return 0;
}

关于为什么这个游戏窗口没有重新出现的任何想法? SDL_Restore不是设计用于恢复最小化窗口吗?

另外FYI这是在Ubuntu 13.10上运行并使用gcc 4.8.1和Gnome metacity 2.34.13进行编译

1 个答案:

答案 0 :(得分:1)

<强>更新

这不是SDL库中的错误。虽然下面的补丁工作,但它不应该如何。 SDL在收到SDL_WINDOWEVENT_MINIMIZED事件时会触发UnmapNotify事件。

因此,需要调用SDL_PumpEvents()SDL_PollEvent(SDL_Event * event)才能让SDL处理事件和事情按预期工作。

OLD ANSWER

这个错误今天仍然存在于SDL2中。

由于窗口未分配SDL_WINDOW_MINIMIZED标记,因此窗口未恢复。因此,SDL_RestoreWindow()无需执行任何操作即可返回:

void
SDL_RestoreWindow(SDL_Window * window)
{
    CHECK_WINDOW_MAGIC(window,);

    if (!(window->flags & (SDL_WINDOW_MAXIMIZED | SDL_WINDOW_MINIMIZED))) {
        return;
    }

    if (_this->RestoreWindow) {
        _this->RestoreWindow(_this, window);
    }
}

Link to SDL repository

解决方案是添加对SDL_SendWindowEvent()的调用,而SDL_RestoreWindow()会相应地设置标记,SDL_MinimizeWindow()将按预期开始工作。

应用此修补程序将修复它(仅适用于--- src/video/SDL_video~.c 2017-01-18 17:31:08.180521882 -0500 +++ src/video/SDL_video.c 2017-01-18 17:12:37.025949492 -0500 @@ -2105,6 +2105,7 @@ if (_this->MinimizeWindow) { _this->MinimizeWindow(_this, window); } + SDL_SendWindowEvent(window, SDL_WINDOWEVENT_MINIMIZED, 0, 0); } void @@ -2119,6 +2120,7 @@ if (_this->RestoreWindow) { _this->RestoreWindow(_this, window); } + SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESTORED, 0, 0); } int

$events = Event::orderBy('event_date')->with('organizers')->get();