summaryrefslogtreecommitdiff
path: root/ext/tk/sample/irbtkw.rbw
blob: f6a35be6edce5e283fd245161a6876395fb37e44 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#!/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))
irb_thread = nil
ev_loop = Thread.new{
  Tk.mainloop
  irb_thread.kill if irb_thread
}

# 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
ev_thread.kill
Tk.exit