3

我正在为 Gnome 3.4 开发一个 gnome shell 扩展。如果任何可编辑的文本被聚焦/聚焦,我的扩展程序需要捕获窗口事件。

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

对我不起作用。

这是一个简单的用例:每当用户单击 firefox 搜索框时,我都希望运行我的处理程序。

谢谢你的帮助,

4

2 回答 2

6

塞尔丘克向我指出了这个问题,所以为了在此处回答这个问题以供将来搜索。

允许设置全局桌面侦听器以关注更改的库是 libatspi(GNOME 可访问性框架的客户端库)。您可以直接使用 C、pyatspi2(python 手动绑定)或基于 gobject-introspection 的绑定(即 javascript)。因此,每次焦点更改时打印焦点对象的 name:role_name 的小型 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

于 2013-11-04T15:38:22.930 回答
0

你不能做这个。

应用程序文本输入小部件不属于窗口管理器的范围,因此您无法访问它们的内容,或者它们是否获得焦点。

于 2013-10-15T22:19:48.087 回答