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

时间:2015-02-15 01:03:27

标签: 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的班级......

-

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

edit2:更多搜索。在主ui树上查看gnome shell源代码,我认为答案是使用扩展代码可用的提到的global对象。 e.g。

global.connect('key-press-event', function(if, i, know, the, signature){} );

2 个答案:

答案 0 :(得分:4)

我前段时间在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扩展。

<强>更新

我最近一直在做一些键绑定的东西,如果将信号处理程序附加到全局对象是有效的,你可以这样做:

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 - &gt;路径:/org/gnome/Shell - &gt;界面:org.gnome.Shell

相关方法:

  • GrabAccelerator(String accelerator, UInt32 flags) - &gt; (UInt32 action)
  • UngrabAccelerator(UInt32 action) - &gt; (Boolean success)

信号:

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

答案 1 :(得分:0)

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