问题发生在
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_MAXIMIZED
和 SDL_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/