如何在Awesome Wm中调用DBUS方法



我想从很棒的WM发送DBUS消息。但是,Awesome的DBU Interfact的文档非常简约,我找不到任何示例。怎么做?例如,我想在org.freedesktop.login1中使用Inhibit函数。

Awesome的内置穷人的DBUS包装器几乎没有足够的支持以使DBU具有内置的通知守护程序(Naughty(工作:https://github.com/awsomewm/awsome/blob/259C4F716FBD08B4507EBB4CB4D40FE5CBABED0F/DBUS.C#l858-L870

此API允许您通过DBU实现一个可用的对象并发出信号,但不能调用DBUS方法。查看一些文档,Inhibit接口似乎是您必须调用的方法。更糟糕的是 - 它返回文件描述符!

随着Gio文档的大量阅读,我想到了以下内容(希望自称;但请阅读https://github.com/pavouk/lgi/lgi/blob/blob/master/master/master/docs/gio.md(示例:

local lgi = require("lgi")
local Gio = lgi.require("Gio")
local GLib = lgi.require("GLib")
-- Workaround for https://github.com/pavouk/lgi/issues/142
local function bus_get_async(type)
    Gio.bus_get(type, nil, coroutine.running())
    local a, b = coroutine.yield()
    return Gio.bus_get_finish(b)
end
local function inhibit(bus, what, who, why, mode)
    local name = "org.freedesktop.login1"
    local object = "/org/freedesktop/login1"
    local interface = "org.freedesktop.login1.Manager"
    local message = Gio.DBusMessage.new_method_call(name, object, interface, "Inhibit")
    message:set_body(GLib.Variant("(ssss)",
        { what, who, why, mode }))
    local timeout = -1 -- Just use the default
    local result, err = bus:async_send_message_with_reply(message, Gio.DBusSendMessageFlags.NONE,
        timeout, nil)
    if err then
        print("error: " .. tostring(err))
        return
    end
    if result:get_message_type() == "ERROR" then
        local _, err = result:to_gerror()
        print("error: " .. tostring(err))
        return
    end
    local fd_list = result:get_unix_fd_list()
    local fd, err = fd_list:get(0)
    if err then
        print("error: " .. tostring(err))
        return
    end
    -- Now... somehow turn this fd into something we can close
    return Gio.UnixInputStream.new(fd, true)
end
Gio.Async.call(function()
    local bus = bus_get_async(Gio.BusType.SYSTEM)
    local a = inhibit(bus, "shutdown:sleep", "hi, it's me!", "Just because", "delay")
    print("got lock")
    io.popen("sleep 10"):read("*a")
    a:async_close()
    -- Speed up deletion of the GDBusMessage that still references the FD
    collectgarbage("collect")
    collectgarbage("collect")
    print("released lock")
    io.popen("sleep 10"):read("*a")
end)()

如果需要,可以通过用foo_sync的呼叫替换对async_foo的呼叫来将上述内容变成同步的东西。这也允许摆脱hack以使bus_get_async()工作和围绕所有内容的Gio.Async.call包装器。

最新更新