Обработка событий фокуса окна в расширении оболочки gnome
Я разрабатываю расширение оболочки для GNOME 3.4. Мое расширение должно захватывать события окна, если какой-либо редактируемый текст сфокусирован на входе / выходе.
global.stage.connect('notify::focus-key', Lang.bind(this, this._myHandler));
не работал для меня.
Вот простой пример использования: всякий раз, когда пользователь нажимает на поле поиска Firefox, я хочу, чтобы мой обработчик запускался.
Спасибо за любую помощь,
2 ответа
Сельчук указал мне этот вопрос, поэтому, чтобы получить ответ здесь для дальнейшего поиска.
Библиотека, которая позволила бы настроить прослушиватель глобального рабочего стола для фокусировки изменений - это libatspi (клиентская библиотека среды доступности GNOME). Вы можете использовать непосредственно C, pyatspi2 (ручные привязки python) или привязки на основе самоанализа gobject (например, javascript). Итак, небольшая javascript-программа, которая печатает name: 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/
Код лупы gnome-shell здесь: https://git.gnome.org/browse/gnome-shell/tree/js/ui/magnifier.js
Ты не сможешь это сделать.
виджеты ввода текста приложения не попадают в область действия оконного менеджера, поэтому вы не можете получить доступ к их содержимому, а также к тому, получили ли они фокус или нет.