如何处理 gnome shell 扩展中的键盘事件?
How to handle keyboard events in gnome shell extensions?
如何添加事件或其他方法来监听 gnome shell 扩展上的按键?例如显示一个对话框,每次按键都会显示按下的键?
我找不到任何例子。 documentation 提到了一个 keyboard
模块,但是使用那个通用名称很难搜索。
Class explanation
...
- General utils
- Keyboard: Manage and define the keyboard events, etc. for gnome shell.
(从上面链接的文档中引用上面的内容。它的样式是代码,因为出于某种原因,引用样式不保留此站点中的换行符)
我发现了一些使用波纹管代码的扩展,结果与我所问的类似,但我再次未能找到特定 classes 和方法的文档:
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 });
});
此外,在任何地方都没有 class 命名为 keyboard
...
--
edit1:更多搜索...我想我可能不得不使用 Clutter
api。但同样,没有太多的例子或文档。我走得最远的是这个
edit2:更多搜索。查看 gnome shell 源代码,在主 ui 树上,我认为答案是使用扩展代码可用的 barelly 提到的 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 扩展。
更新
我最近一直在做一些键绑定的事情,如果将信号处理程序附加到全局对象有效,您可以这样做:
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 and some shell-global documentation here 可能会给您更多线索。希望我能提供更多帮助,但我正在为自己的 GJS atm 苦苦挣扎 ;)
附录
有一个 good answer here,其中有一个示例 class,其中包含信息性日志记录以及推测性解释。我还发现此功能通过 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)
成功了
如何添加事件或其他方法来监听 gnome shell 扩展上的按键?例如显示一个对话框,每次按键都会显示按下的键?
我找不到任何例子。 documentation 提到了一个 keyboard
模块,但是使用那个通用名称很难搜索。
Class explanation
...
- General utils
- Keyboard: Manage and define the keyboard events, etc. for gnome shell.
(从上面链接的文档中引用上面的内容。它的样式是代码,因为出于某种原因,引用样式不保留此站点中的换行符)
我发现了一些使用波纹管代码的扩展,结果与我所问的类似,但我再次未能找到特定 classes 和方法的文档:
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 });
});
此外,在任何地方都没有 class 命名为 keyboard
...
--
edit1:更多搜索...我想我可能不得不使用 Clutter
api。但同样,没有太多的例子或文档。我走得最远的是这个
edit2:更多搜索。查看 gnome shell 源代码,在主 ui 树上,我认为答案是使用扩展代码可用的 barelly 提到的 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 扩展。
更新
我最近一直在做一些键绑定的事情,如果将信号处理程序附加到全局对象有效,您可以这样做:
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 and some shell-global documentation here 可能会给您更多线索。希望我能提供更多帮助,但我正在为自己的 GJS atm 苦苦挣扎 ;)
附录
有一个 good answer here,其中有一个示例 class,其中包含信息性日志记录以及推测性解释。我还发现此功能通过 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)
成功了