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

use*_*.dz 5 gtk gnome event-loop gnome-shell-extensions gjs

我写了这个辅助功能扩展:

这适用于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);
}
Run Code Online (Sandbox Code Playgroud)

试图调试,我修改了代码来显示(状态标签+一个计数器)

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;
}
Run Code Online (Sandbox Code Playgroud)

我可以证实这些:

  • keymap.connect('state_changed', _update ); 这个信号永远不会升起
  • 超时回调效果很好
  • 标签已更新并显示初始状态和递增计数器

所以我认为事件循环有一些东西,因为它不会拉动状态更新或不处理它的事件.

你能指点我解决这个问题吗?v3.10和v3.14之间的区别是什么?

Riv*_*aye 1

假设注释掉键盘映射的定义是有意的,请检查它是否仍然分配在代码中的其他位置。您是否尝试过使用 -(减号)而不是 _(下划线)?大多数事件在 JS 空间中使用前者,而不是后者,这对我来说一直是个问题,当我将事件附加到更改活动工作区时,Meta.Display 的后端会触发workspace_switched,GJS 空间连接起来workspace-switched,还有很多例子。

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