我写了这个可访问性扩展:
- https://extensions.gnome.org/extension/975/keyboard-modifiers-status/
- https://github.com/sneetsher/Keyboard-Modifiers-Status
在 Gnome Shell v3.14 和 v3.16 中可以正常工作,但在 v3.10 中没有。它显示了我重新启动它后唯一的初始键盘修饰符状态,之后再也不更新它。
这里是完整的代码:
const St = imports.gi.St;
const Mainloop = imports.mainloop;
const Main = imports.ui.main;
const Gdk = imports.gi.Gdk
let button, label, keymap;
function _update() {
let symbols = "⇧⇬⋀⌥①◆⌘⎇";
let state = keymap.get_modifier_state();
label.text = " ";
for (var i=0; i<=8; i++ ) {
if (state & 1<<i) {
label.text += symbols[i];
} else {
//label.text += "";
}
}
label.text += " ";
}
function init() {
button = new St.Bin({ style_class: 'panel-button',
reactive: false,
can_focus: false,
x_fill: true,
y_fill: false,
track_hover: false });
label = new St.Label({ style_class: "state-label", text: "" });
button.set_child(label);
keymap = Gdk.Keymap.get_default();
keymap.connect('state_changed', _update );
Mainloop.timeout_add(1000, _update );
}
function enable() {
Main.panel._rightBox.insert_child_at_index(button, 0);
}
function disable() {
Main.panel._rightBox.remove_child(button);
}
尝试调试,我修改了代码以显示(状态标签+计数器)
let c,button, label, keymap;
c=0;
function _update() {
Gtk.main_iteration_do(false);
c++;
let symbols = "⇧⇬⋀⌥①◆⌘⎇";
//let keymap = Gdk.Keymap.get_default()
let state = keymap.get_modifier_state();
label.text = " ";
for (var i=0; i<=8; i++ ) {
if (state & 1<<i) {
label.text += symbols[i];
} else {
//label.text += "";
}
}
label.text += " "+c+" ";
return true;
}
我可以确认这些:
keymap.connect('state_changed', _update );
永远不会发出这个信号- 超时回调效果很好
- 标签已更新并显示初始状态和递增计数器
所以我认为事件循环有一些东西,因为它不拉状态更新或不处理它的事件。
您能否指出解决此问题的方法以及 v3.10 和 v3.14 之间的区别?