Как обработать сигнал 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 даже и подумать не мог что вызывающая сторона будет читать значение из регистра

→ Ссылка