gpt4 book ai didi

c - 如何构建支持超过 223 列鼠标输入的 Curses 程序

转载 作者:太空宇宙 更新时间:2023-11-04 06:54:02 25 4
gpt4 key购买 nike

我正在尝试让一个 curses 程序与我的终端一起工作,跨越我的显示器。但是,x 坐标不能移动超过第 223 列,而是循环。在源代码中,这似乎是由于它们被定义为 8 位,并且位置值仅在前 32 个值之后开始(即 x = raw_x - ' ')。

这是来自 https://gist.github.com/sylt/93d3f7b77e7f3a881603 的示例程序这说明了使用 libncurses5 编译时的问题。在其中,如果您的光标移动到窗口右侧超过 233 列,则 x 值将循环回到 0 - ' ',即 -32

#include <curses.h>
#include <stdio.h>

int main()
{
initscr();
cbreak();
noecho();

// Enables keypad mode. This makes (at least for me) mouse events getting
// reported as KEY_MOUSE, instead as of random letters.
keypad(stdscr, TRUE);

// Don't mask any mouse events
mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, NULL);

printf("\033[?1003h\n"); // Makes the terminal report mouse movement events

for (;;) {
int c = wgetch(stdscr);

// Exit the program on new line fed
if (c == '\n')
break;

char buffer[512];
size_t max_size = sizeof(buffer);
if (c == ERR) {
snprintf(buffer, max_size, "Nothing happened.");
}
else if (c == KEY_MOUSE) {
MEVENT event;
if (getmouse(&event) == OK) {
snprintf(buffer, max_size, "Mouse at row=%d, column=%d bstate=0x%08lx",
event.y, event.x, event.bstate);
}
else {
snprintf(buffer, max_size, "Got bad mouse event.");
}
}
else {
snprintf(buffer, max_size, "Pressed key %d (%s)", c, keyname(c));
}

move(0, 0);
insertln();
addstr(buffer);
clrtoeol();
move(0, 0);
}

printf("\033[?1003l\n"); // Disable mouse movement events, as l = low

endwin();

return 0;
}

出于好奇,您可以使用 gcc file.c -lcurses 构建它

我该如何解决这个问题?我可以在全屏模式下使用 vim,tmux 鼠标交互也可以。这些都依赖于 ncurses,因此必须以某种方式修复它。我花了几个小时尝试阅读他们的来源,并尝试尝试我认为可行的样本。我还尝试了几种 printf() 终端模式,但似乎都没有启用这种模式。如何让我的鼠标事件保持超过 8 位,从而让列字段保持大于 232 的值?

最佳答案

这是一个依赖于终端的特性(不是 ncurses 本身的限制)。 1980 年代后期的原始 xterm 协议(protocol)将每个纵坐标编码为一个字节,为控制字符保留前 32 个。得到 256 - 32 = 223。

xterm 在 2010 中引入了一项实验性功能以扩大范围。有一个 ncurses 终端描述 "xterm-1005"哪个使用那个。一些人批评说,xterm 在 2012 中引入了一个不同的特性。 .同样,有一个 "xterm-1006"使用该功能。

2014中添加了ncurses中的描述. ncurses 6 于 2015 年发布,并且仍然支持(通过编译时选项)ncurses 5 的 ABI 5。如果您的“ncurses5”至少与 2014 年的更改一样新,则该库支持 SGR 1006,无需更改。

不将这些部分之一作为默认“xterm”的原因是跨各种 xterm 模仿器的可移植性很差(就像它们的文档一样),这只会增加错误报告。但是,如果您碰巧使用支持 SGR 1006 功能的终端之一(例如 xterm...),则 ncurses 库支持该功能。

关于c - 如何构建支持超过 223 列鼠标输入的 Curses 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47256750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com