NetBSD Advent Calendar 2024 9日目の記事です。今日はNetBSD-10で拡充されたcursesの機能を見てみようと思います。
cursesの機能拡充
いつものようにNetBSD-10のリリースノートを見ていると、curses(3)に関する記述がありました。
curses(3) - added stub mouse functions and curses_version() for compatibility with ncurses.
curses(3) - improved Unicode support.
端末表示を制御するライブラリであるcurses(3)について、ncursesとの互換性を高めるための機能拡充が行われたようです。
curses_version()
まずはcurses_version(3)を見てみます。バージョンを取得するというシンプルな関数ですが、NetBSD-9.2では以下のようにコンパイルエラーとなってしまう状態でした。
$ uname -sr
NetBSD 9.2
$
$ cat sample.c
#include <curses.h>
int main() {
initscr();
mvprintw(2, 5, "%s", curses_version());
refresh();
getch();
endwin();
return 0;
}
$
$ gcc -o sample sample.c -lcurses
sample.c: In function ‘main’:
sample.c:6:26: warning: implicit declaration of function ‘curses_version’ [-Wimplicit-function-declaration]
mvprintw(2, 5, "%s", curses_version());
^~~~~~~~~~~~~~
ld: /tmp//ccdUeOZD.o: in function `main':
/home/netadm/tmp/curses_sample/sample.c:6: undefined reference to `curses_version'
NetBSD-10の環境ではコンパイルが通るようになっています。
$ uname -sr
NetBSD 10.0
$
$ gcc -o sample sample.c -lcurses ; echo $?
0
実行結果は以下のようになります(が、何やらバージョン番号というよりかは、コード名みたいな感じですね…)。
cursesのマウス機能
さらに"added stub mouse functions"という記述があります。これはマウスイベントを取得できるようになったという意味合いなのでしょうか?
curses(3) - added stub mouse functions and curses_version() for compatibility with ncurses.
curses(3)を見ても"mouse"というキーワードを含む関数の記述はありませんが、GitHub上のコードをみると、マウスに関するコードとmanページが存在しているようです。
- NetBSD/src/blob/netbsd-10/lib/libcurses/mouse.c
- NetBSD/src/blob/netbsd-10/lib/libcurses/curses_mouse.3
manページに記載されている has_mouse()
という関数でマウスの利用可否を判定できるようです。
.Fn has_mouse
function returns true if the mouse support has been initialised for the
terminal, otherwise false.
早速該当する関数を見ると…常に false
を返しています🥴
92 bool
93 has_mouse(void)
94 {
95
96 return false;
97 }
他の関数も単に ERR
や 0
を返しているだけで、リリースノートにあった"added stub mouse functions"は文字通り関数スタブを追加した、という話だったのでした。
99 int
100 getmouse(__unused MEVENT *event)
101 {
102
103 return ERR;
104 }
105
106 int
107 ungetmouse(__unused MEVENT *event)
108 {
109
110 return ERR;
111 }
112
113 mmask_t
114 mousemask(__unused mmask_t newmask, __unused mmask_t *oldmask)
115 {
116
117 return 0;
118 }
まとめ
NetBSD-10で拡充されたcursesの機能を見てみました。ncursesとの互換性を高めるための機能拡充となっていますが、マウス機能については関数スタブが追加された段階でした、端末側でもマウスに対応する機能が必要となるため、今後も機能拡充が進められてゆくと思われます。