Event Examples

イベントのフィルタリング、ハンドリングの例


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

#include "SDL.h"

/* この関数はイベントスレッドとは別に走るでしょう */
int FilterEvents(const SDL_Event *event) {
    static int boycott = 1;

    /* quitイベントはウインドウが閉じられたことを通知します */
    if ( (event->type == SDL_QUIT) && boycott ) {
        printf("Quitイベントは遮断されました。 -- 再度挑戦してください。\n");
        boycott = 0;
        return(0);
    }
    if ( event->type == SDL_MOUSEMOTION ) {
        printf("マウスが (%d,%d) に移動しました。\n",
                event->motion.x, event->motion.y);
        return(0);    /* すでに処理が終わったので捨てます */
    }
    return(1);
}

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

    /* SDLを初期化します (イベントループが始まります) */
    if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
        fprintf(stderr,
                "SDLを初期化できませんでした: %s\n", SDL_GetError());
        exit(1);
    }

    /* ウインドウが閉じられたり、プログラムが止められたときに
    正しく終了するようにします */
    atexit(SDL_Quit);

    /* キーイベントを無視します */
    SDL_EventState(SDL_KEYDOWN, SDL_IGNORE);
    SDL_EventState(SDL_KEYUP, SDL_IGNORE);

    /* quitとマウスのイベントをフィルタリングします */
    SDL_SetEventFilter(FilterEvents);

    /* ディスプレイがないとマウスイベントを受けとることができません */
    if ( SDL_SetVideoMode(640, 480, 8, 0) == NULL ) {
        fprintf(stderr, "640x480x8 ビデオモードにセットすることができませんでした: %s\n",
                        SDL_GetError());
        exit(1);
    }

    /* 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("アクティブになりました\n");
                    } else {
                        printf("アイコン化されました\n");
                    }
                }
            }
            break;
                    
            case SDL_MOUSEBUTTONDOWN: {
                Uint8 *keys;

                keys = SDL_GetKeyState(NULL);
                if ( keys[SDLK_ESCAPE] == SDL_PRESSED ) {
                    printf("さようなら...\n");
                    exit(0);
                }
                printf("マウスのボタンが押されました\n");
            }
            break;

            case SDL_QUIT: {
                printf("Quitのリクエストがありました。終了します。\n");
                exit(0);
            }
            break;
        }
    }
    /* 通常はここには来ないはずです */
    printf("SDL_WaitEventでエラーが発生しました: %s\n", SDL_GetError());
    exit(1);
}