Как установить параметры терминала (термин ios, teseg / getattr, буферизованный ввод) в консоли Windows? - PullRequest
0 голосов
/ 28 января 2020

Я написал программу, которая ловит нажатые клавиши с помощью getchar() и выводит символ и его код на экран. Я также очищаю экран и скрываю курсор во время работы программы, отключаю эхо при запуске и восстанавливаю настройки терминала при нажатии Ctrl + C.

В linux все работает хорошо, но я не могу понять, как можно Я заставляю эту программу работать в Windows. Во-первых, такие команды, как "\033[?2J", вообще не работают. Во-вторых, я не могу отключить буферизованный ввод.

Может быть, кто-то знает, как с этим справиться?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>
#include <stdbool.h>
#include <signal.h>

void setBufferedInput(bool enable) {
    static bool enabled = true;
    static struct termios old;
    struct termios new;

    if (enable && !enabled) {
        tcsetattr(STDIN_FILENO,TCSANOW,&old);
        enabled = true;
    } else if (!enable && enabled) {
        tcgetattr(STDIN_FILENO,&new);
        old = new;
        new.c_lflag &=(~ICANON & ~ECHO);
        tcsetattr(STDIN_FILENO,TCSANOW,&new);
        enabled = false;
    }
}

void signal_callback_handler(int signum) {
    printf("TERMINATED \n");
    setBufferedInput(true);
    printf("\033[?25h\033[m");
    exit(signum);
}

int main() {
    char c;
    printf("\033[?25l\033[2J"); // hide the cursor; clear the screen

    // register signal handler for when ctrl-c is pressed
    signal(SIGINT, signal_callback_handler);
    setBufferedInput(false);
    while (true) {
        c=getchar();
        printf("%c %d \n",c,c); 
    }
}
...