【问题标题】:Connecting a 'clicked' signal to the indicator将“点击”信号连接到指标
【发布时间】:2020-04-12 02:57:33
【问题描述】:

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

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

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

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

是否有支持“点击”信号的小部件?

【问题讨论】:

    标签: javascript gnome-shell gnome-shell-extensions


    【解决方案1】:

    我认为寻找另一个小部件可能比它的价值更多。如果您查看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,以便在用户释放按钮时发生,让他们有机会通过拖动鼠标改变主意.

    【讨论】:

    • 完美,谢谢!一个小的后续问题:是否有显示/隐藏正在运行的应用程序窗口的首选方法?生成它是可行的,但如果应用程序已经在运行,那感觉就有点过头了。换句话说,如何将扩展连接到特定应用程序的运行实例?
    • 如果您需要更详细的帮助,您可能想查看gjs-docs.gnome.org/shell01~0.1_api-appsystem 或打开一个新问题。
    【解决方案2】:

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

    您正在寻找的信号应该是:button-press-event。 单击鼠标左键将触发 button-press-event
    这个信号对我有用。我的 GNOME shell 版本是:3.36.9

    关于您的第二个问题:
    是否有显示/隐藏正在运行的应用程序窗口的首选方式?
    此链接可能会对您有所帮助,或者希望至少能给您一些正确方向的指导:
    https://github.com/amivaleo/Show-Desktop-Button/blob/master/extension.js
    祝你好运!

    【讨论】:

      猜你喜欢
      • 2020-02-19
      • 2020-11-28
      • 2017-03-03
      • 2016-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 2014-01-28
      相关资源
      最近更新 更多