ncurses學習筆記(1)

ncurses不提供ctrl或alt的組合鍵,且只自帶了部分shift組合鍵,由於資料缺乏,找不到良好的例子,我用KEY_SHOME等沒有效果。在Pixel的hexedit的源碼中,我找到了替代解決辦法:

#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佔用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章