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
う〜ん。もう少し改良の余地があるかな。