Я учусь создавать мое первое окно, следующее Учебник 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;
}
}
}
Задача ещё не решена.
Других решений пока нет …