2015-06-03 14 views
5

Ich habe Probleme, den Vollbildmodus mit meinem Programm zu deaktivieren. Das Eingeben des Vollbilds erfolgt korrekt, aber der Versuch, zum Fenstermodus zurückzukehren, funktioniert nicht. Der einzige Effekt ist, dass der Cursor erneut angezeigt wird.SDL2: Wie schaltet man den Vollbildmodus richtig um?

Hier ist der MCVE/SSCCE, die das Problem für mich wiedergibt:

void ToggleFullscreen(SDL_Window* Window) { 
    Uint32 FullscreenFlag = SDL_WINDOW_FULLSCREEN; 
    bool IsFullscreen = SDL_GetWindowFlags(Window) & FullscreenFlag; 
    SDL_SetWindowFullscreen(Window, IsFullscreen ? 0 : FullscreenFlag); 
    SDL_ShowCursor(IsFullscreen); 
} 

int main() { 
    SDL_Init(SDL_INIT_VIDEO); 
    SDL_Window* Window = SDL_CreateWindow("", 
     SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0); 

    bool Exit = false; 
    for (SDL_Event Event; !Exit;) { 
     SDL_WaitEvent(&Event); 
     if (Event.type == SDL_KEYDOWN) { 
      switch (Event.key.keysym.sym) { 
       case SDLK_f: ToggleFullscreen(Window); break; 
       case SDLK_q: Exit = true; break; 
      } 
     } 
    } 
    SDL_DestroyWindow(Window); 
    SDL_Quit(); 
} 

SDL_SetWindowFullscreen kehrt 0, als ob die Operation erfolgreich war. Was mache ich falsch? (Ich verwende SDL 2.0.3 unter OS X 10.10.3.)

Antwort

4

Es sieht wie ein bekanntes Problem aus. Hoffentlich werden die SDL-Entwickler es beheben. Ich habe den folgenden Fehlerbericht gefunden.

https://bugzilla.libsdl.org/show_bug.cgi?id=2479

+0

Es scheint einen Patch für den Fehler in der v2.0.4 Branche zu geben. Ich denke, ich warte nur bis es veröffentlicht wird. – emlai

0

Schon jetzt scheint es immer noch ein Problem mit SDL_SetWindowFullscreen zu sein. Ich habe versucht, meinem Videoplayer Vollbildfunktionen mit dieser Funktion hinzuzufügen. Beim Übergang zwischen Vollbild- und Fenstermodus stürzt es jedoch zufällig ab.

Ich habe eine temporäre Arbeit gefunden, die für den Moment korrekt zu funktionieren scheint.

SDL_DisplayMode dm; 

if (SDL_GetDesktopDisplayMode(0, &dm)) 
{ 
    printf("Error getting desktop display mode\n"); 
    return -1; 
} 

if (SDL_PollEvent(&event)) 
{ 
    switch (event.type) 
    { 
     case SDL_KEYUP: 
      switch (event.key.keysym.sym) 
      { 
       case SDLK_f: 
        SDL_RestoreWindow(screen); //Incase it's maximized... 
        SDL_SetWindowSize(screen, dm.w, dm.h + 10); 
        SDL_SetWindowPosition(screen, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); 
      } 
      break; 
    } 
} 

Es ist im Grunde "gefälschte" Vollbild. Die Größe des Fensters wird so geändert, dass der Clientbereich den gesamten Bildschirm abdeckt und die Schaltflächen zum Minimieren, Maximieren und Beenden nicht angezeigt werden.

Hoffe, das hilft.