Gauche:curses-draw

Gauche:curses-draw

Cursesライブラリをc-wrapperからたたいてみた

だいぶ以前からcursesをたたいてみたかったのです。

#! /usr/local/bin/gosh

(use c-wrapper)
(c-load-library "libcurses.so")
(c-include "curses.h")

(initscr)
(cbreak)
(noecho)

(let ((hello  " [Hello, Curses World!] ")
      (help " [h]:left [j]:down [k]:up [l]:right [c]:clear [q]: quit "))
  (let* ((line (x->number LINES))
         (maxy (- line 2))
         (cols (x->number COLS))
         (maxx (- cols 2))
         (win (newwin (- line 2) (- cols 2) 1 1)))
    (define (init)
      (wclear win)
      (box win (x->number #\|) (x->number #\-))
      (mvwprintw win 0 (x->integer (/ (- cols (string-length hello)) 2)) hello)
      (mvwprintw win (- line 3) (- cols (string-length help) 5) help)
      (wrefresh win))

    (init)

    ;; main loop
    (let lp ((y (x->integer (/ line 2)))
             (x (x->integer (/ cols 2))))

      (cond ((= y (- maxy 1)) (set! y 1))
            ((= 0 y) (set! y (- maxy 2))))
      (cond ((= x (- maxx 1)) (set! x 1))
            ((= 0 x) (set! x (- maxx 2))))

      (mvwaddch win y x (x->number #\*))
      (wmove win y x)
      (wrefresh win)
      (case (read-char)
        ((#\h) (lp y (- x 1)))
        ((#\j) (lp (+ y 1) x))
        ((#\k) (lp (- y 1) x))
        ((#\l) (lp y (+ x 1)))
        ((#\c) (init) (lp y x))
        ((#\q) (endwin) (exit 0))
        (else (lp y x)))

      )))

動作

もうプログラムには特に意味なんて無し。 でもちょっと触っただけでも、viが作れそうにおもってしまいます(キケンだ)。 つーかcursesだし。

 +--------------------------- [Hello, Curses World!] -------------------------+
 |                 *      *                              ****                 |
 |                 ****   *                              *  *                 |
 |                    *****                              *  *                 |
 |                                                       *  ****              |
 |                                ******                       ***            |
 |                                *    **                        **           |
 |                                *     ***                       **          |
 |                     ************       **                       *          |
 |                     *                   **                      *          |
 |                  ****                    *******                *********  |
 |                                                *                        *  |
 |**                                     *        **************           ***|
 | *                                     *                     *              |
 | *                               *******                     *              |
 | ******                         **                     ***** ***            |
 |      *******                 ***                      *   *   *            |
 |            *           *******                        *   *****            |
 |            ******      *                              *                    |
 |                 *      *                              *                    |
 |                 *      *                              *                    |
 +------------------ [h]:left [j]:down [k]:up [l]:right [c]:clear [q]: quit --+

感想

ktermでの動作を確認。 なんかリテラル埋め込みまくりのきちゃないコードですが、いーんです。 動くの確認したかっただけだし。 でも、LINESやCOLSなどが#u(...)な値だったので、x->numberの類やらが 入っちゃうのがイマイチだった。cut-sea:2006/03/08 02:01:47 PST


Last modified : 2012/02/23 03:39:50 UTC