SPTK ライブラリについて

SPTK ライブラリについて
SPTK ライブラリは、ここのサンプルプログラムを動作させるために作った、シンプルな GUI ライブラリです。

サンプルプログラムを複数 OS で動作できるようにと思って、既存の GUI ライブラリを探してみたのですが、なかなか丁度良いのが見つからなかったので、自分で作りました。

ここでは、SPTK ライブラリの使い方について、簡単に説明しておきます。
基本
以下は、ウィンドウを表示するだけのプログラムです。
ウィンドウの閉じるボタンを押すか、ウィンドウ内でマウスの左ボタンを押すと終了します。

001_sptk.c
#include "sptk.h"

void winhandle(SPTK_EVENT *ev)
{
    switch(ev->type)
    {
        case SPTK_EVENT_BTTDOWN:
            if(ev->mouse.btt == SPTK_MOUSEBTT_LEFT)
                sptk_quit();
            break;
        case SPTK_EVENT_WINDOW_CLOSE:
            sptk_quit();
            break;
    }
}

int main()
{
    sptk_init("test", 300, 300);
    
    sptk_window_set_handle(winhandle);
        
    sptk_run();

    return 0;
}
SPTK ライブラリを作成
SPTK のライブラリファイルを作成していない場合は、まず SPTK ライブラリを作成します。

詳細は、SPTK ライブラリ
サンプルプログラムのコンパイル
SPTK ライブラリのヘッダファイル (sptk.h) の場所やライブラリファイルの場所は、各自の環境に合わせて置き換えてください。
Linux (gcc を使う場合)
※ libX11、libXext のリンクが必要です。

$ gcc -o test_sptk -I<SPTKヘッダファイルの場所> test_sptk.c <SPTKライブラリのパス> -lX11 -lXext

<例> "~/sptk" にヘッダファイル・ライブラリがある場合

$ gcc -o test_sptk -I~/sptk test_sptk.c ~/sptk/libsptk.a -lX11 -lXext
Windows
※ サンプルプログラム内では、WinMain() を使わずに main() をエントリポイントとしているので、そのままではエラーが出ます。
リンカに以下のオプションを追加するか、サンプルプログラム内の main() を WinMain() に書き換えてください。

MinGW などを使っている場合は、リンカに -mwindows オプションを追加してください。

Visual C++ では、リンカに以下のオプションを追加してください。
/SUBSYSTEM:WINDOWS
/ENTRY:mainCRTStartup
解説
終了処理について
SPTK では、C 標準関数の atexit() を使うことにより、アプリケーションの終了時 (main 関数の return 時や、exit 関数呼び出し時) に自動で終了処理関数が呼び出されるようになっているので、終了処理に関しては意識する必要はありません。
エラーが出た場合
SPTK では、メモリが確保できなかった場合など、致命的なエラーが出た場合は、exit(1) が呼び出されて、即座にアプリケーションが終了します。
なので、エラーに関しても気にする必要はありません。
各関数
sptk_init(title, w, h) で、初期化とウィンドウの作成を行います。
ウィンドウのタイトルバーに表示する名前と、ウィンドウの幅・高さを指定します。
ウィンドウのサイズは、タイトルバーや枠などを含まないサイズです。
なお、この時点ではまだウィンドウは表示されていません。

sptk_window_set_handle() で、ウィンドウに関するイベントを処理する関数をセットします。
なお、セットしなかった場合はデフォルトのハンドラが使われます。

sptk_run() で、ウィンドウを表示して、メインループを実行します。
メインループは、sptk_quit() が呼ばれると終了します。
イベントハンドラ
ウィンドウ内でイベントが起きると、sptk_window_set_handle() でセットされた関数が呼ばれます。

void handle(SPTK_EVENT *ev);

SPTK_EVENT 構造体
int typeイベントの種類
SPTK_WIDGET *widgetイベントが起きたウィジェットのポインタ。
NULL でメインウィンドウ自体。
SPTK_MOUSEEVENT mouseSPTK_EVENT_BTTDOWN/BTTUP/MOUSEMOVE イベント時のデータが入っています。

x,y が座標、btt がボタン番号、mod が装飾キーです。
SPTK_KEYEVENT keySPTK_WINDOW_KEYDOWN イベント時のデータが入っています。

code が文字コードです。
イベントの種類
SPTK_EVENT_WINDOW_CLOSEウィンドウの「閉じる」ボタンが押された。
通常は sptk_quit() を呼び出して、アプリケーションを終了させます。
SPTK_EVENT_WINDOW_KEYDOWNウィンドウ上でキーが押された
SPTK_EVENT_BTTDOWNマウスのボタンが押された
SPTK_EVENT_BTTUPマウスのボタンが離された
SPTK_EVENT_MOUSEMOVEマウスカーソルが移動した