Обработка событий фокуса окна в расширении оболочки 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

Ты не сможешь это сделать.

виджеты ввода текста приложения не попадают в область действия оконного менеджера, поэтому вы не можете получить доступ к их содержимому, а также к тому, получили ли они фокус или нет.

Другие вопросы по тегам