1

我正在尝试处理键盘快捷键,我已经知道如何处理信号,但问题是信号列表没有提供很多选择。所以我想知道是否可以处理快捷键,例如CTRL+'key' ,并且key可以是任何键盘键,如A Z E R T Y.

4

1 回答 1

0

这是使用 GNU 的示例readline。您可以捕获键序列Ctrl+PCtrl+G等。

int keyPressed(int count, int key) {

        printf("key pressed: %d\n",key);
        rl_on_new_line();
        return 0;
}

int main() {
        rl_catch_signals = 0;
        rl_bind_keyseq("\\C-g",keyPressed);
        rl_bind_keyseq("\\C-p",keyPressed);
        rl_bind_keyseq("\\C-z",keyPressed);

        while(1) {
                char *line = readline("rl> ");
        }

对于信号字符等特殊字符Ctrl+CCtrl+Z您将需要rl_catch_signals=0. 这样,您可以定义自己的信号处理程序。

我发现的一件事是rl_bind_keyseq("\\C-z",keyPressed)不会被调用,即使你raw在调用之前将终端置于模式readline。相反,终端仍将解释Ctrl+ZSIGTSTP.

翻看源码,很明显每次readline()被调用,终端设置都会被重置

//rltty.c
    #if defined (HANDLE_SIGNALS)
      tiop->c_lflag &= ~ISIG;
    #else
      tiop->c_lflag |= ISIG;
    #endif

除非你想修改readline,否则我建议为特殊字符定义信号处理程序。

于 2017-12-13T20:33:29.113 回答