scroll — прокрутка с помощью управляющего кода ANSI переполнение стека

Я пытаюсь прокрутить экран с помощью управляющих кодов 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 для выхода» не появляется снова. Как я могу сделать, чтобы прокрутить экран к предыдущей строке?

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]