繁体   English   中英

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

[英]How to handle keyboard events in gnome shell extensions?

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

我找不到任何例子。 文档提到了一个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 模板中遇到了这个片段,这可能与你在做什么有关:

// 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 扩展。

更新

我最近一直在做一些键绑定的事情,如果将信号处理程序附加到全局对象可以正常工作,您可以执行以下操作:

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 键绑定代码一些shell 全局文档,它们可能会为您提供更多线索。 希望我能提供更多帮助,但我正在与自己的 GJS atm 搏斗;)

附录

这里有一个很好的答案,其中包含一个带有信息日志记录的示例类,以及一个推测性解释。 我还发现此功能通过 DBus 公开,这在某些情况下可能更方便:

总线名称: org.gnome.Shell -> 路径: /org/gnome/Shell -> 接口: org.gnome.Shell

相关方法:

  • GrabAccelerator(String accelerator, UInt32 flags) -> (UInt32 action)
  • UngrabAccelerator(UInt32 action) -> (Boolean success)

信号:

  • AcceleratorActivate(UInt32, Dict of {String, Variant})

对我而言global.stage.connect("key-press-event", _handleKeyPress)做到了

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM