我将我的处理程序连接到press-key-event
小部件信号:TextView
void event_return(GtkWidget *widget,GdkEventKey *event,sig_data *data)
{
if(event->keyval==GDK_KEY_Return){
printf("\nEVENT_RETURN\n");
}
}
也就是说,如果我按下一个键,Enter
那么我的处理程序将工作,并且TextView
该键不会进入小部件缓冲区(以及按下任何键)。就是这样,但是如果我添加sleep(1)
到代码中:
void event_return(GtkWidget *widget,GdkEventKey *event,sig_data *data)
{
if(event->keyval==GDK_KEY_Return){
printf("\nEVENT_RETURN\n");
sleep(1);
}
}
然后换行符将进入缓冲区。为什么会发生这种情况,如何完全拦截此信号而不将其跳过到缓冲区中?
答案是给了我的答案:https ://otvet.mail.ru/question/220446877
按键事件处理程序必须返回 gboolean 类型的值。此值确定默认处理是否将继续:TRUE - 中止,FALSE - 继续。
调用者读取 RAX 寄存器的值,认为它包含预期的返回值。在第一种情况下,有一个非零值,它被认为是 TRUE。在第二种情况下,写入 RAX 的最后一个值是 sleep 函数返回的值,成功时返回 0(即 FALSE)。
Ps 我什至无法想到调用者会从寄存器中读取值