Emacs から dbus を使う
dbus_test.rb
データを受け取ってただ表示する dbus サービスを ruby-dbus で作る。
require 'dbus'
bus = DBus.session_bus
service = bus.request_service("test.dbus.service")
class DBusTest < DBus::Object
dbus_interface "test.dbus.SampleInterface" do
dbus_method :variable, "in var:s, out str:s" do |var|
p "#{var.class} #{var.inspect}"
end
end
end
obj = DBusTest.new("/test/dbus/MyInstance")
service.export(obj)
main = DBus::Main.new
main << bus
main.run
variable メソッドのプロトタイプはいいかげんなので注意。
ruby dbus_test.rb
で実行しておく。
emacs と dbus の変数の対応
数値はそのままでよい。また、配列は list が対応している。 dict-entry はマニュアルを読んでもよくわからなくてしばらくはまった。 次を順に評価していき、確認する。
;; boolean
(dbus-call-method :session "test.dbus.service" "/test/dbus/MyInstance" "test.dbus.SampleInterface" "variable" t)
(dbus-call-method :session "test.dbus.service" "/test/dbus/MyInstance" "test.dbus.SampleInterface" "variable" nil)
;; array
(dbus-call-method :session "test.dbus.service" "/test/dbus/MyInstance" "test.dbus.SampleInterface" "variable"
'(1 2 3))
;; empty array
(dbus-call-method :session "test.dbus.service" "/test/dbus/MyInstance" "test.dbus.SampleInterface" "variable"
'(:array))
;; float
(dbus-call-method :session "test.dbus.service" "/test/dbus/MyInstance" "test.dbus.SampleInterface" "variable" 1.23)
;; integer
(dbus-call-method :session "test.dbus.service" "/test/dbus/MyInstance" "test.dbus.SampleInterface" "variable" 10)
;; string
(dbus-call-method :session "test.dbus.service" "/test/dbus/MyInstance" "test.dbus.SampleInterface" "variable" "str")
;; dict-entry
(dbus-call-method :session "test.dbus.service" "/test/dbus/MyInstance" "test.dbus.SampleInterface" "variable"
'(:array (:dict-entry "abc" "def") (:dict-entry "ABC" "DEF")))
UTF-8 の文字列を送信する
何もしないと emacs から UTF-8 の文字列はうまく送信できない。
(encode-coding-string str 'utf-8)
encode-coding-string を使ってから dbus-call-method などに渡す。