#ifndef CTRL
#define CTRL(c) ((c) & 0x1F)
#endif
#define ALT(c) ((c) | 0xa0)
許多資料使用類似init_pair(1, COLOR_RED, COLOR_BLACK);這讓程序在非黑色背景終端下異常。hexedit的解決方案爲:
#ifdef HAVE_COLORS
if (colored) {
start_color();
use_default_colors();
init_pair(1, COLOR_RED, -1); /* null zeros */
init_pair(2, COLOR_GREEN, -1); /* control chars */
init_pair(3, COLOR_BLUE, -1); /* extended chars */
}
#endif
@2012/12/27
最近耐性子把ncurses 3.x的API和ncurses 5.9的示例程序看了下,可惜ncurses 5.x的文檔找不到。
關於顏色,最好的辦法是:
if (has_colors()) {
use_default_colors();
assume_default_colors(ftg_color, bkg_color);
}
這樣避免未知背景色與前景色不融洽。
接下來就是最麻煩的線程安全。ncurses 3.x以下全部不是線程安全的,在3.x中引入了use_window函數,要求傳人WINDOW*和一個函數指針用以“以線程安全的方式操作屏幕”,可惜沒找到任何文檔示範如何使用。有文檔聲稱,在ncurses 5.5以後,ncurses是線程安全的,但我的5.9卻不是線程安全的。已驗證如下函數在多線程下會破壞窗體結構數據:
move(y, x);
mvadd系列函數;
mvin系列函數;
沒有設置timer的getch系列函數;
破壞窗體結構的後果就是顯示混亂,且不可恢復。對於前3者,通過在線程中加鎖保證永遠只有一個線程操作屏幕即可。最後一個需要:timeout(0);
這是ncurses 5.9的示例程序的做法,但不推薦延遲設置0毫秒,這會導致高CPU佔用。