Ncurses: определение нажатия клавиши F1 и использование сигналов

я пытаюсь изучить библиотеку ncurses, и я придумал код ниже:

#include <ncurses.h>
#include <stdlib.h>
#include <signal.h>

static void finish(int sig);

int main(int argc, char** argv) {

    char c;
    initscr();
    raw();
    keypad(stdscr, TRUE);
    noecho();

    (void) signal(SIGINT, finish);      /* arrange interrupts to terminate */

    printw("Type any character to see it in bold:\n");
    refresh();
    c = getch();

    /* work around for ctrl+c */
    if(c == 3)
        finish(0);

    while(c != KEY_F(1))
    {
        printw("The pressed key is ");
        attron(A_BOLD);
        printw("%c\n", c);
        attroff(A_BOLD);
        refresh();
        c = getch();

        /* work around for ctrl+c */
        if(c == 3)
            finish(0);

        printf("Code = %d\n", c);
    }

    printw("F1 key pressed.\n");
    endwin();

    return (EXIT_SUCCESS);
}

static void finish(int sig)
{
    endwin();

    /* do your non-curses wrapup here */

    exit(0);
}

Проблема в этом коде заключается в том, что когда я нажимаю клавишу F1, открывается окно справки терминала, и я не могу поймать нажатие клавиши F1. Также я не могу поймать нажатие ctrl+c сигнальным механизмом. Есть ли способ переопределить клавишу F1 на терминале и как я могу использовать сигналы в режиме curses.


person Olcay Ertaş    schedule 25.07.2011    source источник


Ответы (1)


В строке меню окна терминала выберите Правка -> Настройки. Перейдите на вкладку «Ярлыки». Удалите конфликтующие ярлыки.

А еще лучше не использовать ярлыки, конфликтующие с уже существующими ярлыками эмулятора терминала.

Вероятно, вам следует оставить SIGINT в покое. ncurses уже перехватывает его, чтобы очистить терминал перед выходом. Если вам нужно запустить собственный код очистки, попробуйте функцию atexit.

person kwatford    schedule 25.07.2011
comment
Функция atexit() на самом деле не та, которую я ищу. Я хочу прервать и закончить программу с помощью ctrl+c. Так что мне все еще нужен SIGINT, вы знаете какое-нибудь решение? - person Olcay Ertaş; 25.07.2011
comment
Закомментируйте свой вызов функции raw. Это перехватывает ctrl-c. Без него ctrl-c нормально прерывает программу и вызывает функцию, зарегистрированную с помощью atexit. - person kwatford; 25.07.2011
comment
Макрос KEY_F(1) возвращает 265, но когда я нажимаю F1, переменная c получает значение 9. - person Olcay Ertaş; 25.07.2011
comment
Вы определили c как char, но 265 слишком велико для хранения в char. Определите его как int. Вы можете применить его к персонажу после того, как определите, является ли он на самом деле персонажем. - person kwatford; 25.07.2011
comment
Спасибо, я заметил это до того, как вы написали. - person Olcay Ertaş; 25.07.2011