如何在Gnome Shell中获取击键

时间:2016-07-22 15:07:58

标签: gnome-shell gnome-3 gnome-shell-extensions

我正在尝试编写我的第一个Shell扩展,并且 - 正如每篇博客文章那样 - 我对缺乏最新文档感到非常挣扎......

即我正试图从键盘上抓取所有击键,并且 - 查看在线代码和旧邮件列表消息 - 似乎直到最近正确的做法是:

const Shell = imports.gi.Shell;
global.set_stage_input_mode(Shell.StageInputMode.FULLSCREEN);
global.stage.connect('key-press-event', myCallbackHere);

然而,这似乎不起作用。功能set_stage_input_mode和属性StageInputMode似乎都已消失,至少在运行GTK 3.20.6的Fedora 24上。

让我的扩展程序获取用户执行的所有击键的正确方法是什么?

1 个答案:

答案 0 :(得分:4)

我认为目前没有正确的方法可以做到这一点。您可以将X特定或特定于Wayland的内容组合在一起,或者您可以修补Gnome Shell以提供此信息。

对于Wayland,您可以从https://github.com/MaartenBaert/wayland-keylogger开始,对于X,您可以从重新使用自动键(https://github.com/autokey/autokey/blob/master/src/lib/interface.py)中的键检测开始。

我猜这不是你希望的答案,因为你在IRC写道,你想写一个autokey的替代品。要从外部程序获取输入,您可以使用GLib.spawn_async_with_pipeshttps://people.gnome.org/~gcampagna/docs/GLib-2.0/GLib.spawn_async_with_pipes.html)。

我前段时间写了一些Shell扩展代码来轮询xinput test并大致记录发生了什么(想想任何字母数字键vs左ctrl vs返回键)。您可以在此处查看该代码:https://gist.github.com/daniellandau/7679741bf8bbc5c345591593ca05e9f6。它不够强大,无法进行任何类型的宏扩展,所以我建议重新使用自动键的检测代码。

通常,https://people.gnome.org/~gcampagna/docs处的文档可以找到可用于Gnome Shell扩展的库的API引用。我希望你能领先你的项目。开始编写扩展程序是令人沮丧的,但一旦掌握了它,最终会非常有趣。