gnome - 如何处理 gnome shell 扩展中的键盘事件?

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

如何添加事件或其他方法来监听 gnome shell 扩展上的按键?例如每次按键都显示一个对话框,显示按下的键?

我找不到任何例子。 documentation提到了 keyboard模块,但是使用该通用名称搜索很困难。

Class explanation
...
- General utils
   - Keyboard: Manage and define the keyboard events, etc. for gnome shell. 

(阅读上面链接文档的引用。它被样式化为代码,因为由于某种原因引用样式不保留本站点中的换行符)

我使用波纹管代码找到了一些扩展,其结果类似于我所要求的结果,但我再次未能找到特定类和方法的文档:
workViewInjections['_init'] = injectToFunction(WorkspacesView.WorkspacesView.prototype, '_init', function(width, height, x, y, workspaces) {
        this._pickWorkspace = false;
        this._pickWindow = false;
        this._keyPressEventId = global.stage.connect('key-press-event', Lang.bind(this, this._onKeyPress));                                                                                
        this._keyReleaseEventId = global.stage.connect('key-release-event', Lang.bind(this, this._onKeyRelease));
        connectedSignals.push({ obj: global.stage, id: this._keyPressEventId });
        connectedSignals.push({ obj: global.stage, id: this._keyReleaseEventId });
        });

此外,没有名为 keyboard 的类那里的任何地方...

--

编辑1:更多搜索...我想我可能不得不使用Clutter api。但同样,没有太多的例子或文档。我去的最远的是这个

编辑2:更多搜索。查看 gnome shell 源代码,在主 ui 树上,我认为答案是使用刚刚提到的 global可用于扩展代码的对象。例如
global.connect('key-press-event', function(if, i, know, the, signature){} );

最佳答案

我在 gcampax 的 gtk-js-app template 中看到了这个片段前段时间,这可能与您正在做的事情有关:

// Due to limitations of gobject-introspection wrt GdkEvent and GdkEventKey,
// this needs to be a signal handler
this.connect('key-press-event', Lang.bind(this, this._handleKeyPress));


_handleKeyPress: function(self, event) {
    return this.main_search_bar.handle_event(event);
},

我还没有需要使用键盘事件,这是 GJS 中的 Gtk,但同样的限制可能会影响 gnome-shell 扩展。

更新

我最近一直在做一些键绑定(bind)的东西,如果将信号处理程序附加到全局对象是有效的,你可以这样做:
global.display.connect("key-press-event", (widget, event, user_data) => {
    let [success, keyval] = event.get_keyval(); // integer
    let keyname = Gdk.keyval_name(keyval); // string keyname

    if (keyname === "Control_L") {
        // Dialog code or eg. this.keys_array.push("<Ctrl>");
    }
});

还有一些Shell keybinding code here还有一些 shell-global documentation here这可能会给你更多的线索。希望我能提供更多帮助,但我正在与自己的 GJS atm 搏斗;)

附录

有一个good answer here带有一个带有信息日志的示例类,以及一个推测性的解释。我还发现此功能通过 DBus 公开,在某些情况下可能更方便:

巴士名称:org.gnome.Shell -> 路径:/org/gnome/Shell -> 接口(interface):org.gnome.Shell
相关方法:
  • GrabAccelerator(String accelerator, UInt32 flags) -> (UInt32 action)
  • UngrabAccelerator(UInt32 action) -> (Boolean success)

  • 信号:
  • AcceleratorActivate(UInt32, Dict of {String, Variant})
  • 关于gnome - 如何处理 gnome shell 扩展中的键盘事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28522031/

    相关文章:

    ubuntu - 如何在 gnome shell 的 libnotify 中自动隐藏错误消息?

    linux - 在 Debian 9 中使用键盘快捷键最小化所有窗口

    python - 你如何使用 python 在 gnome 3 下监听 Mediakey 事件?

    python - 在 tkinter 中分组窗口

    keyboard-shortcuts - 是否有键盘快捷键可以访问 Gnome 中的桌面菜单,或者如何创建它们?

    linux - 如何在 GNOME 中使用 C/C++ 更改文件图标的标志?

    gnome - 使用 LUKS 密码自动登录和解锁 key 圈?

    c - GDK 示例代码

    javascript - GNOME 中鼠标进入屏幕特定像素范围时的激活方法

    linux - 单击特定文件格式时在 linux 的弹出菜单中添加自定义选项