Selcuk указал мне на этот вопрос, поэтому для ответа на этот вопрос здесь для поиска в будущем.
Библиотека, которая позволила бы установить глобальный рабочий стол слушателя, чтобы сфокусировать изменения, - libatspi (клиентская библиотека базы данных доступности GNOME). Вы можете использовать непосредственно C, pyatspi2 (ручные привязки python) или привязки на основе gobject-introspection (т. Е. Javascript). Таким образом, маленькая Javascript программа, которая печатает имя: role_name сфокусированного объекта каждый раз, когда изменение фокуса будет:
const Atspi = imports.gi.Atspi;
function onChanged (event) {
log(event.source.get_name() + ',' + event.source.get_role_name());
}
Atspi.init();
let atspiListener = Atspi.EventListener.new(onChanged);
atspiListener.register("object:state-changed:focused");
Atspi.event_main();
В любом случае, для примеров коды, вы могли бы взглянуть на недавно добавленный фокус/каретке функцию отслеживания на лупке gnome-shell (пример небольшого размера с использованием javascript) или Orca (программа чтения GNOME, пример большого размера, использует pyatspi2).
libatspi ссылка здесь: https://developer.gnome.org/libatspi/
гном-оболочка коды лупы здесь: https://git.gnome.org/browse/gnome-shell/tree/js/ui/magnifier.js
спасибо. Как экранные клавиатуры захватывают это событие, если виджеты ввода текста не попадают под объем wm? Я читаю /usr/share/../js/ui/keyboard.js и, похоже, пытается связать событие таким же образом. Можно ли использовать вызовы Gtk или Gdk для их получения? –
экранная клавиатура использует вспомогательные технологии для обработки ключевых событий и проверки структуры приложения. AT соединяется через набор инструментов (например, GTK + реализует ATK API для этого). – ebassi