SDL_GetWindowFlags () возвращает, казалось бы, случайные значения

Мне нужно, чтобы моя программа SDL2 знала, является ли окно полноэкранным, и я подумал, что могу получить эту информацию, используя SDL_GetWindowFlags (). По умолчанию я инициализирую мое окно с двумя флагами: SDL_WINDOW_SHOWN и SDL_WINDOW_BORDERLESS, которые равны 16 и 4 соответственно. Поэтому я ожидал, что функция вернет 20, но вместо этого я получу 532. А также иногда 1556, который даже меняется на 532 во время выполнения после повторной инициализации окна несколько раз. Однако 532 никогда не меняется на 1556 во время выполнения.

Как работают эти флаги?

bool init( int windowflags )
{
bool success = true;
if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
printf( "Video initialization failed: %s\n", SDL_GetError() );
success = false;
}
else
{
gWindow = SDL_CreateWindow( "VIRGULE", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WIN_W, WIN_H, SDL_WINDOW_SHOWN + windowflags );
if( gWindow == NULL )
{
printf( "Window could not be created: %s\n", SDL_GetError() );
success = false;
}
else
{
gRenderer = SDL_CreateRenderer( gWindow, -1, SDL_RENDERER_ACCELERATED + SDL_RENDERER_TARGETTEXTURE );
if( gRenderer == NULL )
{
printf( "Renderer could not be created: %s\n", SDL_GetError() );
success = false;
}
else
{
gTexture = SDL_CreateTexture( gRenderer, SDL_PIXELFORMAT_UNKNOWN, SDL_TEXTUREACCESS_TARGET, SCR_W, SCR_H );
if( gTexture == NULL )
{
printf( "Texture creation failed: %s\n", SDL_GetError() );
success = false;
}
}
}
}
printf( "%i\n", SDL_GetWindowFlags( gWindow ) );
//this is either prints 1556 or 532
return success;
}

1

Решение

Похоже, значение вашего флага меняется в зависимости от того, SDL_WINDOW_INPUT_FOCUS а также SDL_WINDOW_MOUSE_FOCUS, Но это не важно. Значения флага меняются все время. Вы не должны беспокоиться об общей стоимости флагов. Вам нужно только знать значение флага, который вы смотрите. SDL_WINDOW_SHOWN а также SDL_WINDOW_BORDERLESS флаги по-прежнему установлены, когда значения 532 а также 1556 (если вы посмотрите в двоичном формате).

Просто возьмите значение битового флага:

int flags             = SDL_GetWindowFlags( gWindow );
int window_shown      = ( flags & SDL_WINDOW_SHOWN ) ? true : false;
int window_borderless = ( flags & SDL_WINDOW_BORDERLESS ) ? true : false;
int window_fullscreen = ( flags & SDL_WINDOW_FULLSCREEN ) ? true : false;

Вот функция, которую вы можете использовать, чтобы увидеть, какие флаги установлены в зависимости от значения:

void show_flags(int flags);

int main()
{
show_flags(20);
show_flags(532);
show_flags(1556);

return 0;
}

void show_flags(int flags) {

printf("\nFLAGS ENABLED: ( %d )\n", flags);
printf("=======================\n");
if(flags & SDL_WINDOW_FULLSCREEN)         printf("SDL_WINDOW_FULLSCREEN\n");
if(flags & SDL_WINDOW_OPENGL)             printf("SDL_WINDOW_OPENGL\n");
if(flags & SDL_WINDOW_SHOWN)              printf("SDL_WINDOW_SHOWN\n");
if(flags & SDL_WINDOW_HIDDEN)             printf("SDL_WINDOW_HIDDEN\n");
if(flags & SDL_WINDOW_BORDERLESS)         printf("SDL_WINDOW_BORDERLESS\n");
if(flags & SDL_WINDOW_RESIZABLE)          printf("SDL_WINDOW_RESIZABLE\n");
if(flags & SDL_WINDOW_MINIMIZED)          printf("SDL_WINDOW_MINIMIZED\n");
if(flags & SDL_WINDOW_MAXIMIZED)          printf("SDL_WINDOW_MAXIMIZED\n");
if(flags & SDL_WINDOW_INPUT_GRABBED)      printf("SDL_WINDOW_INPUT_GRABBED\n");
if(flags & SDL_WINDOW_INPUT_FOCUS)        printf("SDL_WINDOW_INPUT_FOCUS\n");
if(flags & SDL_WINDOW_MOUSE_FOCUS)        printf("SDL_WINDOW_MOUSE_FOCUS\n");
if(flags & SDL_WINDOW_FULLSCREEN_DESKTOP) printf("SDL_WINDOW_FULLSCREEN_DESKTOP\n");
if(flags & SDL_WINDOW_FOREIGN)            printf("SDL_WINDOW_FOREIGN\n");
}

Больше флагов можно найти здесь: https://wiki.libsdl.org/SDL_WindowFlags.

Выход:

FLAGS ENABLED: ( 20 )
=======================
SDL_WINDOW_SHOWN
SDL_WINDOW_BORDERLESS

FLAGS ENABLED: ( 532 )
=======================
SDL_WINDOW_SHOWN
SDL_WINDOW_BORDERLESS
SDL_WINDOW_INPUT_FOCUS

FLAGS ENABLED: ( 1556 )
=======================
SDL_WINDOW_SHOWN
SDL_WINDOW_BORDERLESS
SDL_WINDOW_INPUT_FOCUS
SDL_WINDOW_MOUSE_FOCUS
3

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

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

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