Gnome 3.10与3.14中的扩展事件循环



我编写了这个可访问性扩展:

  • https://extensions.gnome.org/extension/975/keyboard-modifiers-status/
  • https://github.com/sneetsher/Keyboard-Modifiers-Status

它在Gnome Shell v3.14&v3.16,但v3.10中没有。它只显示i之后的初始键盘修饰符状态重新启动它,之后再也不更新它。

这里的完整代码:

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?

假设注释掉keymap的定义是有意的,请检查它是否仍在代码的其他地方分配。你试过用-(减号)而不是_(下划线)吗?大多数事件在JS空间中使用前者,而不是后者。在一些情况下,当我将事件附加到更改活动工作区时,这一直是我的问题,Meta.Display的后端会触发workspace_switched,GJS空间通过workspace-switched连接,还有很多例子。

有关官方文档,包括GJS空间内的正确事件、属性和函数名称,请参阅GNOME DevDocs,我不知道它是何时正式发布的,但它们声明它在这里

相关内容

  • 没有找到相关文章

最新更新