module Tkar

Constants

DEGREES_TO_RADIANS
RADIANS_TO_DEGREES
VERSION

Public Class Methods

run(argv, opts) click to toggle source
    # File lib/tkar.rb
 13   def self.run(argv, opts)
 14     verbose = opts["v"]
 15     title = argv.empty? ?  "stdin" : argv.join(":")
 16     root = TkRoot.new { title "Tkar @ #{title}"; iconname "Tkar" }
 17     root.resizable true, true
 18     window = Window.new(root, opts)
 19     canvas = window.canvas
 20 
 21     thread = Thread.new do
 22       movie = false
 23       if movie
 24         win_id = root.winfo_id
 25         pid = Process.pid
 26       end
 27       
 28       persist = opts["persist"]
 29       
 30       f = MessageStream.for(argv, opts)
 31       window.def_message_out do |msg|
 32         begin
 33           f.put_msg msg if f
 34           $stderr.puts msg if verbose
 35         rescue MessageStream::StreamClosed
 36         rescue Errno::ECONNABORTED, Errno::ECONNRESET
 37           raise unless persist
 38         end
 39       end
 40 
 41       cmd = args = nil
 42     
 43       update_count = 0
 44       start_time = Time.now
 45       
 46       j = 0
 47       begin
 48         loop do
 49           cmd, *args = f.get_cmd
 50           break if cmd == "done"
 51           exit if cmd == "exit"
 52           if cmd == "update"
 53             f.put_msg "update" ## optional?
 54             update_count += 1
 55             if verbose and update_count % 100 == 0
 56               rate = update_count / (Time.now - start_time)
 57               $stderr.puts "update rate: %10.2f updates per second" % rate
 58               update_count = 0
 59               start_time = Time.now
 60             end
 61           end
 62           r = canvas.send(cmd, *args)
 63           # f.put_msg return_value if return_value ?
 64           
 65           if movie and cmd == "update"
 66             # add a frame to the movie
 67             mcmd =
 68               "import -window #{win_id} \"tmp/#{pid}_frame_%05d.miff\"" % j
 69             j += 1
 70             rslt = system(mcmd)
 71             unless rslt
 72               puts $?
 73               exit
 74             end
 75           end
 76         end
 77       rescue MessageStream::StreamClosed
 78         f.put_msg "stream closed"
 79         exit unless persist
 80         canvas.update
 81       rescue Recoverable => ex
 82         f.put_msg ex
 83         retry
 84       rescue Errno::ECONNABORTED, Errno::ECONNRESET
 85         raise unless persist
 86       rescue => ex
 87         begin
 88             f.put_msg ex
 89             f.put_msg "exiting"
 90         rescue Errno::ECONNABORTED, Errno::ECONNRESET
 91         end
 92         $stderr.puts "#{ex.class}: #{ex.message}", ex.backtrace.join("\n  ")
 93         raise unless persist
 94       end
 95     end
 96 
 97 #     if /mswin32/ =~ RUBY_PLATFORM
 98 #       3.times do
 99 #         timer = TkTimer.new(1) do
100 #           3.times {thread.run}
101 #         end
102 #
103 #         timer.start
104 #       end
105 #     end
106 
107     Tk.mainloop
108   end