curses プログラミングでありがちな問題と解決策
- お手本のプログラムでさえ正常に動作しません.
- MacOS の場合...多分,MacOS の「ターミナル」特有の問題です.
透明化などのフザケた設定を施していると,
curses は正常に機能しないようです.
(標準設定に戻せ.)
- 画面内の表示が変化しません.
- 多分,refresh( ) を忘れています.
- 画面がチラつきます.
- 多分,clear( ) を使っています.
代わりに erase( ) を使うべき.
また,次の問題と同じ原因かもしれません.
- 画面上にゴミが残ってしまうことがあります.
- 多分,表示処理が複数の場所に分散しています.
表示処理を一箇所にまとめて,その前に erase( ),
その後に refresh( ) を付けましょう.
(それでも直らない場合,多分,端末ソフトの不具合なので諦めよう.)
- 何かキーを押さないと画面が変わりません.
- 多分,timeout(-1) とかになっています.
timeout(0) とかにする.
- 何もキーを押していないのに画面が変わってしまいます.
- 多分,timeout(0) とかになっています.
timeout(-1) とすればよい.
または,端末のサイズを変更しても,
キー入力として認識されます.
- キーを押し続けていると入力されない場合があります.
- 多分,プログラムの動作速度(キー入力受付の周期)と
キーボードの動作速度(キーリピートの周期)がうまくかみ合っていません.
この現象は,timeout( ) の数値とキーボードの設定を変更すれば,
多少は緩和されます.が,完全には解消できません.
(シビアなキー入力を要求しないように,プログラムの仕様を工夫しよう.)
- 日本語表示が文字化けしてしまいます.
-
多分,ソースファイルと端末の文字コード(エンコーディング)を UTF-8 へ変更し,
ソースコードの先頭付近に setlocale(LC_ALL, "") を追加すると直ります.
さらに,コンパイル時に ncursesw をリンクしましょう.
(それでも直らない場合,多分,端末ソフトの不具合なので諦めよう.)
...が,英語表示にとどめておくのが無難.
(この説明を理解できない場合,日本語使用禁止.)
- 端末画面のサイズを変えたいんですが...
-
curses は端末内部の世界だけで動いているので,
端末外部の状況を変えることはできません.
(要するに,ユーザが手動で変更するしかない.
ただ,getmaxyx( ) で現在のサイズを知ることはできるので,
「小さすぎる」とか「大きすぎる」とか
「このサイズじゃなきゃダメ」とか
ユーザへヒントを表示するとよい.)
なお,端末サイズの標準は 80文字×24行です.
極端に大きな画面を要求しないこと.
- 複数のキーを同時に入力したいんですが...
-
できません.
複数キーを同時に押した場合,どれか1個だけしか検出されません.
(同時キー入力について,PC 自体(端末外部)では対応しているが,
端末内部では対応していない.)
(c) 2014, yanagawa@kushiro-ct.ac.jp