summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1998-01-16 12:19:22 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1998-01-16 12:19:22 +0000
commitfd1d8cdc09ed86e4a0812120a17ff0d7b04adcaf (patch)
tree341289a84a427f1e92425c7ebf82d2f1733e9a40 /lib
parentf12baed5df6d3c213dd75d2f0d9f36bb179fb843 (diff)
*** empty log message ***
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/RUBY@11 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib')
-rw-r--r--lib/cgi-lib.rb77
-rw-r--r--lib/finalize.rb36
-rw-r--r--lib/mailread.rb43
-rw-r--r--lib/sync.rb90
-rw-r--r--lib/tk.rb573
-rw-r--r--lib/tktext.rb4
6 files changed, 672 insertions, 151 deletions
diff --git a/lib/cgi-lib.rb b/lib/cgi-lib.rb
index afadbff..5234e04 100644
--- a/lib/cgi-lib.rb
+++ b/lib/cgi-lib.rb
@@ -9,29 +9,59 @@
# foo.keys <== array of fields
# foo.inputs <== hash of { <field> => <value> }
+# if running on Windows(IIS or PWS) then change cwd.
+if ENV['SERVER_SOFTWARE'] =~ /^Microsoft-/ then
+ Dir.chdir ENV['PATH_TRANSLATED'].sub(/[^\\]+$/, '')
+end
+
+require "shellwords.rb"
+
class CGI
+ include Shellwords
+
attr("inputs")
+
+ # original is CGI.pm
+ def read_from_cmdline
+ words = shellwords(if not ARGV.empty? then
+ ARGV.join(' ')
+ else
+ print "(offline mode: enter name=value pairs on standard input)\n"
+ readlines.join(' ').gsub(/\n/, '')
+ end.gsub(/\\=/, '%3D').gsub(/\\&/, '%26'))
+
+ if words.find{|x| x =~ /=/} then words.join('&') else words.join('+') end
+ end
+ # escape url encode
+ def escape(str)
+ str.gsub!(/[^a-zA-Z0-9_\-.]/n){ sprintf("%%%02X", $&.unpack("C")[0]) }
+ str
+ end
+
+ # unescape url encoded
+ def unescape(str)
+ str.gsub! /\+/, ' '
+ str.gsub!(/%([0-9a-fA-F]{2})/){ [$1.hex].pack("c") }
+ str
+ end
+ module_function :escape, :unescape
+
def initialize
- str = if ENV['REQUEST_METHOD'] == "GET"
- ENV['QUERY_STRING']
- elsif ENV['REQUEST_METHOD'] == "POST"
- $stdin.read ENV['CONTENT_LENGTH'].to_i
- else
- ""
- end
- arr = str.split(/&/)
+ # exception messages should be printed to stdout.
+ STDERR.reopen(STDOUT)
+
@inputs = {}
- arr.each do |x|
- x.gsub!(/\+/, ' ')
- key, val = x.split(/=/, 2)
- val = "" unless val
-
- key.gsub!(/%(..)/) { [$1.hex].pack("c") }
- val.gsub!(/%(..)/) { [$1.hex].pack("c") }
-
- @inputs[key] += "\0" if @inputs[key]
- @inputs[key] += val
+ case ENV['REQUEST_METHOD']
+ when "GET"
+ ENV['QUERY_STRING'] or ""
+ when "POST"
+ $stdin.read ENV['CONTENT_LENGTH'].to_i
+ else
+ read_from_cmdline
+ end.split(/&/).each do |x|
+ key, val = x.split(/=/,2).collect{|x|unescape(x)}
+ @inputs[key] += ("\0" if @inputs[key]) + (val or "")
end
end
@@ -53,4 +83,15 @@ class CGI
TRUE
end
+ def CGI.error
+ m = $!.dup
+ m.gsub!(/&/, '&amp;')
+ m.gsub!(/</, '&lt;')
+ m.gsub!(/>/, '&gt;')
+ msgs = ["<pre>ERROR: <strong>#{m}</strong>"]
+ msgs << $@
+ msgs << "</pre>"
+ CGI.message(msgs.join("\n"), "ERROR")
+ exit
+ end
end
diff --git a/lib/finalize.rb b/lib/finalize.rb
index e934753..9b2ffef 100644
--- a/lib/finalize.rb
+++ b/lib/finalize.rb
@@ -1,9 +1,9 @@
#
-# finalize.rb -
-# $Release Version: $
-# $Revision: 1.2 $
-# $Date: 1997/07/25 02:43:00 $
-# by Keiju ISHITSUKA(SHL Japan Inc.)
+# finalizer.rb -
+# $Release Version: 0.2$
+# $Revision: 1.3 $
+# $Date: 1998/01/09 08:09:49 $
+# by Keiju ISHITSUKA
#
# --
#
@@ -44,14 +44,14 @@
#
module Finalizer
- RCS_ID='-$Header: /home/keiju/var/src/var.lib/ruby/RCS/finalize.rb,v 1.2 1997/07/25 02:43:00 keiju Exp keiju $-'
+ RCS_ID='-$Header: /home/keiju/var/src/var.lib/ruby/RCS/finalize.rb,v 1.3 1998/01/09 08:09:49 keiju Exp keiju $-'
# @dependency: {id => [[dependant, method, *opt], ...], ...}
# 依存関係 R_method(obj, dependant) の追加
def add_dependency(obj, dependant, method = :finalize, *opt)
ObjectSpace.call_finalizer(obj)
- method = method.id unless method.kind_of?(Fixnum)
+ method = method.intern unless method.kind_of?(Integer)
assoc = [dependant, method].concat(opt)
if dep = @dependency[obj.id]
dep.push assoc
@@ -63,8 +63,8 @@ module Finalizer
# 依存関係 R_method(obj, dependant) の削除
def delete_dependency(id, dependant, method = :finalize)
- id = id.id unless id.kind_of?(Fixnum)
- method = method.id unless method.kind_of?(Fixnum)
+ id = id.id unless id.kind_of?(Integer)
+ method = method.intern unless method.kind_of?(Integer)
for assoc in @dependency[id]
assoc.delete_if do
|d, m, *o|
@@ -77,8 +77,8 @@ module Finalizer
# 依存関係 R_*(obj, dependant) の削除
def delete_all_dependency(id, dependant)
- id = id.id unless id.kind_of?(Fixnum)
- method = method.id unless method.kind_of?(Fixnum)
+ id = id.id unless id.kind_of?(Integer)
+ method = method.intern unless method.kind_of?(Integer)
for assoc in @dependency[id]
assoc.delete_if do
|d, m, *o|
@@ -90,8 +90,8 @@ module Finalizer
# 依存関係 R_method(*, dependant) の削除
def delete_by_dependant(dependant, method = :finalize)
- method = method.id unless method.kind_of?(Fixnum)
- for id in @dependency.keys
+ method = method.intern unless method.kind_of?(Integer)
+ for id in Dependency.keys
delete(id, dependant, method)
end
end
@@ -106,8 +106,8 @@ module Finalizer
# 依存関連 R_method(obj, dependtant) で結ばれるdependantをfinalizeす
# る.
def finalize_dependency(id, dependant, method = :finalize)
- id = id.id unless id.kind_of?(Fixnum)
- method = method.id unless method.kind_of?(Fixnum)
+ id = id.id unless id.kind_of?(Integer)
+ method = method.intern unless method.kind_of?(Integer)
for assocs in @dependency[id]
assocs.delete_if do
|d, m, *o|
@@ -121,8 +121,8 @@ module Finalizer
# 依存関連 R_*(obj, dependtant) で結ばれるdependantをfinalizeする.
def finalize_all_dependency(id, dependant)
- id = id.id unless id.kind_of?(Fixnum)
- method = method.id unless method.kind_of?(Fixnum)
+ id = id.id unless id.kind_of?(Integer)
+ method = method.intern unless method.kind_of?(Integer)
for assoc in @dependency[id]
assoc.delete_if do
|d, m, *o|
@@ -134,7 +134,7 @@ module Finalizer
# 依存関連 R_method(*, dependtant) で結ばれるdependantをfinalizeする.
def finalize_by_dependant(dependant, method = :finalize)
- method = method.id unless method.kind_of?(Fixnum)
+ method = method.intern unless method.kind_of?(Integer)
for id in @dependency.keys
finalize(id, dependant, method)
end
diff --git a/lib/mailread.rb b/lib/mailread.rb
index d9feffb..a5d60c8 100644
--- a/lib/mailread.rb
+++ b/lib/mailread.rb
@@ -1,36 +1,35 @@
class Mail
- def Mail.new(f)
+
+ def initialize(f)
unless f.kind_of?(IO)
f = open(f, "r")
- me = super(f)
- f.close
- else
- me = super
+ opened = true
end
- return me
- end
- def initialize(f)
@header = {}
@body = []
- while f.gets()
- $_.chop!
- next if /^From / # skip From-line
- break if /^$/ # end of header
+ begin
+ while f.gets()
+ $_.chop!
+ next if /^From / # skip From-line
+ break if /^$/ # end of header
- if /^(\S+):\s*(.*)/
- @header[attr = $1.capitalize!] = $2
- elsif attr
- sub!(/^\s*/, '')
- @header[attr] += "\n" + $_
+ if /^(\S+):\s*(.*)/
+ @header[attr = $1.capitalize!] = $2
+ elsif attr
+ sub!(/^\s*/, '')
+ @header[attr] += "\n" + $_
+ end
end
- end
- return unless $_
+ return unless $_
- while f.gets()
- break if /^From /
- @body.push($_)
+ while f.gets()
+ break if /^From /
+ @body.push($_)
+ end
+ ensure
+ f.close if opened
end
end
diff --git a/lib/sync.rb b/lib/sync.rb
index 3e57ed0..b5a3fc3 100644
--- a/lib/sync.rb
+++ b/lib/sync.rb
@@ -1,13 +1,19 @@
#
# sync.rb - カウント付2-フェーズロッククラス
-# $Release Version: 0.1$
+# $Release Version: 0.2$
# $Revision$
# $Date$
# by Keiju ISHITSUKA
#
# --
+# Sync_m, Synchronizer_m
# Usage:
-# Sync_m, Synchronizer_m
+# obj.extend(Sync_m)
+# or
+# class Foo
+# Sync_m.include_to self
+# :
+# end
#
# Sync_m#sync_mode
# Sync_m#sync_locked?, locked?
@@ -19,8 +25,9 @@
#
# Sync, Synchronicer:
# include Sync_m
-#
+# Usage:
# sync = Sync.new
+#
# Sync#mode
# Sync#locked?
# Sync#shared?
@@ -36,15 +43,17 @@ unless defined? Thread
fail "Thread not available for this ruby interpreter"
end
-require "finalize.rb"
+require "finalize"
module Sync_m
RCS_ID='-$Header$-'
+ # lock mode
UN = :UN
SH = :SH
EX = :EX
+ # 例外定義
class Err < Exception
def Err.Fail(*opt)
fail self, sprintf(self::Message, *opt)
@@ -68,21 +77,53 @@ module Sync_m
end
end
- def Sync_m.extend_object(obj)
+ # include and extend initialize methods.
+ def Sync_m.extendable_module(obj)
if Fixnum === obj or TRUE === obj or FALSE === obj or nil == obj
raise TypeError, "Sync_m can't extend to this class(#{obj.type})"
else
begin
- eval "class << obj
- @sync_locked
- end"
- obj.extend(For_primitive_object)
+ obj.instance_eval "@sync_locked"
+ For_general_object
rescue TypeError
- obj.extend(For_general_object)
+ For_primitive_object
end
end
end
+ def Sync_m.includable_module(cl)
+ begin
+ dummy = cl.new
+ Sync_m.extendable_module(dummy)
+ rescue NameError
+ # newが定義されていない時は, DATAとみなす.
+ For_primitive_object
+ end
+ end
+
+ def Sync_m.extend_class(cl)
+ return super if cl.instance_of?(Module)
+
+ # モジュールの時は何もしない. クラスの場合, 適切なモジュールの決定
+ # とaliasを行う.
+ real = includable_module(cl)
+ cl.module_eval %q{
+ include real
+
+ alias locked? sync_locked?
+ alias shared? sync_shared?
+ alias exclusive? sync_exclusive?
+ alias lock sync_lock
+ alias unlock sync_unlock
+ alias try_lock sync_try_lock
+ alias synchronize sync_synchronize
+ }
+ end
+
+ def Sync_m.extend_object(obj)
+ obj.extend(Sync_m.extendable_module(obj))
+ end
+
def sync_extended
unless (defined? locked? and
defined? shared? and
@@ -94,7 +135,7 @@ module Sync_m
eval "class << self
alias locked? sync_locked?
alias shared? sync_shared?
- alias excluive? sync_exclusive?
+ alias exclusive? sync_exclusive?
alias lock sync_lock
alias unlock sync_unlock
alias try_lock sync_try_lock
@@ -103,6 +144,7 @@ module Sync_m
end
end
+ # accessing
def sync_locked?
sync_mode != UN
end
@@ -115,6 +157,7 @@ module Sync_m
sync_mode == EX
end
+ # locking methods.
def sync_try_lock(mode = EX)
return unlock if sync_mode == UN
@@ -238,7 +281,6 @@ module Sync_m
self.sync_ex_locker = Thread.current
self.sync_ex_count = 1
ret = TRUE
-
elsif sync_mode == EX && sync_ex_locker == Thread.current
self.sync_ex_count = sync_ex_count + 1
ret = TRUE
@@ -262,6 +304,7 @@ module Sync_m
end
end
+ # internal class
module For_primitive_object
include Sync_m
@@ -281,12 +324,18 @@ module Sync_m
Finalizer.add(obj, For_primitive_object, :sync_finalize)
end
- def sync_extended
+ def initialize
super
Sync_Locked[id] = LockState.new(UN, [], [], Hash.new, nil, 0 )
+ self
+ end
+
+ def sync_extended
+ super
+ initialize
end
- def sync_finalize
+ def For_primitive_object.sync_finalize(id)
wait = Sync_Locked.delete(id)
# waiting == [] ときだけ GCされるので, 待ち行列の解放は意味がない.
end
@@ -343,7 +392,7 @@ module Sync_m
obj.sync_extended
end
- def sync_extended
+ def initialize
super
@sync_mode = UN
@sync_waiting = []
@@ -351,6 +400,12 @@ module Sync_m
@sync_sh_locker = Hash.new
@sync_ex_locker = nil
@sync_ex_count = 0
+ self
+ end
+
+ def sync_extended
+ super
+ initialize
end
attr :sync_mode, TRUE
@@ -366,10 +421,11 @@ end
Synchronizer_m = Sync_m
class Sync
- include Sync_m::For_general_object
+ Sync_m.extend_class self
+ #include Sync_m
def initialize
- sync_extended
+ super
end
end
diff --git a/lib/tk.rb b/lib/tk.rb
index df68874..2cbbec0 100644
--- a/lib/tk.rb
+++ b/lib/tk.rb
@@ -1,12 +1,483 @@
#
-# tk.rb - Tk interface for ruby
+# tk.rb - Tk interface modue using tcltklib
# $Date$
-# by Yukihiro Matsumoto <matz@caelum.co.jp>
+# by Yukihiro Matsumoto <matz@netlab.co.jp>
-if defined? Thread and $tk_thread_safe
- require "tkthcore"
-else
- require "tkcore"
+# use Shigehiro's tcltklib
+require "tcltklib"
+require "tkutil"
+
+module TkComm
+ None = Object.new
+ def None.to_s
+ 'None'
+ end
+
+ Tk_CMDTBL = {}
+ Tk_WINDOWS = {}
+
+ def error_at
+ frames = caller(1)
+ frames.delete_if do |c|
+ c =~ %r!/tk(|core|thcore|canvas|text|entry|scrollbox)\.rb:\d+!
+ end
+ frames
+ end
+ private :error_at
+
+ def tk_tcl2ruby(val)
+ case val
+ when /^-?\d+$/
+ val.to_i
+ when /^\./
+ Tk_WINDOWS[val]
+ when /^rb_out (c\d+)/
+ Tk_CMDTBL[$1]
+ when / /
+ val.split.collect{|elt|
+ tk_tcl2ruby(elt)
+ }
+ when /^-?\d+\.\d*$/
+ val.to_f
+ else
+ val
+ end
+ end
+
+ def tk_split_list(str)
+ idx = str.index('{')
+ return tk_tcl2ruby(str) if not idx
+
+ list = tk_tcl2ruby(str[0,idx])
+ str = str[idx+1..-1]
+ i = -1
+ brace = 1
+ str.each_byte {|c|
+ i += 1
+ brace += 1 if c == ?{
+ brace -= 1 if c == ?}
+ break if brace == 0
+ }
+ if str[0, i] == ' '
+ list.push ' '
+ else
+ list.push tk_split_list(str[0, i])
+ end
+ list += tk_split_list(str[i+1..-1])
+ list
+ end
+ private :tk_tcl2ruby, :tk_split_list
+
+ def hash_kv(keys)
+ conf = []
+ if keys and keys != None
+ for k, v in keys
+ conf.push("-#{k}")
+ v = install_cmd(v) if v.kind_of? Proc
+ conf.push(v)
+ end
+ end
+ conf
+ end
+ private :hash_kv
+
+ def bool(val)
+ case val
+ when "1", 1, 'yes', 'true'
+ TRUE
+ else
+ FALSE
+ end
+ end
+ def number(val)
+ case val
+ when /^-?\d+$/
+ val.to_i
+ when /^-?\d+\.\d*$/
+ val.to_f
+ else
+ val
+ end
+ end
+ def string(val)
+ if val == "{}"
+ ''
+ elsif val[0] == ?{
+ val[1..-2]
+ else
+ val
+ end
+ end
+ def list(val)
+ tk_split_list(val)
+ end
+ def window(val)
+ Tk_WINDOWS[val]
+ end
+ def procedure(val)
+ if val =~ /^rb_out (c\d+)/
+ Tk_CMDTBL[$1]
+ else
+ nil
+ end
+ end
+ private :bool, :number, :string, :list, :window, :procedure
+
+ Tk_IDs = [0] # [0]-cmdid, [1]-winid
+ def _curr_cmd_id
+ id = format("c%.4d", Tk_IDs[0])
+ end
+ def _next_cmd_id
+ id = _curr_cmd_id
+ Tk_IDs[0] += 1
+ end
+ def install_cmd(cmd)
+ return '' if cmd == ''
+ id = _next_cmd_id
+ Tk_CMDTBL[id] = cmd
+ @cmdtbl = [] if not @cmdtbl
+ @cmdtbl.push id
+ return format("rb_out %s", id);
+ end
+ def uninstall_cmd(id)
+ Tk_CMDTBL[id] = nil
+ end
+ private :install_cmd, :uninstall_cmd
+
+ def install_win(ppath)
+ id = format("w%.4d", Tk_IDs[0])
+ Tk_IDs[0] += 1
+ if !ppath or ppath == "."
+ @path = format(".%s", id);
+ else
+ @path = format("%s.%s", ppath, id)
+ end
+ Tk_WINDOWS[@path] = self
+ end
+
+ def uninstall_win()
+ Tk_WINDOWS[@path] = nil
+ end
+
+ class Event
+ def initialize(seq,b,f,h,k,s,t,w,x,y,aa,ee,kk,nn,ww,tt,xx,yy)
+ @serial = seq
+ @num = b
+ @focus = (f == 1)
+ @height = h
+ @keycode = k
+ @state = s
+ @time = t
+ @width = w
+ @x = x
+ @y = y
+ @char = aa
+ @send_event = (ee == 1)
+ @keysym = kk
+ @keysym_num = nn
+ @type = tt
+ @widget = ww
+ @x_root = xx
+ @y_root = yy
+ end
+ attr :serial
+ attr :num
+ attr :focus
+ attr :height
+ attr :keycode
+ attr :state
+ attr :time
+ attr :width
+ attr :x
+ attr :y
+ attr :char
+ attr :send_event
+ attr :keysym
+ attr :keysym_num
+ attr :type
+ attr :widget
+ attr :x_root
+ attr :y_root
+ end
+
+ def install_bind(cmd, args=nil)
+ if args
+ id = install_cmd(proc{|arg|
+ TkUtil.eval_cmd cmd, *arg
+ })
+ id + " " + args
+ else
+ id = install_cmd(proc{|arg|
+ TkUtil.eval_cmd cmd, Event.new(*arg)
+ })
+ id + ' %# %b %f %h %k %s %t %w %x %y %A %E %K %N %W %T %X %Y'
+ end
+ end
+
+ def _bind(path, context, cmd, args=nil)
+ begin
+ id = install_bind(cmd, args)
+ tk_call 'bind', path, "<#{context}>", id
+ rescue
+ uninstall_cmd(id)
+ fail
+ end
+ end
+ private :install_bind, :_bind
+
+ def bind_all(context, cmd=Proc.new, args=nil)
+ _bind 'all', context, cmd, args
+ end
+
+ def pack(*args)
+ TkPack.configure *args
+ end
+
+ def after(ms, cmd=Proc.new)
+ myid = _curr_cmd_id
+ tk_call 'after', ms,
+ install_cmd(proc{
+ TkUtil.eval_cmd cmd
+ uninstall_cmd myid
+ })
+ end
+end
+
+module TkCore
+ include TkComm
+ extend TkComm
+
+ INTERP = TclTkIp.new
+ INTERP._eval("proc rb_out {args} { ruby [format \"TkCore.callback %%Q!%s!\" $args] }")
+
+ def TkCore.callback(arg)
+ arg = Array(tk_split_list(arg))
+ TkUtil.eval_cmd Tk_CMDTBL[arg.shift], *arg
+ end
+
+ def mainloop
+ TclTkLib.mainloop
+ end
+
+ def _get_eval_string(*args)
+ argstr = ""
+ args.each{|arg|
+ next if arg == None
+ if arg.kind_of?(Hash)
+ str = hash_kv(arg).join(" ")
+ elsif arg == nil
+ str = ""
+ elsif arg == false
+ str = "0"
+ elsif arg == true
+ str = "1"
+ elsif (arg.respond_to?(:to_eval))
+ str = arg.to_eval()
+ else
+ str = arg.to_s()
+ end
+ argstr += " " if argstr != ""
+ argstr += '"' + str.gsub(/[][$"]/, '\\\\\&') + '"'
+ }
+ return argstr
+ end
+
+ def tk_call(*args)
+ argstr = _get_eval_string(*args)
+
+ res = INTERP._eval(argstr)
+ if INTERP._return_value() != 0
+ fail RuntimeError, res, error_at
+ end
+ return res
+ end
+end
+
+module Tk
+ include TkCore
+ extend Tk
+
+ def root
+ TkRoot.new
+ end
+
+ def bell
+ tk_call 'bell'
+ end
+
+ def mainloop
+ TclTkLib.mainloop
+ end
+
+ module Scrollable
+ def xscrollcommand(cmd=Proc.new)
+ configure_cmd 'xscrollcommand', cmd
+ end
+ def yscrollcommand(cmd=Proc.new)
+ configure_cmd 'yscrollcommand', cmd
+ end
+ end
+
+ module Wm
+ def aspect(*args)
+ w = window(tk_call('wm', 'grid', path, *args))
+ w.split.collect{|s|s.to_i} if args.length == 0
+ end
+ def client(name=None)
+ tk_call 'wm', 'client', path, name
+ end
+ def colormapwindows(*args)
+ list(tk_call('wm', 'colormapwindows', path, *args))
+ end
+ def wm_command(value=None)
+ string(tk_call('wm', 'command', path, value))
+ end
+ def deiconify
+ tk_call 'wm', 'deiconify', path
+ end
+ def focusmodel(*args)
+ tk_call 'wm', 'focusmodel', path, *args
+ end
+ def frame
+ tk_call 'wm', 'frame', path
+ end
+ def geometry(*args)
+ list(tk_call('wm', 'geometry', path, *args))
+ end
+ def grid(*args)
+ w = tk_call('wm', 'grid', path, *args)
+ list(w) if args.size == 0
+ end
+ def group(*args)
+ tk_call 'wm', 'path', path, *args
+ end
+ def iconbitmap(*args)
+ tk_call 'wm', 'bitmap', path, *args
+ end
+ def iconify
+ tk_call 'wm', 'iconify'
+ end
+ def iconmask(*args)
+ tk_call 'wm', 'iconmask', path, *args
+ end
+ def iconname(*args)
+ tk_call 'wm', 'iconname', path, *args
+ end
+ def iconposition(*args)
+ w = tk_call('wm', 'iconposition', path, *args)
+ list(w) if args.size == 0
+ end
+ def iconwindow(*args)
+ tk_call 'wm', 'iconwindow', path, *args
+ end
+ def maxsize(*args)
+ w = tk_call('wm', 'maxsize', path, *args)
+ list(w) if not args.size == 0
+ end
+ def minsize(*args)
+ w = tk_call('wm', 'minsize', path, *args)
+ list(w) if args.size == 0
+ end
+ def overrideredirect(bool=None)
+ if bool == None
+ bool(tk_call('wm', 'overrideredirect', path))
+ else
+ tk_call 'wm', 'overrideredirect', path, bool
+ end
+ end
+ def positionfrom(*args)
+ tk_call 'wm', 'positionfrom', path, *args
+ end
+ def protocol(name, func=None)
+ func = install_cmd(func) if not func == None
+ tk_call 'wm', 'command', path, name, func
+ end
+ def resizable(*args)
+ w = tk_call('wm', 'resizable', path, *args)
+ if args.length == 0
+ list(w).collect{|e| bool(e)}
+ end
+ end
+ def sizefrom(*args)
+ list(tk_call('wm', 'sizefrom', path, *args))
+ end
+ def state
+ tk_call 'wm', 'state', path
+ end
+ def title(*args)
+ tk_call 'wm', 'title', path, *args
+ end
+ def transient(*args)
+ tk_call 'wm', 'transient', path, *args
+ end
+ def withdraw
+ tk_call 'wm', 'withdraw', path
+ end
+ end
+end
+
+class TkVariable
+ include Tk
+
+ Tk_VARIABLE_ID = ["v00000"]
+ def initialize(val="")
+ @id = Tk_VARIABLE_ID[0]
+ Tk_VARIABLE_ID[0] = Tk_VARIABLE_ID[0].succ
+ INTERP._eval(format('global %s; set %s %s', @id, @id, _get_eval_string(val)))
+ end
+
+ def id
+ @id
+ end
+
+ def value
+ INTERP._eval(format('global %s; set %s', @id, @id))
+ end
+
+ def value=(val)
+ INTERP._eval(format('global %s; set %s %s', @id, @id, _get_eval_string(val)))
+ end
+
+ def to_i
+ Integer(number(value))
+ end
+
+ def to_f
+ Float(number(value))
+ end
+
+ def to_s
+ String(string(value))
+ end
+
+ def inspect
+ format "<TkVariable: %s>", @id
+ end
+
+ def ==(other)
+ case other
+ when TkVariable
+ self.equal(self)
+ when String
+ self.to_s == other
+ when Integer
+ self.to_i == other
+ when Float
+ self.to_f == other
+ when Array
+ self.to_a == other
+ else
+ false
+ end
+ end
+
+ def to_a
+ list(value)
+ end
+
+ def to_eval
+ @id
+ end
end
module TkSelection
@@ -290,7 +761,7 @@ module TkPack
end
def propagate(master, bool=None)
- bool(tk_call('pack', 'propagate', mastaer.epath, bool))
+ bool(tk_call('pack', 'propagate', master.epath, bool))
end
module_function :configure, :forget, :propagate
end
@@ -324,6 +795,10 @@ class TkObject<TkKernel
return @path
end
+ def to_eval
+ @path
+ end
+
def tk_send(cmd, *rest)
tk_call path, cmd, *rest
end
@@ -372,60 +847,10 @@ class TkObject<TkKernel
end
end
-
-class TkVariable
- include Tk
- $tk_variable_id = "v00000"
- def initialize(val="")
- @id = $tk_variable_id
- $tk_variable_id = $tk_variable_id.succ
- tk_call(format('global %s; set %s', @id, @id), val)
- end
-
- def id
- @id
- end
-
- def value
- tk_call(format('global %s; set', @id), @id)
- end
-
- def value=(val)
- tk_call(format('global %s; set %s', @id, @id), val)
- end
-
- def to_i
- Integer(number(value))
- end
-
- def to_f
- Float(number(value))
- end
-
- def to_s
- String(string(value))
- end
-
- def inspect
- format "<TkVariable: %s>", @id
- end
-
- def to_a
- list(value)
- end
-end
-
class TkWindow<TkObject
- $tk_window_id = "w00000"
+
def initialize(parent=nil, keys=nil)
- id = $tk_window_id
- $tk_window_id = $tk_window_id.succ
- if !parent or parent == Tk.root
- @path = format(".%s", id);
- else
- @path = format("%s.%s", parent.path, id)
- end
- $tk_window_list[@path] = self
+ install_win(if parent then parent.path end)
create_self
if keys
tk_call @path, 'configure', *hash_kv(keys)
@@ -527,30 +952,32 @@ class TkWindow<TkObject
uninstall_cmd id
end
end
- $tk_window_list[path] = nil
- super
+ uninstall_win
end
end
class TkRoot<TkWindow
include Wm
+ ROOT = []
def TkRoot.new
- return $tk_root if $tk_root
- super
+ return ROOT[0] if ROOT[0]
+ new = super
+ ROOT[0] = new
+ end
+ def create_self
+ @path = '.'
end
def path
"."
end
- $tk_root = TkRoot.new
- $tk_window_list['.'] = $tk_root
end
class TkToplevel<TkWindow
include Wm
- def initialize(parent=nil, screen=nil, classname=nil)
+ def initialize(parent=nil, screen=nil, classname=nil, keys=nil)
@screen = screen if screen
@classname = classname if classname
- super
+ super(parent, keys)
end
def create_self
@@ -661,7 +1088,7 @@ class TkScrollbar<TkWindow
ary1 = tk_send('get', path).split
ary2 = []
for i in ary1
- push number(i)
+ ary2.push number(i)
end
ary2
end
@@ -671,7 +1098,6 @@ class TkScrollbar<TkWindow
end
end
-# abstract class for Text and Listbox
class TkTextWin<TkWindow
def bbox(index)
tk_send 'bbox', index
@@ -682,9 +1108,6 @@ class TkTextWin<TkWindow
def get(*index)
tk_send 'get', *index
end
- def insert(index, *rest)
- tk_send 'insert', index, *rest
- end
def index(index)
tk_send 'index', index
end
@@ -793,8 +1216,10 @@ module TkComposite
private :initialize_composite
def delegate(option, *wins)
- @delegates = {} if not @delegates
- @delegates['DEFAULT'] = @frame
+ unless @delegates
+ @delegates = {}
+ @delegates['DEFAULT'] = @frame
+ end
if option.kind_of?(String)
@delegates[option] = wins
else
diff --git a/lib/tktext.rb b/lib/tktext.rb
index 2488f77..47e11f2 100644
--- a/lib/tktext.rb
+++ b/lib/tktext.rb
@@ -131,7 +131,7 @@ class TkTextMark<TkObject
@t = parent
@path = @id = $tk_text_mark
$tk_text_mark = $tk_text_mark.succ
- tk_call @t.path, 'set', @id, index
+ tk_call @t.path, 'mark', 'set', @id, index
@t._addtag id, self
end
def id
@@ -139,7 +139,7 @@ class TkTextMark<TkObject
end
def set(where)
- tk_call @t.path, 'mark', 'unset', @id, where
+ tk_call @t.path, 'mark', 'set', @id, where
end
def unset