SDL_UpdateWindowSurface () не обновляется после SDL_FillRect ()

Я учусь создавать мое первое окно, следующее Учебник LazyFoo, все компилируется и запускается, но поверхность не обновляется при вызове SDL_UpdateWindowSurface (), как показано на рисунке ниже:

Поверхность должна была быть белой

Как видите, последнее, что появляется, это мой фон. Я уже тестировал эту программу на своем другом ноутбуке, и все работает нормально, и я использую ту же систему, обе обновлены.

Мой код:

#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_Delay (1000) перед SDL_UpdateWindowSurface (), через 1 секунду я смогу увидеть поверхность, заполненную белым, но это не кажется правильным решением, так как программа отлично работает на моем ноутбуке.

Изменить 1:

Просто осознайте одну вещь, моя среда рабочего стола, где я разрабатываю эту программу, использует в качестве оконного менеджера awesomewm. Мой ноутбук использует гном как DE. Я только что установил gnome на свой рабочий стол и вуаля, программа работает как положено. Теперь мне просто любопытно, почему это происходит. Снимок экрана с той же программой, запущенной в Gnome:

Работает как положено (поверхность заполнена белым)

Изменить 2:

Как упоминал Келтар, 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;
}
}
}

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]