Я вставлю краткое изложение того, как работает gtk_window_key_press_event ():
gboolean
gtk_window_propagate_key_event (GtkWindow *window,
GdkEventKey *event)
{
gboolean handled = FALSE;
focus = window->focus_widget;
while (!handled)
{
GtkWidget *parent;
handled = gtk_widget_event (focus, event);
focus = gtk_widget_get_parent (focus);
}
return handled;
}
static gint
gtk_window_key_press_event (GtkWidget *widget,
GdkEventKey *event)
{
GtkWindow *window = GTK_WINDOW (widget);
gboolean handled = FALSE;
/* handle mnemonics and accelerators */
if (!handled)
handled = gtk_window_activate_key (window, event);
/* handle focus widget key events */
if (!handled)
handled = gtk_window_propagate_key_event (window, event);
/* Chain up, invokes binding set */
if (!handled)
handled = GTK_WIDGET_CLASS (gtk_window_parent_class)->key_press_event (widget, event);
return handled;
}
Это в основном означает:
Проверьте, подходит ли ключ для мнемоники (т.е. надписи с подчеркиванием) или ускорителя (от GtkAccelGroup).
Начиная с сфокусированного виджета и поднимаясь вверх по иерархии контейнеров, посмотрите, обрабатывает ли какой-нибудь виджет нажатие клавиши.
Передайте нажатие клавиши родительскому классу GtkWindow. Ближайший родительский элемент, который обрабатывает это GtkWidget, и он делает это, имея дело с привязками (из gtk_binding_entry_add ()).
Как вы сказали, простое выполнение g_signal_connect () для сигнала события нажатия клавиши GtkWindow даст вам всех нажатий клавиш, которые происходят, когда это окно сфокусировано.
Попробуйте вместо этого выполнить g_signal_connect_after (). Это эффективно добавит еще один запасной вариант к приведенной выше последовательности - это означает «запустить мой обработчик сигнала после используемого по умолчанию». Обратите внимание, что вы будете ловить все необработанные нажатия клавиш (например, если кто-то нажимает функциональную клавишу, которую ваше приложение не обрабатывает), поэтому не думайте, что единственное, что доходит до вашего обработчика, это с вашего сканера штрих-кода.