09
5月
2007

cursesの基本的な関数

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);
}

このサンプルは引数の文字列が左から登場して右端まで移動し,また左まで移動してそのまま消えて行く.

You may also like...