端末のマウススクロールイベント

端末のマウススクロールイベント

テキストエディタ端末でマウススクロールイベントをキャプチャしようとしています。いくつかの質問があります。

まず、どうすればよいですか?代替スクロールモード利用可能?alternate bufferpassを指定すると、\x1b[?1049hスクロールが<key-up>andに送信されることを正しく説明しましたか<key-down>

具体的には、以下の内容を理解できません。

ただし、代替スクロールモードが設定されている場合、端末が代替画面バッファを表示すると、カーソルの上下制御が送信されます。代替スクロールモードの初期状態は、alterScrollリソースを使用して設定されます。

以下のプログラムのフォームからスクロール動作をキャプチャできますが、\x1b[MCbCxCy代替スクロールモードについてはわかりません。

2番目の質問は以上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'

他の端末は制御シーケンスをサポートする場合もありません(該当する文書を確認してください)。

関連情報