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