将 'clicked' 信号连接到指标

Connecting a 'clicked' signal to the indicator

我按照以下教程为 shell 3.36 编写了一个 PanelMenu.Button 派生的 class:

https://wiki.gnome.org/Projects/GnomeShell/Extensions/Writing

一切正常(在我必须做一些与 3.36 相关的调整之后)但现在我想左键单击 show/hide 应用程序并单击右键打开菜单。为此,我想捕捉一个 'clicked' 信号,但 PanelMenu.Button 只发出 menu-set。我需要这样的东西:

indicator.connect("clicked", () => GLib.spawn_command_line_async("my_app"));

是否有支持'clicked'信号的小部件?

我认为寻找另一个小部件可能比它值得的工作更多。如果您查看 here 实现,它们实际上只是覆盖 event vfunc 来打开菜单。

vfunc_event(event) {
    if (this.menu &&
        (event.type() == Clutter.EventType.TOUCH_BEGIN ||
         event.type() == Clutter.EventType.BUTTON_PRESS))
        this.menu.toggle();

    return Clutter.EVENT_PROPAGATE;
}

如果你已经将自己子类化并且不需要菜单,你可以通过像这样重新定义虚函数来简单地做类似的事情(只需像常规函数一样把它放在你的子类中):

vfunc_event() {
    if ((event.type() == Clutter.EventType.TOUCH_BEGIN ||
         event.type() == Clutter.EventType.BUTTON_PRESS))
        GLib.spawn_command_line_async("my_app");

    return Clutter.EVENT_PROPAGATE;
}

但是,您可能希望将事件更改为 BUTTON_RELEASETOUCH_END,以便在用户 释放 按钮时发生,给他们机会通过将鼠标拖走来改变他们的想法。

你试过了吗:
indicator.connect("button-press-event", () => GLib.spawn_command_line_async("my_app"));

您正在寻找的信号应该是:按钮按下事件。 单击一次鼠标左键将触发 按钮按下事件
这个信号对我有用。我的 GNOME shell 版本是:3.36.9

关于你的第二个问题:
show/hide 运行 应用程序的 window 是否有首选方法?
此 link 可能会对您有所帮助,或者至少希望能为您提供一些正确方向的指示:
https://github.com/amivaleo/Show-Desktop-Button/blob/master/extension.js
祝你好运!