在linux c应用程序中创建自定义键盘快捷键
我正在尝试处理键盘快捷键,我已经知道如何处理信号,但问题是信号列表没有提供很多选择。 所以我想知道是否有可能处理快捷键,比如CTRL+'key'在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
而
键
可以是任何键盘键,如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
,否则我建议为特殊字符定义信号处理程序。使用GNUreadline
。阅读有关自定义函数的文档。
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