2002-08-28 [長年日記]
λ. DRb vs Gtk::Plug & Gtk::Socket
なかださんが「面白そう」と言ってくれたので、試しに簡単なものを作ってみる。細かなエラー処理などは省略。
# drbembed.rb
require 'drb'
require 'gtk2'
module DRbEmbed
class Socket < Gtk::Socket
def initialize
super()
@drbobj = nil
end
def add(arg)
@drbobj = arg
add_id(@drbobj.__drb_embed_plug_id__)
end
end
end
module Gtk
class Widget
def __drb_embed_plug_id__
if parent
unless parent.is_a? Gtk::Plug
raise TypeError.new("parent isn't Gtk::Plug")
end
else
Gtk::Plug.new.show.add(self)
end
parent.id
end
end
end
次に埋め込まれるWidgetの例。DRbを普通に使ってるだけ。
require 'drbembed'
server = DRb::DRbServer.new(nil, Gtk::Button.new('This is remote widget'))
puts server.uri
Gtk.main
で、このWidgetをリモートから使ってみる。コンテナとしてDRbEmbed::Socketを使う事以外、ほとんど何も気にしなくて良いはず。
require 'drbembed'
there = ARGV.shift || raise("usage: #{$0} <server_uri>")
DRb.start_service(nil, nil)
remote_widget = DRb::DRbObject.new(nil, there)
win = Gtk::Window.new
socket = DRbEmbed::Socket.new
win.add(socket)
win.show_all
socket.add(remote_widget)
remote_widget.show
remote_widget.signal_connect('clicked'){
puts 'Hello DRb!'
}
Gtk.main
う〜ん。もう少し改良の余地があるかな。
[ツッコミを入れる]
