Я пытаюсь прокрутить экран с помощью управляющих кодов ANSI в c ++, но у меня проблема.
Мой код
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <iostream>
#include <cstdlib>
int main() {
system("clear");
std::cout << "Press ESC to quit" << std::endl;
struct termios oldSettings, newSettings;
tcgetattr(fileno(stdin), &oldSettings);
newSettings = oldSettings;
newSettings.c_lflag &= (~ICANON & ~ECHO);
tcsetattr(fileno(stdin), TCSANOW, &newSettings);
while (1) {
char c;
read(fileno(stdin), &c, 1);
if (c == 27) { // ESC or arrow?
fd_set set;
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 0;
FD_ZERO(&set);
FD_SET(fileno(stdin), &set);
int res = select(fileno(stdin) + 1, &set, NULL, NULL, &tv);
if (res > 0) {
read(fileno(stdin), &c, 1);
if (c == 91) {
read(fileno(stdin), &c, 1);
switch (c) {
case 65:
std::cout << "\033[1A" << std::flush; // arrow up
break;
case 66:
std::cout << "\033[1B" << std::flush; // arrow down
break;
case 67:
std::cout << "\033M" << std::flush; // arrow right
break;
case 68:
std::cout << "\033D" << std::flush; // arrow left
break;
default:
while (res != 0) {
read(fileno(stdin), &c, 1);
fd_set set;
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 0;
FD_ZERO(&set);
FD_SET(fileno(stdin), &set);
res = select(fileno(stdin) + 1, &set, NULL,
NULL, &tv);
}
break;
}
}
}
else
break; // ESC
}
}
tcsetattr(fileno(stdin), TCSANOW, &oldSettings);
system("clear");
return 0;
}
Когда я запускаю программу, я нажимаю стрелку вниз, пока курсор не переходит на последнюю строку, а затем я нажимаю стрелку влево, экран прокручивается вниз (и это хорошо). Но если я перемещаю курсор вверх стрелкой вверх, а затем нажимаю стрелку вправо, надпись «Нажмите ESC для выхода» не появляется снова. Как я могу сделать, чтобы прокрутить экран к предыдущей строке?
Задача ещё не решена.