Ncurses:检测F1键是否按下并使用信号

时间:2011-07-25 11:24:38

标签: c ubuntu terminal ncurses signal-handling

我正在尝试学习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模式下使用信号。

1 个答案:

答案 0 :(得分:1)

在终端窗口的菜单栏中,编辑 - &gt;喜好。转到“快捷方式”选项卡。清除冲突的快捷方式。

更好的是,不要使用任何与终端模拟器预先存在的快捷方式冲突的快捷方式。

你应该单独留下SIGINT。 ncurses已经截获它以在退出之前清理终端。如果您需要运行自己的一些清理代码,请尝试atexit函数。