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 などに渡す。

Tags of current page

, ,