Как обработать сигнал key-press-event?
К сигналу 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);
}
}
То символ перевода строки пойдет в буфер. Почему так происходит, как перехватить этот сигнал полностью и не пропустить его в буфер?
Ответы (1 шт):
На меил ответах дали ответ: https://otvet.mail.ru/question/220446877
Обработчик key-press-event должен возвращать значение типа gboolean. Это значение и определяет, будет ли дальше происходить обработка по умолчанию: TRUE - прервать, FALSE - продолжить.
Почему так происходит
Вызывающая сторона читает значение регистра RAX, думая что в нём лежит ожидаемое возвращаемое значение. В первом случае там оказывается ненулевое значение, что расценивается как TRUE. Во втором же случае последним записанным в RAX значением оказывается то, которое вернула функция sleep, а она в случае удачного завершения возвращает 0 (т. е. FALSE).
P.s даже и подумать не мог что вызывающая сторона будет читать значение из регистра