Окно кажется созданным дважды

Когда я компилирую и запускаю простое приложение на языке C, использующее библиотеку SDL (версия 2), окно открывается дважды; сначала я вижу окно, которое очень быстро открывается и закрывается, а затем окно поднимается и остается (на две секунды). Есть идеи, что может быть причиной этого?

Вот тестовая программа:

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

#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480

int main(int argc, char* args[]) {
  SDL_Window* window = NULL;
  SDL_Surface* screenSurface = NULL;
  if (SDL_Init(SDL_INIT_VIDEO) < 0) {
    fprintf(stderr, "could not initialize sdl2: %s\n", SDL_GetError());
    return 1;
  }
  window = SDL_CreateWindow(
                "hello_sdl2",
                SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
                SCREEN_WIDTH, SCREEN_HEIGHT,
                SDL_WINDOW_SHOWN
                );
  if (window == NULL) {
    fprintf(stderr, "could not create window: %s\n", SDL_GetError());
    return 1;
  }
  screenSurface = SDL_GetWindowSurface(window);
  SDL_FillRect(screenSurface, NULL, SDL_MapRGB(screenSurface->format, 0xFF, 0xFF, 0xFF));
  SDL_UpdateWindowSurface(window);
  SDL_Delay(2000);
  SDL_DestroyWindow(window);
  SDL_Quit();
  return 0;
}

Я компилирую программу с помощью

gcc -o hello_sdl2 hello_sdl2.c -lSDL2

и версия такая

$ gcc --version
gcc (Debian 12.2.0-14) 12.2.0
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ sdl2-config --version
2.26.5

Редактировать 27 августа 2024 г.:

$ cat /etc/debian_version 
12.6
$ wmctrl -m
Name: Blackbox
Class: N/A
PID: N/A
Window manager's "showing the desktop" mode: N/A

Я не могу воспроизвести это на своей стороне, но для этого может быть много причин. Возникнет ли у вас та же проблема, если вы замените SDL_WINDOW_SHOWN на SDL_WINDOW_HIDDEN, а затем вызовете SDL_ShowWindow(window); после SDL_FillRect или SDL_UpdateWindowSurface?

Ted Lyngmo 26.08.2024 23:03

Какая среда рабочего стола? Может быть, это что-то специфическое для DE? И какая ОС? (Какая версия Debian?)

HolyBlackCat 27.08.2024 09:25

попробуйте добавить -lSDL2main при компиляции следующим образом: gcc -o hello_sdl2 hello_sdl2.c -lSDL2 -lSDL2main

Hamza AlAjlouni 27.08.2024 09:57

@HamzaAlAjlouni Это полезно только в Windows, а у OP нет проблем с связыванием.

Ted Lyngmo 27.08.2024 16:27

@TedLyngmo Да, использование SDL_WINDOW_HIDDEN и SDL_ShowWindow действительно решило проблему, спасибо!

August Karlstrom 27.08.2024 20:25

@AugustKarlstrom Отлично! Пожалуйста! Так как я не знаю точно, куда вы поставили SDL_ShowWindow(window); для решения вопроса, смело пишите ответ на свой вопрос. Это может помочь кому-то еще в будущем.

Ted Lyngmo 27.08.2024 20:29

@HolyBlackCat Теперь я добавил в вопрос информацию о версии ОС и оконном менеджере.

August Karlstrom 27.08.2024 20:34
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
7
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как отметил Тед Люнгмо в комментариях, решение состоит в том, чтобы использовать флаг SDL_WINDOW_HIDDEN в вызове SDL_CreateWindow, а затем вызвать SDL_ShowWindow после вызова SDL_GetWindowSurface:

...
window = SDL_CreateWindow("hello_sdl2",
    SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
    SCREEN_WIDTH, SCREEN_HEIGHT,
    SDL_WINDOW_HIDDEN);
...
screenSurface = SDL_GetWindowSurface(window);
SDL_ShowWindow(window);
...

Примечание. Если SDL_ShowWindow вызывается до SDL_GetWindowSurface, проблема «мерцания» остается.

Вы должны сообщить об этом разработчикам SDL как об ошибке.

HolyBlackCat 28.08.2024 17:33

Другие вопросы по теме