1999-08-13 01:37:52 -04:00
|
|
|
#
|
2001-05-06 11:06:00 -04:00
|
|
|
# tk.rb - Tk interface module using tcltklib
|
1999-08-13 01:37:52 -04:00
|
|
|
# $Date$
|
2001-05-06 11:06:00 -04:00
|
|
|
# by Yukihiro Matsumoto <matz@netlab.jp>
|
1999-08-13 01:37:52 -04:00
|
|
|
|
|
|
|
# use Shigehiro's tcltklib
|
|
|
|
require "tcltklib"
|
|
|
|
require "tkutil"
|
|
|
|
|
|
|
|
module TkComm
|
1999-08-24 04:21:56 -04:00
|
|
|
WidgetClassNames = {}
|
|
|
|
|
1999-08-13 01:37:52 -04:00
|
|
|
None = Object.new
|
|
|
|
def None.to_s
|
|
|
|
'None'
|
|
|
|
end
|
|
|
|
|
|
|
|
Tk_CMDTBL = {}
|
|
|
|
Tk_WINDOWS = {}
|
|
|
|
|
|
|
|
def error_at
|
|
|
|
frames = caller()
|
|
|
|
frames.delete_if do |c|
|
|
|
|
c =~ %r!/tk(|core|thcore|canvas|text|entry|scrollbox)\.rb:\d+!
|
|
|
|
end
|
|
|
|
frames
|
|
|
|
end
|
|
|
|
private :error_at
|
|
|
|
|
|
|
|
def _genobj_for_tkwidget(path)
|
|
|
|
return TkRoot.new if path == '.'
|
|
|
|
|
|
|
|
begin
|
|
|
|
tk_class = TkCore::INTERP._invoke('winfo', 'class', path)
|
|
|
|
rescue
|
|
|
|
return path
|
|
|
|
end
|
|
|
|
|
1999-08-24 04:21:56 -04:00
|
|
|
ruby_class = WidgetClassNames[tk_class]
|
1999-08-13 01:37:52 -04:00
|
|
|
gen_class_name = ruby_class.name + 'GeneratedOnTk'
|
|
|
|
unless Object.const_defined? gen_class_name
|
|
|
|
eval "class #{gen_class_name}<#{ruby_class.name}
|
|
|
|
def initialize(path)
|
|
|
|
@path=path
|
|
|
|
Tk_WINDOWS[@path] = self
|
|
|
|
end
|
|
|
|
end"
|
|
|
|
end
|
|
|
|
eval "#{gen_class_name}.new('#{path}')"
|
|
|
|
end
|
|
|
|
|
|
|
|
def tk_tcl2ruby(val)
|
|
|
|
if val =~ /^rb_out (c\d+)/
|
|
|
|
return Tk_CMDTBL[$1]
|
|
|
|
end
|
|
|
|
if val.include? ?\s
|
|
|
|
return val.split.collect{|v| tk_tcl2ruby(v)}
|
|
|
|
end
|
|
|
|
case val
|
|
|
|
when /^@font/
|
|
|
|
TkFont.get_obj(val)
|
|
|
|
when /^-?\d+$/
|
|
|
|
val.to_i
|
|
|
|
when /^\./
|
|
|
|
Tk_WINDOWS[val] ? Tk_WINDOWS[val] : _genobj_for_tkwidget(val)
|
|
|
|
when / /
|
|
|
|
val.split.collect{|elt|
|
|
|
|
tk_tcl2ruby(elt)
|
|
|
|
}
|
|
|
|
when /^-?\d+\.\d*$/
|
|
|
|
val.to_f
|
|
|
|
else
|
|
|
|
val
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def tk_split_list(str)
|
|
|
|
return [] if str == ""
|
|
|
|
idx = str.index('{')
|
2001-10-29 00:07:26 -05:00
|
|
|
while idx and idx > 0 and str[idx-1] == ?\\
|
|
|
|
idx = str.index('{', idx+1)
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
return tk_tcl2ruby(str) unless idx
|
|
|
|
|
|
|
|
list = tk_tcl2ruby(str[0,idx])
|
|
|
|
list = [] if list == ""
|
|
|
|
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
|
|
|
|
|
|
|
|
def tk_split_simplelist(str)
|
|
|
|
return [] if str == ""
|
|
|
|
idx = str.index('{')
|
2001-10-29 00:07:26 -05:00
|
|
|
while idx and idx > 0 and str[idx-1] == ?\\
|
|
|
|
idx = str.index('{', idx+1)
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
return str.split unless idx
|
|
|
|
|
|
|
|
list = str[0,idx].split
|
|
|
|
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 i == 0
|
|
|
|
list.push ''
|
|
|
|
elsif str[0, i] == ' '
|
|
|
|
list.push ' '
|
|
|
|
else
|
|
|
|
list.push str[0..i-1]
|
|
|
|
end
|
|
|
|
list += tk_split_simplelist(str[i+1..-1])
|
|
|
|
list
|
|
|
|
end
|
|
|
|
private :tk_tcl2ruby, :tk_split_list, :tk_split_simplelist
|
|
|
|
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
def _symbolkey2str(keys)
|
|
|
|
h = {}
|
|
|
|
keys.each{|key,value| h[key.to_s] = value}
|
|
|
|
h
|
|
|
|
end
|
|
|
|
private :_symbolkey2str
|
|
|
|
|
1999-08-13 01:37:52 -04:00
|
|
|
def hash_kv(keys)
|
|
|
|
conf = []
|
|
|
|
if keys and keys != None
|
|
|
|
for k, v in keys
|
|
|
|
conf.push("-#{k}")
|
|
|
|
conf.push(v)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
conf
|
|
|
|
end
|
|
|
|
private :hash_kv
|
|
|
|
|
|
|
|
def array2tk_list(ary)
|
|
|
|
ary.collect{|e|
|
|
|
|
if e.kind_of? Array
|
|
|
|
"{#{array2tk_list(e)}}"
|
|
|
|
elsif e.kind_of? Hash
|
|
|
|
"{#{e.to_a.collect{|ee| array2tk_list(ee)}.join(' ')}}"
|
|
|
|
else
|
|
|
|
s = _get_eval_string(e)
|
|
|
|
(s.index(/\s/))? "{#{s}}": s
|
|
|
|
end
|
|
|
|
}.join(" ")
|
|
|
|
end
|
|
|
|
private :array2tk_list
|
|
|
|
|
|
|
|
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).to_a
|
|
|
|
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
|
|
|
|
|
|
|
|
def _get_eval_string(str)
|
|
|
|
return nil if str == None
|
2000-01-31 22:12:21 -05:00
|
|
|
if str.kind_of?(String)
|
|
|
|
# do nothing
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
elsif str.kind_of?(Symbol)
|
|
|
|
str = str.id2name
|
2000-01-31 22:12:21 -05:00
|
|
|
elsif str.kind_of?(Hash)
|
1999-08-13 01:37:52 -04:00
|
|
|
str = hash_kv(str).join(" ")
|
|
|
|
elsif str.kind_of?(Array)
|
|
|
|
str = array2tk_list(str)
|
|
|
|
elsif str.kind_of?(Proc)
|
|
|
|
str = install_cmd(str)
|
|
|
|
elsif str == nil
|
|
|
|
str = ""
|
|
|
|
elsif str == false
|
|
|
|
str = "0"
|
|
|
|
elsif str == true
|
|
|
|
str = "1"
|
|
|
|
elsif (str.respond_to?(:to_eval))
|
|
|
|
str = str.to_eval()
|
|
|
|
else
|
|
|
|
str = str.to_s()
|
|
|
|
end
|
|
|
|
return str
|
|
|
|
end
|
|
|
|
private :_get_eval_string
|
|
|
|
|
2000-07-14 00:34:43 -04:00
|
|
|
def ruby2tcl(v)
|
|
|
|
if v.kind_of?(Hash)
|
|
|
|
v = hash_kv(v)
|
|
|
|
v.flatten!
|
|
|
|
v.collect{|e|ruby2tcl(e)}
|
|
|
|
else
|
|
|
|
_get_eval_string(v)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
private :ruby2tcl
|
|
|
|
|
1999-08-13 01:37:52 -04:00
|
|
|
Tk_IDs = [0, 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
|
|
|
|
id
|
|
|
|
end
|
|
|
|
def install_cmd(cmd)
|
|
|
|
return '' if cmd == ''
|
|
|
|
id = _next_cmd_id
|
|
|
|
Tk_CMDTBL[id] = cmd
|
|
|
|
@cmdtbl = [] unless @cmdtbl
|
|
|
|
@cmdtbl.push id
|
|
|
|
return format("rb_out %s", id);
|
|
|
|
end
|
|
|
|
def uninstall_cmd(id)
|
2000-01-17 03:37:53 -05:00
|
|
|
id = $1 if /rb_out (c\d+)/ =~ id
|
2002-10-02 02:02:17 -04:00
|
|
|
Tk_CMDTBL.delete(id)
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
private :install_cmd, :uninstall_cmd
|
|
|
|
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
def install_win(ppath,name=nil)
|
|
|
|
if !name or name == ''
|
|
|
|
name = format("w%.4d", Tk_IDs[1])
|
|
|
|
Tk_IDs[1] += 1
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
if !ppath or ppath == "."
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
@path = format(".%s", name);
|
1999-08-13 01:37:52 -04:00
|
|
|
else
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
@path = format("%s.%s", ppath, name)
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
Tk_WINDOWS[@path] = self
|
|
|
|
end
|
|
|
|
|
|
|
|
def uninstall_win()
|
2002-10-02 02:02:17 -04:00
|
|
|
Tk_WINDOWS.delete(@path)
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
class Event
|
2000-11-20 02:31:55 -05:00
|
|
|
def initialize(seq,a,b,c,d,f,h,k,m,o,p,s,t,w,x,y,
|
|
|
|
aa,bb,dd,ee,kk,nn,rr,ss,tt,ww,xx,yy)
|
1999-08-13 01:37:52 -04:00
|
|
|
@serial = seq
|
2000-11-20 02:31:55 -05:00
|
|
|
@above = a
|
1999-08-13 01:37:52 -04:00
|
|
|
@num = b
|
2000-11-20 02:31:55 -05:00
|
|
|
@count = c
|
|
|
|
@detail = d
|
1999-08-13 01:37:52 -04:00
|
|
|
@focus = (f == 1)
|
|
|
|
@height = h
|
|
|
|
@keycode = k
|
2000-11-20 02:31:55 -05:00
|
|
|
@mode = m
|
|
|
|
@override = (o == 1)
|
|
|
|
@place = p
|
1999-08-13 01:37:52 -04:00
|
|
|
@state = s
|
|
|
|
@time = t
|
|
|
|
@width = w
|
|
|
|
@x = x
|
|
|
|
@y = y
|
|
|
|
@char = aa
|
2000-11-20 02:31:55 -05:00
|
|
|
@borderwidth = bb
|
|
|
|
@wheel_delta = dd
|
1999-08-13 01:37:52 -04:00
|
|
|
@send_event = (ee == 1)
|
|
|
|
@keysym = kk
|
|
|
|
@keysym_num = nn
|
2000-11-20 02:31:55 -05:00
|
|
|
@rootwin_id = rr
|
|
|
|
@subwindow = ss
|
1999-08-13 01:37:52 -04:00
|
|
|
@type = tt
|
|
|
|
@widget = ww
|
|
|
|
@x_root = xx
|
|
|
|
@y_root = yy
|
|
|
|
end
|
|
|
|
attr :serial
|
2000-11-20 02:31:55 -05:00
|
|
|
attr :above
|
1999-08-13 01:37:52 -04:00
|
|
|
attr :num
|
2000-11-20 02:31:55 -05:00
|
|
|
attr :count
|
|
|
|
attr :detail
|
1999-08-13 01:37:52 -04:00
|
|
|
attr :focus
|
|
|
|
attr :height
|
|
|
|
attr :keycode
|
2000-11-20 02:31:55 -05:00
|
|
|
attr :mode
|
|
|
|
attr :override
|
|
|
|
attr :place
|
1999-08-13 01:37:52 -04:00
|
|
|
attr :state
|
|
|
|
attr :time
|
|
|
|
attr :width
|
|
|
|
attr :x
|
|
|
|
attr :y
|
|
|
|
attr :char
|
2000-11-20 02:31:55 -05:00
|
|
|
attr :borderwidth
|
|
|
|
attr :wheel_delta
|
1999-08-13 01:37:52 -04:00
|
|
|
attr :send_event
|
|
|
|
attr :keysym
|
|
|
|
attr :keysym_num
|
2000-11-20 02:31:55 -05:00
|
|
|
attr :rootwin_id
|
|
|
|
attr :subwindow
|
1999-08-13 01:37:52 -04:00
|
|
|
attr :type
|
|
|
|
attr :widget
|
|
|
|
attr :x_root
|
|
|
|
attr :y_root
|
|
|
|
end
|
|
|
|
|
|
|
|
def install_bind(cmd, args=nil)
|
|
|
|
if args
|
2000-08-02 00:54:21 -04:00
|
|
|
id = install_cmd(proc{|*arg|
|
1999-08-13 01:37:52 -04:00
|
|
|
TkUtil.eval_cmd cmd, *arg
|
|
|
|
})
|
|
|
|
id + " " + args
|
|
|
|
else
|
|
|
|
id = install_cmd(proc{|arg|
|
|
|
|
TkUtil.eval_cmd cmd, Event.new(*arg)
|
|
|
|
})
|
2000-11-20 02:31:55 -05:00
|
|
|
id + ' %# %a %b %c %d %f %h %k %m %o %p %s %t %w %x %y' +
|
|
|
|
' %A %B %D %E %K %N %R %S %T %W %X %Y'
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def tk_event_sequence(context)
|
|
|
|
if context.kind_of? TkVirtualEvent
|
|
|
|
context = context.path
|
|
|
|
end
|
|
|
|
if context.kind_of? Array
|
|
|
|
context = context.collect{|ev|
|
2001-05-06 11:06:00 -04:00
|
|
|
if ev.kind_of? TkVirtualEvent
|
1999-08-13 01:37:52 -04:00
|
|
|
ev.path
|
|
|
|
else
|
|
|
|
ev
|
|
|
|
end
|
|
|
|
}.join("><")
|
|
|
|
end
|
|
|
|
if /,/ =~ context
|
|
|
|
context = context.split(/\s*,\s*/).join("><")
|
|
|
|
else
|
|
|
|
context
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
1999-08-24 04:21:56 -04:00
|
|
|
def _bind_core(mode, what, context, cmd, args=nil)
|
|
|
|
id = install_bind(cmd, args) if cmd
|
1999-08-13 01:37:52 -04:00
|
|
|
begin
|
1999-08-24 04:21:56 -04:00
|
|
|
tk_call(*(what + ["<#{tk_event_sequence(context)}>", mode + id]))
|
1999-08-13 01:37:52 -04:00
|
|
|
rescue
|
1999-08-24 04:21:56 -04:00
|
|
|
uninstall_cmd(id) if cmd
|
1999-08-13 01:37:52 -04:00
|
|
|
fail
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
1999-08-24 04:21:56 -04:00
|
|
|
def _bind(what, context, cmd, args=nil)
|
|
|
|
_bind_core('', what, context, cmd, args)
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
1999-08-24 04:21:56 -04:00
|
|
|
def _bind_append(what, context, cmd, args=nil)
|
|
|
|
_bind_core('+', what, context, cmd, args)
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
2000-04-10 01:57:37 -04:00
|
|
|
def _bind_remove(what, context)
|
|
|
|
tk_call(*(what + ["<#{tk_event_sequence(context)}>", '']))
|
|
|
|
end
|
|
|
|
|
1999-08-24 04:21:56 -04:00
|
|
|
def _bindinfo(what, context=nil)
|
1999-08-13 01:37:52 -04:00
|
|
|
if context
|
1999-08-24 04:21:56 -04:00
|
|
|
tk_call(*what+["<#{tk_event_sequence(context)}>"]).collect {|cmdline|
|
1999-08-13 01:37:52 -04:00
|
|
|
if cmdline =~ /^rb_out (c\d+)\s+(.*)$/
|
|
|
|
[Tk_CMDTBL[$1], $2]
|
|
|
|
else
|
|
|
|
cmdline
|
|
|
|
end
|
|
|
|
}
|
|
|
|
else
|
2001-05-06 11:06:00 -04:00
|
|
|
tk_split_simplelist(tk_call(*what)).collect!{|seq|
|
|
|
|
l = seq.scan(/<*[^<>]+>*/).collect!{|subseq|
|
|
|
|
case (subseq)
|
|
|
|
when /^<<[^<>]+>>$/
|
|
|
|
TkVirtualEvent.getobj(subseq[1..-2])
|
|
|
|
when /^<[^<>]+>$/
|
|
|
|
subseq[1..-2]
|
|
|
|
else
|
|
|
|
subseq.split('')
|
|
|
|
end
|
|
|
|
}.flatten
|
|
|
|
(l.size == 1) ? l[0] : l
|
1999-08-13 01:37:52 -04:00
|
|
|
}
|
|
|
|
end
|
|
|
|
end
|
2000-01-17 03:37:53 -05:00
|
|
|
private :install_bind, :tk_event_sequence,
|
2000-04-10 02:05:19 -04:00
|
|
|
:_bind_core, :_bind, :_bind_append, :_bind_remove, :_bindinfo
|
2000-01-17 03:37:53 -05:00
|
|
|
|
|
|
|
def bind(tagOrClass, context, cmd=Proc.new, args=nil)
|
|
|
|
_bind(["bind", tagOrClass], context, cmd, args)
|
|
|
|
end
|
|
|
|
|
|
|
|
def bind_append(tagOrClass, context, cmd=Proc.new, args=nil)
|
|
|
|
_bind_append(["bind", tagOrClass], context, cmd, args)
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
|
2000-04-10 01:57:37 -04:00
|
|
|
def bind_remove(tagOrClass, context)
|
|
|
|
_bind_remove(['bind', tagOrClass], context)
|
|
|
|
end
|
|
|
|
|
1999-08-13 01:37:52 -04:00
|
|
|
def bindinfo(tagOrClass, context=nil)
|
1999-08-24 04:21:56 -04:00
|
|
|
_bindinfo(['bind', tagOrClass], context)
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
2000-01-17 03:37:53 -05:00
|
|
|
def bind_all(context, cmd=Proc.new, args=nil)
|
|
|
|
_bind(['bind', 'all'], context, cmd, args)
|
|
|
|
end
|
|
|
|
|
|
|
|
def bind_append_all(context, cmd=Proc.new, args=nil)
|
|
|
|
_bind_append(['bind', 'all'], context, cmd, args)
|
|
|
|
end
|
|
|
|
|
|
|
|
def bindinfo_all(context=nil)
|
|
|
|
_bindinfo(['bind', 'all'], context)
|
|
|
|
end
|
|
|
|
|
1999-08-13 01:37:52 -04:00
|
|
|
def pack(*args)
|
2002-03-08 02:03:09 -05:00
|
|
|
TkPack.configure(*args)
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def grid(*args)
|
2002-03-08 02:03:09 -05:00
|
|
|
TkGrid.configure(*args)
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def update(idle=nil)
|
|
|
|
if idle
|
|
|
|
tk_call 'update', 'idletasks'
|
|
|
|
else
|
|
|
|
tk_call 'update'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
module TkCore
|
|
|
|
include TkComm
|
|
|
|
extend TkComm
|
|
|
|
|
|
|
|
INTERP = TclTkIp.new
|
|
|
|
|
2001-10-29 00:07:26 -05:00
|
|
|
INTERP._invoke("proc", "rb_out", "args", <<-'EOL')
|
|
|
|
regsub -all {!} $args {\\!} args
|
|
|
|
regsub -all "{" $args "\\{" args
|
|
|
|
if {[set st [catch {ruby [format "TkCore.callback %%Q!%s!" $args]} ret]] != 0} {
|
|
|
|
return -code $st $ret
|
|
|
|
} {
|
|
|
|
return $ret
|
|
|
|
}
|
|
|
|
EOL
|
1999-08-13 01:37:52 -04:00
|
|
|
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
EventFlag = TclTkLib::EventFlag
|
|
|
|
|
1999-08-13 01:37:52 -04:00
|
|
|
def callback_break
|
2000-01-31 22:12:21 -05:00
|
|
|
fail TkCallbackBreak, "Tk callback returns 'break' status"
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def callback_continue
|
2000-01-31 22:12:21 -05:00
|
|
|
fail TkCallbackContinue, "Tk callback returns 'continue' status"
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def after(ms, cmd=Proc.new)
|
|
|
|
myid = _curr_cmd_id
|
|
|
|
cmdid = install_cmd(cmd)
|
|
|
|
tk_call("after",ms,cmdid)
|
2002-03-08 02:03:09 -05:00
|
|
|
# return
|
|
|
|
# if false #defined? Thread
|
|
|
|
# Thread.start do
|
|
|
|
# ms = Float(ms)/1000
|
|
|
|
# ms = 10 if ms == 0
|
|
|
|
# sleep ms/1000
|
|
|
|
# cmd.call
|
|
|
|
# end
|
|
|
|
# else
|
|
|
|
# cmdid = install_cmd(cmd)
|
|
|
|
# tk_call("after",ms,cmdid)
|
|
|
|
# end
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
2000-11-27 04:23:38 -05:00
|
|
|
def after_idle(cmd=Proc.new)
|
|
|
|
myid = _curr_cmd_id
|
|
|
|
cmdid = install_cmd(cmd)
|
|
|
|
tk_call('after','idle',cmdid)
|
|
|
|
end
|
|
|
|
|
|
|
|
def clock_clicks(ms=nil)
|
|
|
|
if ms
|
|
|
|
tk_call('clock','clicks','-milliseconds').to_i
|
|
|
|
else
|
|
|
|
tk_call('clock','clicks').to_i
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def clock_format(clk, form=nil)
|
|
|
|
if form
|
|
|
|
tk_call('clock','format',clk,'-format',form).to_i
|
|
|
|
else
|
|
|
|
tk_call('clock','format',clk).to_i
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def clock_formatGMT(clk, form=nil)
|
|
|
|
if form
|
|
|
|
tk_call('clock','format',clk,'-format',form,'-gmt','1').to_i
|
|
|
|
else
|
|
|
|
tk_call('clock','format',clk,'-gmt','1').to_i
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def clock_scan(str, base=nil)
|
|
|
|
if base
|
|
|
|
tk_call('clock','scan',str,'-base',base).to_i
|
|
|
|
else
|
|
|
|
tk_call('clock','scan',str).to_i
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def clock_scanGMT(str, base=nil)
|
|
|
|
if base
|
|
|
|
tk_call('clock','scan',str,'-base',base,'-gmt','1').to_i
|
|
|
|
else
|
|
|
|
tk_call('clock','scan',str,'-gmt','1').to_i
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def clock_seconds
|
|
|
|
tk_call('clock','seconds').to_i
|
|
|
|
end
|
|
|
|
|
1999-08-13 01:37:52 -04:00
|
|
|
def TkCore.callback(arg)
|
|
|
|
arg = Array(tk_split_list(arg))
|
|
|
|
_get_eval_string(TkUtil.eval_cmd(Tk_CMDTBL[arg.shift], *arg))
|
|
|
|
end
|
|
|
|
|
2000-06-12 03:48:31 -04:00
|
|
|
def scaling(scale=nil)
|
|
|
|
if scale
|
|
|
|
tk_call('tk', 'scaling', scale)
|
|
|
|
else
|
|
|
|
Float(number(tk_call('tk', 'scaling')))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
def scaling_displayof(win, scale=nil)
|
|
|
|
if scale
|
|
|
|
tk_call('tk', 'scaling', '-displayof', win, scale)
|
|
|
|
else
|
|
|
|
Float(number(tk_call('tk', '-displayof', win, 'scaling')))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
1999-08-13 01:37:52 -04:00
|
|
|
def appname(name=None)
|
|
|
|
tk_call('tk', 'appname', name)
|
|
|
|
end
|
|
|
|
|
|
|
|
def appsend(interp, async, *args)
|
|
|
|
if async
|
|
|
|
tk_call('send', '-async', '--', interp, *args)
|
|
|
|
else
|
|
|
|
tk_call('send', '--', interp, *args)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def rb_appsend(interp, async, *args)
|
2003-03-21 23:31:24 -05:00
|
|
|
args = args.collect!{|c| _get_eval_string(c).gsub(/[\[\]$"]/, '\\\\\&')}
|
1999-08-13 01:37:52 -04:00
|
|
|
args.push(').to_s"')
|
|
|
|
appsend(interp, async, 'ruby "(', *args)
|
|
|
|
end
|
|
|
|
|
|
|
|
def appsend_displayof(interp, win, async, *args)
|
|
|
|
win = '.' if win == nil
|
|
|
|
if async
|
|
|
|
tk_call('send', '-async', '-displayof', win, '--', interp, *args)
|
|
|
|
else
|
|
|
|
tk_call('send', '-displayor', win, '--', interp, *args)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def rb_appsend_displayof(interp, win, async, *args)
|
2003-03-21 23:31:24 -05:00
|
|
|
args = args.collect!{|c| _get_eval_string(c).gsub(/[\[\]$"]/, '\\\\\&')}
|
1999-08-13 01:37:52 -04:00
|
|
|
args.push(').to_s"')
|
|
|
|
appsend_displayof(interp, win, async, 'ruby "(', *args)
|
|
|
|
end
|
|
|
|
|
|
|
|
def info(*args)
|
|
|
|
tk_call('info', *args)
|
|
|
|
end
|
|
|
|
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
def mainloop(check_root = true)
|
|
|
|
TclTkLib.mainloop(check_root)
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
def mainloop_watchdog(check_root = true)
|
|
|
|
TclTkLib.mainloop_watchdog(check_root)
|
|
|
|
end
|
|
|
|
|
|
|
|
def do_one_event(flag = 0)
|
|
|
|
TclTkLib.do_one_event(flag)
|
|
|
|
end
|
|
|
|
|
|
|
|
def set_eventloop_tick(timer_tick)
|
|
|
|
TclTkLib.set_eventloop_tick(timer_tick)
|
|
|
|
end
|
|
|
|
|
|
|
|
def get_eventloop_tick()
|
|
|
|
TclTkLib.get_eventloop_tick
|
|
|
|
end
|
|
|
|
|
|
|
|
def set_eventloop_weight(loop_max, no_event_tick)
|
|
|
|
TclTkLib.set_eventloop_weight(loop_max, no_event_tick)
|
|
|
|
end
|
|
|
|
|
|
|
|
def get_eventloop_weight()
|
|
|
|
TclTkLib.get_eventloop_weight
|
|
|
|
end
|
|
|
|
|
|
|
|
def restart(app_name = nil, use = nil)
|
|
|
|
tk_call('set', 'argv0', app_name) if app_name
|
|
|
|
if use
|
|
|
|
tk_call('set', 'argc', 2)
|
|
|
|
tk_call('set', 'argv', "-use #{use}")
|
|
|
|
end
|
2002-03-08 02:03:09 -05:00
|
|
|
TkCore::INTERP.restart
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
TkComm::Tk_CMDTBL.clear
|
2002-03-08 02:03:09 -05:00
|
|
|
TkComm::Tk_WINDOWS.clear
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
|
1999-08-13 01:37:52 -04:00
|
|
|
def event_generate(window, context, keys=nil)
|
|
|
|
window = window.path if window.kind_of? TkObject
|
|
|
|
if keys
|
|
|
|
tk_call('event', 'generate', window,
|
|
|
|
"<#{tk_event_sequence(context)}>", *hash_kv(keys))
|
|
|
|
else
|
|
|
|
tk_call('event', 'generate', window, "<#{tk_event_sequence(context)}>")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def messageBox(keys)
|
|
|
|
tk_call 'tk_messageBox', *hash_kv(keys)
|
|
|
|
end
|
|
|
|
|
2000-07-06 03:21:26 -04:00
|
|
|
def getOpenFile(keys = nil)
|
1999-08-13 01:37:52 -04:00
|
|
|
tk_call 'tk_getOpenFile', *hash_kv(keys)
|
|
|
|
end
|
|
|
|
|
2000-07-06 03:21:26 -04:00
|
|
|
def getSaveFile(keys = nil)
|
1999-08-13 01:37:52 -04:00
|
|
|
tk_call 'tk_getSaveFile', *hash_kv(keys)
|
|
|
|
end
|
|
|
|
|
2000-07-06 03:21:26 -04:00
|
|
|
def chooseColor(keys = nil)
|
1999-08-13 01:37:52 -04:00
|
|
|
tk_call 'tk_chooseColor', *hash_kv(keys)
|
|
|
|
end
|
|
|
|
|
2000-11-20 02:31:55 -05:00
|
|
|
def chooseDirectory(keys = nil)
|
|
|
|
tk_call 'tk_chooseDirectory', *hash_kv(keys)
|
|
|
|
end
|
|
|
|
|
1999-08-13 01:37:52 -04:00
|
|
|
def tk_call(*args)
|
2002-03-08 02:03:09 -05:00
|
|
|
puts args.inspect if $DEBUG
|
2000-07-14 00:34:43 -04:00
|
|
|
args.collect! {|x|ruby2tcl(x)}
|
1999-08-13 01:37:52 -04:00
|
|
|
args.compact!
|
|
|
|
args.flatten!
|
2002-03-08 02:03:09 -05:00
|
|
|
print "=> ", args.join(" ").inspect, "\n" if $DEBUG
|
1999-08-13 01:37:52 -04:00
|
|
|
begin
|
|
|
|
res = INTERP._invoke(*args)
|
|
|
|
rescue NameError
|
|
|
|
err = $!
|
|
|
|
begin
|
|
|
|
args.unshift "unknown"
|
|
|
|
res = INTERP._invoke(*args)
|
|
|
|
rescue
|
2000-01-31 22:12:21 -05:00
|
|
|
fail unless /^invalid command/ =~ $!
|
|
|
|
fail err
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
if INTERP._return_value() != 0
|
|
|
|
fail RuntimeError, res, error_at
|
|
|
|
end
|
2002-03-08 02:03:09 -05:00
|
|
|
print "==> ", res.inspect, "\n" if $DEBUG
|
1999-08-13 01:37:52 -04:00
|
|
|
return res
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2001-03-27 02:10:58 -05:00
|
|
|
module TkPackage
|
|
|
|
include TkCore
|
|
|
|
extend TkPackage
|
|
|
|
|
2001-05-30 05:10:30 -04:00
|
|
|
def add_path(path)
|
|
|
|
Tk::AUTO_PATH.value = Tk::AUTO_PATH.to_a << path
|
|
|
|
end
|
|
|
|
|
2001-03-27 02:10:58 -05:00
|
|
|
def forget(package)
|
|
|
|
tk_call('package', 'forget', package)
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
|
|
|
|
def names
|
|
|
|
tk_split_simplelist(tk_call('package', 'names'))
|
|
|
|
end
|
|
|
|
|
|
|
|
def provide(package, version=nil)
|
|
|
|
if version
|
|
|
|
tk_call('package', 'provide', package, version)
|
|
|
|
nil
|
|
|
|
else
|
|
|
|
tk_call('package', 'provide', package)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def present(package, version=None)
|
|
|
|
tk_call('package', 'present', package, version)
|
|
|
|
end
|
|
|
|
|
|
|
|
def present_exact(package, version)
|
|
|
|
tk_call('package', 'present', '-exact', package, version)
|
|
|
|
end
|
|
|
|
|
|
|
|
def require(package, version=None)
|
|
|
|
tk_call('package', 'require', package, version)
|
|
|
|
end
|
|
|
|
|
|
|
|
def require_exact(package, version)
|
|
|
|
tk_call('package', 'require', '-exact', package, version)
|
|
|
|
end
|
|
|
|
|
|
|
|
def versions(package)
|
|
|
|
tk_split_simplelist(tk_call('package', 'versions', package))
|
|
|
|
end
|
|
|
|
|
|
|
|
def vcompare(version1, version2)
|
|
|
|
Integer(tk_call('package', 'vcompare', version1, version2))
|
|
|
|
end
|
|
|
|
|
|
|
|
def vsatisfies(version1, version2)
|
|
|
|
bool(tk_call('package', 'vsatisfies', version1, version2))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
1999-08-13 01:37:52 -04:00
|
|
|
module Tk
|
|
|
|
include TkCore
|
|
|
|
extend Tk
|
|
|
|
|
|
|
|
TCL_VERSION = INTERP._invoke("info", "tclversion")
|
|
|
|
TK_VERSION = INTERP._invoke("set", "tk_version")
|
2001-03-27 02:10:58 -05:00
|
|
|
|
|
|
|
TCL_PATCHLEVEL = INTERP._invoke("info", "patchlevel")
|
|
|
|
TK_PATCHLEVEL = INTERP._invoke("set", "tk_patchLevel")
|
|
|
|
|
|
|
|
TCL_LIBRARY = INTERP._invoke("set", "tcl_library")
|
|
|
|
TK_LIBRARY = INTERP._invoke("set", "tk_library")
|
|
|
|
LIBRARY = INTERP._invoke("info", "library")
|
|
|
|
|
|
|
|
PLATFORM = Hash[*tk_split_simplelist(INTERP._eval('array get tcl_platform'))]
|
|
|
|
|
1999-08-13 01:37:52 -04:00
|
|
|
JAPANIZED_TK = (INTERP._invoke("info", "commands", "kanji") != "")
|
|
|
|
|
|
|
|
def root
|
|
|
|
TkRoot.new
|
|
|
|
end
|
|
|
|
|
|
|
|
def bell
|
|
|
|
tk_call 'bell'
|
|
|
|
end
|
|
|
|
|
|
|
|
def Tk.focus(display=nil)
|
|
|
|
if display == nil
|
|
|
|
r = tk_call('focus')
|
|
|
|
else
|
|
|
|
r = tk_call('focus', '-displayof', display)
|
|
|
|
end
|
|
|
|
tk_tcl2ruby(r)
|
|
|
|
end
|
|
|
|
|
|
|
|
def Tk.focus_lastfor(win)
|
|
|
|
tk_tcl2ruby(tk_call('focus', '-lastfor', win))
|
|
|
|
end
|
|
|
|
|
2001-03-27 02:10:58 -05:00
|
|
|
def Tk.strictMotif(bool=None)
|
|
|
|
bool(tk_call('set', 'tk_strictMotif', bool))
|
|
|
|
end
|
|
|
|
|
2000-06-13 05:57:40 -04:00
|
|
|
def Tk.show_kinsoku(mode='both')
|
|
|
|
begin
|
|
|
|
if /^8\.*/ === TK_VERSION && JAPANIZED_TK
|
|
|
|
tk_split_simplelist(tk_call('kinsoku', 'show', mode))
|
|
|
|
end
|
|
|
|
rescue
|
|
|
|
end
|
|
|
|
end
|
|
|
|
def Tk.add_kinsoku(chars, mode='both')
|
|
|
|
begin
|
|
|
|
if /^8\.*/ === TK_VERSION && JAPANIZED_TK
|
|
|
|
tk_split_simplelist(tk_call('kinsoku', 'add', mode,
|
|
|
|
*(chars.split(''))))
|
|
|
|
else
|
|
|
|
[]
|
|
|
|
end
|
|
|
|
rescue
|
|
|
|
[]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
def Tk.delete_kinsoku(chars, mode='both')
|
|
|
|
begin
|
|
|
|
if /^8\.*/ === TK_VERSION && JAPANIZED_TK
|
|
|
|
tk_split_simplelist(tk_call('kinsoku', 'delete', mode,
|
|
|
|
*(chars.split(''))))
|
|
|
|
end
|
|
|
|
rescue
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2001-03-27 02:10:58 -05:00
|
|
|
def Tk.toUTF8(str,encoding)
|
1999-08-13 01:37:52 -04:00
|
|
|
INTERP._toUTF8(str,encoding)
|
|
|
|
end
|
|
|
|
|
2001-03-27 02:10:58 -05:00
|
|
|
def Tk.fromUTF8(str,encoding)
|
1999-08-13 01:37:52 -04:00
|
|
|
INTERP._fromUTF8(str,encoding)
|
|
|
|
end
|
|
|
|
|
|
|
|
module Scrollable
|
|
|
|
def xscrollcommand(cmd=Proc.new)
|
|
|
|
configure_cmd 'xscrollcommand', cmd
|
|
|
|
end
|
|
|
|
def yscrollcommand(cmd=Proc.new)
|
|
|
|
configure_cmd 'yscrollcommand', cmd
|
|
|
|
end
|
2000-01-31 22:12:21 -05:00
|
|
|
def xview(*index)
|
|
|
|
v = tk_send('xview', *index)
|
|
|
|
list(v) if index.size == 0
|
|
|
|
end
|
|
|
|
def yview(*index)
|
|
|
|
v = tk_send('yview', *index)
|
|
|
|
list(v) if index.size == 0
|
|
|
|
end
|
|
|
|
def xscrollbar(bar=nil)
|
|
|
|
if bar
|
|
|
|
@xscrollbar = bar
|
|
|
|
@xscrollbar.orient 'horizontal'
|
2002-03-08 02:03:09 -05:00
|
|
|
self.xscrollcommand {|arg| @xscrollbar.set(*arg)}
|
|
|
|
@xscrollbar.command {|arg| self.xview(*arg)}
|
2000-01-31 22:12:21 -05:00
|
|
|
end
|
|
|
|
@xscrollbar
|
|
|
|
end
|
|
|
|
def yscrollbar(bar=nil)
|
|
|
|
if bar
|
|
|
|
@yscrollbar = bar
|
|
|
|
@yscrollbar.orient 'vertical'
|
2002-03-08 02:03:09 -05:00
|
|
|
self.yscrollcommand {|arg| @yscrollbar.set(*arg)}
|
|
|
|
@yscrollbar.command {|arg| self.yview(*arg)}
|
2000-01-31 22:12:21 -05:00
|
|
|
end
|
|
|
|
@yscrollbar
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
module Wm
|
|
|
|
include TkComm
|
|
|
|
def aspect(*args)
|
2000-01-17 03:37:53 -05:00
|
|
|
w = tk_call('wm', 'aspect', path, *args)
|
|
|
|
list(w) if args.length == 0
|
1999-08-13 01:37:52 -04:00
|
|
|
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
|
2000-01-17 03:37:53 -05:00
|
|
|
tk_call('wm', 'frame', path)
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
def geometry(*args)
|
2000-01-17 03:37:53 -05:00
|
|
|
tk_call('wm', 'geometry', path, *args)
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
def grid(*args)
|
|
|
|
w = tk_call('wm', 'grid', path, *args)
|
|
|
|
list(w) if args.size == 0
|
|
|
|
end
|
|
|
|
def group(*args)
|
2000-01-17 03:37:53 -05:00
|
|
|
w = tk_call 'wm', 'group', path, *args
|
|
|
|
window(w) if args.size == 0
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
def iconbitmap(*args)
|
|
|
|
tk_call 'wm', 'iconbitmap', path, *args
|
|
|
|
end
|
|
|
|
def iconify
|
|
|
|
tk_call 'wm', 'iconify', path
|
|
|
|
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)
|
|
|
|
w = tk_call('wm', 'iconwindow', path, *args)
|
|
|
|
window(w) if args.size == 0
|
|
|
|
end
|
|
|
|
def maxsize(*args)
|
|
|
|
w = tk_call('wm', 'maxsize', path, *args)
|
2000-01-17 03:37:53 -05:00
|
|
|
list(w) if args.size == 0
|
1999-08-13 01:37:52 -04:00
|
|
|
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=nil, cmd=nil)
|
|
|
|
if cmd
|
|
|
|
tk_call('wm', 'protocol', path, name, cmd)
|
|
|
|
elsif name
|
|
|
|
result = tk_call('wm', 'protocol', path, name)
|
|
|
|
(result == "")? nil : tk_tcl2ruby(result)
|
|
|
|
else
|
|
|
|
tk_split_simplelist(tk_call('wm', 'protocol', path))
|
|
|
|
end
|
|
|
|
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)
|
2000-01-17 03:37:53 -05:00
|
|
|
tk_call('wm', 'sizefrom', path, *args)
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
2002-03-11 03:02:04 -05:00
|
|
|
def state(state=None)
|
|
|
|
tk_call 'wm', 'state', path, state
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
def title(*args)
|
|
|
|
tk_call 'wm', 'title', path, *args
|
|
|
|
end
|
|
|
|
def transient(*args)
|
2002-06-28 10:42:46 -04:00
|
|
|
window(tk_call('wm', 'transient', path, *args))
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
def withdraw
|
|
|
|
tk_call 'wm', 'withdraw', path
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2000-08-02 00:54:21 -04:00
|
|
|
###########################################
|
|
|
|
# convert kanji string to/from utf-8
|
|
|
|
###########################################
|
|
|
|
if /^8\.[1-9]/ =~ Tk::TCL_VERSION && !Tk::JAPANIZED_TK
|
|
|
|
class TclTkIp
|
|
|
|
# from tkencoding.rb by ttate@jaist.ac.jp
|
|
|
|
alias __eval _eval
|
|
|
|
alias __invoke _invoke
|
|
|
|
private :__eval
|
|
|
|
private :__invoke
|
|
|
|
|
|
|
|
attr_accessor :encoding
|
|
|
|
|
|
|
|
def _eval(cmd)
|
|
|
|
if @encoding
|
|
|
|
_fromUTF8(__eval(_toUTF8(cmd, @encoding)), @encoding)
|
|
|
|
else
|
|
|
|
__eval(cmd)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def _invoke(*cmds)
|
|
|
|
if @encoding
|
|
|
|
cmds = cmds.collect{|cmd| _toUTF8(cmd, @encoding)}
|
|
|
|
_fromUTF8(__invoke(*cmds), @encoding)
|
|
|
|
else
|
|
|
|
__invoke(*cmds)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
module Tk
|
|
|
|
def encoding=(name)
|
|
|
|
INTERP.encoding = name
|
|
|
|
end
|
|
|
|
|
|
|
|
def encoding
|
|
|
|
INTERP.encoding
|
|
|
|
end
|
|
|
|
|
|
|
|
def encoding_names
|
|
|
|
tk_split_simplelist(tk_call('encoding', 'names'))
|
|
|
|
end
|
|
|
|
|
|
|
|
def encoding_system
|
|
|
|
tk_call('encoding', 'system')
|
|
|
|
end
|
|
|
|
|
|
|
|
def encoding_system=(enc)
|
|
|
|
tk_call('encoding', 'system', enc)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# estimate encoding
|
|
|
|
case $KCODE
|
|
|
|
when /^e/i # EUC
|
|
|
|
Tk.encoding = 'euc-jp'
|
|
|
|
when /^s/i # SJIS
|
|
|
|
Tk.encoding = 'shiftjis'
|
|
|
|
when /^u/i # UTF8
|
|
|
|
Tk.encoding = 'utf-8'
|
|
|
|
else # NONE
|
|
|
|
begin
|
|
|
|
Tk.encoding = Tk.encoding_system
|
|
|
|
rescue StandardError, NameError
|
|
|
|
Tk.encoding = 'utf-8'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
else
|
|
|
|
# dummy methods
|
|
|
|
module Tk
|
|
|
|
def encoding=(name)
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
def encoding
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
def encoding_names
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
def encoding_system
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
def encoding_system=(enc)
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2000-01-17 03:37:53 -05:00
|
|
|
module TkBindCore
|
|
|
|
def bind(context, cmd=Proc.new, args=nil)
|
|
|
|
Tk.bind(to_eval, context, cmd, args)
|
|
|
|
end
|
|
|
|
|
|
|
|
def bind_append(context, cmd=Proc.new, args=nil)
|
|
|
|
Tk.bind_append(to_eval, context, cmd, args)
|
|
|
|
end
|
|
|
|
|
2000-04-10 01:57:37 -04:00
|
|
|
def bind_remove(context)
|
|
|
|
Tk.bind_remove(to_eval, context)
|
|
|
|
end
|
|
|
|
|
2000-01-17 03:37:53 -05:00
|
|
|
def bindinfo(context=nil)
|
|
|
|
Tk.bindinfo(to_eval, context)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class TkBindTag
|
|
|
|
include TkBindCore
|
|
|
|
|
|
|
|
BTagID_TBL = {}
|
|
|
|
Tk_BINDTAG_ID = ["btag00000"]
|
|
|
|
|
|
|
|
def TkBindTag.id2obj(id)
|
|
|
|
BTagID_TBL[id]? BTagID_TBL[id]: id
|
|
|
|
end
|
|
|
|
|
2001-05-06 11:06:00 -04:00
|
|
|
ALL = self.new
|
|
|
|
ALL.instance_eval {
|
|
|
|
@id = 'all'
|
|
|
|
BTagID_TBL[@id] = self
|
|
|
|
}
|
|
|
|
|
2000-01-17 03:37:53 -05:00
|
|
|
def initialize(*args)
|
|
|
|
@id = Tk_BINDTAG_ID[0]
|
|
|
|
Tk_BINDTAG_ID[0] = Tk_BINDTAG_ID[0].succ
|
|
|
|
BTagID_TBL[@id] = self
|
|
|
|
bind(*args) if args != []
|
|
|
|
end
|
|
|
|
|
|
|
|
def to_eval
|
|
|
|
@id
|
|
|
|
end
|
|
|
|
|
|
|
|
def inspect
|
|
|
|
format "#<TkBindTag: %s>", @id
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2000-06-12 03:48:31 -04:00
|
|
|
class TkBindTagAll<TkBindTag
|
|
|
|
def TkBindTagAll.new(*args)
|
2001-05-06 11:06:00 -04:00
|
|
|
$stderr.puts "Warning: TkBindTagALL is obsolete. Use TkBindTag::ALL\n"
|
2000-06-12 03:48:31 -04:00
|
|
|
|
2001-05-06 11:06:00 -04:00
|
|
|
TkBindTag::ALL.bind(*args) if args != []
|
|
|
|
TkBindTag::ALL
|
2000-06-12 03:48:31 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
1999-08-13 01:37:52 -04:00
|
|
|
class TkVariable
|
|
|
|
include Tk
|
|
|
|
extend TkCore
|
|
|
|
|
|
|
|
TkVar_CB_TBL = {}
|
|
|
|
Tk_VARIABLE_ID = ["v00000"]
|
|
|
|
|
|
|
|
INTERP._invoke("proc", "rb_var", "args", "ruby [format \"TkVariable.callback %%Q!%s!\" $args]")
|
|
|
|
|
|
|
|
def TkVariable.callback(args)
|
|
|
|
name1,name2,op = tk_split_list(args)
|
|
|
|
if TkVar_CB_TBL[name1]
|
|
|
|
_get_eval_string(TkVar_CB_TBL[name1].trace_callback(name2,op))
|
|
|
|
else
|
|
|
|
''
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def initialize(val="")
|
|
|
|
@id = Tk_VARIABLE_ID[0]
|
|
|
|
Tk_VARIABLE_ID[0] = Tk_VARIABLE_ID[0].succ
|
|
|
|
if val == []
|
|
|
|
INTERP._eval(format('global %s; set %s(0) 0; unset %s(0)',
|
|
|
|
@id, @id, @id))
|
|
|
|
elsif val.kind_of?(Array)
|
|
|
|
a = []
|
|
|
|
val.each_with_index{|e,i| a.push(i); a.push(array2tk_list(e))}
|
2003-03-21 23:31:24 -05:00
|
|
|
s = '"' + a.join(" ").gsub(/[\[\]$"]/, '\\\\\&') + '"'
|
1999-08-13 01:37:52 -04:00
|
|
|
INTERP._eval(format('global %s; array set %s %s', @id, @id, s))
|
|
|
|
elsif val.kind_of?(Hash)
|
|
|
|
s = '"' + val.to_a.collect{|e| array2tk_list(e)}.join(" ")\
|
2003-03-21 23:31:24 -05:00
|
|
|
.gsub(/[\[\]$"]/, '\\\\\&') + '"'
|
1999-08-13 01:37:52 -04:00
|
|
|
INTERP._eval(format('global %s; array set %s %s', @id, @id, s))
|
|
|
|
else
|
2003-03-21 23:31:24 -05:00
|
|
|
s = '"' + _get_eval_string(val).gsub(/[\[\]$"]/, '\\\\\&') + '"'
|
1999-08-13 01:37:52 -04:00
|
|
|
INTERP._eval(format('global %s; set %s %s', @id, @id, s))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def wait
|
|
|
|
INTERP._eval("tkwait variable #{@id}")
|
|
|
|
end
|
|
|
|
|
|
|
|
def id
|
|
|
|
@id
|
|
|
|
end
|
|
|
|
|
|
|
|
def value
|
|
|
|
begin
|
|
|
|
INTERP._eval(format('global %s; set %s', @id, @id))
|
|
|
|
rescue
|
|
|
|
if INTERP._eval(format('global %s; array exists %s', @id, @id)) != "1"
|
2000-01-31 22:12:21 -05:00
|
|
|
fail
|
1999-08-13 01:37:52 -04:00
|
|
|
else
|
|
|
|
Hash[*tk_split_simplelist(INTERP._eval(format('global %s; array get %s',
|
|
|
|
@id, @id)))]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def value=(val)
|
|
|
|
begin
|
2003-03-21 23:31:24 -05:00
|
|
|
s = '"' + _get_eval_string(val).gsub(/[\[\]$"]/, '\\\\\&') + '"'
|
1999-08-13 01:37:52 -04:00
|
|
|
INTERP._eval(format('global %s; set %s %s', @id, @id, s))
|
|
|
|
rescue
|
|
|
|
if INTERP._eval(format('global %s; array exists %s', @id, @id)) != "1"
|
2000-01-31 22:12:21 -05:00
|
|
|
fail
|
1999-08-13 01:37:52 -04:00
|
|
|
else
|
|
|
|
if val == []
|
|
|
|
INTERP._eval(format('global %s; unset %s; set %s(0) 0; unset %s(0)',
|
|
|
|
@id, @id, @id, @id))
|
|
|
|
elsif val.kind_of?(Array)
|
|
|
|
a = []
|
|
|
|
val.each_with_index{|e,i| a.push(i); a.push(array2tk_list(e))}
|
2003-03-21 23:31:24 -05:00
|
|
|
s = '"' + a.join(" ").gsub(/[\[\]$"]/, '\\\\\&') + '"'
|
1999-08-13 01:37:52 -04:00
|
|
|
INTERP._eval(format('global %s; unset %s; array set %s %s',
|
|
|
|
@id, @id, @id, s))
|
|
|
|
elsif val.kind_of?(Hash)
|
|
|
|
s = '"' + val.to_a.collect{|e| array2tk_list(e)}.join(" ")\
|
2003-03-21 23:31:24 -05:00
|
|
|
.gsub(/[\[\]$"]/, '\\\\\&') + '"'
|
1999-08-13 01:37:52 -04:00
|
|
|
INTERP._eval(format('global %s; unset %s; array set %s %s',
|
|
|
|
@id, @id, @id, s))
|
|
|
|
else
|
2000-01-31 22:12:21 -05:00
|
|
|
fail
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def [](index)
|
|
|
|
INTERP._eval(format('global %s; set %s(%s)',
|
|
|
|
@id, @id, _get_eval_string(index)))
|
|
|
|
end
|
|
|
|
|
|
|
|
def []=(index,val)
|
|
|
|
INTERP._eval(format('global %s; set %s(%s) %s', @id, @id,
|
|
|
|
_get_eval_string(index), _get_eval_string(val)))
|
|
|
|
end
|
|
|
|
|
|
|
|
def to_i
|
2001-06-01 02:47:32 -04:00
|
|
|
number(value).to_i
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def to_f
|
2001-06-01 02:47:32 -04:00
|
|
|
number(value).to_f
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def to_s
|
2001-06-01 02:47:32 -04:00
|
|
|
string(value).to_s
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def inspect
|
2000-01-17 03:37:53 -05:00
|
|
|
format "#<TkVariable: %s>", @id
|
1999-08-13 01:37:52 -04:00
|
|
|
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
|
|
|
|
|
|
|
|
def unset(elem=nil)
|
|
|
|
if elem
|
|
|
|
INTERP._eval(format('global %s; unset %s(%s)',
|
|
|
|
@id, @id, tk_tcl2ruby(elem)))
|
|
|
|
else
|
|
|
|
INTERP._eval(format('global %s; unset %s', @id, @id))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
alias remove unset
|
|
|
|
|
|
|
|
def trace_callback(elem, op)
|
|
|
|
if @trace_var.kind_of? Array
|
|
|
|
@trace_var.each{|m,e| e.call(self,elem,op) if m.index(op)}
|
|
|
|
end
|
|
|
|
if elem.kind_of? String
|
|
|
|
if @trace_elem[elem].kind_of? Array
|
|
|
|
@trace_elem[elem].each{|m,e| e.call(self,elem,op) if m.index(op)}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def trace(opts, cmd)
|
|
|
|
@trace_var = [] if @trace_var == nil
|
|
|
|
opts = ['r','w','u'].find_all{|c| opts.index(c)}.join('')
|
|
|
|
@trace_var.unshift([opts,cmd])
|
|
|
|
if @trace_opts == nil
|
|
|
|
TkVar_CB_TBL[@id] = self
|
|
|
|
@trace_opts = opts
|
|
|
|
Tk.tk_call('trace', 'variable', @id, @trace_opts, 'rb_var')
|
|
|
|
else
|
|
|
|
newopts = @trace_opts.dup
|
|
|
|
opts.each_byte{|c| newopts += c.chr unless newopts.index(c)}
|
|
|
|
if newopts != @trace_opts
|
|
|
|
Tk.tk_call('trace', 'vdelete', @id, @trace_opts, 'rb_var')
|
|
|
|
@trace_opts.replace(newopts)
|
|
|
|
Tk.tk_call('trace', 'variable', @id, @trace_opts, 'rb_var')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def trace_element(elem, opts, cmd)
|
|
|
|
@trace_elem = {} if @trace_elem == nil
|
|
|
|
@trace_elem[elem] = [] if @trace_elem[elem] == nil
|
|
|
|
opts = ['r','w','u'].find_all{|c| opts.index(c)}.join('')
|
|
|
|
@trace_elem[elem].unshift([opts,cmd])
|
|
|
|
if @trace_opts == nil
|
|
|
|
TkVar_CB_TBL[@id] = self
|
|
|
|
@trace_opts = opts
|
|
|
|
Tk.tk_call('trace', 'variable', @id, @trace_opts, 'rb_var')
|
|
|
|
else
|
|
|
|
newopts = @trace_opts.dup
|
|
|
|
opts.each_byte{|c| newopts += c.chr unless newopts.index(c)}
|
|
|
|
if newopts != @trace_opts
|
|
|
|
Tk.tk_call('trace', 'vdelete', @id, @trace_opts, 'rb_var')
|
|
|
|
@trace_opts.replace(newopts)
|
|
|
|
Tk.tk_call('trace', 'variable', @id, @trace_opts, 'rb_var')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def trace_vinfo
|
|
|
|
return [] unless @trace_var
|
|
|
|
@trace_var.dup
|
|
|
|
end
|
|
|
|
def trace_vinfo_for_element(elem)
|
|
|
|
return [] unless @trace_elem
|
|
|
|
return [] unless @trace_elem[elem]
|
|
|
|
@trace_elem[elem].dup
|
|
|
|
end
|
|
|
|
|
|
|
|
def trace_vdelete(opts,cmd)
|
|
|
|
return unless @trace_var.kind_of? Array
|
|
|
|
opts = ['r','w','u'].find_all{|c| opts.index(c)}.join('')
|
|
|
|
idx = -1
|
|
|
|
newopts = ''
|
2002-01-28 03:44:45 -05:00
|
|
|
@trace_var.each_with_index{|e,i|
|
1999-08-13 01:37:52 -04:00
|
|
|
if idx < 0 && e[0] == opts && e[1] == cmd
|
|
|
|
idx = i
|
|
|
|
next
|
|
|
|
end
|
|
|
|
e[0].each_byte{|c| newopts += c.chr unless newopts.index(c)}
|
|
|
|
}
|
|
|
|
if idx >= 0
|
|
|
|
@trace_var.delete_at(idx)
|
|
|
|
else
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
|
|
|
@trace_elem.each{|elem|
|
|
|
|
@trace_elem[elem].each{|e|
|
|
|
|
e[0].each_byte{|c| newopts += c.chr unless newopts.index(c)}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
newopts = ['r','w','u'].find_all{|c| newopts.index(c)}.join('')
|
|
|
|
if newopts != @trace_opts
|
|
|
|
Tk.tk_call('trace', 'vdelete', @id, @trace_opts, 'rb_var')
|
|
|
|
@trace_opts.replace(newopts)
|
|
|
|
if @trace_opts != ''
|
|
|
|
Tk.tk_call('trace', 'variable', @id, @trace_opts, 'rb_var')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def trace_vdelete_for_element(elem,opts,cmd)
|
|
|
|
return unless @trace_elem.kind_of? Hash
|
|
|
|
return unless @trace_elem[elem].kind_of? Array
|
|
|
|
opts = ['r','w','u'].find_all{|c| opts.index(c)}.join('')
|
|
|
|
idx = -1
|
2002-01-28 03:44:45 -05:00
|
|
|
@trace_elem[elem].each_with_index{|e,i|
|
1999-08-13 01:37:52 -04:00
|
|
|
if idx < 0 && e[0] == opts && e[1] == cmd
|
|
|
|
idx = i
|
|
|
|
next
|
|
|
|
end
|
|
|
|
}
|
|
|
|
if idx >= 0
|
|
|
|
@trace_elem[elem].delete_at(idx)
|
|
|
|
else
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
|
|
|
newopts = ''
|
|
|
|
@trace_var.each{|e|
|
|
|
|
e[0].each_byte{|c| newopts += c.chr unless newopts.index(c)}
|
|
|
|
}
|
|
|
|
@trace_elem.each{|elem|
|
|
|
|
@trace_elem[elem].each{|e|
|
|
|
|
e[0].each_byte{|c| newopts += c.chr unless newopts.index(c)}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
newopts = ['r','w','u'].find_all{|c| newopts.index(c)}.join('')
|
|
|
|
if newopts != @trace_opts
|
|
|
|
Tk.tk_call('trace', 'vdelete', @id, @trace_opts, 'rb_var')
|
|
|
|
@trace_opts.replace(newopts)
|
|
|
|
if @trace_opts != ''
|
|
|
|
Tk.tk_call('trace', 'variable', @id, @trace_opts, 'rb_var')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class TkVarAccess<TkVariable
|
|
|
|
def initialize(varname, val=nil)
|
|
|
|
@id = varname
|
|
|
|
if val
|
2003-03-21 23:31:24 -05:00
|
|
|
s = '"' + _get_eval_string(val).gsub(/[\[\]$"]/, '\\\\\&') + '"' #"
|
1999-08-13 01:37:52 -04:00
|
|
|
INTERP._eval(format('global %s; set %s %s', @id, @id, s))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2001-05-30 05:10:30 -04:00
|
|
|
module Tk
|
|
|
|
begin
|
|
|
|
auto_path = INTERP._invoke('set', 'auto_path')
|
|
|
|
rescue
|
|
|
|
begin
|
|
|
|
auto_path = INTERP._invoke('set', 'env(TCLLIBPATH)')
|
|
|
|
rescue
|
|
|
|
auto_path = Tk::LIBRARY
|
|
|
|
end
|
|
|
|
end
|
|
|
|
AUTO_PATH = TkVarAccess.new('auto_path', auto_path)
|
|
|
|
|
|
|
|
TCL_PACKAGE_PATH = TkVarAccess.new('tcl_pkgPath')
|
|
|
|
end
|
|
|
|
|
1999-08-13 01:37:52 -04:00
|
|
|
module TkSelection
|
|
|
|
include Tk
|
|
|
|
extend Tk
|
|
|
|
def clear(win=Tk.root)
|
|
|
|
tk_call 'selection', 'clear', win.path
|
|
|
|
end
|
|
|
|
def get(type=None)
|
|
|
|
tk_call 'selection', 'get', type
|
|
|
|
end
|
|
|
|
def TkSelection.handle(win, func, type=None, format=None)
|
2000-03-17 03:58:21 -05:00
|
|
|
tk_call 'selection', 'handle', win.path, func, type, format
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
def handle(func, type=None, format=None)
|
|
|
|
TkSelection.handle self, func, type, format
|
|
|
|
end
|
2000-03-17 03:58:21 -05:00
|
|
|
def TkSelection.own(win=None, func=None)
|
2002-06-28 10:42:46 -04:00
|
|
|
window(tk_call('selection', 'own', win, func))
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
def own(func=None)
|
|
|
|
TkSelection.own self, func
|
|
|
|
end
|
|
|
|
|
|
|
|
module_function :clear, :get
|
|
|
|
end
|
|
|
|
|
|
|
|
module TkKinput
|
|
|
|
include Tk
|
|
|
|
extend Tk
|
|
|
|
|
|
|
|
def TkKinput.start(window, style=None)
|
|
|
|
tk_call 'kinput_start', window.path, style
|
|
|
|
end
|
|
|
|
def kinput_start(style=None)
|
|
|
|
TkKinput.start(self, style)
|
|
|
|
end
|
|
|
|
|
|
|
|
def TkKinput.send_spot(window)
|
|
|
|
tk_call 'kinput_send_spot', window.path
|
|
|
|
end
|
|
|
|
def kinput_send_spot
|
|
|
|
TkKinput.send_spot(self)
|
|
|
|
end
|
|
|
|
|
|
|
|
def TkKinput.input_start(window, keys=nil)
|
|
|
|
tk_call 'kanjiInput', 'start', window.path, *hash_kv(keys)
|
|
|
|
end
|
|
|
|
def kanji_input_start(keys=nil)
|
|
|
|
TkKinput.input_start(self, keys)
|
|
|
|
end
|
|
|
|
|
|
|
|
def TkKinput.attribute_config(window, slot, value=None)
|
|
|
|
if slot.kind_of? Hash
|
|
|
|
tk_call 'kanjiInput', 'attribute', window.path, *hash_kv(slot)
|
|
|
|
else
|
|
|
|
tk_call 'kanjiInput', 'attribute', window.path, "-#{slot}", value
|
|
|
|
end
|
|
|
|
end
|
|
|
|
def kinput_attribute_config(slot, value=None)
|
|
|
|
TkKinput.attribute_config(self, slot, value)
|
|
|
|
end
|
|
|
|
|
|
|
|
def TkKinput.attribute_info(window, slot=nil)
|
|
|
|
if slot
|
|
|
|
conf = tk_split_list(tk_call('kanjiInput', 'attribute',
|
|
|
|
window.path, "-#{slot}"))
|
|
|
|
conf[0] = conf[0][1..-1]
|
|
|
|
conf
|
|
|
|
else
|
|
|
|
tk_split_list(tk_call('kanjiInput', 'attribute',
|
|
|
|
window.path)).collect{|conf|
|
|
|
|
conf[0] = conf[0][1..-1]
|
|
|
|
conf
|
|
|
|
}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
def kinput_attribute_info(slot=nil)
|
|
|
|
TkKinput.attribute_info(self, slot)
|
|
|
|
end
|
|
|
|
|
|
|
|
def TkKinput.input_end(window)
|
|
|
|
tk_call 'kanjiInput', 'end', window.path
|
|
|
|
end
|
|
|
|
def kanji_input_end
|
|
|
|
TkKinput.input_end(self)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2000-06-13 05:57:40 -04:00
|
|
|
module TkXIM
|
|
|
|
include Tk
|
|
|
|
extend Tk
|
|
|
|
|
|
|
|
def TkXIM.useinputmethods(window=nil, value=nil)
|
|
|
|
if window
|
|
|
|
if value
|
|
|
|
tk_call 'tk', 'useinputmethods', '-displayof', window.path, value
|
|
|
|
else
|
|
|
|
tk_call 'tk', 'useinputmethods', '-displayof', window.path
|
|
|
|
end
|
|
|
|
else
|
|
|
|
if value
|
|
|
|
tk_call 'tk', 'useinputmethods', value
|
|
|
|
else
|
|
|
|
tk_call 'tk', 'useinputmethods'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def TkXIM.configure(window, slot, value=None)
|
|
|
|
begin
|
|
|
|
if /^8\.*/ === Tk::TK_VERSION && JAPANIZED_TK
|
|
|
|
if slot.kind_of? Hash
|
|
|
|
tk_call 'imconfigure', window.path, *hash_kv(slot)
|
|
|
|
else
|
|
|
|
tk_call 'imconfigure', window.path, "-#{slot}", value
|
|
|
|
end
|
|
|
|
end
|
|
|
|
rescue
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def TkXIM.configinfo(window, slot=nil)
|
|
|
|
begin
|
|
|
|
if /^8\.*/ === Tk::TK_VERSION && JAPANIZED_TK
|
|
|
|
if slot
|
|
|
|
conf = tk_split_list(tk_call('imconfigure', window.path, "-#{slot}"))
|
|
|
|
conf[0] = conf[0][1..-1]
|
|
|
|
conf
|
|
|
|
else
|
|
|
|
tk_split_list(tk_call('imconfigure', window.path)).collect{|conf|
|
|
|
|
conf[0] = conf[0][1..-1]
|
|
|
|
conf
|
|
|
|
}
|
|
|
|
end
|
|
|
|
else
|
|
|
|
[]
|
|
|
|
end
|
|
|
|
rescue
|
|
|
|
[]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def useinputmethods(value=nil)
|
2001-03-27 02:10:58 -05:00
|
|
|
TkXIM.useinputmethods(self, value)
|
2000-06-13 05:57:40 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def imconfigure(window, slot, value=None)
|
|
|
|
TkXIM.configinfo(window, slot, value)
|
|
|
|
end
|
|
|
|
|
|
|
|
def imconfiginfo(slot=nil)
|
|
|
|
TkXIM.configinfo(window, slot)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
1999-08-13 01:37:52 -04:00
|
|
|
module TkWinfo
|
|
|
|
include Tk
|
|
|
|
extend Tk
|
|
|
|
def TkWinfo.atom(name)
|
2002-06-28 10:42:46 -04:00
|
|
|
number(tk_call('winfo', 'atom', name))
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
def winfo_atom(name)
|
|
|
|
TkWinfo.atom name
|
|
|
|
end
|
|
|
|
def TkWinfo.atomname(id)
|
2000-01-17 03:37:53 -05:00
|
|
|
tk_call 'winfo', 'atomname', id
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
def winfo_atomname(id)
|
|
|
|
TkWinfo.atomname id
|
|
|
|
end
|
|
|
|
def TkWinfo.cells(window)
|
2000-01-17 03:37:53 -05:00
|
|
|
number(tk_call('winfo', 'cells', window.path))
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
def winfo_cells
|
|
|
|
TkWinfo.cells self
|
|
|
|
end
|
|
|
|
def TkWinfo.children(window)
|
|
|
|
c = tk_call('winfo', 'children', window.path)
|
|
|
|
list(c)
|
|
|
|
end
|
|
|
|
def winfo_children
|
|
|
|
TkWinfo.children self
|
|
|
|
end
|
|
|
|
def TkWinfo.classname(window)
|
|
|
|
tk_call 'winfo', 'class', window.path
|
|
|
|
end
|
|
|
|
def winfo_classname
|
|
|
|
TkWinfo.classname self
|
|
|
|
end
|
2000-01-17 03:37:53 -05:00
|
|
|
def TkWinfo.colormapfull(window)
|
|
|
|
bool(tk_call('winfo', 'colormapfull', window.path))
|
|
|
|
end
|
|
|
|
def winfo_colormapfull
|
|
|
|
TkWinfo.colormapfull self
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
def TkWinfo.containing(rootX, rootY)
|
|
|
|
path = tk_call('winfo', 'containing', rootX, rootY)
|
|
|
|
window(path)
|
|
|
|
end
|
|
|
|
def winfo_containing(x, y)
|
|
|
|
TkWinfo.containing x, y
|
|
|
|
end
|
|
|
|
def TkWinfo.depth(window)
|
|
|
|
number(tk_call('winfo', 'depth', window.path))
|
|
|
|
end
|
|
|
|
def winfo_depth
|
|
|
|
TkWinfo.depth self
|
|
|
|
end
|
|
|
|
def TkWinfo.exist?(window)
|
|
|
|
bool(tk_call('winfo', 'exists', window.path))
|
|
|
|
end
|
|
|
|
def winfo_exist?
|
|
|
|
TkWinfo.exist? self
|
|
|
|
end
|
|
|
|
def TkWinfo.fpixels(window, number)
|
|
|
|
number(tk_call('winfo', 'fpixels', window.path, number))
|
|
|
|
end
|
|
|
|
def winfo_fpixels(number)
|
|
|
|
TkWinfo.fpixels self, number
|
|
|
|
end
|
|
|
|
def TkWinfo.geometry(window)
|
2000-01-17 03:37:53 -05:00
|
|
|
tk_call('winfo', 'geometry', window.path)
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
def winfo_geometry
|
|
|
|
TkWinfo.geometry self
|
|
|
|
end
|
|
|
|
def TkWinfo.height(window)
|
|
|
|
number(tk_call('winfo', 'height', window.path))
|
|
|
|
end
|
|
|
|
def winfo_height
|
|
|
|
TkWinfo.height self
|
|
|
|
end
|
|
|
|
def TkWinfo.id(window)
|
2000-01-17 03:37:53 -05:00
|
|
|
tk_call('winfo', 'id', window.path)
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
def winfo_id
|
|
|
|
TkWinfo.id self
|
|
|
|
end
|
|
|
|
def TkWinfo.interps(window=nil)
|
|
|
|
if window
|
2000-01-17 03:37:53 -05:00
|
|
|
tk_split_simplelist(tk_call('winfo', 'interps',
|
|
|
|
'-displayof', window.path))
|
1999-08-13 01:37:52 -04:00
|
|
|
else
|
|
|
|
tk_split_simplelist(tk_call('winfo', 'interps'))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
def winfo_interps
|
|
|
|
TkWinfo.interps self
|
|
|
|
end
|
|
|
|
def TkWinfo.mapped?(window)
|
|
|
|
bool(tk_call('winfo', 'ismapped', window.path))
|
|
|
|
end
|
|
|
|
def winfo_mapped?
|
|
|
|
TkWinfo.mapped? self
|
|
|
|
end
|
2000-01-17 03:37:53 -05:00
|
|
|
def TkWinfo.manager(window)
|
|
|
|
tk_call('winfo', 'manager', window.path)
|
|
|
|
end
|
|
|
|
def winfo_manager
|
|
|
|
TkWinfo.manager self
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
def TkWinfo.appname(window)
|
2000-01-17 03:37:53 -05:00
|
|
|
tk_call('winfo', 'name', window.path)
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
def winfo_appname
|
|
|
|
TkWinfo.appname self
|
|
|
|
end
|
|
|
|
def TkWinfo.parent(window)
|
|
|
|
window(tk_call('winfo', 'parent', window.path))
|
|
|
|
end
|
|
|
|
def winfo_parent
|
|
|
|
TkWinfo.parent self
|
|
|
|
end
|
|
|
|
def TkWinfo.widget(id)
|
|
|
|
window(tk_call('winfo', 'pathname', id))
|
|
|
|
end
|
|
|
|
def winfo_widget(id)
|
|
|
|
TkWinfo.widget id
|
|
|
|
end
|
|
|
|
def TkWinfo.pixels(window, number)
|
|
|
|
number(tk_call('winfo', 'pixels', window.path, number))
|
|
|
|
end
|
|
|
|
def winfo_pixels(number)
|
|
|
|
TkWinfo.pixels self, number
|
|
|
|
end
|
|
|
|
def TkWinfo.reqheight(window)
|
|
|
|
number(tk_call('winfo', 'reqheight', window.path))
|
|
|
|
end
|
|
|
|
def winfo_reqheight
|
|
|
|
TkWinfo.reqheight self
|
|
|
|
end
|
|
|
|
def TkWinfo.reqwidth(window)
|
|
|
|
number(tk_call('winfo', 'reqwidth', window.path))
|
|
|
|
end
|
|
|
|
def winfo_reqwidth
|
|
|
|
TkWinfo.reqwidth self
|
|
|
|
end
|
|
|
|
def TkWinfo.rgb(window, color)
|
|
|
|
list(tk_call('winfo', 'rgb', window.path, color))
|
|
|
|
end
|
|
|
|
def winfo_rgb(color)
|
|
|
|
TkWinfo.rgb self, color
|
|
|
|
end
|
|
|
|
def TkWinfo.rootx(window)
|
|
|
|
number(tk_call('winfo', 'rootx', window.path))
|
|
|
|
end
|
|
|
|
def winfo_rootx
|
|
|
|
TkWinfo.rootx self
|
|
|
|
end
|
|
|
|
def TkWinfo.rooty(window)
|
|
|
|
number(tk_call('winfo', 'rooty', window.path))
|
|
|
|
end
|
|
|
|
def winfo_rooty
|
|
|
|
TkWinfo.rooty self
|
|
|
|
end
|
|
|
|
def TkWinfo.screen(window)
|
|
|
|
tk_call 'winfo', 'screen', window.path
|
|
|
|
end
|
|
|
|
def winfo_screen
|
|
|
|
TkWinfo.screen self
|
|
|
|
end
|
|
|
|
def TkWinfo.screencells(window)
|
|
|
|
number(tk_call('winfo', 'screencells', window.path))
|
|
|
|
end
|
|
|
|
def winfo_screencells
|
|
|
|
TkWinfo.screencells self
|
|
|
|
end
|
|
|
|
def TkWinfo.screendepth(window)
|
|
|
|
number(tk_call('winfo', 'screendepth', window.path))
|
|
|
|
end
|
|
|
|
def winfo_screendepth
|
|
|
|
TkWinfo.screendepth self
|
|
|
|
end
|
|
|
|
def TkWinfo.screenheight (window)
|
|
|
|
number(tk_call('winfo', 'screenheight', window.path))
|
|
|
|
end
|
|
|
|
def winfo_screenheight
|
|
|
|
TkWinfo.screenheight self
|
|
|
|
end
|
|
|
|
def TkWinfo.screenmmheight(window)
|
|
|
|
number(tk_call('winfo', 'screenmmheight', window.path))
|
|
|
|
end
|
|
|
|
def winfo_screenmmheight
|
|
|
|
TkWinfo.screenmmheight self
|
|
|
|
end
|
|
|
|
def TkWinfo.screenmmwidth(window)
|
|
|
|
number(tk_call('winfo', 'screenmmwidth', window.path))
|
|
|
|
end
|
|
|
|
def winfo_screenmmwidth
|
|
|
|
TkWinfo.screenmmwidth self
|
|
|
|
end
|
|
|
|
def TkWinfo.screenvisual(window)
|
|
|
|
tk_call 'winfo', 'screenvisual', window.path
|
|
|
|
end
|
|
|
|
def winfo_screenvisual
|
|
|
|
TkWinfo.screenvisual self
|
|
|
|
end
|
|
|
|
def TkWinfo.screenwidth(window)
|
|
|
|
number(tk_call('winfo', 'screenwidth', window.path))
|
|
|
|
end
|
|
|
|
def winfo_screenwidth
|
|
|
|
TkWinfo.screenwidth self
|
|
|
|
end
|
2000-01-17 03:37:53 -05:00
|
|
|
def TkWinfo.server(window)
|
|
|
|
tk_call 'winfo', 'server', window.path
|
|
|
|
end
|
|
|
|
def winfo_server
|
|
|
|
TkWinfo.server self
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
def TkWinfo.toplevel(window)
|
|
|
|
window(tk_call('winfo', 'toplevel', window.path))
|
|
|
|
end
|
|
|
|
def winfo_toplevel
|
|
|
|
TkWinfo.toplevel self
|
|
|
|
end
|
|
|
|
def TkWinfo.visual(window)
|
|
|
|
tk_call 'winfo', 'visual', window.path
|
|
|
|
end
|
|
|
|
def winfo_visual
|
|
|
|
TkWinfo.visual self
|
|
|
|
end
|
2000-01-17 03:37:53 -05:00
|
|
|
def TkWinfo.visualid(window)
|
|
|
|
tk_call 'winfo', 'visualid', window.path
|
|
|
|
end
|
|
|
|
def winfo_visualid
|
|
|
|
TkWinfo.visualid self
|
|
|
|
end
|
|
|
|
def TkWinfo.visualsavailable(window, includeids=false)
|
|
|
|
if includeids
|
|
|
|
v = tk_call('winfo', 'visualsavailable', window.path, "includeids")
|
|
|
|
else
|
|
|
|
v = tk_call('winfo', 'visualsavailable', window.path)
|
|
|
|
end
|
|
|
|
list(v)
|
|
|
|
end
|
|
|
|
def winfo_visualsavailable(includeids=false)
|
|
|
|
TkWinfo.visualsavailable self, includeids
|
|
|
|
end
|
|
|
|
def TkWinfo.vrootheight(window)
|
1999-08-13 01:37:52 -04:00
|
|
|
number(tk_call('winfo', 'vrootheight', window.path))
|
|
|
|
end
|
|
|
|
def winfo_vrootheight
|
|
|
|
TkWinfo.vrootheight self
|
|
|
|
end
|
|
|
|
def TkWinfo.vrootwidth(window)
|
|
|
|
number(tk_call('winfo', 'vrootwidth', window.path))
|
|
|
|
end
|
|
|
|
def winfo_vrootwidth
|
|
|
|
TkWinfo.vrootwidth self
|
|
|
|
end
|
|
|
|
def TkWinfo.vrootx(window)
|
|
|
|
number(tk_call('winfo', 'vrootx', window.path))
|
|
|
|
end
|
|
|
|
def winfo_vrootx
|
|
|
|
TkWinfo.vrootx self
|
|
|
|
end
|
|
|
|
def TkWinfo.vrooty(window)
|
|
|
|
number(tk_call('winfo', 'vrooty', window.path))
|
|
|
|
end
|
|
|
|
def winfo_vrooty
|
|
|
|
TkWinfo.vrooty self
|
|
|
|
end
|
|
|
|
def TkWinfo.width(window)
|
|
|
|
number(tk_call('winfo', 'width', window.path))
|
|
|
|
end
|
|
|
|
def winfo_width
|
|
|
|
TkWinfo.width self
|
|
|
|
end
|
|
|
|
def TkWinfo.x(window)
|
|
|
|
number(tk_call('winfo', 'x', window.path))
|
|
|
|
end
|
|
|
|
def winfo_x
|
|
|
|
TkWinfo.x self
|
|
|
|
end
|
|
|
|
def TkWinfo.y(window)
|
|
|
|
number(tk_call('winfo', 'y', window.path))
|
|
|
|
end
|
|
|
|
def winfo_y
|
|
|
|
TkWinfo.y self
|
|
|
|
end
|
|
|
|
def TkWinfo.viewable(window)
|
2002-06-28 10:42:46 -04:00
|
|
|
bool(tk_call('winfo', 'viewable', window.path))
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
def winfo_viewable
|
|
|
|
TkWinfo.viewable self
|
|
|
|
end
|
|
|
|
def TkWinfo.pointerx(window)
|
|
|
|
number(tk_call('winfo', 'pointerx', window.path))
|
|
|
|
end
|
|
|
|
def winfo_pointerx
|
|
|
|
TkWinfo.pointerx self
|
|
|
|
end
|
|
|
|
def TkWinfo.pointery(window)
|
|
|
|
number(tk_call('winfo', 'pointery', window.path))
|
|
|
|
end
|
|
|
|
def winfo_pointery
|
|
|
|
TkWinfo.pointery self
|
|
|
|
end
|
|
|
|
def TkWinfo.pointerxy(window)
|
|
|
|
list(tk_call('winfo', 'pointerxy', window.path))
|
|
|
|
end
|
|
|
|
def winfo_pointerxy
|
|
|
|
TkWinfo.pointerxy self
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
module TkPack
|
|
|
|
include Tk
|
|
|
|
extend Tk
|
|
|
|
def configure(win, *args)
|
|
|
|
if args[-1].kind_of?(Hash)
|
|
|
|
keys = args.pop
|
|
|
|
end
|
|
|
|
wins = [win.epath]
|
|
|
|
for i in args
|
|
|
|
wins.push i.epath
|
|
|
|
end
|
|
|
|
tk_call "pack", 'configure', *(wins+hash_kv(keys))
|
|
|
|
end
|
|
|
|
|
|
|
|
def forget(*args)
|
|
|
|
tk_call 'pack', 'forget' *args
|
|
|
|
end
|
|
|
|
|
2000-11-27 04:23:38 -05:00
|
|
|
def info(slave)
|
|
|
|
ilist = list(tk_call('pack', 'info', slave.epath))
|
|
|
|
info = {}
|
|
|
|
while key = ilist.shift
|
|
|
|
info[key[1..-1]] = ilist.shift
|
|
|
|
end
|
|
|
|
return info
|
|
|
|
end
|
|
|
|
|
1999-08-13 01:37:52 -04:00
|
|
|
def propagate(master, bool=None)
|
2000-11-27 04:23:38 -05:00
|
|
|
if bool == None
|
|
|
|
bool(tk_call('pack', 'propagate', master.epath))
|
|
|
|
else
|
|
|
|
tk_call('pack', 'propagate', master.epath, bool)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def slaves(master)
|
|
|
|
list(tk_call('pack', 'slaves', master.epath))
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
2000-11-27 04:23:38 -05:00
|
|
|
|
|
|
|
module_function :configure, :forget, :info, :propagate, :slaves
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
module TkGrid
|
|
|
|
include Tk
|
|
|
|
extend Tk
|
|
|
|
|
|
|
|
def bbox(*args)
|
|
|
|
list(tk_call('grid', 'bbox', *args))
|
|
|
|
end
|
|
|
|
|
|
|
|
def configure(widget, *args)
|
|
|
|
if args[-1].kind_of?(Hash)
|
|
|
|
keys = args.pop
|
|
|
|
end
|
|
|
|
wins = [widget.epath]
|
|
|
|
for i in args
|
|
|
|
wins.push i.epath
|
|
|
|
end
|
|
|
|
tk_call "grid", 'configure', *(wins+hash_kv(keys))
|
|
|
|
end
|
|
|
|
|
|
|
|
def columnconfigure(master, index, args)
|
|
|
|
tk_call "grid", 'columnconfigure', master, index, *hash_kv(args)
|
|
|
|
end
|
|
|
|
|
|
|
|
def rowconfigure(master, index, args)
|
|
|
|
tk_call "grid", 'rowconfigure', master, index, *hash_kv(args)
|
|
|
|
end
|
|
|
|
|
2000-11-27 04:23:38 -05:00
|
|
|
def columnconfiginfo(master, index, slot=nil)
|
|
|
|
if slot
|
|
|
|
tk_call 'grid', 'columnconfigure', master, index, "-#{slot}"
|
|
|
|
else
|
|
|
|
ilist = list(tk_call('grid', 'columnconfigure', master, index))
|
|
|
|
info = {}
|
|
|
|
while key = ilist.shift
|
|
|
|
info[key[1..-1]] = ilist.shift
|
|
|
|
end
|
|
|
|
info
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def rowconfiginfo(master, index, slot=nil)
|
|
|
|
if slot
|
|
|
|
tk_call 'grid', 'rowconfigure', master, index, "-#{slot}"
|
|
|
|
else
|
|
|
|
ilist = list(tk_call('grid', 'rowconfigure', master, index))
|
|
|
|
info = {}
|
|
|
|
while key = ilist.shift
|
|
|
|
info[key[1..-1]] = ilist.shift
|
|
|
|
end
|
|
|
|
info
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
1999-08-13 01:37:52 -04:00
|
|
|
def add(widget, *args)
|
|
|
|
configure(widget, *args)
|
|
|
|
end
|
|
|
|
|
|
|
|
def forget(*args)
|
|
|
|
tk_call 'grid', 'forget', *args
|
|
|
|
end
|
|
|
|
|
|
|
|
def info(slave)
|
|
|
|
list(tk_call('grid', 'info', slave))
|
|
|
|
end
|
|
|
|
|
|
|
|
def location(master, x, y)
|
|
|
|
list(tk_call('grid', 'location', master, x, y))
|
|
|
|
end
|
|
|
|
|
|
|
|
def propagate(master, bool=None)
|
2000-11-27 04:23:38 -05:00
|
|
|
if bool == None
|
|
|
|
bool(tk_call('grid', 'propagate', master.epath))
|
|
|
|
else
|
|
|
|
tk_call('grid', 'propagate', master.epath, bool)
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def remove(*args)
|
|
|
|
tk_call 'grid', 'remove', *args
|
|
|
|
end
|
|
|
|
|
|
|
|
def size(master)
|
|
|
|
tk_call 'grid', 'size', master
|
|
|
|
end
|
|
|
|
|
2000-11-27 04:23:38 -05:00
|
|
|
def slaves(master, args)
|
|
|
|
list(tk_call('grid', 'slaves', master, *hash_kv(args)))
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
module_function :bbox, :forget, :propagate, :info
|
|
|
|
module_function :remove, :size, :slaves, :location
|
|
|
|
module_function :configure, :columnconfigure, :rowconfigure
|
2000-11-27 04:23:38 -05:00
|
|
|
module_function :columnconfiginfo, :rowconfiginfo
|
|
|
|
end
|
|
|
|
|
|
|
|
module TkPlace
|
|
|
|
include Tk
|
|
|
|
extend Tk
|
|
|
|
|
|
|
|
def configure(win, slot, value=None)
|
|
|
|
if slot.kind_of? Hash
|
|
|
|
tk_call 'place', 'configure', win.epath, *hash_kv(slot)
|
|
|
|
else
|
|
|
|
tk_call 'place', 'configure', win.epath, "-#{slot}", value
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def configinfo(win, slot = nil)
|
|
|
|
# for >= Tk8.4a2 ?
|
|
|
|
if slot
|
|
|
|
conf = tk_split_list(tk_call('place', 'configure',
|
|
|
|
win.epath, "-#{slot}") )
|
|
|
|
conf[0] = conf[0][1..-1]
|
|
|
|
conf
|
|
|
|
else
|
|
|
|
tk_split_simplelist(tk_call('place', 'configure',
|
|
|
|
win.epath)).collect{|conflist|
|
|
|
|
conf = tk_split_simplelist(conflist)
|
|
|
|
conf[0] = conf[0][1..-1]
|
|
|
|
conf
|
|
|
|
}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def forget(win)
|
|
|
|
tk_call 'place', 'forget', win
|
|
|
|
end
|
|
|
|
|
|
|
|
def info(win)
|
|
|
|
ilist = list(tk_call('place', 'info', win.epath))
|
|
|
|
info = {}
|
|
|
|
while key = ilist.shift
|
|
|
|
info[key[1..-1]] = ilist.shift
|
|
|
|
end
|
|
|
|
return info
|
|
|
|
end
|
|
|
|
|
|
|
|
def slaves(master)
|
|
|
|
list(tk_call('place', 'slaves', master.epath))
|
|
|
|
end
|
|
|
|
|
|
|
|
module_function :configure, :configinfo, :forget, :info, :slaves
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
module TkOption
|
|
|
|
include Tk
|
|
|
|
extend Tk
|
|
|
|
def add pat, value, pri=None
|
|
|
|
tk_call 'option', 'add', pat, value, pri
|
|
|
|
end
|
|
|
|
def clear
|
|
|
|
tk_call 'option', 'clear'
|
|
|
|
end
|
|
|
|
def get win, name, klass
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
tk_call('option', 'get', win ,name, klass).taint
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
def readfile file, pri=None
|
|
|
|
tk_call 'option', 'readfile', file, pri
|
|
|
|
end
|
|
|
|
module_function :add, :clear, :get, :readfile
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
|
|
|
|
# support procs on the resource database
|
|
|
|
@@resource_proc_class = Class.new
|
|
|
|
class << @@resource_proc_class
|
|
|
|
private :new
|
|
|
|
|
|
|
|
CARRIER = '.'.freeze
|
|
|
|
METHOD_TBL = {}
|
|
|
|
ADD_METHOD = false
|
|
|
|
SAFE_MODE = 4
|
|
|
|
|
|
|
|
def __check_proc_string__(str)
|
|
|
|
# If you want to check the proc_string, do it in this method.
|
|
|
|
str
|
|
|
|
end
|
|
|
|
|
|
|
|
def method_missing(id, *args)
|
|
|
|
res_proc = self::METHOD_TBL[id]
|
|
|
|
unless res_proc.kind_of? Proc
|
|
|
|
if id == :new || (!self::METHOD_TBL.has_key?(id) && !self::ADD_METHOD)
|
|
|
|
raise NoMethodError,
|
|
|
|
"not support resource-proc '#{id.id2name}' for #{self.name}"
|
|
|
|
end
|
|
|
|
proc_str = TkOption.get(self::CARRIER, id.id2name, '')
|
|
|
|
proc_str = '{' + proc_str + '}' unless /\A\{.*\}\Z/ =~ proc_str
|
|
|
|
proc_str = __check_proc_string__(proc_str)
|
|
|
|
res_proc = eval 'Proc.new' + proc_str
|
|
|
|
self::METHOD_TBL[id] = res_proc
|
|
|
|
end
|
|
|
|
proc{
|
|
|
|
$SAFE = self::SAFE_MODE
|
|
|
|
res_proc.call(*args)
|
|
|
|
}.call
|
|
|
|
end
|
|
|
|
|
|
|
|
private :__check_proc_string__, :method_missing
|
|
|
|
end
|
|
|
|
|
|
|
|
def new_proc_class(klass, func, safe = 4, add = false, parent = nil)
|
|
|
|
klass = klass.to_s if klass.kind_of? Symbol
|
|
|
|
unless (?A..?Z) === klass[0]
|
|
|
|
fail ArgumentError, "bad string '#{klass}' for class name"
|
|
|
|
end
|
|
|
|
unless func.kind_of? Array
|
|
|
|
fail ArgumentError, "method-list must be Array"
|
|
|
|
end
|
|
|
|
func_str = func.join(' ')
|
|
|
|
if parent == nil
|
|
|
|
install_win(parent)
|
|
|
|
elsif parent <= @@resource_proc_class
|
|
|
|
install_win(parent::CARRIER)
|
|
|
|
else
|
|
|
|
fail ArgumentError, "parent must be Resource-Proc class"
|
|
|
|
end
|
|
|
|
carrier = Tk.tk_call('frame', @path, '-class', klass)
|
|
|
|
|
|
|
|
body = <<-"EOD"
|
|
|
|
class #{klass} < TkOption.module_eval('@@resource_proc_class')
|
|
|
|
CARRIER = '#{carrier}'.freeze
|
|
|
|
METHOD_TBL = {}
|
|
|
|
ADD_METHOD = #{add}
|
|
|
|
SAFE_MODE = #{safe}
|
2002-10-02 02:02:17 -04:00
|
|
|
%w(#{func_str}).each{|f| METHOD_TBL.delete(f.intern) }
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
end
|
|
|
|
EOD
|
|
|
|
|
|
|
|
if parent.kind_of?(Class) && parent <= @@resource_proc_class
|
|
|
|
parent.class_eval body
|
|
|
|
eval parent.name + '::' + klass
|
|
|
|
else
|
|
|
|
eval body
|
|
|
|
eval 'TkOption::' + klass
|
|
|
|
end
|
|
|
|
end
|
|
|
|
module_function :new_proc_class
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
module TkTreatFont
|
|
|
|
def font_configinfo
|
|
|
|
ret = TkFont.used_on(self.path)
|
|
|
|
if ret == nil
|
|
|
|
ret = TkFont.init_widget_font(self.path, self.path, 'configure')
|
|
|
|
end
|
|
|
|
ret
|
|
|
|
end
|
|
|
|
alias fontobj font_configinfo
|
|
|
|
|
|
|
|
def font_configure(slot)
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
slot = _symbolkey2str(slot)
|
2000-01-04 23:41:21 -05:00
|
|
|
if (fnt = slot.delete('font'))
|
1999-08-13 01:37:52 -04:00
|
|
|
if fnt.kind_of? TkFont
|
|
|
|
return fnt.call_font_configure(self.path, self.path,'configure',slot)
|
|
|
|
else
|
|
|
|
latinfont_configure(fnt) if fnt
|
|
|
|
end
|
|
|
|
end
|
2000-01-04 23:41:21 -05:00
|
|
|
if (ltn = slot.delete('latinfont'))
|
1999-08-13 01:37:52 -04:00
|
|
|
latinfont_configure(ltn) if ltn
|
|
|
|
end
|
2000-01-04 23:41:21 -05:00
|
|
|
if (ltn = slot.delete('asciifont'))
|
1999-08-13 01:37:52 -04:00
|
|
|
latinfont_configure(ltn) if ltn
|
|
|
|
end
|
2000-01-04 23:41:21 -05:00
|
|
|
if (knj = slot.delete('kanjifont'))
|
1999-08-13 01:37:52 -04:00
|
|
|
kanjifont_configure(knj) if knj
|
|
|
|
end
|
|
|
|
|
|
|
|
tk_call(self.path, 'configure', *hash_kv(slot)) if slot != {}
|
|
|
|
self
|
|
|
|
end
|
|
|
|
|
|
|
|
def latinfont_configure(ltn, keys=nil)
|
|
|
|
fobj = fontobj
|
|
|
|
if ltn.kind_of? TkFont
|
|
|
|
conf = {}
|
|
|
|
ltn.latin_configinfo.each{|key,val| conf[key] = val}
|
|
|
|
if keys
|
|
|
|
fobj.latin_configure(conf.update(keys))
|
|
|
|
else
|
|
|
|
fobj.latin_configure(conf)
|
|
|
|
end
|
|
|
|
else
|
|
|
|
fobj.latin_replace(ltn)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
alias asciifont_configure latinfont_configure
|
|
|
|
|
|
|
|
def kanjifont_configure(knj, keys=nil)
|
|
|
|
fobj = fontobj
|
|
|
|
if knj.kind_of? TkFont
|
|
|
|
conf = {}
|
|
|
|
knj.kanji_configinfo.each{|key,val| conf[key] = val}
|
|
|
|
if keys
|
|
|
|
fobj.kanji_configure(conf.update(keys))
|
|
|
|
else
|
|
|
|
fobj.kanji_configure(cond)
|
|
|
|
end
|
|
|
|
else
|
|
|
|
fobj.kanji_replace(knj)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def font_copy(window, tag=nil)
|
|
|
|
if tag
|
|
|
|
window.tagfontobj(tag).configinfo.each{|key,value|
|
|
|
|
fontobj.configure(key,value)
|
|
|
|
}
|
|
|
|
fontobj.replace(window.tagfontobj(tag).latin_font,
|
|
|
|
window.tagfontobj(tag).kanji_font)
|
|
|
|
else
|
|
|
|
window.fontobj.configinfo.each{|key,value|
|
|
|
|
fontobj.configure(key,value)
|
|
|
|
}
|
|
|
|
fontobj.replace(window.fontobj.latin_font, window.fontobj.kanji_font)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def latinfont_copy(window, tag=nil)
|
|
|
|
if tag
|
|
|
|
fontobj.latin_replace(window.tagfontobj(tag).latin_font)
|
|
|
|
else
|
|
|
|
fontobj.latin_replace(window.fontobj.latin_font)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
alias asciifont_copy latinfont_copy
|
|
|
|
|
|
|
|
def kanjifont_copy(window, tag=nil)
|
|
|
|
if tag
|
|
|
|
fontobj.kanji_replace(window.tagfontobj(tag).kanji_font)
|
|
|
|
else
|
|
|
|
fontobj.kanji_replace(window.fontobj.kanji_font)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2002-02-28 01:53:33 -05:00
|
|
|
module TkTreatItemFont
|
|
|
|
def __conf_cmd(idx)
|
2003-03-23 12:58:57 -05:00
|
|
|
raise NotImplementedError, "need to define `__conf_cmd'"
|
2002-02-28 01:53:33 -05:00
|
|
|
end
|
|
|
|
def __item_pathname(tagOrId)
|
2003-03-23 12:58:57 -05:00
|
|
|
raise NotImplementedError, "need to define `__item_pathname'"
|
2002-02-28 01:53:33 -05:00
|
|
|
end
|
|
|
|
private :__conf_cmd, :__item_pathname
|
|
|
|
|
|
|
|
def tagfont_configinfo(tagOrId)
|
|
|
|
pathname = __item_pathname(tagOrId)
|
|
|
|
ret = TkFont.used_on(pathname)
|
|
|
|
if ret == nil
|
|
|
|
ret = TkFont.init_widget_font(pathname, self.path,
|
|
|
|
__conf_cmd(0), __conf_cmd(1), tagOrId)
|
|
|
|
end
|
|
|
|
ret
|
|
|
|
end
|
|
|
|
alias tagfontobj tagfont_configinfo
|
|
|
|
|
|
|
|
def tagfont_configure(tagOrId, slot)
|
|
|
|
pathname = __item_pathname(tagOrId)
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
slot = _symbolkey2str(slot)
|
2002-02-28 01:53:33 -05:00
|
|
|
if (fnt = slot.delete('font'))
|
|
|
|
if fnt.kind_of? TkFont
|
|
|
|
return fnt.call_font_configure(pathname, self.path,
|
|
|
|
__conf_cmd(0), __conf_cmd(1),
|
|
|
|
tagOrId, slot)
|
|
|
|
else
|
|
|
|
latintagfont_configure(tagOrId, fnt) if fnt
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if (ltn = slot.delete('latinfont'))
|
|
|
|
latintagfont_configure(tagOrId, ltn) if ltn
|
|
|
|
end
|
|
|
|
if (ltn = slot.delete('asciifont'))
|
|
|
|
latintagfont_configure(tagOrId, ltn) if ltn
|
|
|
|
end
|
|
|
|
if (knj = slot.delete('kanjifont'))
|
|
|
|
kanjitagfont_configure(tagOrId, knj) if knj
|
|
|
|
end
|
|
|
|
|
|
|
|
tk_call(self.path, __conf_cmd(0), __conf_cmd(1),
|
|
|
|
tagOrId, *hash_kv(slot)) if slot != {}
|
|
|
|
self
|
|
|
|
end
|
|
|
|
|
|
|
|
def latintagfont_configure(tagOrId, ltn, keys=nil)
|
|
|
|
fobj = tagfontobj(tagOrId)
|
|
|
|
if ltn.kind_of? TkFont
|
|
|
|
conf = {}
|
|
|
|
ltn.latin_configinfo.each{|key,val| conf[key] = val if val != []}
|
|
|
|
if conf == {}
|
|
|
|
fobj.latin_replace(ltn)
|
|
|
|
fobj.latin_configure(keys) if keys
|
|
|
|
elsif keys
|
|
|
|
fobj.latin_configure(conf.update(keys))
|
|
|
|
else
|
|
|
|
fobj.latin_configure(conf)
|
|
|
|
end
|
|
|
|
else
|
|
|
|
fobj.latin_replace(ltn)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
alias asciitagfont_configure latintagfont_configure
|
|
|
|
|
|
|
|
def kanjitagfont_configure(tagOrId, knj, keys=nil)
|
|
|
|
fobj = tagfontobj(tagOrId)
|
|
|
|
if knj.kind_of? TkFont
|
|
|
|
conf = {}
|
|
|
|
knj.kanji_configinfo.each{|key,val| conf[key] = val if val != []}
|
|
|
|
if conf == {}
|
|
|
|
fobj.kanji_replace(knj)
|
|
|
|
fobj.kanji_configure(keys) if keys
|
|
|
|
elsif keys
|
|
|
|
fobj.kanji_configure(conf.update(keys))
|
|
|
|
else
|
|
|
|
fobj.kanji_configure(conf)
|
|
|
|
end
|
|
|
|
else
|
|
|
|
fobj.kanji_replace(knj)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def tagfont_copy(tagOrId, window, wintag=nil)
|
|
|
|
if wintag
|
|
|
|
window.tagfontobj(wintag).configinfo.each{|key,value|
|
|
|
|
tagfontobj(tagOrId).configure(key,value)
|
|
|
|
}
|
|
|
|
tagfontobj(tagOrId).replace(window.tagfontobj(wintag).latin_font,
|
|
|
|
window.tagfontobj(wintag).kanji_font)
|
|
|
|
else
|
|
|
|
window.tagfont(wintag).configinfo.each{|key,value|
|
|
|
|
tagfontobj(tagOrId).configure(key,value)
|
|
|
|
}
|
|
|
|
tagfontobj(tagOrId).replace(window.fontobj.latin_font,
|
|
|
|
window.fontobj.kanji_font)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def latintagfont_copy(tagOrId, window, wintag=nil)
|
|
|
|
if wintag
|
|
|
|
tagfontobj(tagOrId).latin_replace(window.tagfontobj(wintag).latin_font)
|
|
|
|
else
|
|
|
|
tagfontobj(tagOrId).latin_replace(window.fontobj.latin_font)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
alias asciitagfont_copy latintagfont_copy
|
|
|
|
|
|
|
|
def kanjitagfont_copy(tagOrId, window, wintag=nil)
|
|
|
|
if wintag
|
|
|
|
tagfontobj(tagOrId).kanji_replace(window.tagfontobj(wintag).kanji_font)
|
|
|
|
else
|
|
|
|
tagfontobj(tagOrId).kanji_replace(window.fontobj.kanji_font)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
1999-08-13 01:37:52 -04:00
|
|
|
class TkObject<TkKernel
|
|
|
|
include Tk
|
|
|
|
include TkTreatFont
|
2000-01-17 03:37:53 -05:00
|
|
|
include TkBindCore
|
1999-08-13 01:37:52 -04:00
|
|
|
|
|
|
|
def path
|
|
|
|
return @path
|
|
|
|
end
|
|
|
|
|
|
|
|
def epath
|
|
|
|
return @path
|
|
|
|
end
|
|
|
|
|
|
|
|
def to_eval
|
|
|
|
@path
|
|
|
|
end
|
|
|
|
|
|
|
|
def tk_send(cmd, *rest)
|
|
|
|
tk_call path, cmd, *rest
|
|
|
|
end
|
|
|
|
private :tk_send
|
|
|
|
|
|
|
|
def method_missing(id, *args)
|
|
|
|
name = id.id2name
|
|
|
|
case args.length
|
|
|
|
when 1
|
|
|
|
configure name, args[0]
|
|
|
|
when 0
|
|
|
|
begin
|
|
|
|
cget name
|
|
|
|
rescue
|
|
|
|
fail NameError, "undefined local variable or method `#{name}' for #{self.to_s}", error_at
|
|
|
|
end
|
|
|
|
else
|
|
|
|
fail NameError, "undefined method `#{name}' for #{self.to_s}", error_at
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def [](id)
|
|
|
|
cget id
|
|
|
|
end
|
|
|
|
|
|
|
|
def []=(id, val)
|
|
|
|
configure id, val
|
|
|
|
end
|
|
|
|
|
|
|
|
def cget(slot)
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
case slot.to_s
|
2001-09-05 02:54:57 -04:00
|
|
|
when 'text', 'label', 'show', 'data', 'file'
|
2000-11-27 04:23:38 -05:00
|
|
|
tk_call path, 'cget', "-#{slot}"
|
|
|
|
else
|
2002-06-28 10:42:46 -04:00
|
|
|
tk_tcl2ruby tk_call(path, 'cget', "-#{slot}")
|
2000-11-27 04:23:38 -05:00
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def configure(slot, value=None)
|
|
|
|
if slot.kind_of? Hash
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
if (slot['font'] || slot[:font] ||
|
|
|
|
slot['kanjifont'] || slot[:kanjifont] ||
|
|
|
|
slot['latinfont'] || slot[:latinfont] ||
|
|
|
|
slot['asciifont'] || slot[:asciifont] )
|
|
|
|
font_configure(slot)
|
1999-08-13 01:37:52 -04:00
|
|
|
else
|
|
|
|
tk_call path, 'configure', *hash_kv(slot)
|
|
|
|
end
|
|
|
|
|
|
|
|
else
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
if (slot == 'font' || slot == :font ||
|
|
|
|
slot == 'kanjifont' || slot == :kanjifont ||
|
|
|
|
slot == 'latinfont' || slot == :latinfont ||
|
|
|
|
slot == 'asciifont' || slot == :asciifont )
|
1999-08-13 01:37:52 -04:00
|
|
|
if value == None
|
|
|
|
fontobj
|
|
|
|
else
|
|
|
|
font_configure({slot=>value})
|
|
|
|
end
|
|
|
|
else
|
|
|
|
tk_call path, 'configure', "-#{slot}", value
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def configure_cmd(slot, value)
|
|
|
|
configure slot, install_cmd(value)
|
|
|
|
end
|
|
|
|
|
|
|
|
def configinfo(slot = nil)
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
if slot == 'font' || slot == :font ||
|
|
|
|
slot == 'kanjifont' || slot == :kanjifont
|
1999-08-13 01:37:52 -04:00
|
|
|
fontobj
|
|
|
|
else
|
|
|
|
if slot
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
case slot.to_s
|
2001-09-05 02:54:57 -04:00
|
|
|
when 'text', 'label', 'show', 'data', 'file'
|
2000-11-27 04:23:38 -05:00
|
|
|
conf = tk_split_simplelist(tk_send('configure', "-#{slot}") )
|
|
|
|
else
|
|
|
|
conf = tk_split_list(tk_send('configure', "-#{slot}") )
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
conf[0] = conf[0][1..-1]
|
|
|
|
conf
|
|
|
|
else
|
2000-11-27 04:23:38 -05:00
|
|
|
ret = tk_split_simplelist(tk_send('configure') ).collect{|conflist|
|
|
|
|
conf = tk_split_simplelist(conflist)
|
1999-08-13 01:37:52 -04:00
|
|
|
conf[0] = conf[0][1..-1]
|
2000-11-27 04:23:38 -05:00
|
|
|
case conf[0]
|
2001-09-05 02:54:57 -04:00
|
|
|
when 'text', 'label', 'show', 'data', 'file'
|
2000-11-27 04:23:38 -05:00
|
|
|
else
|
|
|
|
if conf[3]
|
|
|
|
if conf[3].index('{')
|
|
|
|
conf[3] = tk_split_list(conf[3])
|
|
|
|
else
|
|
|
|
conf[3] = tk_tcl2ruby(conf[3])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if conf[4]
|
|
|
|
if conf[4].index('{')
|
|
|
|
conf[4] = tk_split_list(conf[4])
|
|
|
|
else
|
|
|
|
conf[4] = tk_tcl2ruby(conf[4])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
conf
|
|
|
|
}
|
2000-11-27 04:23:38 -05:00
|
|
|
fontconf = ret.assoc('font')
|
|
|
|
if fontconf
|
1999-08-13 01:37:52 -04:00
|
|
|
ret.delete_if{|item| item[0] == 'font' || item[0] == 'kanjifont'}
|
2000-11-27 04:23:38 -05:00
|
|
|
fontconf[4] = fontobj
|
|
|
|
ret.push(fontconf)
|
1999-08-13 01:37:52 -04:00
|
|
|
else
|
|
|
|
ret
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def event_generate(context, keys=nil)
|
|
|
|
if keys
|
|
|
|
tk_call('event', 'generate', path,
|
|
|
|
"<#{tk_event_sequence(context)}>", *hash_kv(keys))
|
|
|
|
else
|
|
|
|
tk_call('event', 'generate', path, "<#{tk_event_sequence(context)}>")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def tk_trace_variable(v)
|
|
|
|
unless v.kind_of?(TkVariable)
|
|
|
|
fail ArgumentError, format("requires TkVariable given %s", v.type)
|
|
|
|
end
|
|
|
|
v
|
|
|
|
end
|
|
|
|
private :tk_trace_variable
|
|
|
|
|
|
|
|
def destroy
|
|
|
|
tk_call 'trace', 'vdelete', @tk_vn, 'w', @var_id if @var_id
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class TkWindow<TkObject
|
2000-01-17 03:37:53 -05:00
|
|
|
extend TkBindCore
|
1999-08-13 01:37:52 -04:00
|
|
|
|
|
|
|
def initialize(parent=nil, keys=nil)
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
if parent.kind_of? Hash
|
|
|
|
keys = _symbolkey2str(parent)
|
|
|
|
keydup = true
|
|
|
|
parent = keys.delete('parent')
|
|
|
|
widgetname = keys.delete('widgetname')
|
|
|
|
install_win(if parent then parent.path end, widgetname)
|
|
|
|
elsif keys
|
|
|
|
keys = _symbolkey2str(keys)
|
|
|
|
widgetname = keys.delete('widgetname')
|
|
|
|
install_win(if parent then parent.path end, widgetname)
|
|
|
|
else
|
|
|
|
install_win(if parent then parent.path end)
|
|
|
|
end
|
2002-02-28 01:53:33 -05:00
|
|
|
if self.method(:create_self).arity == 0
|
|
|
|
p 'create_self has no arg' if $DEBUG
|
|
|
|
create_self
|
|
|
|
if keys
|
|
|
|
# tk_call @path, 'configure', *hash_kv(keys)
|
|
|
|
configure(keys)
|
|
|
|
end
|
|
|
|
else
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
p 'create_self has args' if $DEBUG
|
2002-02-28 01:53:33 -05:00
|
|
|
fontkeys = {}
|
|
|
|
if keys
|
|
|
|
['font', 'kanjifont', 'latinfont', 'asciifont'].each{|key|
|
|
|
|
fontkeys[key] = keys.delete(key) if keys.key?(key)
|
|
|
|
}
|
|
|
|
end
|
|
|
|
create_self(keys)
|
|
|
|
font_configure(fontkeys) unless fontkeys.empty?
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def create_self
|
|
|
|
end
|
|
|
|
private :create_self
|
|
|
|
|
|
|
|
def pack(keys = nil)
|
|
|
|
tk_call 'pack', epath, *hash_kv(keys)
|
|
|
|
self
|
|
|
|
end
|
|
|
|
|
2000-06-12 03:48:31 -04:00
|
|
|
def unpack
|
1999-08-13 01:37:52 -04:00
|
|
|
tk_call 'pack', 'forget', epath
|
|
|
|
self
|
|
|
|
end
|
2000-11-27 04:23:38 -05:00
|
|
|
alias pack_forget unpack
|
|
|
|
|
|
|
|
def pack_config(slot, value=None)
|
|
|
|
if slot.kind_of? Hash
|
|
|
|
tk_call 'pack', 'configure', epath, *hash_kv(slot)
|
|
|
|
else
|
|
|
|
tk_call 'pack', 'configure', epath, "-#{slot}", value
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def pack_info()
|
|
|
|
ilist = list(tk_call('pack', 'info', epath))
|
|
|
|
info = {}
|
|
|
|
while key = ilist.shift
|
|
|
|
info[key[1..-1]] = ilist.shift
|
|
|
|
end
|
|
|
|
return info
|
|
|
|
end
|
|
|
|
|
|
|
|
def pack_propagate(mode = nil)
|
|
|
|
if mode
|
|
|
|
tk_call('pack', 'propagate', epath, mode)
|
|
|
|
else
|
|
|
|
bool(tk_call('pack', 'propagate', epath))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def pack_slaves()
|
|
|
|
list(tk_call('pack', 'slaves', epath))
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
|
|
|
|
def grid(keys = nil)
|
|
|
|
tk_call 'grid', epath, *hash_kv(keys)
|
|
|
|
self
|
|
|
|
end
|
|
|
|
|
2000-06-12 03:48:31 -04:00
|
|
|
def ungrid
|
1999-08-13 01:37:52 -04:00
|
|
|
tk_call 'grid', 'forget', epath
|
|
|
|
self
|
|
|
|
end
|
2000-11-27 04:23:38 -05:00
|
|
|
alias grid_forget ungrid
|
|
|
|
|
|
|
|
def grid_bbox(*args)
|
|
|
|
list(tk_call('grid', 'bbox', epath, *args))
|
|
|
|
end
|
|
|
|
|
|
|
|
def grid_config(slot, value=None)
|
|
|
|
if slot.kind_of? Hash
|
|
|
|
tk_call 'grid', 'configure', epath, *hash_kv(slot)
|
|
|
|
else
|
|
|
|
tk_call 'grid', 'configure', epath, "-#{slot}", value
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def grid_columnconfig(index, keys)
|
2002-02-28 01:53:33 -05:00
|
|
|
tk_call('grid', 'columnconfigure', epath, index, *hash_kv(keys))
|
2000-11-27 04:23:38 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def grid_rowconfig(index, keys)
|
2002-02-28 01:53:33 -05:00
|
|
|
tk_call('grid', 'rowconfigure', epath, index, *hash_kv(keys))
|
2000-11-27 04:23:38 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def grid_columnconfiginfo(index, slot=nil)
|
|
|
|
if slot
|
|
|
|
tk_call('grid', 'columnconfigure', epath, index, "-#{slot}")
|
|
|
|
else
|
|
|
|
ilist = list(tk_call('grid', 'columnconfigure', epath, index))
|
|
|
|
info = {}
|
|
|
|
while key = ilist.shift
|
|
|
|
info[key[1..-1]] = ilist.shift
|
|
|
|
end
|
|
|
|
info
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def grid_rowconfiginfo(index, slot=nil)
|
|
|
|
if slot
|
|
|
|
tk_call('grid', 'rowconfigure', epath, index, "-#{slot}")
|
|
|
|
else
|
|
|
|
ilist = list(tk_call('grid', 'rowconfigure', epath, index))
|
|
|
|
info = {}
|
|
|
|
while key = ilist.shift
|
|
|
|
info[key[1..-1]] = ilist.shift
|
|
|
|
end
|
|
|
|
info
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def grid_info()
|
|
|
|
list(tk_call('grid', 'info', epath))
|
|
|
|
end
|
|
|
|
|
|
|
|
def grid_location(x, y)
|
|
|
|
list(tk_call('grid', 'location', epath, x, y))
|
|
|
|
end
|
|
|
|
|
|
|
|
def grid_propagate(mode=nil)
|
|
|
|
if mode
|
2001-03-27 02:10:58 -05:00
|
|
|
tk_call('grid', 'propagate', epath, mode)
|
2000-11-27 04:23:38 -05:00
|
|
|
else
|
|
|
|
bool(tk_call('grid', 'propagate', epath))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def grid_remove()
|
|
|
|
tk_call 'grid', 'remove', epath
|
|
|
|
end
|
|
|
|
|
|
|
|
def grid_size()
|
|
|
|
tk_call 'grid', 'size', epath
|
|
|
|
end
|
|
|
|
|
|
|
|
def grid_slaves(args)
|
|
|
|
list(tk_call('grid', 'slaves', epath, *hash_kv(args)))
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
|
|
|
|
def place(keys = nil)
|
|
|
|
tk_call 'place', epath, *hash_kv(keys)
|
|
|
|
self
|
|
|
|
end
|
|
|
|
|
2000-06-12 03:48:31 -04:00
|
|
|
def unplace
|
|
|
|
tk_call 'place', 'forget', epath
|
1999-08-13 01:37:52 -04:00
|
|
|
self
|
|
|
|
end
|
|
|
|
alias place_forget unplace
|
|
|
|
|
2000-11-27 04:23:38 -05:00
|
|
|
def place_config(slot, value=None)
|
|
|
|
if slot.kind_of? Hash
|
|
|
|
tk_call 'place', 'configure', epath, *hash_kv(slot)
|
|
|
|
else
|
|
|
|
tk_call 'place', 'configure', epath, "-#{slot}", value
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2000-11-27 04:23:38 -05:00
|
|
|
def place_configinfo(slot = nil)
|
|
|
|
# for >= Tk8.4a2 ?
|
|
|
|
if slot
|
|
|
|
conf = tk_split_list(tk_call('place', 'configure', epath, "-#{slot}") )
|
|
|
|
conf[0] = conf[0][1..-1]
|
|
|
|
conf
|
|
|
|
else
|
|
|
|
tk_split_simplelist(tk_call('place',
|
|
|
|
'configure', epath)).collect{|conflist|
|
|
|
|
conf = tk_split_simplelist(conflist)
|
|
|
|
conf[0] = conf[0][1..-1]
|
|
|
|
conf
|
|
|
|
}
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
2000-11-27 04:23:38 -05:00
|
|
|
def place_info()
|
|
|
|
ilist = list(tk_call('place', 'info', epath))
|
1999-08-13 01:37:52 -04:00
|
|
|
info = {}
|
|
|
|
while key = ilist.shift
|
|
|
|
info[key[1..-1]] = ilist.shift
|
|
|
|
end
|
|
|
|
return info
|
|
|
|
end
|
|
|
|
|
|
|
|
def place_slaves()
|
|
|
|
list(tk_call('place', 'slaves', epath))
|
|
|
|
end
|
|
|
|
|
|
|
|
def focus(force=false)
|
|
|
|
if force
|
|
|
|
tk_call 'focus', '-force', path
|
|
|
|
else
|
|
|
|
tk_call 'focus', path
|
|
|
|
end
|
|
|
|
self
|
|
|
|
end
|
|
|
|
|
|
|
|
def grab(*args)
|
|
|
|
if !args or args.length == 0
|
|
|
|
tk_call 'grab', 'set', path
|
|
|
|
elsif args.length == 1
|
|
|
|
case args[0]
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
when 'global', :global
|
2002-06-28 10:42:46 -04:00
|
|
|
return(tk_call('grab', 'set', '-global', path))
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
when 'release', :release
|
2002-06-28 10:42:46 -04:00
|
|
|
return tk_call('grab', 'release', path)
|
1999-08-13 01:37:52 -04:00
|
|
|
else
|
|
|
|
val = tk_call('grab', args[0], path)
|
|
|
|
end
|
|
|
|
case args[0]
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
when 'current', :current
|
1999-08-13 01:37:52 -04:00
|
|
|
return window(val)
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
when 'status', :status
|
1999-08-13 01:37:52 -04:00
|
|
|
return val
|
|
|
|
end
|
|
|
|
else
|
|
|
|
fail ArgumentError, 'wrong # of args'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def lower(below=None)
|
2000-06-12 03:48:31 -04:00
|
|
|
tk_call 'lower', epath, below
|
1999-08-13 01:37:52 -04:00
|
|
|
self
|
|
|
|
end
|
|
|
|
def raise(above=None)
|
2000-06-12 03:48:31 -04:00
|
|
|
tk_call 'raise', epath, above
|
1999-08-13 01:37:52 -04:00
|
|
|
self
|
|
|
|
end
|
|
|
|
|
|
|
|
def command(cmd=Proc.new)
|
|
|
|
configure_cmd 'command', cmd
|
|
|
|
end
|
|
|
|
|
|
|
|
def colormodel model=None
|
|
|
|
tk_call 'tk', 'colormodel', path, model
|
|
|
|
self
|
|
|
|
end
|
|
|
|
|
|
|
|
def destroy
|
2002-09-12 02:27:15 -04:00
|
|
|
super
|
2000-06-12 03:48:31 -04:00
|
|
|
tk_call 'destroy', epath
|
1999-08-13 01:37:52 -04:00
|
|
|
if @cmdtbl
|
|
|
|
for id in @cmdtbl
|
|
|
|
uninstall_cmd id
|
|
|
|
end
|
|
|
|
end
|
|
|
|
uninstall_win
|
|
|
|
end
|
|
|
|
|
|
|
|
def wait_visibility
|
|
|
|
tk_call 'tkwait', 'visibility', path
|
|
|
|
end
|
|
|
|
alias wait wait_visibility
|
|
|
|
|
|
|
|
def wait_destroy
|
2000-06-12 03:48:31 -04:00
|
|
|
tk_call 'tkwait', 'window', epath
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def bindtags(taglist=nil)
|
|
|
|
if taglist
|
2001-05-06 11:06:00 -04:00
|
|
|
fail ArgumentError unless taglist.kind_of? Array
|
1999-08-13 01:37:52 -04:00
|
|
|
tk_call('bindtags', path, taglist)
|
|
|
|
else
|
2000-01-17 03:37:53 -05:00
|
|
|
list(tk_call('bindtags', path)).collect{|tag|
|
|
|
|
if tag.kind_of?(String)
|
|
|
|
if cls = WidgetClassNames[tag]
|
|
|
|
cls
|
|
|
|
elsif btag = TkBindTag.id2obj(tag)
|
|
|
|
btag
|
|
|
|
else
|
|
|
|
tag
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
else
|
|
|
|
tag
|
|
|
|
end
|
|
|
|
}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class TkRoot<TkWindow
|
|
|
|
include Wm
|
|
|
|
ROOT = []
|
|
|
|
def TkRoot.new
|
|
|
|
return ROOT[0] if ROOT[0]
|
|
|
|
new = super
|
|
|
|
ROOT[0] = new
|
|
|
|
Tk_WINDOWS["."] = new
|
|
|
|
end
|
|
|
|
|
|
|
|
WidgetClassName = 'Tk'.freeze
|
1999-08-24 04:21:56 -04:00
|
|
|
WidgetClassNames[WidgetClassName] = self
|
1999-08-13 01:37:52 -04:00
|
|
|
def self.to_eval
|
|
|
|
WidgetClassName
|
|
|
|
end
|
|
|
|
|
|
|
|
def create_self
|
|
|
|
@path = '.'
|
|
|
|
end
|
|
|
|
def path
|
|
|
|
"."
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class TkToplevel<TkWindow
|
|
|
|
include Wm
|
|
|
|
|
|
|
|
WidgetClassName = 'Toplevel'.freeze
|
1999-08-24 04:21:56 -04:00
|
|
|
WidgetClassNames[WidgetClassName] = self
|
1999-08-13 01:37:52 -04:00
|
|
|
def self.to_eval
|
|
|
|
WidgetClassName
|
|
|
|
end
|
|
|
|
|
2002-02-28 01:53:33 -05:00
|
|
|
################# old version
|
|
|
|
# def initialize(parent=nil, screen=nil, classname=nil, keys=nil)
|
|
|
|
# if screen.kind_of? Hash
|
|
|
|
# keys = screen.dup
|
|
|
|
# else
|
|
|
|
# @screen = screen
|
|
|
|
# end
|
|
|
|
# @classname = classname
|
|
|
|
# if keys.kind_of? Hash
|
|
|
|
# keys = keys.dup
|
|
|
|
# @classname = keys.delete('classname') if keys.key?('classname')
|
|
|
|
# @colormap = keys.delete('colormap') if keys.key?('colormap')
|
|
|
|
# @container = keys.delete('container') if keys.key?('container')
|
|
|
|
# @screen = keys.delete('screen') if keys.key?('screen')
|
|
|
|
# @use = keys.delete('use') if keys.key?('use')
|
|
|
|
# @visual = keys.delete('visual') if keys.key?('visual')
|
|
|
|
# end
|
|
|
|
# super(parent, keys)
|
|
|
|
# end
|
|
|
|
#
|
|
|
|
# def create_self
|
|
|
|
# s = []
|
|
|
|
# s << "-class" << @classname if @classname
|
|
|
|
# s << "-colormap" << @colormap if @colormap
|
|
|
|
# s << "-container" << @container if @container
|
|
|
|
# s << "-screen" << @screen if @screen
|
|
|
|
# s << "-use" << @use if @use
|
|
|
|
# s << "-visual" << @visual if @visual
|
|
|
|
# tk_call 'toplevel', @path, *s
|
|
|
|
# end
|
|
|
|
#################
|
|
|
|
|
1999-08-13 01:37:52 -04:00
|
|
|
def initialize(parent=nil, screen=nil, classname=nil, keys=nil)
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
if parent.kind_of? Hash
|
|
|
|
keys = _symbolkey2str(parent)
|
|
|
|
@screen = keys['screen']
|
|
|
|
@classname = keys['class']
|
|
|
|
@colormap = keys['colormap']
|
|
|
|
@container = keys['container']
|
|
|
|
@screen = keys['screen']
|
|
|
|
@use = keys['use']
|
|
|
|
@visual = keys['visual']
|
|
|
|
super(keys)
|
|
|
|
return
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
if screen.kind_of? Hash
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
keys = _symbolkey2str(screen)
|
1999-08-13 01:37:52 -04:00
|
|
|
else
|
|
|
|
@screen = screen
|
|
|
|
end
|
|
|
|
@classname = classname
|
|
|
|
if keys.kind_of? Hash
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
keys = _symbolkey2str(keys)
|
|
|
|
if keys.key?(:classname) || keys.key?('classname')
|
2002-02-28 01:53:33 -05:00
|
|
|
keys['class'] = keys.delete('classname')
|
|
|
|
end
|
|
|
|
@classname = keys['class']
|
|
|
|
@colormap = keys['colormap']
|
|
|
|
@container = keys['container']
|
|
|
|
@screen = keys['screen']
|
|
|
|
@use = keys['use']
|
|
|
|
@visual = keys['visual']
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
super(parent, keys)
|
|
|
|
end
|
|
|
|
|
2002-02-28 01:53:33 -05:00
|
|
|
def create_self(keys)
|
|
|
|
if keys and keys != None
|
|
|
|
tk_call 'toplevel', @path, *hash_kv(keys)
|
|
|
|
else
|
|
|
|
tk_call 'toplevel', @path
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def specific_class
|
|
|
|
@classname
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class TkFrame<TkWindow
|
|
|
|
WidgetClassName = 'Frame'.freeze
|
1999-08-24 04:21:56 -04:00
|
|
|
WidgetClassNames[WidgetClassName] = self
|
1999-08-13 01:37:52 -04:00
|
|
|
def self.to_eval
|
|
|
|
WidgetClassName
|
|
|
|
end
|
|
|
|
|
2002-02-28 01:53:33 -05:00
|
|
|
################# old version
|
|
|
|
# def initialize(parent=nil, keys=nil)
|
|
|
|
# if keys.kind_of? Hash
|
|
|
|
# keys = keys.dup
|
|
|
|
# @classname = keys.delete('classname') if keys.key?('classname')
|
|
|
|
# @colormap = keys.delete('colormap') if keys.key?('colormap')
|
|
|
|
# @container = keys.delete('container') if keys.key?('container')
|
|
|
|
# @visual = keys.delete('visual') if keys.key?('visual')
|
|
|
|
# end
|
|
|
|
# super(parent, keys)
|
|
|
|
# end
|
|
|
|
#
|
|
|
|
# def create_self
|
|
|
|
# s = []
|
|
|
|
# s << "-class" << @classname if @classname
|
|
|
|
# s << "-colormap" << @colormap if @colormap
|
|
|
|
# s << "-container" << @container if @container
|
|
|
|
# s << "-visual" << @visual if @visual
|
|
|
|
# tk_call 'frame', @path, *s
|
|
|
|
# end
|
|
|
|
#################
|
|
|
|
|
1999-08-13 01:37:52 -04:00
|
|
|
def initialize(parent=nil, keys=nil)
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
if parent.kind_of? Hash
|
|
|
|
keys = _symbolkey2str(parent)
|
|
|
|
else
|
|
|
|
if keys
|
|
|
|
keys = _symbolkey2str(keys)
|
|
|
|
keys['parent'] = parent
|
|
|
|
else
|
|
|
|
keys = {'parent'=>parent}
|
2002-02-28 01:53:33 -05:00
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
if keys.key?('classname')
|
|
|
|
keys['class'] = keys.delete('classname')
|
|
|
|
end
|
|
|
|
@classname = keys['class']
|
|
|
|
@colormap = keys['colormap']
|
|
|
|
@container = keys['container']
|
|
|
|
@visual = keys['visual']
|
|
|
|
super(keys)
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
2002-02-28 01:53:33 -05:00
|
|
|
def create_self(keys)
|
|
|
|
if keys and keys != None
|
|
|
|
tk_call 'frame', @path, *hash_kv(keys)
|
|
|
|
else
|
|
|
|
tk_call 'frame', @path
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class TkLabel<TkWindow
|
|
|
|
WidgetClassName = 'Label'.freeze
|
1999-08-24 04:21:56 -04:00
|
|
|
WidgetClassNames[WidgetClassName] = self
|
1999-08-13 01:37:52 -04:00
|
|
|
def self.to_eval
|
|
|
|
WidgetClassName
|
|
|
|
end
|
2002-02-28 01:53:33 -05:00
|
|
|
def create_self(keys)
|
|
|
|
if keys and keys != None
|
|
|
|
tk_call 'label', @path, *hash_kv(keys)
|
|
|
|
else
|
|
|
|
tk_call 'label', @path
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
def textvariable(v)
|
|
|
|
configure 'textvariable', tk_trace_variable(v)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class TkButton<TkLabel
|
1999-08-24 04:21:56 -04:00
|
|
|
WidgetClassNames['Button'] = self
|
1999-08-13 01:37:52 -04:00
|
|
|
def TkButton.to_eval
|
|
|
|
'Button'
|
|
|
|
end
|
2002-02-28 01:53:33 -05:00
|
|
|
def create_self(keys)
|
|
|
|
if keys and keys != None
|
|
|
|
tk_call 'button', @path, *hash_kv(keys)
|
|
|
|
else
|
|
|
|
tk_call 'button', @path
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
def invoke
|
|
|
|
tk_send 'invoke'
|
|
|
|
end
|
|
|
|
def flash
|
|
|
|
tk_send 'flash'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2000-11-27 04:23:38 -05:00
|
|
|
class TkRadioButton<TkButton
|
1999-08-24 04:21:56 -04:00
|
|
|
WidgetClassNames['Radiobutton'] = self
|
2000-11-27 04:23:38 -05:00
|
|
|
def TkRadioButton.to_eval
|
1999-08-13 01:37:52 -04:00
|
|
|
'Radiobutton'
|
|
|
|
end
|
2002-02-28 01:53:33 -05:00
|
|
|
def create_self(keys)
|
|
|
|
if keys and keys != None
|
|
|
|
tk_call 'radiobutton', @path, *hash_kv(keys)
|
|
|
|
else
|
|
|
|
tk_call 'radiobutton', @path
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
def deselect
|
|
|
|
tk_send 'deselect'
|
|
|
|
end
|
|
|
|
def select
|
|
|
|
tk_send 'select'
|
|
|
|
end
|
|
|
|
def variable(v)
|
|
|
|
configure 'variable', tk_trace_variable(v)
|
|
|
|
end
|
|
|
|
end
|
2000-11-27 04:23:38 -05:00
|
|
|
TkRadiobutton = TkRadioButton
|
1999-08-13 01:37:52 -04:00
|
|
|
|
2000-11-27 04:23:38 -05:00
|
|
|
class TkCheckButton<TkRadioButton
|
1999-08-24 04:21:56 -04:00
|
|
|
WidgetClassNames['Checkbutton'] = self
|
2000-11-27 04:23:38 -05:00
|
|
|
def TkCheckButton.to_eval
|
1999-08-13 01:37:52 -04:00
|
|
|
'Checkbutton'
|
|
|
|
end
|
2002-02-28 01:53:33 -05:00
|
|
|
def create_self(keys)
|
|
|
|
if keys and keys != None
|
|
|
|
tk_call 'checkbutton', @path, *hash_kv(keys)
|
|
|
|
else
|
|
|
|
tk_call 'checkbutton', @path
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
def toggle
|
|
|
|
tk_send 'toggle'
|
|
|
|
end
|
|
|
|
end
|
2000-11-27 04:23:38 -05:00
|
|
|
TkCheckbutton = TkCheckButton
|
1999-08-13 01:37:52 -04:00
|
|
|
|
|
|
|
class TkMessage<TkLabel
|
1999-08-24 04:21:56 -04:00
|
|
|
WidgetClassNames['Message'] = self
|
1999-08-13 01:37:52 -04:00
|
|
|
def TkMessage.to_eval
|
|
|
|
'Message'
|
|
|
|
end
|
2002-02-28 01:53:33 -05:00
|
|
|
def create_self(keys)
|
|
|
|
if keys and keys != None
|
|
|
|
tk_call 'message', @path, *hash_kv(keys)
|
|
|
|
else
|
|
|
|
tk_call 'message', @path
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class TkScale<TkWindow
|
|
|
|
WidgetClassName = 'Scale'.freeze
|
1999-08-24 04:21:56 -04:00
|
|
|
WidgetClassNames[WidgetClassName] = self
|
1999-08-13 01:37:52 -04:00
|
|
|
def self.to_eval
|
|
|
|
WidgetClassName
|
|
|
|
end
|
|
|
|
|
2002-02-28 01:53:33 -05:00
|
|
|
def create_self(keys)
|
|
|
|
if keys and keys != None
|
|
|
|
tk_call 'scale', @path, *hash_kv(keys)
|
|
|
|
else
|
|
|
|
tk_call 'scale', @path
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
2001-03-27 02:10:58 -05:00
|
|
|
def get(x=None, y=None)
|
|
|
|
number(tk_send('get', x, y))
|
|
|
|
end
|
|
|
|
|
|
|
|
def coords(val=None)
|
|
|
|
tk_split_list(tk_send('coords', val))
|
|
|
|
end
|
|
|
|
|
|
|
|
def identify(x, y)
|
|
|
|
tk_send('identify', x, y)
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def set(val)
|
|
|
|
tk_send "set", val
|
|
|
|
end
|
|
|
|
|
|
|
|
def value
|
|
|
|
get
|
|
|
|
end
|
|
|
|
|
|
|
|
def value= (val)
|
|
|
|
set val
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class TkScrollbar<TkWindow
|
|
|
|
WidgetClassName = 'Scrollbar'.freeze
|
1999-08-24 04:21:56 -04:00
|
|
|
WidgetClassNames[WidgetClassName] = self
|
1999-08-13 01:37:52 -04:00
|
|
|
def self.to_eval
|
|
|
|
WidgetClassName
|
|
|
|
end
|
|
|
|
|
2002-02-28 01:53:33 -05:00
|
|
|
def create_self(keys)
|
|
|
|
if keys and keys != None
|
|
|
|
tk_call 'scrollbar', @path, *hash_kv(keys)
|
|
|
|
else
|
|
|
|
tk_call 'scrollbar', @path
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def delta(deltax=None, deltay=None)
|
|
|
|
number(tk_send('delta', deltax, deltay))
|
|
|
|
end
|
|
|
|
|
|
|
|
def fraction(x=None, y=None)
|
|
|
|
number(tk_send('fraction', x, y))
|
|
|
|
end
|
|
|
|
|
2001-03-27 02:10:58 -05:00
|
|
|
def identify(x, y)
|
|
|
|
tk_send('identify', x, y)
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def get
|
|
|
|
ary1 = tk_send('get').split
|
|
|
|
ary2 = []
|
|
|
|
for i in ary1
|
|
|
|
ary2.push number(i)
|
|
|
|
end
|
|
|
|
ary2
|
|
|
|
end
|
|
|
|
|
|
|
|
def set(first, last)
|
|
|
|
tk_send "set", first, last
|
|
|
|
end
|
2001-03-27 02:10:58 -05:00
|
|
|
|
|
|
|
def activate(element=None)
|
|
|
|
tk_send('activate', element)
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
class TkTextWin<TkWindow
|
|
|
|
def create_self
|
2000-01-31 22:12:21 -05:00
|
|
|
fail TypeError, "TkTextWin is abstract class"
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def bbox(index)
|
|
|
|
tk_send 'bbox', index
|
|
|
|
end
|
|
|
|
def delete(first, last=None)
|
|
|
|
tk_send 'delete', first, last
|
|
|
|
end
|
|
|
|
def get(*index)
|
|
|
|
tk_send 'get', *index
|
|
|
|
end
|
|
|
|
def index(index)
|
|
|
|
tk_send 'index', index
|
|
|
|
end
|
|
|
|
def insert(index, chars, *args)
|
|
|
|
tk_send 'insert', index, chars, *args
|
|
|
|
end
|
|
|
|
def scan_mark(x, y)
|
|
|
|
tk_send 'scan', 'mark', x, y
|
|
|
|
end
|
|
|
|
def scan_dragto(x, y)
|
|
|
|
tk_send 'scan', 'dragto', x, y
|
|
|
|
end
|
|
|
|
def see(index)
|
|
|
|
tk_send 'see', index
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2002-02-28 01:53:33 -05:00
|
|
|
module TkTreatListItemFont
|
|
|
|
include TkTreatItemFont
|
|
|
|
|
|
|
|
ItemCMD = ['itemconfigure', TkComm::None]
|
|
|
|
def __conf_cmd(idx)
|
|
|
|
ItemCMD[idx]
|
|
|
|
end
|
|
|
|
|
|
|
|
def __item_pathname(tagOrId)
|
|
|
|
self.path + ';' + tagOrId.to_s
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
1999-08-13 01:37:52 -04:00
|
|
|
class TkListbox<TkTextWin
|
2002-02-28 01:53:33 -05:00
|
|
|
include TkTreatListItemFont
|
1999-12-06 04:04:03 -05:00
|
|
|
include Scrollable
|
|
|
|
|
1999-08-24 04:21:56 -04:00
|
|
|
WidgetClassNames['Listbox'] = self
|
1999-08-13 01:37:52 -04:00
|
|
|
def TkListbox.to_eval
|
|
|
|
'Listbox'
|
|
|
|
end
|
2002-02-28 01:53:33 -05:00
|
|
|
def create_self(keys)
|
|
|
|
if keys and keys != None
|
|
|
|
tk_call 'listbox', @path, *hash_kv(keys)
|
|
|
|
else
|
|
|
|
tk_call 'listbox', @path
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def activate(y)
|
|
|
|
tk_send 'activate', y
|
|
|
|
end
|
|
|
|
def curselection
|
|
|
|
list(tk_send('curselection'))
|
|
|
|
end
|
2000-01-31 22:12:21 -05:00
|
|
|
def get(*index)
|
|
|
|
v = tk_send('get', *index)
|
|
|
|
if index.size == 1
|
|
|
|
v
|
|
|
|
else
|
|
|
|
tk_split_simplelist(v)
|
|
|
|
end
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
def nearest(y)
|
|
|
|
tk_send('nearest', y).to_i
|
|
|
|
end
|
1999-12-14 01:50:43 -05:00
|
|
|
def size
|
1999-08-13 01:37:52 -04:00
|
|
|
tk_send('size').to_i
|
|
|
|
end
|
|
|
|
def selection_anchor(index)
|
|
|
|
tk_send 'selection', 'anchor', index
|
|
|
|
end
|
|
|
|
def selection_clear(first, last=None)
|
|
|
|
tk_send 'selection', 'clear', first, last
|
|
|
|
end
|
1999-12-14 01:50:43 -05:00
|
|
|
def selection_includes(index)
|
|
|
|
bool(tk_send('selection', 'includes', index))
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
def selection_set(first, last=None)
|
|
|
|
tk_send 'selection', 'set', first, last
|
|
|
|
end
|
2000-06-12 03:48:31 -04:00
|
|
|
|
|
|
|
def itemcget(index, key)
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
case key.to_s
|
2000-11-27 04:23:38 -05:00
|
|
|
when 'text', 'label', 'show'
|
|
|
|
tk_send 'itemcget', index, "-#{key}"
|
|
|
|
else
|
2002-06-28 10:42:46 -04:00
|
|
|
tk_tcl2ruby tk_send('itemcget', index, "-#{key}")
|
2000-11-27 04:23:38 -05:00
|
|
|
end
|
2000-06-12 03:48:31 -04:00
|
|
|
end
|
|
|
|
def itemconfigure(index, key, val=None)
|
|
|
|
if key.kind_of? Hash
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
if (key['font'] || key[:font] ||
|
|
|
|
key['kanjifont'] || key[:kanjifont] ||
|
|
|
|
key['latinfont'] || key[:latinfont] ||
|
|
|
|
key['asciifont'] || key[:asciifont] )
|
|
|
|
tagfont_configure(index, _symbolkey2str(key))
|
2000-06-12 03:48:31 -04:00
|
|
|
else
|
|
|
|
tk_send 'itemconfigure', index, *hash_kv(key)
|
|
|
|
end
|
|
|
|
|
|
|
|
else
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
if (key == 'font' || key == :font ||
|
|
|
|
key == 'kanjifont' || key == :kanjifont ||
|
|
|
|
key == 'latinfont' || key == :latinfont ||
|
|
|
|
key == 'asciifont' || key == :asciifont )
|
2002-02-28 01:53:33 -05:00
|
|
|
tagfont_configure(index, {key=>val})
|
2000-06-12 03:48:31 -04:00
|
|
|
else
|
|
|
|
tk_call 'itemconfigure', index, "-#{key}", val
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def itemconfiginfo(index, key=nil)
|
|
|
|
if key
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
case key.to_s
|
2000-11-27 04:23:38 -05:00
|
|
|
when 'text', 'label', 'show'
|
|
|
|
conf = tk_split_simplelist(tk_send('itemconfigure',index,"-#{key}"))
|
|
|
|
else
|
|
|
|
conf = tk_split_list(tk_send('itemconfigure',index,"-#{key}"))
|
|
|
|
end
|
2000-06-12 03:48:31 -04:00
|
|
|
conf[0] = conf[0][1..-1]
|
|
|
|
conf
|
|
|
|
else
|
2000-11-27 04:23:38 -05:00
|
|
|
tk_split_simplelist(tk_send('itemconfigure', index)).collect{|conflist|
|
|
|
|
conf = tk_split_simplelist(conflist)
|
2000-06-12 03:48:31 -04:00
|
|
|
conf[0] = conf[0][1..-1]
|
2000-11-27 04:23:38 -05:00
|
|
|
case conf[0]
|
|
|
|
when 'text', 'label', 'show'
|
|
|
|
else
|
|
|
|
if conf[3]
|
|
|
|
if conf[3].index('{')
|
|
|
|
conf[3] = tk_split_list(conf[3])
|
|
|
|
else
|
|
|
|
conf[3] = tk_tcl2ruby(conf[3])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if conf[4]
|
|
|
|
if conf[4].index('{')
|
|
|
|
conf[4] = tk_split_list(conf[4])
|
|
|
|
else
|
|
|
|
conf[4] = tk_tcl2ruby(conf[4])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2000-06-12 03:48:31 -04:00
|
|
|
conf
|
|
|
|
}
|
|
|
|
end
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
module TkTreatMenuEntryFont
|
2002-02-28 01:53:33 -05:00
|
|
|
include TkTreatItemFont
|
1999-08-13 01:37:52 -04:00
|
|
|
|
2002-02-28 01:53:33 -05:00
|
|
|
ItemCMD = ['entryconfigure', TkComm::None]
|
|
|
|
def __conf_cmd(idx)
|
|
|
|
ItemCMD[idx]
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
2002-02-28 01:53:33 -05:00
|
|
|
|
|
|
|
def __item_pathname(tagOrId)
|
|
|
|
self.path + ';' + tagOrId.to_s
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class TkMenu<TkWindow
|
|
|
|
include TkTreatMenuEntryFont
|
|
|
|
|
|
|
|
WidgetClassName = 'Menu'.freeze
|
1999-08-24 04:21:56 -04:00
|
|
|
WidgetClassNames[WidgetClassName] = self
|
1999-08-13 01:37:52 -04:00
|
|
|
def self.to_eval
|
|
|
|
WidgetClassName
|
|
|
|
end
|
2002-02-28 01:53:33 -05:00
|
|
|
def create_self(keys)
|
|
|
|
if keys and keys != None
|
|
|
|
tk_call 'menu', @path, *hash_kv(keys)
|
|
|
|
else
|
|
|
|
tk_call 'menu', @path
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
def activate(index)
|
|
|
|
tk_send 'activate', index
|
|
|
|
end
|
|
|
|
def add(type, keys=nil)
|
|
|
|
tk_send 'add', type, *hash_kv(keys)
|
|
|
|
end
|
|
|
|
def index(index)
|
|
|
|
tk_send 'index', index
|
|
|
|
end
|
|
|
|
def invoke(index)
|
|
|
|
tk_send 'invoke', index
|
|
|
|
end
|
|
|
|
def insert(index, type, keys=nil)
|
2001-03-27 02:10:58 -05:00
|
|
|
tk_send 'insert', index, type, *hash_kv(keys)
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
def delete(index, last=None)
|
|
|
|
tk_send 'delete', index, last
|
|
|
|
end
|
2001-03-27 02:10:58 -05:00
|
|
|
def popup(x, y, index=None)
|
2000-06-12 03:48:31 -04:00
|
|
|
tk_call 'tk_popup', path, x, y, index
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
def post(x, y)
|
|
|
|
tk_send 'post', x, y
|
|
|
|
end
|
|
|
|
def postcascade(index)
|
|
|
|
tk_send 'postcascade', index
|
|
|
|
end
|
|
|
|
def postcommand(cmd=Proc.new)
|
|
|
|
configure_cmd 'postcommand', cmd
|
|
|
|
end
|
2000-11-20 02:31:55 -05:00
|
|
|
def tearoffcommand(cmd=Proc.new)
|
|
|
|
configure_cmd 'tearoffcommand', cmd
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
def menutype(index)
|
|
|
|
tk_send 'type', index
|
|
|
|
end
|
|
|
|
def unpost
|
|
|
|
tk_send 'unpost'
|
|
|
|
end
|
|
|
|
def yposition(index)
|
|
|
|
number(tk_send('yposition', index))
|
|
|
|
end
|
|
|
|
def entrycget(index, key)
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
case key.to_s
|
2000-11-27 04:23:38 -05:00
|
|
|
when 'text', 'label', 'show'
|
|
|
|
tk_send 'entrycget', index, "-#{key}"
|
|
|
|
else
|
2002-06-28 10:42:46 -04:00
|
|
|
tk_tcl2ruby tk_send('entrycget', index, "-#{key}")
|
2000-11-27 04:23:38 -05:00
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
def entryconfigure(index, key, val=None)
|
|
|
|
if key.kind_of? Hash
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
if (key['font'] || key[:font] ||
|
|
|
|
key['kanjifont'] || key[:kanjifont] ||
|
|
|
|
key['latinfont'] || key[:latinfont] ||
|
|
|
|
key['asciifont'] || key[:asciifont])
|
|
|
|
tagfont_configure(index, _symbolkey2str(key))
|
1999-08-13 01:37:52 -04:00
|
|
|
else
|
|
|
|
tk_send 'entryconfigure', index, *hash_kv(key)
|
|
|
|
end
|
|
|
|
|
|
|
|
else
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
if (key == 'font' || key == :font ||
|
|
|
|
key == 'kanjifont' || key == :kanjifont ||
|
|
|
|
key == 'latinfont' || key == :latinfont ||
|
|
|
|
key == 'asciifont' || key == :asciifont )
|
1999-08-13 01:37:52 -04:00
|
|
|
tagfont_configure({key=>val})
|
|
|
|
else
|
|
|
|
tk_call 'entryconfigure', index, "-#{key}", val
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def entryconfiginfo(index, key=nil)
|
|
|
|
if key
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
case key.to_s
|
2000-11-27 04:23:38 -05:00
|
|
|
when 'text', 'label', 'show'
|
|
|
|
conf = tk_split_simplelist(tk_send('entryconfigure',index,"-#{key}"))
|
|
|
|
else
|
|
|
|
conf = tk_split_list(tk_send('entryconfigure',index,"-#{key}"))
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
conf[0] = conf[0][1..-1]
|
|
|
|
conf
|
|
|
|
else
|
2000-11-27 04:23:38 -05:00
|
|
|
tk_split_simplelist(tk_send('entryconfigure', index)).collect{|conflist|
|
|
|
|
conf = tk_split_simplelist(conflist)
|
1999-08-13 01:37:52 -04:00
|
|
|
conf[0] = conf[0][1..-1]
|
2000-11-27 04:23:38 -05:00
|
|
|
case conf[0]
|
|
|
|
when 'text', 'label', 'show'
|
|
|
|
else
|
|
|
|
if conf[3]
|
|
|
|
if conf[3].index('{')
|
|
|
|
conf[3] = tk_split_list(conf[3])
|
|
|
|
else
|
|
|
|
conf[3] = tk_tcl2ruby(conf[3])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if conf[4]
|
|
|
|
if conf[4].index('{')
|
|
|
|
conf[4] = tk_split_list(conf[4])
|
|
|
|
else
|
|
|
|
conf[4] = tk_tcl2ruby(conf[4])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
conf
|
|
|
|
}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2000-11-20 02:31:55 -05:00
|
|
|
class TkMenuClone<TkMenu
|
2001-03-27 02:10:58 -05:00
|
|
|
def initialize(parent, type=None)
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
widgetname = nil
|
|
|
|
if parent.kind_of? Hash
|
|
|
|
keys = _symbolkey2str(parent)
|
|
|
|
parent = keys.delete('parent')
|
|
|
|
widgetname = keys.delete('widgetname')
|
|
|
|
type = keys.delete('type'); type = None unless type
|
|
|
|
end
|
2000-11-20 02:31:55 -05:00
|
|
|
unless parent.kind_of?(TkMenu)
|
|
|
|
fail ArgumentError, "parent must be TkMenu"
|
|
|
|
end
|
|
|
|
@parent = parent
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
install_win(@parent.path, widgetname)
|
2000-11-20 02:31:55 -05:00
|
|
|
tk_call @parent.path, 'clone', @path, type
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2000-06-12 03:48:31 -04:00
|
|
|
module TkSystemMenu
|
|
|
|
def initialize(parent, keys=nil)
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
if parent.kind_of? Hash
|
|
|
|
keys = _symbolkey2str(parent)
|
|
|
|
parent = keys.delete('parent')
|
|
|
|
end
|
2000-06-12 03:48:31 -04:00
|
|
|
fail unless parent.kind_of? TkMenu
|
|
|
|
@path = format("%s.%s", parent.path, self.type::SYSMENU_NAME)
|
|
|
|
TkComm::Tk_WINDOWS[@path] = self
|
2002-02-28 01:53:33 -05:00
|
|
|
if self.method(:create_self).arity == 0
|
|
|
|
p 'create_self has no arg' if $DEBUG
|
|
|
|
create_self
|
|
|
|
configure(keys) if keys
|
|
|
|
else
|
|
|
|
p 'create_self has an arg' if $DEBUG
|
|
|
|
create_self(keys)
|
|
|
|
end
|
2000-06-12 03:48:31 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class TkSysMenu_Help<TkMenu
|
|
|
|
# for all platform
|
|
|
|
include TkSystemMenu
|
|
|
|
SYSMENU_NAME = 'help'
|
|
|
|
end
|
|
|
|
|
|
|
|
class TkSysMenu_System<TkMenu
|
|
|
|
# for Windows
|
|
|
|
include TkSystemMenu
|
|
|
|
SYSMENU_NAME = 'system'
|
|
|
|
end
|
|
|
|
|
|
|
|
class TkSysMenu_Apple<TkMenu
|
|
|
|
# for Machintosh
|
|
|
|
include TkSystemMenu
|
|
|
|
SYSMENU_NAME = 'apple'
|
|
|
|
end
|
|
|
|
|
1999-08-13 01:37:52 -04:00
|
|
|
class TkMenubutton<TkLabel
|
1999-08-24 04:21:56 -04:00
|
|
|
WidgetClassNames['Menubutton'] = self
|
1999-08-13 01:37:52 -04:00
|
|
|
def TkMenubutton.to_eval
|
|
|
|
'Menubutton'
|
|
|
|
end
|
2002-02-28 01:53:33 -05:00
|
|
|
def create_self(keys)
|
|
|
|
if keys and keys != None
|
|
|
|
tk_call 'menubutton', @path, *hash_kv(keys)
|
|
|
|
else
|
|
|
|
tk_call 'menubutton', @path
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2000-06-12 03:48:31 -04:00
|
|
|
class TkOptionMenubutton<TkMenubutton
|
|
|
|
class OptionMenu<TkMenu
|
|
|
|
def initialize(parent)
|
|
|
|
@path = parent.path + '.menu'
|
|
|
|
TkComm::Tk_WINDOWS[@path] = self
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def initialize(parent=nil, var=TkVariable.new, firstval=nil, *vals)
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
if parent.kind_of Hash
|
|
|
|
keys = _symbolkey2str(parent)
|
|
|
|
parent = keys['parent']
|
|
|
|
var = keys['variable'] if keys['variable']
|
|
|
|
firstval, *vals = keys['values']
|
|
|
|
end
|
2000-06-12 03:48:31 -04:00
|
|
|
fail unless var.kind_of? TkVariable
|
|
|
|
@variable = var
|
|
|
|
firstval = @variable.value unless firstval
|
|
|
|
@variable.value = firstval
|
|
|
|
install_win(if parent then parent.path end)
|
|
|
|
@menu = OptionMenu.new(self)
|
|
|
|
tk_call 'tk_optionMenu', @path, @variable.id, firstval, *vals
|
|
|
|
end
|
|
|
|
|
|
|
|
def value
|
|
|
|
@variable.value
|
|
|
|
end
|
|
|
|
|
|
|
|
def activate(index)
|
|
|
|
@menu.activate(index)
|
|
|
|
end
|
|
|
|
def add(value)
|
|
|
|
@menu.add('radiobutton', 'variable'=>@variable,
|
|
|
|
'label'=>value, 'value'=>value)
|
|
|
|
end
|
|
|
|
def index(index)
|
|
|
|
@menu.index(index)
|
|
|
|
end
|
|
|
|
def invoke(index)
|
|
|
|
@menu.invoke(index)
|
|
|
|
end
|
|
|
|
def insert(index, value)
|
|
|
|
@menu.add(index, 'radiobutton', 'variable'=>@variable,
|
|
|
|
'label'=>value, 'value'=>value)
|
|
|
|
end
|
|
|
|
def delete(index, last=None)
|
|
|
|
@menu.delete(index, last)
|
|
|
|
end
|
|
|
|
def yposition(index)
|
|
|
|
@menu.yposition(index)
|
|
|
|
end
|
|
|
|
def menucget(index, key)
|
|
|
|
@menu.cget(index, key)
|
|
|
|
end
|
|
|
|
def menuconfigure(index, key, val=None)
|
|
|
|
@menu.configure(index, key, val)
|
|
|
|
end
|
|
|
|
def menuconfiginfo(index, key=nil)
|
|
|
|
@menu.configinfo(index, key)
|
|
|
|
end
|
|
|
|
def entrycget(index, key)
|
|
|
|
@menu.entrycget(index, key)
|
|
|
|
end
|
|
|
|
def entryconfigure(index, key, val=None)
|
|
|
|
@menu.entryconfigure(index, key, val)
|
|
|
|
end
|
|
|
|
def entryconfiginfo(index, key=nil)
|
|
|
|
@menu.entryconfiginfo(index, key)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
1999-08-13 01:37:52 -04:00
|
|
|
module TkComposite
|
|
|
|
include Tk
|
|
|
|
extend Tk
|
|
|
|
|
|
|
|
def initialize(parent=nil, *args)
|
* tkfont.rb: Fix bugs on TkFont.init_widget_font for Tk8.x.
* tkafter.rb: Add self to 1st argument of interval- and loop-proc
TkAfter#current_interval returns an interval (sleep) time value
TkAfter#current_args returns an array of arguments
TkAfter#return_value returns a return value of last loop-proc
e.g.
TkAfter.new(
proc{|obj| 500 - obj.current_interval}, 10,
[proc{|obj| p obj.current_args}, 'proc', 1],
proc{|obj| p obj.current_args; ['return', 2]},
[proc{|obj|
p obj.return_value
p ['proc', obj.current_args[0].call(obj.return_value[1],
obj.current_args[1])]},
proc{|*args| args[0] + args[1]}, 1],
proc{p ['proc', 4]} ).start(100)
* tk*.rb: Allow to use Symbols for parameters.
Allow new notation of constructor (also allow old notation).
e.g.
TkFrame.new('classname'=>'User'){|base|
pack
f = TkFrame.new(base, :classname=>'ButtonFrame').pack
TkButton.new(
:parent => f,
:text => 'Quit',
:command => proc{exit}
).pack(
:fill => :x,
:pady => 2
)
}
* tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item
constructor (for new notation of constructor).
e.g.
c = TkCanvas.new.pack
l = TkcLine.new(c, :coords=>[[0,0], [100,100]])
* tcltklib.c: New 'mainloop' and 'mainloop_watchdog'.
The priority of their event-loop can be controlled.
They accept an optional argument.
If it false, they don't exit although the root widget is destroyed.
This function is sometimes useful, if it is used with 'restart'.
'mainloop' can't treat Thread#join/value in a callback routine.
(e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) )
'mainloop_watchdog' can treat them, but watchdog thread is always running
(so, a little heavier than 'mainloop').
If the purpose of using Thread#join/value is to do something under some
safe-level, please use Proc object.
(e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE})
* tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'.
* tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter.
'app-name' specifies the name and the resource class of the
application. If 'app-name' is specified to 'xxx', the application
class on the resource database is set to 'Xxx' and the application
name is changed by the same rule of Tk.appname method. 'use'
specifies the main window for embedding the root widget instead of
generating a new window.
* tk.rb: Add new parameter 'widgetname' to the widget constructor to
support effective use of Resource Database. For example, the
resource 'Xxx*quit.text: QUIT' can set the text of the button
generated by the following code.
e.g.
Tk.restart('Xxx')
TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
Tk.mainloop
* tk.rb: TkOption::get always returns a tainted string.
Add TkOption::new_proc_class.
It generates a class to import procedures defined on the resource
database. For example, there is a following resource file.
----< resource-test >------------
*CMD.foo: {|*args| p [$SAFE, :foo, args]}
*CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
*Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
---------------------------------
The following code is a sample of use of the resource file.
e.g.
require 'tk'
TkOption.readfile 'resource-test'
p TkOption.new_proc_class(:CMD, [:foo], 1)
p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
TkButton.new(:text=>'test').pack
Tk.mainloop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-06-04 03:03:33 -04:00
|
|
|
if parent.kind_of? Hash
|
|
|
|
keys = _symbolkey2str(parent)
|
|
|
|
parent = keys['parent']
|
|
|
|
keys['parent'] = @frame = TkFrame.new(parent)
|
|
|
|
@path = @epath = @frame.path
|
|
|
|
initialize_composite(keys)
|
|
|
|
else
|
|
|
|
@frame = TkFrame.new(parent)
|
|
|
|
@path = @epath = @frame.path
|
|
|
|
initialize_composite(*args)
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def epath
|
|
|
|
@epath
|
|
|
|
end
|
|
|
|
|
|
|
|
def initialize_composite(*args) end
|
|
|
|
private :initialize_composite
|
|
|
|
|
|
|
|
def delegate(option, *wins)
|
|
|
|
unless @delegates
|
|
|
|
@delegates = {}
|
|
|
|
@delegates['DEFAULT'] = @frame
|
|
|
|
end
|
|
|
|
if @delegates[option].kind_of?(Array)
|
|
|
|
for i in wins
|
|
|
|
@delegates[option].push(i)
|
|
|
|
end
|
|
|
|
else
|
|
|
|
@delegates[option] = wins
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def configure(slot, value=None)
|
|
|
|
if slot.kind_of? Hash
|
|
|
|
slot.each{|slot,value| configure slot, value}
|
|
|
|
else
|
|
|
|
if @delegates and @delegates[slot]
|
|
|
|
for i in @delegates[slot]
|
|
|
|
if not i
|
|
|
|
i = @delegates['DEFALUT']
|
|
|
|
redo
|
|
|
|
else
|
|
|
|
last = i.configure(slot, value)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
last
|
|
|
|
else
|
|
|
|
super
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
module TkClipboard
|
|
|
|
include Tk
|
|
|
|
extend Tk
|
|
|
|
|
|
|
|
def clear
|
|
|
|
tk_call 'clipboard', 'clear'
|
|
|
|
end
|
|
|
|
def get
|
|
|
|
begin
|
|
|
|
tk_call 'selection', 'get', '-selection', 'CLIPBOARD'
|
|
|
|
rescue
|
|
|
|
''
|
|
|
|
end
|
|
|
|
end
|
|
|
|
def set(data)
|
|
|
|
clear
|
|
|
|
append(data)
|
|
|
|
end
|
|
|
|
def append(data)
|
|
|
|
tk_call 'clipboard', 'append', data
|
|
|
|
end
|
|
|
|
|
|
|
|
module_function :clear, :set, :get, :append
|
|
|
|
end
|
|
|
|
|
|
|
|
autoload :TkCanvas, 'tkcanvas'
|
|
|
|
autoload :TkImage, 'tkcanvas'
|
|
|
|
autoload :TkBitmapImage, 'tkcanvas'
|
|
|
|
autoload :TkPhotoImage, 'tkcanvas'
|
|
|
|
autoload :TkEntry, 'tkentry'
|
2000-11-20 02:31:55 -05:00
|
|
|
autoload :TkSpinbox, 'tkentry'
|
1999-08-13 01:37:52 -04:00
|
|
|
autoload :TkText, 'tktext'
|
|
|
|
autoload :TkDialog, 'tkdialog'
|
2000-11-27 04:23:38 -05:00
|
|
|
autoload :TkWarning, 'tkdialog'
|
1999-08-13 01:37:52 -04:00
|
|
|
autoload :TkMenubar, 'tkmenubar'
|
|
|
|
autoload :TkAfter, 'tkafter'
|
|
|
|
autoload :TkPalette, 'tkpalette'
|
|
|
|
autoload :TkFont, 'tkfont'
|
|
|
|
autoload :TkVirtualEvent, 'tkvirtevent'
|
2000-11-27 04:23:38 -05:00
|
|
|
autoload :TkBgError, 'tkbgerror'
|
|
|
|
autoload :TkManageFocus, 'tkmngfocus'
|
|
|
|
autoload :TkPalette, 'tkpalette'
|
|
|
|
autoload :TkWinDDE, 'tkwinpkg'
|
|
|
|
autoload :TkWinRegistry, 'tkwinpkg'
|
|
|
|
autoload :TkMacResource, 'tkmacpkg'
|