ncursesを試す

cでncursesを試すのに、moreとかlessっぽいアレを作ってみた。

#include <stdlib.h>
#include <stdio.h>
#include <ncurses.h>

int main(int argc, char **argv) 
{
    char *filename;
    FILE *fp;
    int ch;
    int h, w;
    int lineno = 1;
    int input;
    WINDOW *win;

    if (argc < 2) {
        fprintf(stderr, "Usage: %s [filename]\n", argv[0]);
        exit(1);
    }

    filename = argv[1];
    if ((fp = fopen(filename, "r")) == NULL) {
        fprintf(stderr, "Could not open %s\n", filename); 
        exit(1);
    }

    win = initscr();
    noecho();
    cbreak();
    getmaxyx(win, h, w);
    scrollok(win, TRUE);

    while ((ch = fgetc(fp)) != EOF) {
        if (ch == '\n') {
            if (h <= lineno) {
                break;
            }
            wmove(win, lineno++, 0);
        } else {
            waddch(win, ch);
        }
    }
    refresh();

    while ((input = getch()) != 'q') {
        if (ch == EOF) {
            wmove(win, h-1, 0);
            wprintw(win, "(END)");
        } else {
            wscrl(win, 1);
            wmove(win, h-1, 0);
            while ((ch = fgetc(fp)) != EOF) {
                if (ch == '\n') {
                    lineno++;
                    break;
                }
                waddch(win, ch);
            }
            refresh();
        }
    };

    endwin();
    return 0;
}

メモ

  • 左上端の座標が(0, 0)
  • initscr()の返り値はWINDOW *
  • scrollok(win, TRUE) でスクロール許可
  • getmaxyx(win, y, x) でウィンドウのサイズを取得
  • wscrl(win, n)でn行スクロール