summaryrefslogtreecommitdiff
path: root/jni/ruby/ext/tk/sample/irbtkw.rbw
blob: b75ebca48d610ee90d08181662386b2272b23bbe (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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#!/usr/bin/env ruby
#
#  irbtkw.rb : IRB console with Ruby/Tk
#
#                                 by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)
#
release = '2008/03/08'

require 'tk'
begin
  require 'tktextio'
rescue LoadError
  require File.join(File.dirname(File.expand_path(__FILE__)), 'tktextio.rb')
end

require 'irb'

if TkCore::WITH_ENCODING
else
  # $KCODE setup
  case Tk.encoding
  when 'shiftjis', 'cp932'
    $KCODE='SJIS'
  when 'euc-jp'
    $KCODE='EUC'
  when 'utf-8', 'unicode'
    $KCODE='UTF8'
  else
    # unknown
  end
end

# console setup
top = TkToplevel.new(:title=>'IRB console')
top.protocol(:WM_DELETE_WINDOW){ Tk.exit }

case (Tk.windowingsystem)
when 'win32'
  fnt = ['MS Gothic', '-12']
else
  fnt = ['courier', '-12']
end

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))

# save original I/O
out = $stdout
err = $stderr

irb_thread = nil
ev_loop = Thread.new{
  begin
    Tk.mainloop
  ensure
    $stdout = out
    $stderr = err
    irb_thread.kill if irb_thread
  end
}

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