Event Examples

Filtering and Handling Events

#include <stdio.h>
#include <stdlib.h>

#include "SDL.h"

/* This function may run in a separate event thread */
int FilterEvents(const SDL_Event *event) {
    static int boycott = 1;

    /* This quit event signals the closing of the window */
    if ( (event->type == SDL_QUIT) && boycott ) {
        printf("Quit event filtered out -- try again.\n");
        boycott = 0;
        return(0);
    }
    if ( event->type == SDL_MOUSEMOTION ) {
        printf("Mouse moved to (%d,%d)\n",
                event->motion.x, event->motion.y);
        return(0);    /* Drop it, we've handled it */
    }
    return(1);
}

int main(int argc, char *argv[])
{
    SDL_Event event;

    /* Initialize the SDL library (starts the event loop) */
    if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
        fprintf(stderr,
                "Couldn't initialize SDL: %s\n", SDL_GetError());
        exit(1);
    }

    /* Clean up on exit, exit on window close and interrupt */
    atexit(SDL_Quit);

    /* Ignore key events */
    SDL_EventState(SDL_KEYDOWN, SDL_IGNORE);
    SDL_EventState(SDL_KEYUP, SDL_IGNORE);

    /* Filter quit and mouse motion events */
    SDL_SetEventFilter(FilterEvents);

    /* The mouse isn't much use unless we have a display for reference */
    if ( SDL_SetVideoMode(640, 480, 8, 0) == NULL ) {
        fprintf(stderr, "Couldn't set 640x480x8 video mode: %s\n",
                        SDL_GetError());
        exit(1);
    }

    /* Loop waiting for ESC+Mouse_Button */
    while ( SDL_WaitEvent(&event) >= 0 ) {
        switch (event.type) {
            case SDL_ACTIVEEVENT: {
                if ( event.active.state & SDL_APPACTIVE ) {
                    if ( event.active.gain ) {
                        printf("App activated\n");
                    } else {
                        printf("App iconified\n");
                    }
                }
            }
            break;
                    
            case SDL_MOUSEBUTTONDOWN: {
                Uint8 *keys;

                keys = SDL_GetKeyState(NULL);
                if ( keys[SDLK_ESCAPE] == SDL_PRESSED ) {
                    printf("Bye bye...\n");
                    exit(0);
                }
                printf("Mouse button pressed\n");
            }
            break;

            case SDL_QUIT: {
                printf("Quit requested, quitting.\n");
                exit(0);
            }
            break;
        }
    }
    /* This should never happen */
    printf("SDL_WaitEvent error: %s\n", SDL_GetError());
    exit(1);
}

SDL_ACTIVEEVENT related Event Handling

Following example shows how to evaluate the event SDL_ACTIVEEVENT in order to extract information on losing / gaining focus and minimizing / restoring of application window.

    enum ApplicationWindowState
    {
        Minimized,              // application window has been iconified
        Restored,               // application window has been restored
        GainedFocus,            // application window got input focus
        LostFocus               // application window lost input focus
    } _appWindowState;

    ....

    SDL_Event event;

    // get the event in your application
    ...

    // set proper state depending on current state and incoming sdl event
    if ( event.active.type == SDL_ACTIVEEVENT )
    {
        if ( event.active.state == ( SDL_APPINPUTFOCUS | SDL_APPACTIVE ) )
        {
            if ( event.active.gain == 0 )
                _appWindowState = Minimized;
            else
            {
                if ( _appWindowState == LostFocus )
                    _appWindowState = GainedFocus;
                else
                    _appWindowState = Restored;
            }
        }
        else if ( event.active.state & SDL_APPINPUTFOCUS )
        {
            if ( event.active.gain == 0 )
                _appWindowState = LostFocus;
            else
                _appWindowState = GainedFocus;
        }
    }


CategoryExamples

Event_Examples (last edited 2008-12-11 22:16:46 by KenBull)