터미널의 마우스 스크롤 이벤트

터미널의 마우스 스크롤 이벤트

텍스트 편집기 터미널에서 마우스 스크롤 이벤트를 캡처하려고 합니다. 몇 가지 질문이 있습니다.

첫째, 어떻게 할 수 있는가?대체 스크롤 모드사용 가능? alternate bufferpass 를 지정 하면 \x1b[?1049h스크롤이 <key-up>and 로 전송 된다는 점을 올바르게 설명했습니까 <key-down>?

구체적으로 다음과 같은 내용을 이해할 수 없습니다.

그러나 대체 스크롤 모드가 설정된 경우 단말기가 대체 화면 버퍼를 표시할 때 커서 위/아래 제어가 전송됩니다. 대체 스크롤 모드의 초기 상태는 alterScroll 리소스를 사용하여 설정됩니다.

아래 프로그램의 양식에서 스크롤 동작을 캡처 할 수 있지만 \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:

추신=1 0 0 7 ⇒ 대체 스크롤 모드인 xterm을 활성화합니다.
이는 다음에 해당합니다.alternateScroll자원.

예를 들어

printf '\033[?1007h'

다른 터미널은 제어 시퀀스를 지원할 수도 있고 지원하지 않을 수도 있습니다(해당 문서를 확인하세요).

관련 정보