我在 Linux 下使用 SDL3 时,遇到了全屏切换问题,从全屏状态恢复到普通窗口状态时,窗口大小不再是全屏前的大小,而是满屏幕的窗口大小。另外一个问题,从最大化状态进入全屏,再退出全屏,此时无法从最大化状态恢复到原来的窗口大小,也是恢复成了满屏幕窗口大小。下面的代码用一个函数解决了上面两个问题:
cpp
// SDL3 全屏切换示例:F11 切换全屏
// 编译运行:g++ main.cpp -lSDL3 -lGL -o main && ./main
#include <SDL3/SDL.h>
#include <GL/gl.h>
static SDL_Window* window = nullptr;
// ---------- 核心:一个函数解决全屏/恢复问题 ----------
void ToggleFullscreen() {
// 需要两个持久变量来记录窗口状态
static SDL_Rect savedRect{0, 0, 600, 400};
static bool isMaximized = false;
// 是否进入全屏状态
if (!(SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN)) {
// 进入全屏前,记录是否处于最大化状态
isMaximized = SDL_GetWindowFlags(window) & SDL_WINDOW_MAXIMIZED;
// 如果不是最大化状态,则保存窗口大小和位置
if (!isMaximized) {
SDL_GetWindowPosition(window, &savedRect.x, &savedRect.y);
SDL_GetWindowSize(window, &savedRect.w, &savedRect.h);
}
// 进入全屏
SDL_SetWindowFullscreen(window, true);
} else {
// 退出全屏
SDL_SetWindowFullscreen(window, false);
// 修复窗口大小
SDL_RestoreWindow(window);
SDL_SetWindowSize(window, savedRect.w, savedRect.h);
// 刷新对窗口大小的修改结果,否则对窗口位置的修改会出错
SDL_SyncWindow(window);
SDL_SetWindowPosition(window, savedRect.x, savedRect.y);
// 如果进入全屏前是最大化状态,则需要先恢复到普通窗口状态,
// 并修复窗口位置,然后再次进入最大化状态,如果直接从全屏
// 状态退出到最大化状态而不做修复,那么将无法从最大化状态
// 回到正确的普通窗口位置。
if (isMaximized) SDL_MaximizeWindow(window);
}
}
int main() {
SDL_Init(SDL_INIT_VIDEO);
window = SDL_CreateWindow("F11 Toggle Fullscreen", 640, 480, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
SDL_GL_CreateContext(window);
while (true) {
SDL_Event event;
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_EVENT_KEY_DOWN:
switch (event.key.key) {
case SDLK_F11:
ToggleFullscreen();
break;
}
break;
case SDL_EVENT_QUIT:
return 0;
}
}
glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
SDL_GL_SwapWindow(window);
}
}