c++ - SDL Window 最小化后无法恢复

标签 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;
}

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

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

最佳答案

简答

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

更长的答案

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

这是 source code 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);
    }
}

如果 SDL_WINDOW_MAXIMIZEDSDL_WINDOW_MINIMIZED 都没有设置,则 _this->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 中所述。 :

Internally, SDL stores all the events waiting to be handled in an event queue. Using functions like SDL_PollEvent(), SDL_PeepEvents() and SDL_WaitEvent() you can observe and handle waiting input events.

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

This function updates the event queue and internal input device state.

Often the need for calls to SDL_PumpEvents() is hidden from the user since SDL_PollEvent() and SDL_WaitEvent() implicitly call SDL_PumpEvents(). However, if you are not polling or waiting for events (e.g. you are filtering them), then you must call SDL_PumpEvents() to force an event queue update.

关于c++ - SDL Window 最小化后无法恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22251146/

相关文章:

python - 在 Ubuntu 服务器上使用 Python 看不到套接字

c++ - 有向无环图 : Updating the vertex property of a parent node by comparing the property of the child nodes.

c++ - QWidgetAction : how to make the menu disappear after the user completes his input

c++ - 宏 C++ #define Examples(obje) (::f(s, (obje), arg1, arg2, arg3))

windows - 操作系统 Windows 和 Linux 中 TCP 窗口大小的默认值

ubuntu - qemu-kvm install iso 出现空白屏幕,显示 "640 480 graphic mode"

docker - 无法使用 DockerOperator 从 Airflow 容器在 Ubuntu 容器中执行命令

C++ STL 映射异常。 (不可变树的根)

适用于 Linux 的 Windows 资源编辑器

python - 是否可以使用自定义 Python 窗口管理器来主题化 GUI 应用程序?