requires=
classes=Curses,Curses=Key,Curses=MouseEvent,Curses=Window
methods=
sublibraries=
is_sublibrary=false
category=CUI

Ruby の curses ライブラリ(以下、Ruby curses)は、C のプログラムから端末
の画面を制御するための curses ライブラリ(以下、C curses)を利用して、端
末に依存しない形式でテキストユーザインタフェースを構築するためのライブ
ラリです。

C curses には、次のような実装があります。

  * [[url:http://www.gnu.org/software/ncurses/ncurses.html]]
  * [[url:http://pdcurses.sourceforge.net/]]

Ruby curses を使ってテキストユーザインタフェース(以下、TUI)を
構築する流れは次のようになります。

  (1) [[m:Curses.#init_screen]] で初期化を行います。
  (2) [[c:Curses]] のモジュール関数を使い、
      入力のエコーを無効にするなどの Ruby curses の設定を行います。
  (3) [[m:Curses.#stdscr]] やそのサブウインドウを操作し、TUI を構築します。
  (4) [[m:Curses.#getch]] や [[m:Curses.#getstr]] により、
      ユーザからの入力を取得します。入力した情報に従って処理を行い、
      そして、入力を待つということを繰り返します。
  (5) 最後に [[m:Curses.#close_screen]] で終了処理を行います。

例: 画面中央に「Hello World!」と表示し、何か入力があると終了する。

  require "curses"
  
  Curses.init_screen
  begin
    s = "Hello World!"
    Curses.setpos(Curses.lines / 2, Curses.cols / 2 - (s.length / 2))
    Curses.addstr(s)
    Curses.refresh
    Curses.getch
  ensure
    Curses.close_screen
  end

例: 上記の例と同様だが、Curses モジュールを include する場合

  require "curses"

  include Curses
  
  init_screen
  begin
    s = "Hello World!"
    setpos(lines / 2, cols / 2 - (s.length / 2))
    addstr(s)
    refresh
    getch
  ensure
    close_screen
  end

なお、C curses を利用できない環境で Ruby をコンパイルしている場合、
Ruby curses は利用できません。
利用できない場合、require の時点で例外 LoadError が発生します。

  foo:1:in `require': no such file to load -- curses (LoadError)
          from foo:1:in `<main>'

Ruby curses の操作によっては、
利用する C curses が提供していない機能を使うものがあります。
そのような操作を行った場合、例外 NotImplementedError が発生します。

セーフレベル ($SAFE) が 4 の場合、いくつかの操作で例外 SecurityError を発生します。
