summaryrefslogtreecommitdiff
path: root/awesome/util/dbus_example.lua
diff options
context:
space:
mode:
authorTimmy Keller <tjk@tjkeller.xyz>2024-10-05 11:51:10 -0500
committerTimmy Keller <tjk@tjkeller.xyz>2024-10-05 11:51:10 -0500
commit5a20302dc51bd0cae9562460c8e202bfd604b6ea (patch)
tree29f0f404eb1d5cfef35d02c92ac2a15474f4f025 /awesome/util/dbus_example.lua
parentd1f9ee5eced0c273de6c598f88ddb0f7b4e54230 (diff)
downloaddotconfig-5a20302dc51bd0cae9562460c8e202bfd604b6ea.tar.xz
dotconfig-5a20302dc51bd0cae9562460c8e202bfd604b6ea.zip
pavolctld module and more
Diffstat (limited to 'awesome/util/dbus_example.lua')
-rw-r--r--awesome/util/dbus_example.lua59
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)()
+