Распространение событий
Функция, которая первоначально получает входные события на стороне GTK, отвечает за ряд задач.
Найти виджет, получивший событие.
Генерировать события перехода (т.е. вход и выход) при изменении фокуса или области наведения с одного виджета на другой.
Отправить событие виджетам.
Событие распространяется вниз и вверх по иерархии виджетов в трех фазах (см. GtkPropagationPhase) к целевому виджету.
Рисунок 14. Фазы распространения событий
Для событий нажатия клавиш верхнее окно получает первую возможность активировать мнемоники и акселераторы. Если это не потребляет события, целевой виджет для распространения событий — текущий виджет фокуса окна (см. gtk_window_get_focus()).
Для событий указателя целевой виджет определяется путем выбора виджета в координатах событий (см. gtk_widget_pick()).
В первой фазе («захват») событие доставляется каждому виджету сверху вниз (от верхнего уровня GtkWindow или виджета захвата) до целевого GtkWidget. Контроллеры событий, прикрепленные с помощью GTK_PHASE_CAPTURE, получают возможность отреагировать на событие.
После фазы «захвата» виджет, который должен быть местом назначения события, выполнит контроллеры событий, прикрепленные к нему с помощью GTK_PHASE_TARGET. Это известно как фаза «цель», и происходит только на этом виджете.
В последней фазе («пузырьковая») событие доставляется каждому виджету от целевого к верхнему, и выполняются контроллеры событий, прикрепленные с помощью GTK_PHASE_BUBBLE.
События не доставляются виджету, который не чувствителен или не отображен.
В любой момент во время фазы распространения контроллер может указать, что полученное событие было обработано, и поэтому распространение должно быть остановлено. Если используются жесты, это может произойти, когда жест заявляет о событии последовательности касания (или событиях указателя) для собственного использования. См. раздел «состояния жестов» ниже, чтобы узнать больше о жестах и последовательностях.
© 2005–2020 The GNOME Project
Licensed under the GNU Lesser General Public License version 2.1 or later.
https://developer-old.gnome.org/gtk4/4.0/event-propagation.html