unix - ncurses中的颜色对没有使用正确的颜色
问题描述
我正在尝试使用 ncursesw6.1(链接到 PicoLisp)。据我所知,PicoLisp 直接传递值的方式是,我通过非 C 语言调用 ncurses 的事实不应该是一个因素[1]。但是,当我尝试使用颜色对(定义如下)时:
(curses "init_pair" NIL 1 *COLOR-SCHEME-TEXT *COLOR-SCHEME-BACKGROUND-DARK)
(curses "init_pair" NIL 2 *COLOR-SCHEME-COMMENT *COLOR-SCHEME-BACKGROUND-DARK)
(curses "init_pair" NIL 3 *COLOR-SCHEME-FUNCTION *COLOR-SCHEME-BACKGROUND-DARK)
(curses "init_pair" NIL 4 *COLOR-SCHEME-VALUE *COLOR-SCHEME-BACKGROUND-DARK)
(curses "init_pair" NIL 5 *COLOR-SCHEME-BACKGROUND-DARK *COLOR-SCHEME-COMMENT)
(curses "init_pair" NIL 6 *COLOR-SCHEME-BACKGROUND-DARK *COLOR-SCHEME-FUNCTION)
(curses "init_pair" NIL 7 *COLOR-SCHEME-BACKGROUND-DARK *COLOR-SCHEME-VALUE)
它不起作用。相反,颜色对 1、2 和 3 都显示为相同的颜色对。然后 4 和 6 显示为*COLOR-SCHEME-COMMENT
顶部,*COLOR-SCHEME-BACKGROUND-DARK
5 和 7 显示为 4 和 6 的反面。这似乎与我输入的内容没有逻辑关系。更奇怪的是,当我使用非自定义颜色(颜色 0-7)时,它也不起作用,因此通过定义这些配色方案颜色init_color
与它无关。
我已经用颜色对 1 单独测试了颜色,所以我知道颜色正在正确初始化。
到底是怎么回事init_pair
?
PS 如果我使用 Lisp 的事实让这变得更加困难,我真的很抱歉,我知道它不是一种通用语言。这在当时似乎是个好主意,而且到目前为止还不错……
编辑:我已经重新编译了启用的 libncursesw6.1 --with-trace
,这是来自跟踪文件的相关信息:
called {init_pair(0x1d74d00,1,10,8)
+ return }0
+ called {init_pair(0x1d74d00,2,12,8)
+ return }0
+ called {init_pair(0x1d74d00,3,11,8)
+ return }0
+ called {init_pair(0x1d74d00,4,13,8)
+ return }0
+ called {init_pair(0x1d74d00,5,8,12)
+ return }0
+ called {init_pair(0x1d74d00,6,8,11)
+ return }0
+ called {init_pair(0x1d74d00,7,8,13)
+ return }0
这些确实是正确的值,因此正确的值被传递给init_pair
. 虽然自定义颜色不是问题,但对于那些想知道的人来说,这里是关于颜色的trace
文件信息:*COLOR-SCHEME
started color: COLORS = 256, COLOR_PAIRS = 65536
+ return }0
+ called {init_color(0x1d74d00,8,216,228,252)
+ + called {tparm("\e]4;%p1%d;rgb:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\e\\", 8, 216, 228, 252)
+ + return }"\e]4;8;rgb:37/3A/40\e\\"
+ return }0
+ called {init_color(0x1d74d00,9,908,956,896)
+ + called {tparm("\e]4;%p1%d;rgb:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\e\\", 9, 908, 956, 896)
+ + return }"\e]4;9;rgb:E7/F3/E4\e\\"
+ return }0
+ called {init_color(0x1d74d00,10,968,968,968)
+ + called {tparm("\e]4;%p1%d;rgb:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\e\\", 10, 968, 968, 968)
+ + return }"\e]4;10;rgb:F6/F6/F6\e\\"
+ return }0
+ called {init_color(0x1d74d00,11,612,748,1000)
+ + called {tparm("\e]4;%p1%d;rgb:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\e\\", 11, 612, 748, 1000)
+ + return }"\e]4;11;rgb:9C/BE/FF\e\\"
+ return }0
+ called {init_color(0x1d74d00,12,508,252,340)
+ + called {tparm("\e]4;%p1%d;rgb:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\e\\", 12, 508, 252, 340)
+ + return }"\e]4;12;rgb:81/40/56\e\\"
+ return }0
+ called {init_color(0x1d74d00,13,612,136,272)
+ + called {tparm("\e]4;%p1%d;rgb:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\e\\", 13, 612, 136, 272)
+ + return }"\e]4;13;rgb:9C/22/45\e\\"
+ return }0
此外,虽然我将wborder
函数设置为使用颜色对 7,根据调试信息应该是颜色 8 而非颜色 13(与我的代码中的颜色匹配),但trace
文件说它实际上使用的是颜色对 5,我在代码中的任何地方都没有使用:
+ called {wborder(0x1da6cd0,{' ' = 040},{' ' = 040},{' ' = 040},{' ' = 040},{' ' = 040},{' ' = 040},{' ' = 040},{' ' = 040})
using {' ' = 040 | {A_BOLD|A_COLOR{5 = {color8, color12}}}}, {' ' = 040 | {A_BOLD|A_COLOR{5 = {color8, color12}}}}, {' ' = 040 | {A_BOLD|A_COLOR{5 = {color8, color12}}}}, {' ' = 040 | {A_BOLD|A_COLOR{5 = {color8, color12}}}}, {' ' = 040 | {A_BOLD|A_COLOR{5 = {color8, color12}}}}, {' ' = 040 | {A_BOLD|A_COLOR{5 = {color8, color12}}}}, {' ' = 040 | {A_BOLD|A_COLOR{5 = {color8, color12}}}}, {' ' = 040 | {A_BOLD|A_COLOR{5 = {color8, color12}}}}
+ return }0
所以,我上面的推测是确实正在发生的事情。颜色对 5 和 7 显示相同,即使颜色和颜色对被正确传递给 ncurses。
解决方案
根据@christopher-dumas 的说法,问题是 PicoLisp 中的一个错误:
好的,我发现问题是
颜色对实现不正确,因为 Picolisp 只有右移操作,并且操作数顺序与 C 使用的相反。显然,我采用颜色对的原始实现的来源是错误的。对于新的实现,我从 ncurses 源代码中的 lib_gen.c 复制了它。新的实现是:
(de color-pair (n)
(& (>> -8 n) (>> -8 (- (>> -8 1) 1))))
在 ncurses 中,颜色对值是一个 8 位字段chtype
或attr_t
,在标头中定义curses.h
。这是模板的引用(@cf_cv_1UL@
被替换为处理不允许UL
数字后缀的非常旧的编译器):
#define NCURSES_ATTR_SHIFT 8
#define NCURSES_BITS(mask,shift) (NCURSES_CAST(chtype,(mask)) << ((shift) + NCURSES_ATTR_SHIFT))
...
#define A_COLOR NCURSES_BITS(((@cf_cv_1UL@) << 8) - @cf_cv_1UL@,0)
推荐阅读
- python-3.x - 局部离群因子仅针对某些点计算(scikitLearn)
- spring-boot - 基于Authenticated Role的Spring Security Question动态AntMatcher
- python - 在 Google Colab 上绘制轴和标题错误:“[object Object]”
- javascript - 为什么要保存。.js 文件的缩进?
- javascript - 如何显示 _something_ 等于 _anothersomething_ 的 json get 请求(Node.js,MongoDB)
- mongodb - 删除 MongoDB 集合中的数据但保留索引的更好方法
- android - 如何为 Android 应用选择在线数据库
- python - 遍历字典问题中的布尔值
- r - ggplot:带有 LaTex 表达式 + 变量值 + 普通文本的图例标签
- c# - 无法从 C# 连接到 Azure DevOps Repo