2017-10-20 6 views
1

J'ai besoin de mon programme SDL2 pour savoir si une fenêtre est en plein écran, et j'ai pensé que je pourrais obtenir cette information en utilisant SDL_GetWindowFlags(). Par défaut, j'initialise ma fenêtre avec deux drapeaux: SDL_WINDOW_SHOWN et SDL_WINDOW_BORDERLESS, qui sont respectivement 16 et 4. Donc je m'attendais à ce que la fonction retourne 20, mais à la place j'en ai 532. Et aussi parfois 1556, qui passe même à 532 pendant l'exécution après avoir réinitialisé la fenêtre plusieurs fois. 532 ne change jamais à 1556 pendant l'exécution cependant.SDL_GetWindowFlags() renvoie des valeurs apparemment aléatoires

Comment ces drapeaux fonctionnent-ils?

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; 
} 

Répondre

3

On dirait que la valeur de votre drapeau est changeant basée sur les États de SDL_WINDOW_INPUT_FOCUS et SDL_WINDOW_MOUSE_FOCUS. Mais peu importe. Les valeurs de drapeau changent tout le temps. Vous ne devriez pas vous soucier de la valeur totale des drapeaux. Vous avez seulement besoin de connaître la valeur du bit de drapeau que vous regardez. Les indicateurs SDL_WINDOW_SHOWN et SDL_WINDOW_BORDERLESS sont toujours définis lorsque les valeurs sont 532 et 1556 (si vous regardez en binaire).

Il suffit de saisir la valeur de l'indicateur binaire:

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; 

Voici une fonction que vous pouvez utiliser pour voir ce que les drapeaux sont définis en fonction de la valeur:

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"); 
} 

Plus drapeaux peuvent être trouvés ici : https://wiki.libsdl.org/SDL_WindowFlags.

sortie:

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