单击面板扩展图标时调用 gdbus

gdbus call when click on panel extension icon

是否可以在点击面板扩展图标时触发 gdbus call

在我的具体示例中,我想调用以下命令来更改单击扩展程序图标时的显示亮度。

gdbus call --session --dest org.gnome.SettingsDaemon.Power --object-path /org/gnome/SettingsDaemon/Power --method org.gnome.SettingsDaemon.Power.Screen.StepUp --session --dest org.gnome.SettingsDaemon.Power --object-path /org/gnome/SettingsDaemon/Power --method org.gnome.SettingsDaemon.Power.Screen.StepUp

有几个选项可供您选择。您可以使用 GLib.spawn_command_line_async():

生成该命令
const Lang = imports.lang;
const PanelMenu = imports.ui.panelMenu;
const St = imports.gi.St;

const ExamplePanel = new Lang.Class({
    Name: "ExamplePanelButton",
    Extends: PanelMenu.Button,

    _init: function () {
        this.parent(null, "ExamplePanelButton");

        // Icon
        this.icon = new St.Icon({
            icon_name: "view-refresh-symbolic",
            style_class: "system-status-icon"
        });

        this.icon.connect("clicked", () => GLib.spawn_command_line_async(
                "gdbus call --session --dest org.gnome.SettingsDaemon.Power --object-path /org/gnome/SettingsDaemon/Power --method org.gnome.SettingsDaemon.Power.Screen.StepUp"
        ));

        this.actor.add_actor(this.icon);
    }
});

但是也有相当广泛的 DBus API 可用,例如 creating proxy wrappers 的这个较旧的示例。或者您可以进行原始 DBus 调用:

const Gio = imports.gi.Gio;

//
let proxy = new Gio.DBusProxy({
    g_connection: Gio.DBus.session,
    g_name: "org.gnome.SettingsDaemon.Power",
    g_object_path: "/org/gnome/SettingsDaemon/Power",
    g_interface_name: "org.gnome.SettingsDaemon.Power.Screen"
});
proxy.init(null);

let returnValue = proxy.call_sync(
    "org.gnome.SettingsDaemon.Power.Screen.StepUp",
    null, // method args
    0,    // call flags
    -1,   // timeout
    null  // cancellable
);

log(returnValue.deep_unpack());
  • 免责声明:我很确定这是对的,我通常使用代理包装器。