cursesの多くの関数のうち,基本的なものを紹介する.
cursesの基本的な関数
カーソルの移動
文字出力
文字の削除
画面のクリア
サンプル
サンプル2
cursesの基本的な関数
cursesには沢山の関数がある.ここではそのうちの以下の機能を使ってみる.
カーソルの移動
文字出力
文字の削除
画面のクリア
カーソルの移動
カーソルの移動には
int move(int y, int x);
を使用する.左上が0,0となる.そして縦にy,横にxが増加していく.また,ウィンドウが複数になると,ウィンドウを指定してそのウィンドウのカーソルを移動させることができる.
int wmove(WINDOW *win, int y, int x);
複数のウィンドウの扱いについては別項に記述する.
文字出力
文字を出力する関数はいろいろある.最も基本的なものとして以下がある.
int printw(char *fmt [, arg] …);
cursesにおけるprintf.
int addch(chtype ch);
現在のカーソル位置で文字を上書きする.この結果,カーソルは一つ進む.
int insch(chtype ch);
現在のカーソル位置に文字を挿入する.現在のカーソルより右側にある文字は全て右に一つずつずれる.
printwの更に高機能なものとして以下がある.
int mvprintw(int y, int x, char *fmt [, arg] …);
カーソルを移動してprintwする.
int mvwprintw(WINDOW *win, int y, int x, char *fmt [, arg] …);
ウィンドウを指定し,カーソルを移動してprintwする.
addchの更に高機能なものとして以下がある.
int waddch(WINDOW *win, chtype ch);
ウィンドウを指定して文字を出力する.
int mvaddch(int y, int x, chtype ch);
カーソルを移動して文字を出力する.
int mvwaddch(WINDOW *win, int y, int x, chtype ch);
ウィンドウを指定し,カーソルを移動して文字を出力する.
int echochar(chtype ch);
addchしたあとrefreshする.
int wechochar(WINDOW *win, chtype ch);
waddchしたあとwrefreshする.
inschには更に高機能なものとして以下がある.
int winsch(WINDOW *win, chtype ch);
ウィンドウを指定して文字を挿入する.
int mvinsch(int y, int x, chtype ch);
カーソルを移動して文字を挿入する.
int mvwinsch(WINDOW *win, int y, int x, chtype ch);
ウィンドウを指定し,カーソルを移動して文字を挿入する.
以上のように最初の三つの関数名にwとかmvが付加されてどんどん高機能になっていく.wが付加されるとウィンドウを指定でき,mvが付加されるとカーソルを移動できる.
文字の削除
文字の削除には以下の関数がある.
int delch(void);
カーソル位置の文字を削除する.
int wdelch(WINDOW *win);
ウィンドウを指定してdelch.
int mvdelch(int y, int x);
カーソルを移動してその文字を削除.
int mvwdelch(WINDOW *win, int y, int x);
ウィンドウを指定してmvdelch.
画面のクリア
画面をクリアして0からやりなおしたいこともある.画面のクリアには以下の関数がある.
int erase(void);
画面の全ての位置にスペースを出力する.
int werase(WINDOW *win);
ウィンドウを指定してeraseする.
int clear(void);
画面をクリアする.大抵端末コマンドを呼び出すのでeraseより確実らしい.
int wclear(WINDOW *win);
ウィンドウを指定してclearする.
int clrtobot(void);
カーソルの位置以降の画面をクリアする.
int wclrtobot(WINDOW *win);
ウィンドウを指定してclrtobotする.
int clrtoeol(void);
カーソルの位置以降の行をクリアする.
int wclrtoeol(WINDOW *win);
ウィンドウを指定してclrtoeolする.
サンプル
上記の関数のうち,いくつかを使用したサンプルを作ってみた.まず,以下はmvaddchとclearを使用するサンプルである.
#include <stdlib.h>
#include <curses.h>
#include <unistd.h>
#include <time.h>
#define STAR_COUNT_MAX 500
#define DELAY 10000
int main(int argc, char *argv[])
{
int i,j;
int istep, jstep;
int star_count;
int loop_count;
if(argc != 2){
fprintf(stderr,"Usage %s loopcount\n", argv[0]);
exit(EXIT_FAILURE);
}
loop_count = atoi(argv[1]);
if(initscr() == NULL){
fprintf(stderr, "initscr failure\n");
exit(EXIT_FAILURE);
}
srand(time(NULL));
while(loop_count > 0){
star_count = 0;
i = rand() % LINES;
j = rand() % COLS;
istep = jstep = 1;
if(i == 0){
istep = -1;
}
if(j == 0){
jstep = -1;
}
do{
/* i,j$B$N0LCV$K(B*$B$r=PNO(B */
mvaddch(i, j, '*');
star_count++;
refresh();
usleep(DELAY);
if(i == LINES - 1 || i == 0){
istep = -istep;
}
if(j == COLS - 1 || j == 0){
jstep = -jstep;
}
i += istep;
j += jstep;
}while(star_count < STAR_COUNT_MAX);
loop_count--;
/* $B2hLL$r%/%j%"$9$k(B */
clear();
}
endwin();
exit(EXIT_SUCCESS);
}
このサンプルは’‘をウィンドウに表示していく.ウィンドウの端にいくとバウンドする.LINESとCOLSという変数を使用している.両者はinitscrで画面の行数と列数に設定される.また,STAR_COUNT個の’‘を表示すると画面をclearする.以上を引数回数繰り返す.
サンプル2
二つ目のサンプルはdelchを使用するサンプルである.
#include <curses.h>
#include <stdlib.h>
#include <curses.h>
#include <unistd.h>
#include <string.h>
#define DELAY 100000
int main(int argc, char *argv[])
{
char *msg;
char *cur;
int count = 0;
if(argc != 2){
fprintf(stderr, "Usage: %s message\n", argv[0]);
exit(EXIT_FAILURE);
}
msg = argv[1];
if(initscr() == NULL){
fprintf(stderr, "initscr failure\n");
exit(EXIT_FAILURE);
}
/* $BG0$N$?$a$^$:(B0,0$B$K%+!<%=%k$r0\F0$9$k(B */
move(0,0);
/* $BJ8;zNs$N:G8e$+$i=g$K(B1$BJ8;z$:$DA^F~$7$F$$$/(B. */
cur = msg + strlen(msg);
while(cur != msg){
insch(*(--cur));
count++;
refresh();
usleep(DELAY);
}
/* $B$5$i$K9T$NI}J,%9%Z!<%9$rA^F~(B */
while(count < COLS){
insch(' ');
count++;
refresh();
usleep(DELAY);
}
sleep(1);
/* 0,0$B$K$F(Bdelete$B$7$F$$$/(B */
while(count > 0){
mvdelch(0, 0);
count--;
refresh();
usleep(DELAY);
}
endwin();
exit(EXIT_SUCCESS);
}
このサンプルは引数の文字列が左から登場して右端まで移動し,また左まで移動してそのまま消えて行く.