텍스트 편집기 터미널에서 마우스 스크롤 이벤트를 캡처하려고 합니다. 몇 가지 질문이 있습니다.
첫째, 어떻게 할 수 있는가?대체 스크롤 모드사용 가능? alternate buffer
pass 를 지정 하면 \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'
다른 터미널은 제어 시퀀스를 지원할 수도 있고 지원하지 않을 수도 있습니다(해당 문서를 확인하세요).