SDL2 Fokus Event



  • Wie findet man mit SDL2 heraus, wenn das Fenster den Fokus verliert? SDL_WINDOWEVENT_FOCUS_LOST scheint nicht das richtige zu sein und SDL_GetAppState() gibt es seit SDL2 nicht mehr.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (alle ISO-Standards) in das Forum Spiele-/Grafikprogrammierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hmm, SDL_WINDOWEVENT_FOCUS_LOST sollte eigentlich richtig sein. Alle Window events sind auf https://wiki.libsdl.org/SDL_WindowEventID aufgelistet.



  • class game{
    ...
    
        void process_events(){
            SDL_Event event;
    
            while(SDL_PollEvent(&event)){
                if(event.type == SDL_QUIT)
                    running = false;
    
                else if(event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_p)
                    pause = !pause;
    
                else if(event.type == SDL_WINDOWEVENT_FOCUS_LOST)
                    pause = true;
    ...
            }
        }
    ...
    
        void run(){
    ...
    
            while(running){
    ...
                process_events();
    
                if(!pause){
                    check_input();
                    update();
                    render();
                }
    ...
            }
        }
    ...
    };
    

    Während das Pausen mit 'P' tadellos funktioniert, wird beim Verlieren des Fokus nicht gepaust.



  • Und mal 'SDL_WINDOWEVENT_LEAVE' probiert?



  • Th69 schrieb:

    Und mal 'SDL_WINDOWEVENT_LEAVE' probiert?

    else if(event.type == SDL_WINDOWEVENT_LEAVE || event.type == SDL_WINDOWEVENT_FOCUS_LOST)
                    pause = true;
    

    Klappt immer noch nicht.
    Ich glaube hier handelt es sich um einen Bug, kann das sein?



  • Kannst du denn mal debuggen oder über die Konsole loggen, welches (oder ob ein) Event geworfen wird, wenn du du das Fenster wechselst?

    PS: Unter welchem OS programmierst du und welche SDL-Version verwendest du?

    Laut SDL2 multiple windows focus könnte ein Fehler diesbzgl. in 2.0.3 behoben worden sein.



  • Th69 schrieb:

    Kannst du denn mal debuggen oder über die Konsole loggen, welches (oder ob ein) Event geworfen wird, wenn du du das Fenster wechselst?

    Event 512, wenn das Fenster den Mausfokus verliert, was allerdings noch nicht ganz das Richtige ist. Ansonsten wird kein Event ausgelöst.

    PS: Unter welchem OS programmierst du und welche SDL-Version verwendest du?

    Linux mit sdl2 2.0.4-2

    Laut SDL2 multiple windows focus könnte ein Fehler diesbzgl. in 2.0.3 behoben worden sein.

    Scheint bei mir noch nicht der Fall zu sein. Es wird echt bloß Event 512 und 1024 ausgelöst, was jeweils für die Maus ist. Tja, sieht wohl so aus, als müsste ich auf eine neue Version warten. Oder selber am SDL-Code rumfummeln, aber das lass ich mal stecken.



  • Ähmm du machst hier einen Fehler:

    weißesBlatt schrieb:

    class game{
    ...
    
        void process_events(){
            SDL_Event event;
    
            while(SDL_PollEvent(&event)){
                if(event.type == SDL_QUIT)
                    running = false;
    
                else if(event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_p)
                    pause = !pause;
    
                else if(event.type == SDL_WINDOWEVENT_FOCUS_LOST) // FALSCHER Vergleich
                    pause = true;
    ...
            }
        }
    

    Du musst prüfen, ob event.type == SDL_WINDOWEVENT ist, erst dann kannst du mit event.window.event == SDL_WINDOWEVENT_FOCUS_LOST auf dein gewünschtes Event prüfen.



  • Ach ja, Mist.
    Danke, das wars gewesen.


Log in to reply