SDL3 全屏问题解决方案

我在 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);
    }
}
相关推荐
KaMeidebaby10 小时前
卡梅德生物技术快报|噬菌体肽库展示技术构建 Mhp168‑Hsp70 定向随机肽库:流程、质控与数据结果
前端·数据库·其他·百度·新浪微博
Biocloudy13 小时前
信号分子:从 CD8⁺ T 细胞到癌症免疫疗法
大数据·人工智能·经验分享·其他
拾光向日葵14 小时前
在广东药科大学读书,课余生活与管理氛围观察
其他
KaMeidebaby16 小时前
卡梅德生物技术快报|多肽库筛选技术构建药物递送功能肽库:流程、算法与质控体
前端·数据库·其他·百度·新浪微博
洞察世界资讯2 天前
辽宁传媒学院校园环境与食堂服务情况梳理
其他
秦明月132 天前
伺服撞机、丢脉冲?FX3U控制松下伺服调试避坑指南
经验分享·其他·职场和发展·创业创新·学习方法
KaMeidebaby2 天前
卡梅德生物技术快报|单 B 细胞抗体制备:流程优化、表达系统适配与性能数据
前端·数据库·其他·百度·新浪微博
老陈头聊SEO2 天前
生成引擎优化(GEO)在内容创作中实现用户体验提升的新实践
其他·搜索引擎·seo优化
kaisun643 天前
一些问题的答案
其他
KaMeidebaby3 天前
卡梅德生物技术快报|单 B 细胞抗体技术:全犬源单抗制备流程、关键参数与性能验证
前端·数据库·其他·百度·新浪微博