在SDL_FillRect()

时间:2017-11-14 22:27:58

标签: c++ linux sdl-2 gnome awesome-wm

我正在学习在LazyFoo's tutorial之后创建我的第一个窗口,所有内容都编译并运行,但是当调用SDL_UpdateWindowSurface()时表面没有更新,如下图所示:

The surface was supposed to be white

正如你所看到的,出现它的最后一件事是我的背景。我已经在我的另一台笔记本电脑上测试了这个程序,一切正常,我使用相同的系统,都更新了。

我的代码:

#include <SDL2/SDL.h>

const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;

int main(){
    SDL_Window* window = NULL;
    SDL_Surface* screenSurface = NULL;
    if(SDL_Init(SDL_INIT_VIDEO) < 0){
        printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
    }else{
        window = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
        if(window == NULL){
            printf("Window could not be created SDL_Error: %s\n", SDL_GetError() );
        }
        else{
            screenSurface = SDL_GetWindowSurface(window);
            if(screenSurface == NULL){
                printf("Surface could not be loaded SDL_Error: %s\n", SDL_GetError());
            }else{
                SDL_FillRect(screenSurface, NULL, SDL_MapRGB(screenSurface->format, 255, 255, 255));
                SDL_UpdateWindowSurface(window);
                SDL_Delay(3000);
            }
        }
    }
}

奇怪的是:如果我在SDL_UpdateWindowSurface()之前添加SDL_Delay(1000),1秒后我可以看到表面充满白色,但这似乎不是正确的解决方案,因为程序在我的笔记本电脑上完美运行。

编辑1:

只是意识到一件事,我正在开发这个程序的桌面环境,正在使用awesomewm作为窗口管理器。我的笔记本电脑使用gnome作为DE。我刚刚在我的桌面上安装了gnome并且voilá,该程序按预期工作。现在我只是好奇为什么会这样。在Gnome上运行的相同程序的屏幕截图:

Working as expected(Surface filled with white)

编辑2:

正如keltar所说,SDL在窗口管理器加载之前更新了表面。解决方案是处理窗口事件EXPOSED,即窗口管理器加载窗口时。

SDL_Event event;

while(SDL_WaitEvent(&event))){
    switch(event.type){
        case SDL_WINDOWEVENT:
            switch(event.window.event){
                case SDL_WINDOWEVENT_EXPOSED:
                    SDL_FillRect(screenSurface, NULL, SDL_MapRGB(screenSurface->format, 255, 255, 255));
                    SDL_UpdateWindowSurface(window);
                    SDL_Delay(3000);
                    SDL_Quit();
                    break;
            }
    }
}

0 个答案:

没有答案