Перехват события X11 KeyPress в GtkDrawingArea GTK + 3 в Linux - PullRequest
0 голосов
/ 25 августа 2018

GTK + версия: 3.18.9

Я создал область рисования (GtkWidget) со следующим кодом

content = gtk_drawing_area_new();
gtk_widget_set_can_focus(content, TRUE);
gtk_widget_add_events(content, GDK_ALL_EVENTS_MASK);
g_signal_connect(content, "draw", G_CALLBACK(&drawCallback), ctx);
gtk_widget_realize(content);

// Add a filter for interception
gdk_window_add_filter(content, gtk_widget_get_window(content),
  OnXEvent, NULL);

Проблема в том, что когда я щелкнул по широкому значению, я получил последовательность событий XEvents следующим образом:

LeaveNotify
FocusIn
EnterNotify
ButtonPress
FocusOut    // Lost focus!
ButtonRelease

Выше FocusOut означает, что мы сразу же потеряли фокус после нажатия. Это означает, что мы не можем получать какие-либо события клавиатуры, поскольку они доступны только внутри фокуса.

Это ограничение GTK? Если нет, есть ли какие-нибудь инструменты / методология, чтобы узнать, какой виджет / вдова вызывает FocusOut?

Ссылки:

gdk_window_add_filter

1 Ответ

0 голосов
/ 28 августа 2018

Начиная с версии GTK + 3.18.9, он использует дополнительное окно X для окна верхнего уровня, и любые события клавиатуры регистрируются окном. Таким образом, фильтр должен быть добавлен как глобальный, то есть

gdk_window_add_filter(NULL, OnXEvent, NULL)

Обратите внимание, что API был удален в этом коммите в GTK + 4.x.

...