端くれプログラマの備忘録 Unix [Unix] Ncurses – テキストユーザインタフェース (TUI) 作成用ライブラリ

[Unix] Ncurses – テキストユーザインタフェース (TUI) 作成用ライブラリ

ncurses は、Unix/Linux 環境で動作する CUI (Character User Interface) アプリケーションを開発するためのライブラリです。
このライブラリを使うと、ターミナル上でウィンドウや色付きテキスト、キーボード入力管理など、GUIライクな操作をCUIで実現できます。

主な特徴

  1. ターミナルの抽象化
  • ターミナルの低レベル制御(カーソル移動、スクリーン操作など)を簡略化。
  • ANSIエスケープシーケンスを意識せずにコードを書くことが可能。
  1. マルチプラットフォーム
  • 多くのUnix系環境で動作し、互換性のあるインターフェースを提供。
  1. 高度な操作サポート
  • ウィンドウ管理、色の使用、キーボード入力の処理、スクロール可能なビューなど。
  1. バックバッファリング
  • 画面の描画を効率化するために、画面操作をバッファにまとめて反映(”ダブルバッファリング” に似た動作)。
  1. 互換性
  • 古い curses ライブラリの拡張版で、より多くの機能を提供。

主な機能

1. ウィンドウ管理

  • ターミナル全体を分割してウィンドウを作成。
  • 各ウィンドウに対して独立した描画操作が可能。

2. カーソル操作

  • カーソル位置を自由に設定可能。
  • 入力カーソルの非表示や表示操作も可能。

3. 色の管理

  • ターミナルが色をサポートしている場合、テキストや背景の色を変更可能。
  • 色のペアを定義し、特定の領域に適用。

4. キーボード入力

  • 文字単位やキー単位での入力を処理。
  • 特殊キー(例: 矢印キー、ファンクションキー)の処理も簡単。

5. スクロールやリフレッシュ

  • 画面やウィンドウ内でのスクロール処理。
  • 効率的に画面を更新。

基本的な使い方

サンプルコード: “Hello World” を表示

#include <ncurses.h>

int main() {
    initscr();               // ncursesの初期化
    printw("Hello, World!"); // メッセージを画面に表示
    refresh();               // 画面を更新
    getch();                 // ユーザー入力を待機
    endwin();                // ncursesの終了処理
    return 0;
}
  • initscr(): ncursesを初期化し、デフォルトのウィンドウを作成。
  • printw(): テキストを現在のカーソル位置に表示。
  • refresh(): バッファから画面に内容を反映。
  • getch(): キー入力を1つ受け取る。
  • endwin(): ncursesを終了し、通常のターミナルモードに戻す。

サンプルコード: 色付きテキストを表示

#include <ncurses.h>

int main() {
    initscr();              // ncursesの初期化
    start_color();          // 色を使用可能にする
    init_pair(1, COLOR_RED, COLOR_BLACK); // 色ペア(前景: 赤, 背景: 黒)を定義

    attron(COLOR_PAIR(1));  // 色ペア1を適用
    printw("This is red text on black background!");
    attroff(COLOR_PAIR(1)); // 色ペア1を解除

    refresh();              // 画面を更新
    getch();                // ユーザー入力を待機
    endwin();               // ncursesの終了処理
    return 0;
}
  • start_color(): 色サポートを有効化。
  • init_pair(pair_number, fg_color, bg_color): 色ペアを定義。
  • attron() / attroff(): 属性(色や装飾)を適用/解除。

主な関数一覧

以下は ncurses のよく使われる関数の一部です:

関数説明
initscr()ncursesライブラリの初期化
endwin()ncursesの終了
printw()テキストを表示
refresh()画面を更新
getch()ユーザーのキー入力を取得
start_color()色の使用を有効化
init_pair()色ペアを定義
attron()属性(色や装飾)を有効化
attroff()属性を解除
mvprintw(y, x, text)指定位置にテキストを表示
clear()画面をクリア
noecho()入力された文字を画面に表示しない
cbreak()標準入力バッファリングを無効化
newwin()新しいウィンドウを作成
delwin()ウィンドウを削除

利用シーン

  • ターミナルベースのアプリケーション
    例: htop, nano, tmux
  • ゲーム
    例: テキストベースのゲーム(スネーク、チェスなど)。
  • システムモニタリングツール
    例: サーバー状態をリアルタイムに表示。

ncurses は軽量で強力なツールセットを提供し、ターミナルベースのアプリケーション開発に非常に有用です。