前回に続き「いつもお世話になっている」割には使った記憶のないライブラリを使ってみます。今回は ncursesライブラリ、古い curses ライブラリの置き換えで”New” がついての ncurses みたいです。忘却力の年寄はターミナルウインドウ上でもncursesベースのユーティリティに頼ってます。ほんとに便利。
※「ソフトな忘却力」投稿順 Index はこちら
※実行確認はWindows11上のWSL2にのせてあるUbuntu20.04LTSで行ってます。
ncursesベースのブログラムは、sshなどリモートログインした端末の中でも画面全体を使い、また色をつけたり、マウスも使えたりと至れり尽くせりです。これがあればGUIなどいらん?ホントか。
さて、ncursesのホームページは以下です。
さらに以下のHOWTOページも充実。これがあれば何でもできそう?
さて、いつものWSL2上のUbuntu20.04LTSでのncursesの状況ですが、実行用のライブラリは勿論のこと、開発用の-dev パッケージも最初から入ってました。何も追加インストールしなくても即プログラムを書いてビルドできる状態でした。
念のため、以下のパッケージを追加インストール。
$ sudo apt install ncurses-doc ncurses-examples
上記をインストールしておくと、info ncurses とかやるとドキュメントが読めるようになってます。
サンプルプログラムをもってきて勝手改造
上記のProgramming HOWTOのページに Hello World もおかれていたので、これを参考に以下のファイルを作成いたしました。これまたお世話になっているWindows11の「ターミナル」内でUbuntu動かしてです。この「ターミナル」何気に強力で良いソフトだと気にいってます。WSL2のUbuntuだけでなく、リモートのRaspberry Pi OSにSSH接続して使ったりもしているのですが、どのウインドウでも完璧にmc (midnight commander)が動きます。マウスもサポート(唯一の例外はMSYS2上でmcを動かすとマウス使えないんですけど。)まあ、Ubuntu動かしている「ターミナル」内ならncursesは縦横無人の筈。
Hello Worldのサンプルプログラムに、画面サイズの報告機能などを若干加えてみました。
念のため、テキスト形態でもソースおいておきます。
#include <ncurses.h> int main() { int row, col; initscr(); printw("Hello World !!!\n"); getmaxyx(stdscr, row, col); printw("Screen size Row=%d Col=%d", row, col); mvprintw(5, 10, "Type any key>"); refresh(); getch(); endwin(); return 0; }
一か所、あれっと思ったのが getmaxyx()のところですかね。これはrow, colにそのときの画面サイズをセットしてくれるものなのです。なんで引数に & ついてないの? ドキュメントを見たら疑問氷解。getmaxyxはマクロでした。関数じゃありません。
ビルドして実行
例によって、pkg-configが使用可能であったので使わせていただいています。上記のドキュメント上は -lncurses すればOKみたいに書かれてましたが確かめてないっす。
$ gcc -o ncursesHello2 ncursesHello2.c $(pkg-config --cflags --libs ncurses)
実行するとこんな感じ。この環境では画面はクリアされて、左上にカーソルがいる状態に初期化されるようです。30行120列はWindows11の「ターミナル」のデフォルトの画面サイズです。知らんけど。
一文字キーを触ればプロンプトに戻ります。