【问题标题】:SDL Window can't be restored after minimisingSDL Window 最小化后无法恢复
【发布时间】:2014-04-10 15:54:12
【问题描述】:

问题发生的时候

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 不是为恢复最小化窗口而设计的吗?

仅供参考,这是在 Ubuntu 13.10 上运行并使用 gcc 4.8.1 和 Gnome metacity 2.34.13 编译

【问题讨论】:

  • 函数返回什么值?
  • SDL_RestoreWindow 和其他返回 void 根据wiki.libsdl.org/SDL_RestoreWindow
  • 似乎无法重现这一点(尽管环境不同)。在您的测试用例中,您是否在最小化之前看到弹出窗口? SDL_CreateWindow 是否成功返回?您是否尝试过不使用 OpenGL(尝试使用 SDL_WINDOW_SHOWN 标志)?
  • 是的,我看到了窗口小狗,然后最小化,但永远不会回来。 SDL_WINDOW_SHOWN 在这里似乎也没有什么不同。不过,我会在不同的环境中检查一下,看看是否会有所不同。

标签: c++ linux ubuntu window sdl


【解决方案1】:

简答

确保调用让 SDL 处理事件的函数之一:SDL_PollEvent()SDL_WaitEvent()SDL_PumpEvents()

更长的答案

窗口无法恢复的原因可能是因为它没有分配SDL_WINDOW_MINIMIZED标志。

这是SDL_RestoreWindow()函数的source code

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);
    }
}

如果既没有设置SDL_WINDOW_MAXIMIZED 也没有设置SDL_WINDOW_MINIMIZED,则不会调用_this-&gt;RestoreWindow()(并且不会恢复窗口)。

通常,当窗口最小化时,SDL_WINDOW_MINIMIZED 标志由 SDL 在SDL_SendWindowEvent() function 中设置:

    case SDL_WINDOWEVENT_MINIMIZED:
        if (window->flags & SDL_WINDOW_MINIMIZED) {
            return 0;
        }
        window->flags &= ~SDL_WINDOW_MAXIMIZED;
        window->flags |= SDL_WINDOW_MINIMIZED;
        SDL_OnWindowMinimized(window);
        break;

这将在 SDL 处理事件队列时发生。事件的处理应由您的应用程序触发,如documentation 中所述:

在内部,SDL 将所有等待处理的事件存储在一个 事件队列。使用 SDL_PollEvent()、SDL_PeepEvents() 等函数 和 SDL_WaitEvent() 可以观察和处理等待输入事件。

如果不想接收和处理输入事件,可以调用SDL_PumpEvents()function让SDL处理事件:

此函数更新事件队列和内部输入设备状态。

由于 SDL_PollEvent() 和 SDL_WaitEvent() 隐式调用 SDL_PumpEvents(),因此用户通常不需要调用 SDL_PumpEvents()。但是,如果您没有轮询或等待事件(例如,您正在过滤它们),那么您必须调用 SDL_PumpEvents() 来强制更新事件队列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    相关资源
    最近更新 更多