Почему этот графический код SDL2 не работает должным образом в Kubuntu 18.04? - PullRequest
0 голосов
/ 07 января 2020

Следующий код создает цветное окно в Ubuntu 18.04 с окружением рабочего стола gdm3 . Но тот же код не создает цветное окно в Kubuntu 18.04, имеющем среду рабочего стола KDE ; вместо этого окно кажется прозрачным и показывает только оконные рамы. И когда окно куда-то перетаскивают, оно замораживает весь пользовательский интерфейс, пока окно не разрушено.

#include <stdio.h>
#include <SDL2/SDL.h>

SDL_Window * window = NULL;
SDL_Surface * surface = NULL;

int main() {
    SDL_Init(SDL_INIT_VIDEO);   
    window = SDL_CreateWindow(
                                "Title of window",
                                SDL_WINDOWPOS_UNDEFINED, //horizontal position of window
                                SDL_WINDOWPOS_UNDEFINED, //vertical position of window
                                640, //width of window
                                480, //height of window
                                SDL_WINDOW_SHOWN //flags
                                );
    if(window == NULL) fprintf(stderr, "Window couldnt be created.\n");
    else
    {
        surface = SDL_GetWindowSurface(window);
        if(surface == NULL) fprintf(stderr, "Could not get window surface\n");
        else {
            SDL_FillRect(
                            surface,
                            NULL,
                            SDL_MapRGB(
                                        surface->format,
                                        0x00,
                                        0xff,
                                        0xff
                                        )
                            );
            SDL_UpdateWindowSurface(window);
            SDL_Delay(10000);
            SDL_DestroyWindow(window);
            SDL_Quit();
        }
    }
    return 0;
}

1 Ответ

1 голос
/ 09 января 2020

Решение состоит в том, чтобы перерисовать окно в событии l oop после возникновения события SDL_WINDOWEVENT_EXPOSED; как упомянуто в libsdl . Окончательный код выглядит следующим образом.

#include <stdio.h>
#include <SDL2/SDL.h>

SDL_Window * window = NULL;
SDL_Surface * surface = NULL;
SDL_Event event;

int main() {
    int show = 1;
    SDL_Init(SDL_INIT_VIDEO);   
    window = SDL_CreateWindow(
                                "Title of window",
                                SDL_WINDOWPOS_UNDEFINED, //horizontal position of window
                                SDL_WINDOWPOS_UNDEFINED, //vertical position of window
                                640, //width of window
                                480, //height of window
                                SDL_WINDOW_SHOWN //flags
                                );
    if(window == NULL) fprintf(stderr, "Window couldnt be created.\n");
    else
    {
        surface = SDL_GetWindowSurface(window);
        if(surface == NULL) fprintf(stderr, "Could not get window surface\n");
        else {
            SDL_FillRect(
                            surface,
                            NULL,
                            SDL_MapRGB(
                                        surface->format,
                                        0x00,
                                        0xff,
                                        0xff
                                        )
                            );
            while(show) {
                while(SDL_PollEvent(&event)) {
                    if(event.type == SDL_WINDOWEVENT) {
                        switch(event.window.event) {
                            case SDL_WINDOWEVENT_EXPOSED:
                                printf("SDL_WINDOWEVENT_EXPOSED event occured\n");
                                SDL_UpdateWindowSurface(window);
                                break;
                            default:
                                printf("other events\n");
                        }
                    } else if(event.type == SDL_QUIT) {
                        show = 0;
                        break;
                    }
                }
            }
            SDL_DestroyWindow(window);
            SDL_Quit();
        }
    }
    return 0;
}
...