Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как обработать сигнал key-press-event? Gtk+, язык Си

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

>> Почему так происходит

Вызывающая сторона читает значение регистра RAX, думая что в нём лежит ожидаемое возвращаемое значение. В первом случае там оказывается ненулевое значение, что расценивается как TRUE. Во втором же случае последним записанным в RAX значением оказывается то, которое вернула функция sleep, а она в случае удачного завершения возвращает 0 (т. е. FALSE).
anonim anonimУченик (134) 3 года назад
Большое спасибо! Теперь больше знаю о сигналах в gtk
anonim anonimУченик (134) 3 года назад
Даже не думал что вызывающая сторона будет читать значение из регистра
Похожие вопросы