时出现问题
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进行编译
答案 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);
}
}
解决方案是添加对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();