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占用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值