我正在为Gnome 3.4开发一个gnome shell扩展。如果任何可编辑文本聚焦在/进出,我的扩展需要捕获窗口事件。
global.stage.connect('notify::focus-key', Lang.bind(this, this._myHandler));
对我不起作用。
这是一个简单的用例:每当用户点击firefox搜索框时,我都希望我的处理程序能够运行。
感谢您的帮助,
答案 0 :(得分:6)
塞尔丘克向我提出了这个问题,所以为了将来这个问题回答这个问题。
允许设置全局桌面侦听器以集中更改的库是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/
gnome-shell放大镜代码:https://git.gnome.org/browse/gnome-shell/tree/js/ui/magnifier.js
答案 1 :(得分:0)
你不能这样做。
应用程序文本输入窗口小部件不属于窗口管理器的范围,因此您无法访问其内容,也无法获得焦点。