mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* ext/tk/lib/tk/timer.rb (TkRTTimer): correct calculation of offset
value. get a little better accuracy. * ext/tk/sample/demos-en/widget: use a binding with no local variables when eval a sample script. * ext/tk/sample/demos-en/bind.rb: ditto. * ext/tk/sample/demos-en/tcolor: ditto. * ext/tk/sample/demos-jp/widget: ditto. * ext/tk/sample/demos-jp/bind.rb: ditto. * ext/tk/sample/demos-jp/tcolor: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8143 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
28b1db091d
commit
cde3bdf26f
9 changed files with 187 additions and 49 deletions
18
ChangeLog
18
ChangeLog
|
@ -1,3 +1,21 @@
|
|||
Mon Mar 14 00:13:49 2005 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
|
||||
|
||||
* ext/tk/lib/tk/timer.rb (TkRTTimer): correct calculation of offset
|
||||
value. get a little better accuracy.
|
||||
|
||||
* ext/tk/sample/demos-en/widget: use a binding with no local variables
|
||||
when eval a sample script.
|
||||
|
||||
* ext/tk/sample/demos-en/bind.rb: ditto.
|
||||
|
||||
* ext/tk/sample/demos-en/tcolor: ditto.
|
||||
|
||||
* ext/tk/sample/demos-jp/widget: ditto.
|
||||
|
||||
* ext/tk/sample/demos-jp/bind.rb: ditto.
|
||||
|
||||
* ext/tk/sample/demos-jp/tcolor: ditto.
|
||||
|
||||
Sun Mar 13 22:19:17 2005 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* eval.c (recursive_pop): raise TypeError instead of fatal error.
|
||||
|
|
|
@ -4002,7 +4002,7 @@ end
|
|||
#Tk.freeze
|
||||
|
||||
module Tk
|
||||
RELEASE_DATE = '2005-03-10'.freeze
|
||||
RELEASE_DATE = '2005-03-13'.freeze
|
||||
|
||||
autoload :AUTO_PATH, 'tk/variable'
|
||||
autoload :TCL_PACKAGE_PATH, 'tk/variable'
|
||||
|
|
|
@ -509,7 +509,9 @@ class TkRTTimer < TkTimer
|
|||
def initialize(*args, &b)
|
||||
super(*args, &b)
|
||||
|
||||
@offset_list = Array.new(DEFAULT_OFFSET_LIST_SIZE, 0.0)
|
||||
@offset_list = Array.new(DEFAULT_OFFSET_LIST_SIZE){ [0, 0] }
|
||||
@offset_s = 0
|
||||
@offset_u = 0
|
||||
@est_time = nil
|
||||
end
|
||||
|
||||
|
@ -533,10 +535,18 @@ class TkRTTimer < TkTimer
|
|||
end
|
||||
|
||||
def _offset_ave
|
||||
size = @offset_list.size.to_f
|
||||
s = 0.0
|
||||
@offset_list.each{|n| s + n}
|
||||
s / size
|
||||
size = 0
|
||||
d_sec = 0; d_usec = 0
|
||||
@offset_list.each_with_index{|offset, idx|
|
||||
# weight = 1
|
||||
weight = idx + 1
|
||||
size += weight
|
||||
d_sec += offset[0] * weight
|
||||
d_usec += offset[1] * weight
|
||||
}
|
||||
offset_s, mod = d_sec.divmod(size)
|
||||
offset_u = ((mod * 1000000 + d_usec) / size.to_f).round
|
||||
[offset_s, offset_u]
|
||||
end
|
||||
private :_offset_ave
|
||||
|
||||
|
@ -564,6 +574,8 @@ class TkRTTimer < TkTimer
|
|||
@current_pos += 1
|
||||
@current_proc = cmd
|
||||
|
||||
@offset_s, @offset_u = _offset_ave
|
||||
|
||||
if TkComm._callback_entry?(@sleep_time)
|
||||
sleep = @sleep_time.call(self)
|
||||
else
|
||||
|
@ -571,26 +583,42 @@ class TkRTTimer < TkTimer
|
|||
end
|
||||
|
||||
if @est_time
|
||||
@est_time = Time.at(@est_time.to_f + sleep / 1000.0)
|
||||
@est_time = Time.at(@est_time.to_i, @est_time.usec + sleep*1000)
|
||||
else
|
||||
@est_time = Time.at(@cb_start_time.to_f + sleep / 1000.0)
|
||||
@est_time = Time.at(@cb_start_time.to_i,
|
||||
@cb_start_time.usec + sleep*1000)
|
||||
end
|
||||
|
||||
offset = _offset_ave
|
||||
|
||||
real_sleep = ((@est_time - Time.now)*1000.0 + offset).round
|
||||
real_sleep = 0 if real_sleep < 0
|
||||
now = Time.now
|
||||
real_sleep = ((@est_time.to_i - now.to_i + @offset_s)*1000.0 +
|
||||
(@est_time.usec - now.usec + @offset_u)/1000.0).round
|
||||
if real_sleep <= 0
|
||||
real_sleep = 0
|
||||
@offset_s = now.to_i
|
||||
@offset_u = now.usec
|
||||
end
|
||||
@current_sleep = real_sleep
|
||||
|
||||
set_callback(real_sleep, cmd_args)
|
||||
end
|
||||
|
||||
def cb_call
|
||||
@cb_start_time = Time.now
|
||||
|
||||
if @est_time
|
||||
@offset_list.shift
|
||||
@offset_list.push((@est_time - @cb_start_time) * 1000.0)
|
||||
|
||||
@cb_start_time = Time.now
|
||||
|
||||
if @current_sleep == 0
|
||||
@offset_list.push([
|
||||
@offset_s - @cb_start_time.to_i,
|
||||
@offset_u - @cb_start_time.usec
|
||||
])
|
||||
else
|
||||
@offset_list.push([
|
||||
@offset_s + (@est_time.to_i - @cb_start_time.to_i),
|
||||
@offset_u + (@est_time.usec - @cb_start_time.usec)
|
||||
])
|
||||
end
|
||||
end
|
||||
|
||||
@cb_cmd.call
|
||||
|
|
|
@ -93,17 +93,35 @@ TkText.new($bind_demo){|t|
|
|||
tag_binding_for_bind_demo(tag, tagstyle_bold, tagstyle_normal)
|
||||
}
|
||||
d1.bind('1',
|
||||
proc{eval `cat #{[$demo_dir,'items.rb'].join(File::Separator)}`})
|
||||
proc{
|
||||
eval(`cat #{[$demo_dir,'items.rb'].join(File::Separator)}`,
|
||||
_null_binding)
|
||||
})
|
||||
d2.bind('1',
|
||||
proc{eval `cat #{[$demo_dir,'plot.rb'].join(File::Separator)}`})
|
||||
proc{
|
||||
eval(`cat #{[$demo_dir,'plot.rb'].join(File::Separator)}`,
|
||||
_null_binding)
|
||||
})
|
||||
d3.bind('1',
|
||||
proc{eval `cat #{[$demo_dir,'ctext.rb'].join(File::Separator)}`})
|
||||
proc{
|
||||
eval(`cat #{[$demo_dir,'ctext.rb'].join(File::Separator)}`,
|
||||
_null_binding)
|
||||
})
|
||||
d4.bind('1',
|
||||
proc{eval `cat #{[$demo_dir,'arrow.rb'].join(File::Separator)}`})
|
||||
proc{
|
||||
eval(`cat #{[$demo_dir,'arrow.rb'].join(File::Separator)}`,
|
||||
_null_binding)
|
||||
})
|
||||
d5.bind('1',
|
||||
proc{eval `cat #{[$demo_dir,'ruler.rb'].join(File::Separator)}`})
|
||||
proc{
|
||||
eval(`cat #{[$demo_dir,'ruler.rb'].join(File::Separator)}`,
|
||||
_null_binding)
|
||||
})
|
||||
d6.bind('1',
|
||||
proc{eval `cat #{[$demo_dir,'cscroll.rb'].join(File::Separator)}`})
|
||||
proc{
|
||||
eval(`cat #{[$demo_dir,'cscroll.rb'].join(File::Separator)}`,
|
||||
_null_binding)
|
||||
})
|
||||
|
||||
TkTextMarkInsert.new(t, '0.0')
|
||||
configure('state','disabled')
|
||||
|
|
|
@ -121,9 +121,14 @@ def hsbToRgb(hue,sat,value)
|
|||
end
|
||||
|
||||
|
||||
def _null_binding
|
||||
Module.new.instance_eval{binding}
|
||||
end
|
||||
private :_null_binding
|
||||
|
||||
def doUpdate
|
||||
newCmd = $command.to_s.gsub("%%","\"#{$color}\"")
|
||||
eval(newCmd)
|
||||
eval(newCmd, _null_binding)
|
||||
end
|
||||
|
||||
|
||||
|
@ -208,21 +213,21 @@ def tc_loadNamedColor(name)
|
|||
else
|
||||
case name.length
|
||||
when 4
|
||||
format = /#(.{1})(.{1})(.{1})/
|
||||
fmt = /#(.{1})(.{1})(.{1})/
|
||||
shift = 12
|
||||
when 7
|
||||
format = /#(.{2})(.{2})(.{2})/
|
||||
fmt = /#(.{2})(.{2})(.{2})/
|
||||
shift = 8
|
||||
when 10
|
||||
format = /#(.{3})(.{3})(.{3})/
|
||||
fmt = /#(.{3})(.{3})(.{3})/
|
||||
shift = 4
|
||||
when 13
|
||||
format = /#(.{4})(.{4})(.{4})/
|
||||
fmt = /#(.{4})(.{4})(.{4})/
|
||||
shift = 0
|
||||
else
|
||||
raise(eException,"syntax error in color name \"#{name}\"")
|
||||
end
|
||||
name.scan(format){|strlist|
|
||||
name.scan(fmt){|strlist|
|
||||
if strlist.length != 3
|
||||
raise(eException,"syntax error in color name \"#{name}\"")
|
||||
end
|
||||
|
|
|
@ -509,6 +509,12 @@ else # ver >= 8.4
|
|||
alias showVars showVars2
|
||||
end
|
||||
|
||||
def _null_binding
|
||||
# binding
|
||||
Module.new.instance_eval{binding}
|
||||
end
|
||||
private :_null_binding
|
||||
|
||||
# invoke --
|
||||
# This procedure is called when the user clicks on a demo description.
|
||||
# It is responsible for invoking the demonstration.
|
||||
|
@ -516,7 +522,20 @@ end
|
|||
# Arguments:
|
||||
# txt - Name of text widget
|
||||
# index - The index of the character that the user clicked on.
|
||||
def invoke(txt, idx)
|
||||
tag = txt.tag_names(idx).find{|t| t.kind_of?(String) && t =~ /^demo-/}
|
||||
return unless tag
|
||||
|
||||
cursor = txt.cget('cursor')
|
||||
txt.cursor('watch')
|
||||
Tk.update
|
||||
eval(IO.readlines("#{[$demo_dir, tag[5..-1]].join(File::Separator)}.rb").join, _null_binding)
|
||||
Tk.update
|
||||
txt.cursor(cursor)
|
||||
|
||||
$tag_visited.add("#{idx} linestart +1 chars", "#{idx} lineend +1 chars")
|
||||
end
|
||||
=begin
|
||||
def invoke (txt, idx)
|
||||
tag = txt.tag_names(idx).find{|t| t.kind_of?(String) && t =~ /^demo-/}
|
||||
return unless tag
|
||||
|
@ -532,7 +551,7 @@ def invoke (txt, idx)
|
|||
|
||||
$tag_visited.add("#{idx} linestart +1 chars", "#{idx} lineend +1 chars")
|
||||
end
|
||||
|
||||
=end
|
||||
# showStatus --
|
||||
#
|
||||
# Show the name of the demo program in the status bar. This procedure
|
||||
|
@ -577,7 +596,7 @@ def showCode1(demo)
|
|||
}.pack('side'=>'left', 'expand'=>'yes', 'pady'=>2)
|
||||
TkButton.new(f) {
|
||||
text "Rerun Demo"
|
||||
command proc{eval($code_text.get('1.0','end'))}
|
||||
command proc{eval($code_text.get('1.0','end'), _null_binding)}
|
||||
}.pack('side'=>'left', 'expand'=>'yes', 'pady'=>2)
|
||||
# f.pack('side'=>'bottom', 'expand'=>'yes', 'fill'=>'x')
|
||||
f.pack('side'=>'bottom', 'fill'=>'x')
|
||||
|
@ -670,7 +689,9 @@ def showCode2(demo)
|
|||
:command=>proc{printCode($code_text, file)},
|
||||
:image=>$image['print'], :compound=>:left)
|
||||
b_run = TkButton.new(bf, :text=>'Rerun Demo',
|
||||
:command=>proc{eval($code_text.get('1.0','end'))},
|
||||
:command=>proc{
|
||||
eval($code_text.get('1.0','end'), _null_binding)
|
||||
},
|
||||
:image=>$image['refresh'], :compound=>:left)
|
||||
|
||||
TkGrid('x', b_run, b_prn, b_dis, :padx=>4, :pady=>[6,4])
|
||||
|
@ -791,7 +812,7 @@ end
|
|||
#
|
||||
def aboutBox
|
||||
Tk.messageBox('icon'=>'info', 'type'=>'ok', 'title'=>'About Widget Demo',
|
||||
'message'=>"Ruby/Tk widget demonstration Ver.1.5.3-en\n\n" +
|
||||
'message'=>"Ruby/Tk widget demonstration Ver.1.5.4-en\n\n" +
|
||||
"based on demos of Tk8.1 -- 8.5 " +
|
||||
"( Copyright:: " +
|
||||
"(c) 1996-1997 Sun Microsystems, Inc. / " +
|
||||
|
@ -812,7 +833,8 @@ ARGV.each{|cmd|
|
|||
if cmd =~ /(.*).rb/
|
||||
cmd = $1
|
||||
end
|
||||
eval IO.readlines("#{[$demo_dir, cmd].join(File::Separator)}.rb").join
|
||||
eval(IO.readlines("#{[$demo_dir, cmd].join(File::Separator)}.rb").join,
|
||||
_null_binding)
|
||||
}
|
||||
if no_launcher
|
||||
$root.withdraw # hide root window
|
||||
|
|
|
@ -90,17 +90,35 @@ TkText.new($bind_demo){|t|
|
|||
tag_binding_for_bind_demo(tag, tagstyle_bold, tagstyle_normal)
|
||||
}
|
||||
d1.bind('1',
|
||||
proc{eval `cat #{[$demo_dir,'items.rb'].join(File::Separator)}`})
|
||||
proc{
|
||||
eval(`cat #{[$demo_dir,'items.rb'].join(File::Separator)}`,
|
||||
_null_binding)
|
||||
})
|
||||
d2.bind('1',
|
||||
proc{eval `cat #{[$demo_dir,'plot.rb'].join(File::Separator)}`})
|
||||
proc{
|
||||
eval(`cat #{[$demo_dir,'plot.rb'].join(File::Separator)}`,
|
||||
_null_binding)
|
||||
})
|
||||
d3.bind('1',
|
||||
proc{eval `cat #{[$demo_dir,'ctext.rb'].join(File::Separator)}`})
|
||||
proc{
|
||||
eval(`cat #{[$demo_dir,'ctext.rb'].join(File::Separator)}`,
|
||||
_null_binding)
|
||||
})
|
||||
d4.bind('1',
|
||||
proc{eval `cat #{[$demo_dir,'arrow.rb'].join(File::Separator)}`})
|
||||
proc{
|
||||
eval(`cat #{[$demo_dir,'arrow.rb'].join(File::Separator)}`,
|
||||
_null_binding)
|
||||
})
|
||||
d5.bind('1',
|
||||
proc{eval `cat #{[$demo_dir,'ruler.rb'].join(File::Separator)}`})
|
||||
proc{
|
||||
eval(`cat #{[$demo_dir,'ruler.rb'].join(File::Separator)}`,
|
||||
_null_binding)
|
||||
})
|
||||
d6.bind('1',
|
||||
proc{eval `cat #{[$demo_dir,'cscroll.rb'].join(File::Separator)}`})
|
||||
proc{
|
||||
eval(`cat #{[$demo_dir,'cscroll.rb'].join(File::Separator)}`,
|
||||
_null_binding)
|
||||
})
|
||||
|
||||
TkTextMarkInsert.new(t, '0.0')
|
||||
configure('state','disabled')
|
||||
|
|
|
@ -124,9 +124,14 @@ def hsbToRgb(hue,sat,value)
|
|||
end
|
||||
|
||||
|
||||
def _null_binding
|
||||
Module.new.instance_eval{binding}
|
||||
end
|
||||
private :_null_binding
|
||||
|
||||
def doUpdate
|
||||
newCmd = $command.to_s.gsub("%%","\"#{$color}\"")
|
||||
eval(newCmd)
|
||||
eval(newCmd, _null_binding)
|
||||
end
|
||||
|
||||
|
||||
|
@ -211,21 +216,21 @@ def tc_loadNamedColor(name)
|
|||
else
|
||||
case name.length
|
||||
when 4
|
||||
format = /#(.{1})(.{1})(.{1})/
|
||||
fmt = /#(.{1})(.{1})(.{1})/
|
||||
shift = 12
|
||||
when 7
|
||||
format = /#(.{2})(.{2})(.{2})/
|
||||
fmt = /#(.{2})(.{2})(.{2})/
|
||||
shift = 8
|
||||
when 10
|
||||
format = /#(.{3})(.{3})(.{3})/
|
||||
fmt = /#(.{3})(.{3})(.{3})/
|
||||
shift = 4
|
||||
when 13
|
||||
format = /#(.{4})(.{4})(.{4})/
|
||||
fmt = /#(.{4})(.{4})(.{4})/
|
||||
shift = 0
|
||||
else
|
||||
raise(eException,"syntax error in color name \"#{name}\"")
|
||||
end
|
||||
name.scan(format){|strlist|
|
||||
name.scan(fmt){|strlist|
|
||||
if strlist.length != 3
|
||||
raise(eException,"syntax error in color name \"#{name}\"")
|
||||
end
|
||||
|
|
|
@ -11,7 +11,7 @@ require 'tk'
|
|||
$demo_dir = File.dirname($0)
|
||||
|
||||
# root の生成
|
||||
$root = TkRoot.new{title "Widget Demonstration"}
|
||||
$root = TkRoot.new{title "Ruby/Tk Widget Demonstration"}
|
||||
|
||||
# tk バージョンの取得
|
||||
$tk_version = Tk::TK_VERSION
|
||||
|
@ -551,7 +551,27 @@ else # ver >= 8.4
|
|||
alias showVars showVars2
|
||||
end
|
||||
|
||||
def _null_binding
|
||||
# binding
|
||||
Module.new.instance_eval{binding}
|
||||
end
|
||||
private :_null_binding
|
||||
|
||||
# テキスト上での click に対する動作
|
||||
def invoke(txt, idx)
|
||||
tag = txt.tag_names(idx).find{|t| t.kind_of?(String) && t =~ /^demo-/}
|
||||
return unless tag
|
||||
|
||||
cursor = txt.cget('cursor')
|
||||
txt.cursor('watch')
|
||||
Tk.update
|
||||
eval(IO.readlines("#{[$demo_dir, tag[5..-1]].join(File::Separator)}.rb").join, _null_binding)
|
||||
Tk.update
|
||||
txt.cursor(cursor)
|
||||
|
||||
$tag_visited.add("#{idx} linestart +1 chars", "#{idx} lineend +1 chars")
|
||||
end
|
||||
=begin
|
||||
def invoke (txt, idx)
|
||||
tag = txt.tag_names(idx).find{|t| t.kind_of?(String) && t =~ /^demo-/}
|
||||
return unless tag
|
||||
|
@ -567,6 +587,7 @@ def invoke (txt, idx)
|
|||
|
||||
$tag_visited.add("#{idx} linestart +1 chars", "#{idx} lineend +1 chars")
|
||||
end
|
||||
=end
|
||||
|
||||
# 状態表示
|
||||
def showStatus (txt, index)
|
||||
|
@ -601,7 +622,7 @@ def showCode1(demo)
|
|||
}.pack('side'=>'left', 'expand'=>'yes', 'pady'=>2)
|
||||
TkButton.new(f) {
|
||||
text "再実行"
|
||||
command proc{eval($code_text.get('1.0','end'))}
|
||||
command proc{eval($code_text.get('1.0','end'), _null_binding)}
|
||||
}.pack('side'=>'left', 'expand'=>'yes', 'pady'=>2)
|
||||
# f.pack('side'=>'bottom', 'expand'=>'yes', 'fill'=>'x')
|
||||
f.pack('side'=>'bottom', 'fill'=>'x')
|
||||
|
@ -694,7 +715,9 @@ def showCode2(demo)
|
|||
:command=>proc{printCode($code_text, file)},
|
||||
:image=>$image['print'], :compound=>:left)
|
||||
b_run = TkButton.new(bf, :text=>'再実行',
|
||||
:command=>proc{eval($code_text.get('1.0','end'))},
|
||||
:command=>proc{
|
||||
eval($code_text.get('1.0','end'), _null_binding)
|
||||
},
|
||||
:image=>$image['refresh'], :compound=>:left)
|
||||
|
||||
TkGrid('x', b_run, b_prn, b_dis, :padx=>4, :pady=>[6,4])
|
||||
|
@ -819,7 +842,7 @@ end
|
|||
#
|
||||
def aboutBox
|
||||
Tk.messageBox('icon'=>'info', 'type'=>'ok', 'title'=>'About Widget Demo',
|
||||
'message'=>"Ruby/Tk ウィジェットデモ Ver.1.5.3-jp\n\n" +
|
||||
'message'=>"Ruby/Tk ¥¦¥£¥¸¥§¥Ã¥È¥Ç¥â Ver.1.5.4-jp\n\n" +
|
||||
"based on demos of Tk8.1 -- 8.5 " +
|
||||
"( Copyright:: " +
|
||||
"(c) 1996-1997 Sun Microsystems, Inc. / " +
|
||||
|
@ -840,7 +863,8 @@ ARGV.each{|cmd|
|
|||
if cmd =~ /(.*).rb/
|
||||
cmd = $1
|
||||
end
|
||||
eval IO.readlines("#{[$demo_dir, cmd].join(File::Separator)}.rb").join
|
||||
eval(IO.readlines("#{[$demo_dir, cmd].join(File::Separator)}.rb").join,
|
||||
_null_binding)
|
||||
}
|
||||
if no_launcher
|
||||
$root.withdraw # hide root window
|
||||
|
|
Loading…
Reference in a new issue