终端中的鼠标滚动事件

终端中的鼠标滚动事件

我正在尝试在文本编辑器的终端中捕获鼠标滚动事件。我有几个问题。

首先,如何才能交替滚动模式被启用?我是否正确地解释说,当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'

其他终端可能/可能不支持控制序列(检查它们的文档)。

相关内容