如何在GNOME扩展中捕获键盘语言切换事件?
如何在GNOME扩展中捕获键盘语言切换事件?
我来帮你搞定这个问题!要在GNOME扩展里捕获键盘语言切换的事件,我们可以利用GNOME Shell内置的Shell.InputSourceManager来实现,它会在当前激活的键盘语言(输入源)变化时发出对应的信号。下面是调整后的完整代码示例,我会一步步给你解释:
首先,我们需要在扩展的enable方法中获取输入源管理器的实例,然后监听它的active-source-changed信号;同时别忘了在disable方法中移除监听,避免内存泄漏。
修改后的完整代码:
/* SPDX-License-Identifier: GPL-2.0-or-later */ /* exported init */ const { Shell } = imports.gi; class Extension { constructor() { this._inputSourceManager = null; this._languageChangedHandler = null; } enable() { // 获取输入源管理器实例 this._inputSourceManager = Shell.InputSourceManager.get_default(); // 监听输入源切换事件 this._languageChangedHandler = this._inputSourceManager.connect( 'active-source-changed', () => { // 获取当前激活的输入源(键盘语言) const currentSource = this._inputSourceManager.current_source; // 获取语言名称,你也可以获取其他属性比如id等 const languageName = currentSource.get_display_name(); // 打印日志,验证事件触发 log(`Language was changed and now = ${languageName}`); } ); } disable() { // 移除事件监听 if (this._languageChangedHandler) { this._inputSourceManager.disconnect(this._languageChangedHandler); this._languageChangedHandler = null; } this._inputSourceManager = null; } } function init() { return new Extension(); }
关键点说明:
- 首先导入
Shell这个GI模块,因为InputSourceManager属于它的API; - 在构造函数里初始化两个变量,用来保存管理器实例和事件句柄,方便在
disable时清理; active-source-changed信号会在每次键盘语言切换时触发,回调函数里通过current_source获取当前激活的输入源,再用get_display_name()拿到易读的语言名称;- 一定要在
disable方法中断开信号连接并清空变量,这是GNOME扩展开发的最佳实践,防止内存泄漏。
如果你只是想简单监听切换动作,不需要获取具体语言信息,也可以简化回调函数的内容,只保留日志或者你需要执行的逻辑就行。
备注:内容来源于stack exchange,提问作者Ilya Startsev
相关产品推荐
相关产品推荐

