我想DBUS消息从真棒WM发送给其他应用程序。然而,Awesome的dbus interfact文档非常简约,我找不到任何示例。怎么做?例如,我想使用org.freedesktop.login1
中的Inhibit
函数。如何在Awesome WM中调用dbus方法?
0
A
回答
1
真棒内置的可怜人的DBus包装几乎包含了足够的支持的DBus有其内置的通知守护进程(淘气)工作:https://github.com/awesomeWM/awesome/blob/259c4f716fbd08b4507ebb4cb4d40fe5cbabed0f/dbus.c#L858-L870
该API允许你实现提供对象通过的DBus和发射信号,但不能调用DBus方法。看着some docs,它好像Inhibit
界面是你要调用的方法。更糟 - 它返回一个文件描述符!
随着大量的GIO的文档的阅读,我想出了以下(希望不言自明;同时也请阅读https://github.com/pavouk/lgi/blob/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
同步。这也让摆脱黑客攻击,使bus_get_async()
工作和周围的一切的Gio.Async.call
包装。
相关问题
- 1. 在Awesome WM
- 2. 在Awesome WM菜单中切换用户
- 3. 在Gjs/Gnome Shell中调用DBus方法
- 4. 使用dbus调用java方法
- 5. Dbus结构和方法调用C
- 6. 停止MPlayer在Awesome WM中使用浮点数
- 7. 如何在Awesome WM 4.0中的多个标签上显示应用程序?
- 8. 在dbus-cxx中调用方法后收到多个参数
- 9. 不能用python调用dbus中的klipper方法
- 10. 在潜入之前,Awesome WM有可能吗?
- 11. 如何使用dbus-send调用org.bluez.Adapter1.StartDiscovery?
- 12. 如何在瓦片布局中使用箭头键在Awesome WM中导航打开的程序?
- 13. 在线程中调用dbus-python
- 14. 谁将在dbus中调用message_function。
- 15. Rhino Mocks:如何在方法调用中模拟方法调用?
- 16. awesome-wm外接显示器和笔记本电脑
- 17. awesome wm启动栏小部件不显示?
- 18. C DBus:调用方法返回字符串时失败
- 19. 应用程序在特定的标签下自动启动awesome-wm
- 20. 如何使用多个参数公开dbus方法?
- 21. 如何调试Font-Awesome图标?
- 22. 如何在lua中调用此方法?
- 23. 如何在javascript中调用c#方法
- 24. 如何调用super.super方法在Ruby中
- 25. 如何在Ruby中调用方法?
- 26. 如何在Angularjs中调用post方法?
- 27. 如何在JavaScript中调用类方法
- 28. 如何在Objective-C中调用方法?
- 29. 如何在JSP中调用void方法
- 30. 如何在Javascript中调用Java方法
使用d-脚得到可用的接口和方法的一个很好的列表,让您同时使用这些方法玩。 – AndreLDM