diff options
Diffstat (limited to 'awesome/util')
-rw-r--r-- | awesome/util/dbus_example.lua | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/awesome/util/dbus_example.lua b/awesome/util/dbus_example.lua new file mode 100644 index 0000000..1e4d756 --- /dev/null +++ b/awesome/util/dbus_example.lua @@ -0,0 +1,59 @@ +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)() + |