Я учусь создавать свое первое окно, следуя руководству 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. Мой ноутбук использует gnome как DE. Я только что установил gnome на свой рабочий стол и вуаля, программа работает как положено. Теперь мне просто интересно, почему это происходит. Скриншот той же программы, работающей в Gnome:
Редактировать 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;
}
}
}
SDL_SetHint(SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR,·"0");
непосредственно передSDL_Init()
, компоновщик остается и UpdateWindow работает. Я до сих пор не знаю, почему вам не нужно ждать события EXPOSED с включенным композитором. - person JonnyRobbie   schedule 26.05.2020