[プログラム][C言語]CURSESサンプル

CURSESについて調べてみてサンプルコードを書いてみた。C勉強会で取り上げてみようか。しかし標準Cが建前ではある。そうはいっても標準Cの範囲ではできることにあまりにも制約がありすぎるから仕方ないかな。


CURESESってきっとcursor(カーソル)から付いた名前だけど絶対curseの方に意味がかかってるよね。おかげでたちの悪いジョークソフトかと思ってインストールをはずしていたよorz

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

#define MAXCOUNT (10)

/* マウスカーソルの座標 */
static int x, y;

/* プロトタイプ宣言 */
static void moveUp(void);
static void moveDown(void);
static void moveLeft(void);
static void moveRight();

static void demo0(void);
static void demo1(void);

int main(void)
{
    /* スクリーンの初期化 */
    if (initscr() == NULL) {
        fprintf(stderr, "error init screen\n");
        exit(-1);
    }

    demo0();

    demo1();

    /* ウィンドウを閉じる */
    if (endwin() == ERR) {
        fprintf(stderr, "error end win\n");
        exit(-2);
    }
    
    return 0;
}

/* マウスカーソルを上にひとつ移動する
 * 一番上の次は一番下に移動する。(ワープ) */
static void moveUp()
{
    y = (y == 0) ? LINES : y - 1;
}

static void moveDown()
{
    y = (LINES <= y) ? 0 : y + 1;
}

static void moveLeft()
{
    x = (x == 0) ? COLS : x - 1;
}

static void moveRight()
{
    x = (COLS <= x) ? 0 : x + 1;
}

static void demo0(void)
{
    int i;
    
    /* 画面クリア */
    clear();
    
    for (i = 0; i < MAXCOUNT; i++) {
        mvprintw(i, i, "%2d", i);
        refresh();
        sleep(1);
    }
}

static void demo1(void)
{
    int ch;
    
    /* echo off */
    noecho();
    /* 画面をクリアする */
    clear();
    /* cbreak modeにする */
    cbreak();
    
    x = y = 0;
    while ((ch = getch()) != EOF) {
        switch (ch) {
        case 'h':
            moveLeft();
            mvaddch(y, x, ch);
            break;
        case 'j':
            moveDown();
            mvaddch(y, x, ch);
            break;
        case 'k':
            moveUp();
            mvaddch(y, x, ch);
            break;
        case 'l':
            moveRight();
            mvaddch(y, x, ch);
            break;
        default:
            /* nop */
            break;
        }
    }
}