Мне нужно, чтобы моя программа 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;
}
Похоже, значение вашего флага меняется в зависимости от того, 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
Других решений пока нет …