diff options
author | nagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2006-11-06 06:56:37 +0000 |
---|---|---|
committer | nagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2006-11-06 06:56:37 +0000 |
commit | 2ec88c167b2dd0e3c13a77dadb9518f8d06d0c59 (patch) | |
tree | 5a810d5880298b9c85fb4109db9262931a131be4 /ext/tk/sample/irbtkw.rbw | |
parent | ced53248ff41863ef7adf62db215380d5089bc24 (diff) |
* ext/tk/lib/tk/itemconfig.rb: bug fix on 'itemconfiginfo' method, and
modify to make it easy to override 'itemconfiginfo' method.
* ext/tk/lib/tkextlib/tile/treeview.rb : support Tile 0.7.8.
* ext/tk/lib/tkextlib/version.rb : [new] add Tk::Tkextlib_RELEASE_DATE
to get the information from scripts.
* ext/tk/lib/tk.rb: load 'tkextlib/version.rb', and update RELEASE_DATE.
* ext/tk/lib/tkextlib/SUPPORT_STATUS: update.
* ext/tk/sample/editable_listbox.rb: [new] the listbox with editable
items. It's one of the example about usage of Place geometry manager.
* ext/tk/sample/tktextio.rb: improve the functions of TkTextIO class.
Those are required by 'irbtkw.rbw'.
* ext/tk/sample/irbtkw.rbw: [new] IRB on Ruby/Tk. It doesn't need any
real console. IRB works on a text widget without I/O blocking. That
is, thread switching on IRB will work properly, even if on Windows.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11283 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/tk/sample/irbtkw.rbw')
-rw-r--r-- | ext/tk/sample/irbtkw.rbw | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/ext/tk/sample/irbtkw.rbw b/ext/tk/sample/irbtkw.rbw new file mode 100644 index 0000000000..92fa5692f2 --- /dev/null +++ b/ext/tk/sample/irbtkw.rbw @@ -0,0 +1,119 @@ +#!/usr/bin/env ruby +# +# irbtkw.rb : IRB console with Ruby/Tk +# +# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) +# +release = '2006/11/06' + +require 'tk' +begin + require 'tktextio' +rescue LoadError + require File.join(File.dirname(File.expand_path(__FILE__)), 'tktextio.rb') +end + +require 'irb' + +# console setup +top = TkToplevel.new(:title=>'IRB console') +top.protocol(:WM_DELETE_WINDOW){ Tk.exit } + +console = TkTextIO.new(top, :mode=>:console, + :width=>80).pack(:side=>:left, + :expand=>true, :fill=>:both) +console.yscrollbar(TkScrollbar.new(top, :width=>10).pack(:before=>console, + :side=>:right, + :expand=>false, + :fill=>:y)) +ev_loop = Thread.new{Tk.mainloop} + +# window position control +root = Tk.root + +r_x = root.winfo_rootx +r_y = root.winfo_rooty +r_w = root.winfo_width + +t_x = top.winfo_rootx +t_y = top.winfo_rooty +t_w = top.winfo_width + +delta = 10 + +ratio = 0.8 +s_w = (ratio * root.winfo_screenwidth).to_i + +if r_x < t_x + r_x, t_x = t_x, r_x +end +if t_x + t_w + r_w + delta < s_w + r_x = t_x + t_w + delta +elsif t_w + r_w + delta < s_w + r_x = s_w - r_w + t_x = r_x - t_w +else + r_x = s_w - r_w + t_x = 0 +end + +root.geometry("+#{r_x}+#{r_y}") +top.geometry("+#{t_x}+#{t_y}") + +root.raise +console.focus + +# I/O setup +$stdin = console +$stdout = console +$stderr = console + +# dummy for rubyw.exe on Windows +def STDIN.tty? + true +end + +# IRB setup +IRB.init_config(nil) +IRB.conf[:USE_READLINE] = false +IRB.init_error +irb = IRB::Irb.new +IRB.conf[:MAIN_CONTEXT] = irb.context + +class IRB::StdioInputMethod + def gets + prompt = "\n" << @prompt + $stdin.instance_eval{ + flush + @prompt = prompt + _set_console_line + @prompt = nil + _see_pos + } + + @line[@line_no += 1] = $stdin.gets + end +end + +# IRB start +$stdout.print("*** IRB console on Ruby/Tk (#{release}) ") +irb_thread = Thread.new{ + catch(:IRB_EXIT){ + loop { + begin + irb.eval_input + rescue Exception + end + } + } +} + +console.bind('Control-c'){ + console.insert('end', "^C\n") + irb_thread.raise RubyLex::TerminateLineInput +} + +irb_thread.join + +# exit +Tk.exit |