在linux c应用程序中创建自定义键盘快捷键

在linux c应用程序中创建自定义键盘快捷键,c,linux,keyboard,shortcuts,C,Linux,Keyboard,Shortcuts,我正在尝试处理键盘快捷键,我已经知道如何处理信号,但问题是信号列表没有提供很多选择。 所以我想知道是否有可能处理快捷键,比如CTRL+'key' 而键可以是任何键盘键,如A Z E R T Y这里是一个使用GNU的示例。您可以捕获键序列Ctrl+P、Ctrl+G等 对于诸如信号字符,Ctrl+C、Ctrl+Z,您需要rl\u catch\u signals=0。通过这种方式,您可以定义自己的信号处理程序 我发现一件事是,即使在调用readline之前将终端置于raw模式,也不会调用rl\u bi

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

这里是一个使用GNU的示例。您可以捕获键序列Ctrl+P、Ctrl+G等

对于诸如信号字符,Ctrl+C、Ctrl+Z,您需要
rl\u catch\u signals=0
。通过这种方式,您可以定义自己的信号处理程序

我发现一件事是,即使在调用
readline
之前将终端置于
raw
模式,也不会调用
rl\u bind\u keyseq(\\C-z),keyppressed)
。相反,终端仍将Ctrl+Z解释为
SIGTSTP

通过查看源代码,很明显每次调用
readline()
时,终端设置都是无效的


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

使用GNU
readline
。阅读有关自定义函数的文档。
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> ");
        }
//rltty.c
    #if defined (HANDLE_SIGNALS)
      tiop->c_lflag &= ~ISIG;
    #else
      tiop->c_lflag |= ISIG;
    #endif