我正在尝试在文本编辑器的终端中捕获鼠标滚动事件。我有几个问题。
首先,如何才能交替滚动模式被启用?我是否正确地解释说,当alternate buffer
通过指定\x1b[?1049h
时,卷轴将作为<key-up>
和发送<key-down>
?
具体来说,我无法理解这一点:
但是,如果设置了备用滚动模式,则当终端显示备用屏幕缓冲区时,将发送光标向上/向下控制。交替滚动模式的初始状态是使用alternateScroll 资源设置的。
我能够\x1b[MCbCxCy
在下面的程序中捕获表单中的滚动操作,但我不知道备用滚动模式。
我的第二个问题是,对于多于Cx 和 Cy 从哪里来?在我的终端中,这似乎完全是不确定的。这是一个示例程序,您可以复制粘贴来查看:
#include <termios.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#define ENABLE_ALT_SCREEN "\x1b[?1049h"
#define DISABLE_ALT_SCREEN "\x1b[?1049l"
#define ENABLE_ALT_SCREEN_SZ 8
#define DISABLE_ALT_SCREEN_SZ ENABLE_ALT_SCREEN_SZ
#define ENABLE_MOUSE_TRACKING "\x1b[?1000h"
#define DISABLE_MOUSE_TRACKING "\x1b[?1000l"
#define ENABLE_MOUSE_TRACKING_SZ 8
#define DISABLE_MOUSE_TRACKING_SZ ENABLE_MOUSE_TRACKING_SZ
struct termios orig_termios;
void
disable_raw_mode (void)
{
tcsetattr(STDIN_FILENO, TCSAFLUSH, &orig_termios);
write(STDIN_FILENO, DISABLE_ALT_SCREEN,DISABLE_ALT_SCREEN_SZ);
write(STDIN_FILENO, DISABLE_MOUSE_TRACKING, DISABLE_MOUSE_TRACKING_SZ);
}
void
enable_raw_mode (void)
{
write(STDIN_FILENO, ENABLE_ALT_SCREEN,ENABLE_ALT_SCREEN_SZ);
write(STDIN_FILENO, ENABLE_MOUSE_TRACKING, ENABLE_MOUSE_TRACKING_SZ);
tcgetattr(STDIN_FILENO, &orig_termios);
atexit(disable_raw_mode);
struct termios raw = orig_termios;
raw.c_iflag &= ~(BRKINT | INPCK | PARMRK | INLCR | IGNCR | ISTRIP | ICRNL | IXON);
// raw.c_oflag &= ~(OPOST);
raw.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG);
raw.c_cflag &= ~(CSIZE | PARENB);
raw.c_cflag |= (CS8);
tcsetattr(STDIN_FILENO, TCSAFLUSH, &raw);
}
int
main (void)
{
enable_raw_mode();
char c;
while ( read(STDIN_FILENO, &c, 1) == 1 && c != 'q')
{
if (iscntrl(c))
printf("%d\n", c);
else
printf("%d ('%c')\n", c, c);
}
return 0;
}
我的终端是xterm-256color
.
答案1
引用来自xterm联机帮助页,指的是私人模式1007:
PS=
1 0 0 7
⇒ 启用交替滚动模式,xterm。
这对应于alternateScroll
资源。
例如
printf '\033[?1007h'
其他终端可能/可能不支持控制序列(检查它们的文档)。