3

我正在尝试编写我的第一个 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 上。

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

4

1 回答 1

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 上你写道你想写一个自动键的替代品。要从外部程序获取输入,您可以使用GLib.spawn_async_with_pipes( https://people.gnome.org/~gcampagna/docs/GLib-2.0/GLib.spawn_async_with_pipes.html )。

我前段时间写了一些 Shell 扩展代码来轮询xinput test和大致记录正在发生的事情(想想任何字母数字键与左 ctrl 与返回键)。您可以在此处查看该代码:https ://gist.github.com/daniellandau/7679741bf8bbc5c345591593ca05e9f6 。它不足以进行任何类型的宏扩展,因此我建议重用来自 autokey 的检测代码。

一般来说,https: //people.gnome.org/~gcampagna/docs 上的文档是查找可从 Gnome Shell 扩展使用的库的 API 参考的地方。我希望你能在你的项目中取得进展。开始编写扩展是令人沮丧的,但一旦掌握了它,最终会非常有趣。

于 2016-07-28T19:20:44.787 回答