Управление клавишами со стрелками в пользовательской оболочке с использованием языка Си - PullRequest
1 голос
/ 14 октября 2019

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

на этомточка при нажатии одной из стрелок ^ [[A, ^ [[B, ^ [[C или ^ [[D] отображается и после нажатия Enter я узнаю, что одна из них была нажата с помощью:

char a = getchar();

if (a == '\033') {
    getchar();
    int ch2 = getchar();
    switch(ch2){
        case 'A': 
            printf("UP\n"); 
            break;
        case 'B': 
            printf("DOWN\n"); 
            break;
        case 'D': 
            printf("LEFT\n"); 
            break;
        case 'C': 
            printf("RIGHT\n"); 
            break;
        default:
            printf("SOME OTHER SCROLL KEY PRESSED: %d %d\n", a, ch2); 
            break;
    }
}

Что я хочу получить, так это то, что как только я нажимаю одну из стрелок, действие происходит без отображения чего-либо.

1 Ответ

4 голосов
/ 14 октября 2019

По умолчанию вход терминала в Unix-системах буферизован строкой, вы можете использовать termios, чтобы указать собственное условие возврата для функций stdin:

#include <stdio.h>
#include <termios.h>

static struct termios orig_termios;

char get_char_wait_for_keypress(void) {
    struct termios raw;
    // Get stdin file descriptor (0 by default)
    int stdin_fileno = fileno(stdin);
    // Copy terminal io settings
    raw = orig_termios;
    // Set return condition at first byte being received (For input timeout you can use `raw.c_cc[VTIME] = secs`)
    raw.c_cc[VMIN] = 1;
    // Apply settings with new return condition
    tcsetattr(stdin_fileno, TCSANOW, &raw);
    // Get char with new conditions
    char c = getchar();
    // Restore old settings
    tcsetattr(stdin_fileno, TCSANOW, &orig_termios);
    return c;
}

int main(void) {
struct termios raw;
    char c = get_char_wait_for_keypress();
    printf("%d", c);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...