ncurses不提供ctrl或alt的组合键,且只自带了部分shift组合键,由于资料缺乏,找不到良好的例子,我用KEY_SHOME等没有效果。在Pixel的hexedit的源码中,我找到了替代解决办法:
许多资料使用类似init_pair(1, COLOR_RED, COLOR_BLACK);这让程序在非黑色背景终端下异常。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占用。