2013-10-15 8 views
3

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

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

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

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

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

ответ

6

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

0

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

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

+0

спасибо. Как экранные клавиатуры захватывают это событие, если виджеты ввода текста не попадают под объем wm? Я читаю /usr/share/../js/ui/keyboard.js и, похоже, пытается связать событие таким же образом. Можно ли использовать вызовы Gtk или Gdk для их получения? –

+0

экранная клавиатура использует вспомогательные технологии для обработки ключевых событий и проверки структуры приложения. AT соединяется через набор инструментов (например, GTK + реализует ATK API для этого). – ebassi