Awesome WMから他のアプリケーションにdbusメッセージを送信したい。しかし、Awesomeのdbusインタフェクトのドキュメントはかなり単純で、例は見つけられません。どうやってするか?たとえば、org.freedesktop.login1
にInhibit
関数を使用したいとします。Awesome WMでdbusメソッドを呼び出すには?
0
A
答えて
1
恐ろしいDバスは、内蔵の通知デーモン(いたずら)仕事持っているため、内蔵貧乏人のDバスラッパーがかろうじて十分なサポートが含まれています:https://github.com/awesomeWM/awesome/blob/259c4f716fbd08b4507ebb4cb4d40fe5cbabed0f/dbus.c#L858-L870
このAPIを使用すると、Dバスを経由して利用できるオブジェクトを実装し、放出することを可能にしますしかし、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)()
あなたがしたい場合は、何かに上記を変えることができますasync_foo
への呼び出しをfoo_sync
への呼び出しと置き換えることによって同期します。それはまた、bus_get_async()
を働かせるためのハックを取り除き、すべての周りにGio.Async.call
ラッパーを作ることを可能にします。
関連する問題
- 1. awesome-wm gears.timer setup
- 2. 返信を期待しないでDbusメソッドを呼び出す
- 3. Gjs/GnomeシェルでDBusメソッドを呼び出す
- 4. DBus上の第2クラスのメソッドは呼び出し不可能
- 5. awesome-wm外部モニターとラップトップ
- 6. dbusのmessage_functionを呼び出します。
- 7. メソッド呼び出し後に複数の引数を受け取るdbus-cxx
- 8. Awesome WMで特定のクライアントクラスのクライアントキーをバインドする方法は?
- 9. C#でメソッド/呼び出しを別のメソッドから呼び出す方法は?
- 10. 他のオブジェクトからメソッドを呼び出すメソッド呼び出し
- 11. 呼び出すメソッドは、オブジェクト
- 12. ダイビングに入る前に、これはAwesome WMで可能ですか?
- 13. メインドライバでvoidメソッドではないメソッドを呼び出すには?
- 14. メソッド内でメソッドを呼び出すruby
- 15. awesome-wm:フローティングクライアントを画面の中央に移動
- 16. Spring AOP @AfterThrowing - メソッドの詳細を呼び出すメソッドの呼び出し(メソッドを呼び出さない)
- 17. プロキシのdbusメソッドをブロックせずに呼び出します(またはタイムアウトなし)
- 18. 1回の呼び出しでメソッドを呼び出す
- 19. 各メソッド呼び出しでjQueryがコンストラクタを呼び出す
- 20. ToList()メソッド呼び出し時にデータベースを呼び出す
- 21. ViewModelメソッドを呼び出す
- 22. Pythonメソッドを呼び出す
- 23. メソッドを呼び出すか?
- 24. メソッドを呼び出す、C#
- 25. Javaメソッドを呼び出す
- 26. メソッドを呼び出す
- 27. C#メソッドを呼び出す
- 28. メソッドを呼び出すボタンアクション
- 29. Pythonを呼び出すメソッド
- 30. voidメソッドを呼び出す
D-Feetを使用して、利用可能なインターフェイスとそのメソッドの素敵なリストを取得し、これらのメソッドでも遊ぶことができます。 – AndreLDM