SDL-1.3を使ってみる

開発版のSDL-1.3だとマルチウィンドウにも対応しているそうなのでどうやるか調べてみる。

とりあえずサンプルプログラムで動作を確認してみた。

$ cd SDL-1.3.0-5003
$ ./configure
$ make
$ sudo make install

$ cd test
$ ./configure
$ make
$ ./testwm2 --windows 3

3個ウィンドウが出てきた。
SDL_CreateWindow関数を使えばできるようだ。
SDL-1.2のSDL_SetVideoModeの代わりにこれを使うということらしい。

以前のやりかた

窓を出してループに入るまで。

// g++ -o sample `sdl-config --cflags --libs` main.cpp
#include <SDL.h>
#include <iostream>

void onExit()
{
    std::cout << "onExit" << std::endl;
    SDL_Quit();
}

int main(int argc, char **argv)
{
    if(SDL_Init(SDL_INIT_VIDEO)<0){
        return 1;
    }
    atexit(onExit);

    SDL_Surface *surface=SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);

    bool isLoop=true;
    while(isLoop)
    {
        SDL_Event event;
        SDL_PollEvent(&event);
        switch(event.type){
            case SDL_QUIT:
                isLoop=false;
                break;

            case SDL_KEYDOWN:
                {
                    SDLKey &key=event.key.keysym.sym;
                    if(key==27){
                        isLoop=false;
                    }
                }
                break;
        }
    }
    return 0;
}

SDL_CreateWindowを使う

とりあえず、Window表示まで。詳しくは、SDL-1.3のソースのtest/common.cを見ればだいたいわかりそう。他に、FullScreen時の細々としたところとか、OpenGLの初期化、マルチモニタの判別(たぶん)とかも書いてあった。

    SDL_Surface *surface=SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);

    SDL_Window *window=SDL_CreateWindow("title", 100, 100, 640, 480, 0);
    if(!window){
        return 2;
    }
    SDL_ShowWindow(window);

これで、複数回SDL_CreateWindowを呼べばマルチウィンドウできあがり。
EventにWindowIDがついてくるようなので、メインループの方でWindow毎にEventを捌けばよさげ。