Обработка событий фокуса окна в расширении оболочки gnome

Я разрабатываю расширение оболочки gnome для Gnome 3.4. Моему расширению необходимо фиксировать события окна, если какой-либо редактируемый текст сфокусирован внутрь или наружу.

global.stage.connect('notify::focus-key', Lang.bind(this, this._myHandler));

не работал для меня.

Вот простой пример использования: всякий раз, когда пользователь нажимает на окно поиска Firefox, я хочу, чтобы мой обработчик запускался.

Спасибо за любую помощь,


person The_Cute_Hedgehog    schedule 15.10.2013    source источник


Ответы (2)


Сельчук указал мне на этот вопрос, чтобы получить ответ здесь для будущего поиска.

Библиотека, которая позволяет настроить прослушиватель глобального рабочего стола для фокусировки изменений, — это libatspi (клиентская библиотека среды доступности GNOME). Вы можете использовать непосредственно C, pyatspi2 (ручные привязки Python) или привязки на основе gobject-introspection (например, javascript). Таким образом, небольшая программа javascript, которая печатает имя: имя_роли сфокусированного объекта каждый раз, когда изменяется фокус, будет:

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

person infapi00    schedule 04.11.2013

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

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

person ebassi    schedule 15.10.2013
comment
благодарю вас. Как экранные клавиатуры фиксируют это событие, если виджеты для ввода текста не подпадают под действие wm? Я прочитал /usr/share/../js/ui/keyboard.js и, похоже, пытается связать событие таким же образом. Можно ли использовать вызовы Gtk или Gdk для их получения? - person The_Cute_Hedgehog; 16.10.2013
comment
экранная клавиатура использует вспомогательные технологии для обработки ключевых событий и проверки структуры приложения. AT подключается через набор инструментов (например, GTK+ реализует для этого API ATK). - person ebassi; 16.10.2013