mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* ext/tk/tcltklib.c: add TclTkIp#_create_console() method to create
a Tcl/Tk's console window. * ext/tk/lib/multi-tk.rb: support TclTkIp#_create_console() method. * ext/tk/lib/remote-tk.rb: ditto. * ext/tk/lib/tk/console.rb: ditto. * ext/tk/lib/tk.rb: update RELEASE_DATE * ext/tk/sample/demo-*/check2.rb: use 'return' in the Proc object. * ext/tk/sample/tkextlib/**: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8212 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
a07bc1123a
commit
11974f26b3
17 changed files with 612 additions and 442 deletions
17
ChangeLog
17
ChangeLog
|
@ -1,3 +1,20 @@
|
|||
Wed Mar 30 17:41:48 2005 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
|
||||
|
||||
* ext/tk/tcltklib.c: add TclTkIp#_create_console() method to create
|
||||
a Tcl/Tk's console window.
|
||||
|
||||
* ext/tk/lib/multi-tk.rb: support TclTkIp#_create_console() method.
|
||||
|
||||
* ext/tk/lib/remote-tk.rb: ditto.
|
||||
|
||||
* ext/tk/lib/tk/console.rb: ditto.
|
||||
|
||||
* ext/tk/lib/tk.rb: update RELEASE_DATE
|
||||
|
||||
* ext/tk/sample/demo-*/check2.rb: use 'return' in the Proc object.
|
||||
|
||||
* ext/tk/sample/tkextlib/**: ditto.
|
||||
|
||||
Tue Mar 29 22:20:49 2005 Masatoshi SEKI <m_seki@mva.biglobe.ne.jp>
|
||||
|
||||
* test/rinda/test_rinda.rb: use DRbObject.new_with instead of reinit.
|
||||
|
|
|
@ -1,3 +1,21 @@
|
|||
2005-03-30 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
|
||||
|
||||
* sample/tkextlib/bwidget/tree.rb: use 'return' in the Proc object.
|
||||
|
||||
* sample/tkextlib/tkHTML/hv.rb: ditto.
|
||||
|
||||
* sample/tkextlib/tkHTML/ss.rb: ditto.
|
||||
|
||||
* sample/tkextlib/tktable/basic.rb: ditto.
|
||||
|
||||
* sample/tkextlib/tktable/command.rb: ditto.
|
||||
|
||||
* sample/tkextlib/tktable/debug.rb: ditto.
|
||||
|
||||
* sample/tkextlib/tktable/maxsize.rb: ditto.
|
||||
|
||||
* sample/tkextlib/treectrl/demo.rb: ditto.
|
||||
|
||||
2005-03-29 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
|
||||
|
||||
* lib/tkextlib/blt/component.rb: cannot create elements except
|
||||
|
|
|
@ -1787,6 +1787,10 @@ class << MultiTkIp
|
|||
def _conv_listelement(arg)
|
||||
__getip._conv_listelement(arg)
|
||||
end
|
||||
|
||||
def _create_console
|
||||
__getip._create_console
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
|
|
@ -400,6 +400,10 @@ class RemoteTkIp
|
|||
@interp._conv_listelement(str)
|
||||
end
|
||||
|
||||
def _create_console
|
||||
fail RuntimeError, 'not support "_create_console" on the remote interpreter'
|
||||
end
|
||||
|
||||
def mainloop
|
||||
fail RuntimeError, 'not support "mainloop" on the remote interpreter'
|
||||
end
|
||||
|
|
|
@ -4024,7 +4024,7 @@ end
|
|||
#Tk.freeze
|
||||
|
||||
module Tk
|
||||
RELEASE_DATE = '2005-03-26'.freeze
|
||||
RELEASE_DATE = '2005-03-30'.freeze
|
||||
|
||||
autoload :AUTO_PATH, 'tk/variable'
|
||||
autoload :TCL_PACKAGE_PATH, 'tk/variable'
|
||||
|
|
|
@ -9,6 +9,9 @@ module TkConsole
|
|||
|
||||
TkCommandNames = ['console'.freeze].freeze
|
||||
|
||||
def self.create
|
||||
TkCore::INTERP._create_console
|
||||
end
|
||||
def self.title(str=None)
|
||||
tk_call 'console', str
|
||||
end
|
||||
|
|
|
@ -76,31 +76,31 @@ TkCheckButton.new($check2_demo, :text=>'Safety Check', :variable=>safety,
|
|||
# tristate check
|
||||
in_check = false
|
||||
tristate_check = proc{|n1,n2,op|
|
||||
return if in_check
|
||||
|
||||
in_check = true
|
||||
begin
|
||||
if n1 == safety
|
||||
if safety == 'none'
|
||||
wipers.value = 0
|
||||
brakes.value = 0
|
||||
sober.value = 0
|
||||
elsif safety == 'all'
|
||||
wipers.value = 1
|
||||
brakes.value = 1
|
||||
sober.value = 1
|
||||
end
|
||||
else
|
||||
if wipers == 1 && brakes == 1 && sober == 1
|
||||
safety.value = 'all'
|
||||
elsif wipers == 1 || brakes == 1 || sober == 1
|
||||
safety.value = 'partial'
|
||||
unless in_check
|
||||
in_check = true
|
||||
begin
|
||||
if n1 == safety
|
||||
if safety == 'none'
|
||||
wipers.value = 0
|
||||
brakes.value = 0
|
||||
sober.value = 0
|
||||
elsif safety == 'all'
|
||||
wipers.value = 1
|
||||
brakes.value = 1
|
||||
sober.value = 1
|
||||
end
|
||||
else
|
||||
safety.value = 'none'
|
||||
if wipers == 1 && brakes == 1 && sober == 1
|
||||
safety.value = 'all'
|
||||
elsif wipers == 1 || brakes == 1 || sober == 1
|
||||
safety.value = 'partial'
|
||||
else
|
||||
safety.value = 'none'
|
||||
end
|
||||
end
|
||||
ensure
|
||||
in_check = false
|
||||
end
|
||||
ensure
|
||||
in_check = false
|
||||
end
|
||||
}
|
||||
|
||||
|
|
|
@ -76,31 +76,31 @@ TkCheckButton.new($check2_demo, :text=>'
|
|||
# tristate check
|
||||
in_check = false
|
||||
tristate_check = proc{|n1,n2,op|
|
||||
return if in_check
|
||||
|
||||
in_check = true
|
||||
begin
|
||||
if n1 == safety
|
||||
if safety == 'none'
|
||||
wipers.value = 0
|
||||
brakes.value = 0
|
||||
sober.value = 0
|
||||
elsif safety == 'all'
|
||||
wipers.value = 1
|
||||
brakes.value = 1
|
||||
sober.value = 1
|
||||
end
|
||||
else
|
||||
if wipers == 1 && brakes == 1 && sober == 1
|
||||
safety.value = 'all'
|
||||
elsif wipers == 1 || brakes == 1 || sober == 1
|
||||
safety.value = 'partial'
|
||||
unless in_check
|
||||
in_check = true
|
||||
begin
|
||||
if n1 == safety
|
||||
if safety == 'none'
|
||||
wipers.value = 0
|
||||
brakes.value = 0
|
||||
sober.value = 0
|
||||
elsif safety == 'all'
|
||||
wipers.value = 1
|
||||
brakes.value = 1
|
||||
sober.value = 1
|
||||
end
|
||||
else
|
||||
safety.value = 'none'
|
||||
if wipers == 1 && brakes == 1 && sober == 1
|
||||
safety.value = 'all'
|
||||
elsif wipers == 1 || brakes == 1 || sober == 1
|
||||
safety.value = 'partial'
|
||||
else
|
||||
safety.value = 'none'
|
||||
end
|
||||
end
|
||||
ensure
|
||||
in_check = false
|
||||
end
|
||||
ensure
|
||||
in_check = false
|
||||
end
|
||||
}
|
||||
|
||||
|
|
|
@ -119,7 +119,7 @@ module DemoTree
|
|||
Tk.root.bind_remove('Unmap')
|
||||
Tk.root.bind_remove('Map')
|
||||
Tk.root.bind_remove('Configure')
|
||||
return true
|
||||
true
|
||||
})
|
||||
end
|
||||
|
||||
|
|
|
@ -78,38 +78,43 @@ big_imgs = {}
|
|||
hotkey = {}
|
||||
|
||||
move_big_image = proc{|b|
|
||||
return unless big_imgs.key?(b)
|
||||
b.copy(big_imgs[b])
|
||||
big_imgs[b].delete
|
||||
big_imgs.delete(b)
|
||||
Tk.update
|
||||
if big_imgs.key?(b)
|
||||
b.copy(big_imgs[b])
|
||||
big_imgs[b].delete
|
||||
big_imgs.delete(b)
|
||||
Tk.update
|
||||
end
|
||||
}
|
||||
|
||||
image_cmd = proc{|*args|
|
||||
return smgray unless show_img.bool
|
||||
fn = args[0]
|
||||
if old_imgs.key?(fn)
|
||||
images[fn] = old_imgs[fn]
|
||||
old_imgs.delete(fn)
|
||||
return images[fn]
|
||||
if show_img.bool
|
||||
smgray
|
||||
else
|
||||
fn = args[0]
|
||||
|
||||
if old_imgs.key?(fn)
|
||||
images[fn] = old_imgs[fn]
|
||||
old_imgs.delete(fn)
|
||||
images[fn]
|
||||
|
||||
else
|
||||
begin
|
||||
img = TkPhotoImage.new(:file=>fn)
|
||||
rescue
|
||||
smgray
|
||||
else
|
||||
if img.width * img.height > 20000
|
||||
b = TkPhotoImage.new(:width=>img.width, :height=>img.height)
|
||||
big_imgs[b] = img
|
||||
img = b
|
||||
Tk.after_idle(proc{ move_big_image.call(b) })
|
||||
end
|
||||
|
||||
images[fn] = img
|
||||
img
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
begin
|
||||
img = TkPhotoImage.new(:file=>fn)
|
||||
rescue
|
||||
return smgray
|
||||
end
|
||||
|
||||
if img.width * img.height > 20000
|
||||
b = TkPhotoImage.new(:width=>img.width, :height=>img.height)
|
||||
big_imgs[b] = img
|
||||
img = b
|
||||
Tk.after_idle(proc{ move_big_image.call(b) })
|
||||
end
|
||||
|
||||
images[fn] = img
|
||||
|
||||
img
|
||||
}
|
||||
|
||||
#
|
||||
|
@ -183,12 +188,13 @@ clear_screen = proc{
|
|||
# Load a file into the HTML widget
|
||||
#
|
||||
load_file = proc{|name|
|
||||
return unless (doc = read_file.call(name))
|
||||
clear_screen.call
|
||||
last_file = name
|
||||
html.configure(:base=>name)
|
||||
html.parse(doc)
|
||||
old_imgs.clear
|
||||
if (doc = read_file.call(name))
|
||||
clear_screen.call
|
||||
last_file = name
|
||||
html.configure(:base=>name)
|
||||
html.parse(doc)
|
||||
old_imgs.clear
|
||||
end
|
||||
}
|
||||
|
||||
href_binding = proc{|x, y|
|
||||
|
@ -196,15 +202,16 @@ href_binding = proc{|x, y|
|
|||
html.selection_clear
|
||||
priv['mark'] = "@#{x},#{y}"
|
||||
lst = html.href(x, y)
|
||||
return if lst.size.zero?
|
||||
|
||||
lnk, target = lst
|
||||
unless lst.size.zero?
|
||||
lnk, target = lst
|
||||
|
||||
if lnk != ""
|
||||
if lnk =~ /^#{last_file}#(.*)$/
|
||||
html.yview($1)
|
||||
else
|
||||
load_file.call(lnk)
|
||||
if lnk != ""
|
||||
if lnk =~ /^#{last_file}#(.*)$/
|
||||
html.yview($1)
|
||||
else
|
||||
load_file.call(lnk)
|
||||
end
|
||||
end
|
||||
end
|
||||
}
|
||||
|
|
|
@ -6,401 +6,431 @@
|
|||
require 'tk'
|
||||
require 'tkextlib/tkHTML'
|
||||
|
||||
root = TkRoot.new(:title=>'HTML File Viewer', :iconname=>'HV')
|
||||
fswin = nil
|
||||
|
||||
html = nil
|
||||
html_fs = nil
|
||||
|
||||
hotkey = {}
|
||||
|
||||
file = ARGV[0]
|
||||
|
||||
class TkHTML_File_Viewer
|
||||
include TkComm
|
||||
|
||||
# These are images to use with the actual image specified in a
|
||||
# "<img>" markup can't be found.
|
||||
#
|
||||
biggray = TkPhotoImage.new(:data=><<'EOD')
|
||||
@@biggray = TkPhotoImage.new(:data=><<'EOD')
|
||||
R0lGODdhPAA+APAAALi4uAAAACwAAAAAPAA+AAACQISPqcvtD6OctNqLs968+w+G4kiW5omm
|
||||
6sq27gvH8kzX9o3n+s73/g8MCofEovGITCqXzKbzCY1Kp9Sq9YrNFgsAO///
|
||||
EOD
|
||||
|
||||
smgray = TkPhotoImage.new(:data=><<'EOD')
|
||||
@@smgray = TkPhotoImage.new(:data=><<'EOD')
|
||||
R0lGODdhOAAYAPAAALi4uAAAACwAAAAAOAAYAAACI4SPqcvtD6OctNqLs968+w+G4kiW5omm
|
||||
6sq27gvH8kzX9m0VADv/
|
||||
EOD
|
||||
|
||||
def initialize(file = nil)
|
||||
@root = TkRoot.new(:title=>'HTML File Viewer', :iconname=>'HV')
|
||||
@fswin = nil
|
||||
|
||||
#
|
||||
# A font chooser routine.
|
||||
#
|
||||
# html[:fontcommand] = pick_font
|
||||
pick_font = proc{|size, attrs|
|
||||
# puts "FontCmd: #{size} #{attrs}"
|
||||
[ ((attrs =~ /fixed/)? 'courier': 'charter'),
|
||||
(12 * (1.2**(size.to_f - 4.0))).to_i,
|
||||
((attrs =~ /italic/)? 'italic': 'roman'),
|
||||
((attrs =~ /bold/)? 'bold': 'normal') ].join(' ')
|
||||
}
|
||||
@html = nil
|
||||
@html_fs = nil
|
||||
|
||||
# This routine is called to pick fonts for the fullscreen view.
|
||||
#
|
||||
baseFontSize = 24
|
||||
pick_font_fs = proc{|size, attrs|
|
||||
# puts "FontCmd: #{size} #{attrs}"
|
||||
[ ((attrs =~ /fixed/)? 'courier': 'charter'),
|
||||
(baseFontSize * (1.2**(size.to_f - 4.0))).to_i,
|
||||
((attrs =~ /italic/)? 'italic': 'roman'),
|
||||
((attrs =~ /bold/)? 'bold': 'normal') ].join(' ')
|
||||
}
|
||||
@hotkey = {}
|
||||
|
||||
#
|
||||
#
|
||||
hyper_cmd = proc{|*args|
|
||||
puts "HyperlinkCommand: #{args.inspect}"
|
||||
}
|
||||
@applet_arg = TkVarAccess.new_hash('AppletArg')
|
||||
|
||||
# This routine is called to run an applet
|
||||
#
|
||||
applet_arg = TkVarAccess.new_hash('AppletArg')
|
||||
run_applet = proc{|size, w, arglist|
|
||||
applet_arg.value = Hash[*simplelist(arglist)]
|
||||
@images = {}
|
||||
@old_imgs = {}
|
||||
@big_imgs = {}
|
||||
|
||||
return unless applet_arg.key?('src')
|
||||
@last_dir = Dir.pwd
|
||||
|
||||
src = html.remove(applet_arg['src'])
|
||||
@last_file = ''
|
||||
|
||||
applet_arg['window'] = w
|
||||
applet_arg['fontsize'] = size
|
||||
@key_block = false
|
||||
|
||||
begin
|
||||
Tk.load_tclscript(src)
|
||||
rescue => e
|
||||
puts "Applet error: #{e.message}"
|
||||
end
|
||||
}
|
||||
Tk::HTML_Widget::ClippingWindow.bind('1',
|
||||
proc{|w, ksym| key_press(w, ksym)},
|
||||
'%W Down')
|
||||
Tk::HTML_Widget::ClippingWindow.bind('3',
|
||||
proc{|w, ksym| key_press(w, ksym)},
|
||||
'%W Up')
|
||||
Tk::HTML_Widget::ClippingWindow.bind('2',
|
||||
proc{|w, ksym| key_press(w, ksym)},
|
||||
'%W Down')
|
||||
|
||||
#
|
||||
#
|
||||
form_cmd = proc{|n, cmd, *args|
|
||||
}
|
||||
Tk::HTML_Widget::ClippingWindow.bind('KeyPress',
|
||||
proc{|w, ksym| key_press(w, ksym)},
|
||||
'%W %K')
|
||||
|
||||
#
|
||||
#
|
||||
images = {}
|
||||
old_imgs = {}
|
||||
big_imgs = {}
|
||||
############################################
|
||||
#
|
||||
# Build the half-size view of the page
|
||||
#
|
||||
menu_spec = [
|
||||
[['File', 0],
|
||||
['Open', proc{sel_load()}, 0],
|
||||
['Full Screen', proc{fullscreen()}, 0],
|
||||
['Refresh', proc{refresh()}, 0],
|
||||
'---',
|
||||
['Exit', proc{exit}, 1]]
|
||||
]
|
||||
|
||||
#
|
||||
#
|
||||
move_big_image = proc{|b|
|
||||
return unless big_imgs.key?(b)
|
||||
b.copy(big_imgs[b])
|
||||
big_imgs[b].delete
|
||||
big_imgs.delete(b)
|
||||
}
|
||||
mbar = @root.add_menubar(menu_spec)
|
||||
|
||||
image_cmd = proc{|hs, *args|
|
||||
fn = args[0]
|
||||
|
||||
if old_imgs.key?(fn)
|
||||
return (images[fn] = old_imgs.delete(fn))
|
||||
end
|
||||
|
||||
begin
|
||||
img = TkPhotoImage.new(:file=>fn)
|
||||
rescue
|
||||
return ((hs)? smallgray: biggray)
|
||||
end
|
||||
|
||||
if hs
|
||||
img2 = TkPhotoImage.new
|
||||
img2.copy(img, :subsample=>[2,2])
|
||||
img.delete
|
||||
img = img2
|
||||
end
|
||||
|
||||
if img.width * img.height > 20000
|
||||
b = TkPhotoImage.new(:width=>img.width, :height=>img.height)
|
||||
big_imgs[b] = img
|
||||
img = b
|
||||
Tk.after_idle(proc{ move_big_image.call(b) })
|
||||
end
|
||||
|
||||
images[fn] = img
|
||||
|
||||
img
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
# This routine is called for every <SCRIPT> markup
|
||||
#
|
||||
script_cmd = proc{|*args|
|
||||
# puts "ScriptCmd: #{args.inspect}"
|
||||
}
|
||||
|
||||
# This routine is called for every <APPLET> markup
|
||||
#
|
||||
applet_cmd = proc{|w, arglist|
|
||||
# puts "AppletCmd: w=#{w} arglist=#{arglist}"
|
||||
#TkLabel.new(w, :text=>"The Applet #{w}", :bd=>2, :relief=>raised)
|
||||
}
|
||||
|
||||
# This binding fires when there is a click on a hyperlink
|
||||
#
|
||||
href_binding = proc{|w, x, y|
|
||||
lst = w.href(x, y)
|
||||
unless lst.empty?
|
||||
process_url.call(lst)
|
||||
end
|
||||
}
|
||||
|
||||
#
|
||||
#
|
||||
last_dir = Dir.pwd
|
||||
load_file = nil
|
||||
|
||||
sel_load = proc{
|
||||
filetypes = [
|
||||
['Html Files', ['.html', '.htm']],
|
||||
['All Files', '*']
|
||||
]
|
||||
|
||||
f = Tk.getOpenFile(:initialdir=>last_dir, :filetypes=>filetypes)
|
||||
if f != ''
|
||||
load_file.call(f)
|
||||
last_dir = File.dirname(f)
|
||||
end
|
||||
}
|
||||
|
||||
# Clear the screen.
|
||||
#
|
||||
clear_screen = proc{
|
||||
if html_fs && html_fs.exist?
|
||||
w = html_fs
|
||||
else
|
||||
w = html
|
||||
end
|
||||
w.clear
|
||||
old_imgs.clear
|
||||
big_imgs.clear
|
||||
hotkey.clear
|
||||
images.each{|k, v| old_imgs[k] = v }
|
||||
images.clear
|
||||
}
|
||||
|
||||
# Read a file
|
||||
#
|
||||
read_file = proc{|name|
|
||||
begin
|
||||
fp = open(name, 'r')
|
||||
ret = fp.read(File.size(name))
|
||||
rescue
|
||||
ret = nil
|
||||
fp = nil
|
||||
Tk.messageBox(:icon=>'error', :message=>"fail to open '#{name}'",
|
||||
:type=>:ok)
|
||||
ensure
|
||||
fp.close if fp
|
||||
end
|
||||
ret
|
||||
}
|
||||
|
||||
# Process the given URL
|
||||
#
|
||||
process_url = proc{|url|
|
||||
case url[0]
|
||||
when /^file:/
|
||||
load_file.call(url[0][5..-1])
|
||||
when /^exec:/
|
||||
Tk.ip_eval(url[0][5..-1].tr('\\', ' '))
|
||||
else
|
||||
load_file.call(url[0])
|
||||
end
|
||||
}
|
||||
|
||||
# Load a file into the HTML widget
|
||||
#
|
||||
last_file = ''
|
||||
|
||||
load_file = proc{|name|
|
||||
return unless (doc = read_file.call(name))
|
||||
clear_screen.call
|
||||
last_file = name
|
||||
if html_fs && html_fs.exist?
|
||||
w = html_fs
|
||||
else
|
||||
w = html
|
||||
end
|
||||
w.configure(:base=>name)
|
||||
w.parse(doc)
|
||||
w.configure(:cursor=>'top_left_arrow')
|
||||
old_imgs.clear
|
||||
}
|
||||
|
||||
# Refresh the current file.
|
||||
#
|
||||
refresh = proc{|*args|
|
||||
load_file.call(last_file) if last_file
|
||||
}
|
||||
|
||||
# This routine is called whenever a "<meta>" markup is seen.
|
||||
#
|
||||
meta = proc{|w, tag, alist|
|
||||
v = Hash[*simplelist(alist)]
|
||||
|
||||
if v.kye?('key') && v.key?('href')
|
||||
hotkey[v['key']] = w.resolve(v['href'])
|
||||
end
|
||||
|
||||
if v.kye?('next')
|
||||
hotkey['Down'] =v['next']
|
||||
end
|
||||
|
||||
if v.kye?('prev')
|
||||
hotkey['Up'] =v['prev']
|
||||
end
|
||||
|
||||
if v.kye?('other')
|
||||
hotkey['o'] =v['other']
|
||||
end
|
||||
}
|
||||
|
||||
# Go from full-screen mode back to window mode.
|
||||
#
|
||||
fullscreen_off = proc{
|
||||
fswin.destroy
|
||||
root.deiconify
|
||||
Tk.update
|
||||
root.raise
|
||||
html.clipwin.focus
|
||||
clear_screen.call
|
||||
old_imgs.clear
|
||||
refresh.call
|
||||
}
|
||||
|
||||
# Go from window mode to full-screen mode.
|
||||
#
|
||||
fullscreen = proc{
|
||||
if fswin && fswin.exist?
|
||||
fswin.deiconify
|
||||
Tk.update
|
||||
fswin.raise
|
||||
return
|
||||
end
|
||||
|
||||
width = root.winfo_screenwidth
|
||||
height = root.winfo_screenheight
|
||||
fswin = TkToplevel.new(:overrideredirect=>true,
|
||||
:geometry=>"#{width}x#{height}+0+0")
|
||||
|
||||
html_fs = Tk::HTML_Widget.new(fswin, :padx=>5, :pady=>9,
|
||||
:formcommand=>form_cmd,
|
||||
:imagecommand=>proc{image_cmd.call(0)},
|
||||
:scriptcommand=>script_cmd,
|
||||
:appletcommand=>applet_cmd,
|
||||
:hyperlinkcommand=>hyper_cmd,
|
||||
:bg=>'white', :tablerelief=>:raised,
|
||||
:appletcommand=>proc{|*args|
|
||||
run_applet('big', *args)
|
||||
@html = Tk::HTML_Widget.new(:width=>512, :height=>384,
|
||||
:padx=>5, :pady=>9,
|
||||
:formcommand=>proc{|*args| form_cmd(*args)},
|
||||
:imagecommand=>proc{|*args|
|
||||
image_cmd(1, *args)
|
||||
},
|
||||
:fontcommand=>pick_font_fs,
|
||||
:cursor=>:tcross) {
|
||||
pack(:fill=>:both, :expand=>true)
|
||||
token_handler('meta', proc{|*args| meta.call(self, *args)})
|
||||
}
|
||||
:scriptcommand=>proc{|*args|
|
||||
script_cmd(*args)
|
||||
},
|
||||
:appletcommand=>proc{|*args|
|
||||
applet_cmd(*args)
|
||||
},
|
||||
:hyperlinkcommand=>proc{|*args|
|
||||
hyper_cmd(*args)
|
||||
},
|
||||
:fontcommand=>proc{|*args|
|
||||
pick_font(*args)
|
||||
},
|
||||
:appletcommand=>proc{|*args|
|
||||
run_applet('small', *args)
|
||||
},
|
||||
:bg=>'white', :tablerelief=>:raised)
|
||||
|
||||
clear_screen.call
|
||||
old_imgs.clear
|
||||
refresh.call
|
||||
Tk.update
|
||||
html_fs.clipwin.focus
|
||||
}
|
||||
@html.token_handler('meta', proc{|*args| meta(@html, *args)})
|
||||
|
||||
#
|
||||
#
|
||||
key_block = false
|
||||
vscr = @html.yscrollbar(TkScrollbar.new)
|
||||
hscr = @html.xscrollbar(TkScrollbar.new)
|
||||
|
||||
key_press = proc{|w, keysym|
|
||||
return if key_block
|
||||
key_block = true
|
||||
Tk.after(250, proc{key_block = false})
|
||||
Tk.grid(@html, vscr, :sticky=>:news)
|
||||
Tk.grid(hscr, :sticky=>:ew)
|
||||
@root.grid_columnconfigure(0, :weight=>1)
|
||||
@root.grid_columnconfigure(1, :weight=>0)
|
||||
@root.grid_rowconfigure(0, :weight=>1)
|
||||
@root.grid_rowconfigure(1, :weight=>0)
|
||||
|
||||
if hotkey.key?(keysym)
|
||||
process_url.call(hotkey[keysym])
|
||||
end
|
||||
case keysym
|
||||
when 'Escape'
|
||||
if fswin && fswin.exist?
|
||||
fullscreen_off.call
|
||||
else
|
||||
fullscreen.call
|
||||
############################################
|
||||
|
||||
@html.clipwin.focus
|
||||
|
||||
# If an arguent was specified, read it into the HTML widget.
|
||||
#
|
||||
Tk.update
|
||||
if file && file != ""
|
||||
load_file(file)
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
Tk::HTML_Widget::ClippingWindow.bind('1', key_press, '%W Down')
|
||||
Tk::HTML_Widget::ClippingWindow.bind('3', key_press, '%W Up')
|
||||
Tk::HTML_Widget::ClippingWindow.bind('2', key_press, '%w Down')
|
||||
#
|
||||
# A font chooser routine.
|
||||
#
|
||||
# html[:fontcommand] = pick_font
|
||||
def pick_font(size, attrs)
|
||||
# puts "FontCmd: #{size} #{attrs}"
|
||||
[ ((attrs =~ /fixed/)? 'courier': 'charter'),
|
||||
(12 * (1.2**(size.to_f - 4.0))).to_i,
|
||||
((attrs =~ /italic/)? 'italic': 'roman'),
|
||||
((attrs =~ /bold/)? 'bold': 'normal') ].join(' ')
|
||||
end
|
||||
|
||||
Tk::HTML_Widget::ClippingWindow.bind('KeyPress', key_press, '%W %K')
|
||||
# This routine is called to pick fonts for the fullscreen view.
|
||||
#
|
||||
def pick_font_fs(size, attrs)
|
||||
baseFontSize = 24
|
||||
|
||||
# puts "FontCmd: #{size} #{attrs}"
|
||||
[ ((attrs =~ /fixed/)? 'courier': 'charter'),
|
||||
(baseFontSize * (1.2**(size.to_f - 4.0))).to_i,
|
||||
((attrs =~ /italic/)? 'italic': 'roman'),
|
||||
((attrs =~ /bold/)? 'bold': 'normal') ].join(' ')
|
||||
end
|
||||
|
||||
############################################
|
||||
#
|
||||
# Build the half-size view of the page
|
||||
#
|
||||
menu_spec = [
|
||||
[['File', 0],
|
||||
['Open', sel_load, 0],
|
||||
['Full Screen', fullscreen, 0],
|
||||
['Refresh', refresh, 0],
|
||||
'---',
|
||||
['Exit', proc{exit}, 1]]
|
||||
]
|
||||
#
|
||||
#
|
||||
def hyper_cmd(*args)
|
||||
puts "HyperlinkCommand: #{args.inspect}"
|
||||
end
|
||||
|
||||
mbar = root.add_menubar(menu_spec)
|
||||
# This routine is called to run an applet
|
||||
#
|
||||
def run_applet(size, w, arglist)
|
||||
applet_arg.value = Hash[*simplelist(arglist)]
|
||||
|
||||
html = Tk::HTML_Widget.new(:width=>512, :height=>384,
|
||||
:padx=>5, :pady=>9,
|
||||
:formcommand=>form_cmd,
|
||||
:imagecommand=>proc{|*args|
|
||||
image_cmd.call(1, *args)
|
||||
},
|
||||
:scriptcommand=>script_cmd,
|
||||
:appletcommand=>applet_cmd,
|
||||
:hyperlinkcommand=>hyper_cmd,
|
||||
:fontcommand=>pick_font,
|
||||
:appletcommand=>proc{|*args|
|
||||
run_applet.call('small', *args)
|
||||
},
|
||||
:bg=>'white', :tablerelief=>:raised)
|
||||
return unless @applet_arg.key?('src')
|
||||
|
||||
html.token_handler('meta', proc{|*args| meta.call(html, *args)})
|
||||
src = @html.remove(@applet_arg['src'])
|
||||
|
||||
vscr = html.yscrollbar(TkScrollbar.new)
|
||||
hscr = html.xscrollbar(TkScrollbar.new)
|
||||
@applet_arg['window'] = w
|
||||
@applet_arg['fontsize'] = size
|
||||
|
||||
Tk.grid(html, vscr, :sticky=>:news)
|
||||
Tk.grid(hscr, :sticky=>:ew)
|
||||
Tk.root.grid_columnconfigure(0, :weight=>1)
|
||||
Tk.root.grid_columnconfigure(1, :weight=>0)
|
||||
Tk.root.grid_rowconfigure(0, :weight=>1)
|
||||
Tk.root.grid_rowconfigure(1, :weight=>0)
|
||||
begin
|
||||
Tk.load_tclscript(src)
|
||||
rescue => e
|
||||
puts "Applet error: #{e.message}"
|
||||
end
|
||||
end
|
||||
|
||||
#
|
||||
#
|
||||
def form_cmd(n, cmd, *args)
|
||||
# p [n, cmd, *args]
|
||||
end
|
||||
|
||||
############################################
|
||||
#
|
||||
#
|
||||
def move_big_image(b)
|
||||
return unless @big_imgs.key?(b)
|
||||
b.copy(@big_imgs[b])
|
||||
@big_imgs[b].delete
|
||||
@big_imgs.delete(b)
|
||||
end
|
||||
|
||||
html.clipwin.focus
|
||||
def image_cmd(hs, *args)
|
||||
fn = args[0]
|
||||
|
||||
# If an arguent was specified, read it into the HTML widget.
|
||||
#
|
||||
Tk.update
|
||||
if file && file != ""
|
||||
load_file.call(file)
|
||||
if @old_imgs.key?(fn)
|
||||
return (@images[fn] = @old_imgs.delete(fn))
|
||||
end
|
||||
|
||||
begin
|
||||
img = TkPhotoImage.new(:file=>fn)
|
||||
rescue
|
||||
return ((hs)? @@smallgray: @@biggray)
|
||||
end
|
||||
|
||||
if hs
|
||||
img2 = TkPhotoImage.new
|
||||
img2.copy(img, :subsample=>[2,2])
|
||||
img.delete
|
||||
img = img2
|
||||
end
|
||||
|
||||
if img.width * img.height > 20000
|
||||
b = TkPhotoImage.new(:width=>img.width, :height=>img.height)
|
||||
@big_imgs[b] = img
|
||||
img = b
|
||||
Tk.after_idle(proc{ move_big_image(b) })
|
||||
end
|
||||
|
||||
@images[fn] = img
|
||||
|
||||
img
|
||||
end
|
||||
|
||||
#
|
||||
# This routine is called for every <SCRIPT> markup
|
||||
#
|
||||
def script_cmd(*args)
|
||||
# puts "ScriptCmd: #{args.inspect}"
|
||||
end
|
||||
|
||||
# This routine is called for every <APPLET> markup
|
||||
#
|
||||
def applet_cmd(w, arglist)
|
||||
# puts "AppletCmd: w=#{w} arglist=#{arglist}"
|
||||
#TkLabel.new(w, :text=>"The Applet #{w}", :bd=>2, :relief=>raised)
|
||||
end
|
||||
|
||||
# This binding fires when there is a click on a hyperlink
|
||||
#
|
||||
def href_binding(w, x, y)
|
||||
lst = w.href(x, y)
|
||||
unless lst.empty?
|
||||
process_url(lst)
|
||||
end
|
||||
end
|
||||
|
||||
#
|
||||
#
|
||||
def sel_load
|
||||
filetypes = [
|
||||
['Html Files', ['.html', '.htm']],
|
||||
['All Files', '*']
|
||||
]
|
||||
|
||||
f = Tk.getOpenFile(:initialdir=>@last_dir, :filetypes=>filetypes)
|
||||
if f != ''
|
||||
load_file(f)
|
||||
@last_dir = File.dirname(f)
|
||||
end
|
||||
end
|
||||
|
||||
# Clear the screen.
|
||||
#
|
||||
def clear_screen
|
||||
if @html_fs && @html_fs.exist?
|
||||
w = @html_fs
|
||||
else
|
||||
w = @html
|
||||
end
|
||||
w.clear
|
||||
@old_imgs.clear
|
||||
@big_imgs.clear
|
||||
@hotkey.clear
|
||||
@images.each{|k, v| @old_imgs[k] = v }
|
||||
@images.clear
|
||||
end
|
||||
|
||||
# Read a file
|
||||
#
|
||||
def read_file(name)
|
||||
begin
|
||||
fp = open(name, 'r')
|
||||
ret = fp.read(File.size(name))
|
||||
rescue
|
||||
ret = nil
|
||||
fp = nil
|
||||
Tk.messageBox(:icon=>'error', :message=>"fail to open '#{name}'",
|
||||
:type=>:ok)
|
||||
ensure
|
||||
fp.close if fp
|
||||
end
|
||||
ret
|
||||
end
|
||||
|
||||
# Process the given URL
|
||||
#
|
||||
def process_url(url)
|
||||
case url[0]
|
||||
when /^file:/
|
||||
load_file(url[0][5..-1])
|
||||
when /^exec:/
|
||||
Tk.ip_eval(url[0][5..-1].tr('\\', ' '))
|
||||
else
|
||||
load_file(url[0])
|
||||
end
|
||||
end
|
||||
|
||||
# Load a file into the HTML widget
|
||||
#
|
||||
def load_file(name)
|
||||
return unless (doc = read_file(name))
|
||||
clear_screen()
|
||||
@last_file = name
|
||||
if @html_fs && @html_fs.exist?
|
||||
w = @html_fs
|
||||
else
|
||||
w = @html
|
||||
end
|
||||
w.configure(:base=>name)
|
||||
w.parse(doc)
|
||||
w.configure(:cursor=>'top_left_arrow')
|
||||
@old_imgs.clear
|
||||
end
|
||||
|
||||
# Refresh the current file.
|
||||
#
|
||||
def refresh(*args)
|
||||
load_file(@last_file) if @last_file
|
||||
end
|
||||
|
||||
# This routine is called whenever a "<meta>" markup is seen.
|
||||
#
|
||||
def meta(w, tag, alist)
|
||||
v = Hash[*simplelist(alist)]
|
||||
|
||||
if v.key?('key') && v.key?('href')
|
||||
@hotkey[v['key']] = w.resolve(v['href'])
|
||||
end
|
||||
|
||||
if v.key?('next')
|
||||
@hotkey['Down'] =v['next']
|
||||
end
|
||||
|
||||
if v.key?('prev')
|
||||
@hotkey['Up'] =v['prev']
|
||||
end
|
||||
|
||||
if v.key?('other')
|
||||
@hotkey['o'] =v['other']
|
||||
end
|
||||
end
|
||||
|
||||
# Go from full-screen mode back to window mode.
|
||||
#
|
||||
def fullscreen_off
|
||||
@fswin.destroy
|
||||
@root.deiconify
|
||||
Tk.update
|
||||
@root.raise
|
||||
@html.clipwin.focus
|
||||
clear_screen()
|
||||
@old_imgs.clear
|
||||
refresh()
|
||||
end
|
||||
|
||||
# Go from window mode to full-screen mode.
|
||||
#
|
||||
def fullscreen
|
||||
if @fswin && @fswin.exist?
|
||||
@fswin.deiconify
|
||||
Tk.update
|
||||
@fswin.raise
|
||||
return
|
||||
end
|
||||
|
||||
width = @root.winfo_screenwidth
|
||||
height = @root.winfo_screenheight
|
||||
@fswin = TkToplevel.new(:overrideredirect=>true,
|
||||
:geometry=>"#{width}x#{height}+0+0")
|
||||
|
||||
@html_fs = Tk::HTML_Widget.new(@fswin, :padx=>5, :pady=>9,
|
||||
:formcommand=>proc{|*args|
|
||||
form_cmd(*args)
|
||||
},
|
||||
:imagecommand=>proc{|*args|
|
||||
image_cmd(0, *args)
|
||||
},
|
||||
:scriptcommand=>proc{|*args|
|
||||
script_cmd(*args)
|
||||
},
|
||||
:appletcommand=>proc{|*args|
|
||||
applet_cmd(*args)
|
||||
},
|
||||
:hyperlinkcommand=>proc{|*args|
|
||||
hyper_cmd(*args)
|
||||
},
|
||||
:appletcommand=>proc{|*args|
|
||||
run_applet('big', *args)
|
||||
},
|
||||
:fontcommand=>proc{|*args|
|
||||
pick_font_fs(*args)
|
||||
},
|
||||
:bg=>'white', :tablerelief=>:raised,
|
||||
:cursor=>:tcross) {
|
||||
pack(:fill=>:both, :expand=>true)
|
||||
token_handler('meta', proc{|*args| meta(self, *args)})
|
||||
}
|
||||
|
||||
clear_screen()
|
||||
@old_imgs.clear
|
||||
refresh()
|
||||
Tk.update
|
||||
@html_fs.clipwin.focus
|
||||
end
|
||||
|
||||
#
|
||||
#
|
||||
def key_press(w, keysym)
|
||||
return if @key_block
|
||||
@key_block = true
|
||||
Tk.after(250, proc{@key_block = false})
|
||||
|
||||
if @hotkey.key?(keysym)
|
||||
process_url(@hotkey[keysym])
|
||||
end
|
||||
case keysym
|
||||
when 'Escape'
|
||||
if @fswin && @fswin.exist?
|
||||
fullscreen_off()
|
||||
else
|
||||
fullscreen()
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
############################################
|
||||
|
||||
TkHTML_File_Viewer.new(file)
|
||||
|
||||
Tk.mainloop
|
||||
|
|
|
@ -29,11 +29,11 @@ table = Tk::TkTable.new(:rows=>rows, :cols=>cols, :variable=>ary,
|
|||
:rowstretchmode=>:last, :colstretchmode=>:last,
|
||||
:rowtagcommand=>proc{|row|
|
||||
row = Integer(row)
|
||||
return 'OddRow' if row>0 && row%2 == 1
|
||||
(row>0 && row%2 == 1)? 'OddRow': ''
|
||||
},
|
||||
:coltagcommand=>proc{|col|
|
||||
col = Integer(col)
|
||||
return 'OddCol' if col>0 && col%2 == 1
|
||||
(col>0 && col%2 == 1)? 'OddCol': ''
|
||||
},
|
||||
:selectmode=>:extended, :sparsearray=>false)
|
||||
|
||||
|
|
|
@ -45,11 +45,11 @@ table = Tk::TkTable.new(:rows=>rows, :cols=>cols,
|
|||
:rowstretchmode=>:last, :colstretchmode=>:last,
|
||||
:rowtagcommand=>proc{|row|
|
||||
row = Integer(row)
|
||||
return 'OddRow' if row>0 && row%2 == 1
|
||||
(row>0 && row%2 == 1)? 'OddRow': ''
|
||||
},
|
||||
:coltagcommand=>proc{|col|
|
||||
col = Integer(col)
|
||||
return 'OddCol' if col>0 && col%2 == 1
|
||||
(col>0 && col%2 == 1)? 'OddCol': ''
|
||||
},
|
||||
:selectmode=>:extended, :flashmode=>true,
|
||||
:rowstretch=>:unset, :colstretch=>:unset,
|
||||
|
|
|
@ -29,7 +29,7 @@ table = Tk::TkTable.new(:rows=>rows, :cols=>cols, :variable=>ary,
|
|||
:roworigin=>-5, :colorigin=>-2,
|
||||
:coltagcommand=>proc{|col|
|
||||
col = Integer(col)
|
||||
return 'OddCol' if col>0 && col%2 == 1
|
||||
(col>0 && col%2 == 1)? 'OddCol': ''
|
||||
},
|
||||
:selectmode=>:extended, :flashmode=>true,
|
||||
:rowstretch=>:unset, :colstretch=>:unset,
|
||||
|
|
|
@ -28,7 +28,7 @@ table = Tk::TkTable.new(:rows=>rows, :cols=>cols, :variable=>ary,
|
|||
:titlerows=>1, :titlecols=>1,
|
||||
:coltagcommand=>proc{|col|
|
||||
col = Integer(col)
|
||||
return 'OddCol' if col>0 && col%2 == 1
|
||||
(col>0 && col%2 == 1)? 'OddCol': ''
|
||||
},
|
||||
:selectmode=>:extended,
|
||||
:colstretch=>:unset, :rowstretch=>:unset,
|
||||
|
|
|
@ -111,6 +111,7 @@ class TkTreeCtrl_demo
|
|||
[['File']]
|
||||
]
|
||||
if Tk::PLATFORM['platform'] != 'unix'
|
||||
TkConsole.create
|
||||
TkConsole.eval('.console conf -height 8')
|
||||
menuspec[0] << ['Console', proc{
|
||||
if TkComm.bool(TkConsole.eval('winfo ismapped .'))
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* Oct. 24, 1997 Y. Matsumoto
|
||||
*/
|
||||
|
||||
#define TCLTKLIB_RELEASE_DATE "2005-03-10"
|
||||
#define TCLTKLIB_RELEASE_DATE "2005-03-30"
|
||||
|
||||
#include "ruby.h"
|
||||
#include "rubysig.h"
|
||||
|
@ -22,6 +22,12 @@
|
|||
#include <tcl.h>
|
||||
#include <tk.h>
|
||||
|
||||
#ifndef TCL_ALPHA_RELEASE
|
||||
#define TCL_ALPHA_RELEASE 0
|
||||
#define TCL_BETA_RELEASE 1
|
||||
#define TCL_FINAL_RELEASE 2
|
||||
#endif
|
||||
|
||||
#ifdef __MACOS__
|
||||
# include <tkMac.h>
|
||||
# include <Quickdraw.h>
|
||||
|
@ -4945,6 +4951,84 @@ ip_create_slave(argc, argv, self)
|
|||
return retval;
|
||||
}
|
||||
|
||||
#if defined(MAC_TCL) || defined(__WIN32__)
|
||||
#if TCL_MAJOR_VERSION < 8 \
|
||||
|| (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 0) \
|
||||
|| (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 1 \
|
||||
&& (TCL_RELEASE_LEVEL == TCL_ALPHA_RELEASE \
|
||||
|| (TCL_RELEASE_LEVEL == TCL_BETA_RELEASE \
|
||||
&& TCL_RELEASE_SERIAL < 2) ) )
|
||||
EXTERN void TkConsoleCreate _((void));
|
||||
#endif
|
||||
#if TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 1 \
|
||||
&& ( (TCL_RELEASE_LEVEL == TCL_FINAL_RELEASE \
|
||||
&& TCL_RELEASE_SERIAL == 0) \
|
||||
|| (TCL_RELEASE_LEVEL == TCL_BETA_RELEASE \
|
||||
&& TCL_RELEASE_SERIAL >= 2) )
|
||||
EXTERN void TkConsoleCreate_ _((void));
|
||||
#endif
|
||||
#endif
|
||||
static VALUE
|
||||
ip_create_console_core(interp, argc, argv)
|
||||
VALUE interp;
|
||||
int argc; /* dummy */
|
||||
VALUE *argv; /* dummy */
|
||||
{
|
||||
struct tcltkip *ptr = get_ip(interp);
|
||||
|
||||
if (Tcl_GetVar(ptr->ip,"tcl_interactive",TCL_GLOBAL_ONLY) == (char*)NULL) {
|
||||
Tcl_SetVar(ptr->ip, "tcl_interactive", "0", TCL_GLOBAL_ONLY);
|
||||
}
|
||||
|
||||
|
||||
#if TCL_MAJOR_VERSION > 8 \
|
||||
|| (TCL_MAJOR_VERSION == 8 \
|
||||
&& (TCL_MINOR_VERSION > 1 \
|
||||
|| (TCL_MINOR_VERSION == 1 \
|
||||
&& TCL_RELEASE_LEVEL == TCL_FINAL_RELEASE \
|
||||
&& TCL_RELEASE_SERIAL >= 1) ) )
|
||||
Tk_InitConsoleChannels(ptr->ip);
|
||||
|
||||
if (Tk_CreateConsoleWindow(ptr->ip) != TCL_OK) {
|
||||
rb_raise(rb_eRuntimeError, "fail to create console-window");
|
||||
}
|
||||
#else
|
||||
#if defined(MAC_TCL) || defined(__WIN32__)
|
||||
#if TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 1 \
|
||||
&& ( (TCL_RELEASE_LEVEL == TCL_FINAL_RELEASE && TCL_RELEASE_SERIAL == 0) \
|
||||
|| (TCL_RELEASE_LEVEL == TCL_BETA_RELEASE && TCL_RELEASE_SERIAL >= 2) )
|
||||
TkConsoleCreate_();
|
||||
#else
|
||||
TkConsoleCreate();
|
||||
#endif
|
||||
|
||||
if (TkConsoleInit(ptr->ip) != TCL_OK) {
|
||||
rb_raise(rb_eRuntimeError, "fail to create console-window");
|
||||
}
|
||||
#else
|
||||
rb_notimplement();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
return interp;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
ip_create_console(self)
|
||||
VALUE self;
|
||||
{
|
||||
struct tcltkip *ptr = get_ip(self);
|
||||
|
||||
/* ip is deleted? */
|
||||
if (ptr == (struct tcltkip *)NULL || ptr->ip == (Tcl_Interp*)NULL
|
||||
|| Tcl_InterpDeleted(ptr->ip)) {
|
||||
DUMP1("ip is deleted");
|
||||
rb_raise(rb_eRuntimeError, "interpreter is deleted");
|
||||
}
|
||||
|
||||
return tk_funcall(ip_create_console_core, 0, (VALUE*)NULL, self);
|
||||
}
|
||||
|
||||
/* make ip "safe" */
|
||||
static VALUE
|
||||
ip_make_safe_core(interp, argc, argv)
|
||||
|
@ -8349,6 +8433,8 @@ Init_tcltklib()
|
|||
rb_define_method(ip, "_invoke", ip_invoke, -1);
|
||||
rb_define_method(ip, "_return_value", ip_retval, 0);
|
||||
|
||||
rb_define_method(ip, "_create_console", ip_create_console, 0);
|
||||
|
||||
/* --------------------------------------------------------------- */
|
||||
|
||||
rb_define_method(ip, "_get_variable", ip_get_variable, 2);
|
||||
|
|
Loading…
Reference in a new issue