1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* ext/tk/*: full update Ruby/Tk to support Ruby(1.9|1.8) and Tc/Tk8.5.

* ext/tk/lib/tkextlib/tile.rb: [incompatible] remove TileWidgets' 
  instate/state/identify method to avoid the conflict with standard
  widget options. Those methods are renamed to ttk_instate/ttk_state/
  ttk_identify (tile_instate/tile_state/tile_identify are available 
  too). Although I don't recommend, if you realy need old methods, 
  please define "Tk::USE_OBSOLETE_TILE_STATE_METHOD = true" before 
  "require 'tkextlib/tile'".

* ext/tk/lib/tkextlib/tile.rb: "Tk::Tile::__Import_Tile_Widgets__!"
  is obsolete. It outputs warning. To control default widget set, 
  use "Tk.default_widget_set = :Ttk".

* ext/tk/lib/tk.rb: __IGNORE_UNKNOWN_CONFIGURE_OPTION__ method and 
  __set_IGNORE_UNKNOWN_CONFIGURE_OPTION__!(mode) method are defind 
  as module methods of TkConfigMethod. It may help users to wrap old 
  Ruby/Tk scripts (use standard widgets) to force to use Ttk widgets.
  Ttk widgets don't have some options of standard widgets which are 
  control the view of widgets. When set ignore-mode true, configure 
  method tries to ignoure such unknown options with no exception. 
  Of course, it may raise other troubles on the GUI design. 
  So, those are a little danger methods. 

* ext/tk/lib/tk/itemconfig.rb: __IGNORE_UNKNOWN_CONFIGURE_OPTION__ 
  method and __set_IGNORE_UNKNOWN_CONFIGURE_OPTION__!(mode) method 
  are defind as module methods of TkItemConfigMethod as the same 
  purpose as TkConfigMethod's ones.

* ext/tk/sample/ttk_wrapper.rb: A new example. This is a tool for 
  wrapping old Ruby/Tk scripts (which use standard widgets) to use 
  Ttk (Tile) widgets as default.

* ext/tk/sample/tkextlib/tile/demo.rb: use ttk_instate/ttk_state 
  method instead of instate/state method.

* ext/tk/lib/tk/root, ext/tk/lib/tk/namespace.rb,
  ext/tk/lib/tk/text.rb, ext/tk/lib/tkextlib/*: some 'instance_eval's  
  are replaced to "instance_exec(self)".

* ext/tk/lib/tk/event.rb: bug fix on KEY_TBL and PROC_TBL (?x is not 
  a character code on Ruby1.9).

* ext/tk/lib/tk/variable.rb: support new style of operation argument 
  on Tcl/Tk's 'trace' command for variables. 

* ext/tk/sample/demos-jp/widget, ext/tk/sample/demos-en/widget: bug fix

* ext/tk/sammple/demos-jp/textpeer.rb, 
  ext/tk/sammple/demos-en/textpeer.rb: new widget demo.

* ext/tk/tcltklib.c: decrase SEGV troubles (probably)

* ext/tk/lib/tk.rb: remove Thread.critical access if Ruby1.9

* ext/tk/lib/tk/multi-tk.rb: support Ruby1.9 (probably)

* ext/tk/lib/tkextlib/tile.rb: add method to define Tcl/Tk command 
  to make Tcl/Tk theme sources (based on different version of Tile 
  extension) available. 
  (Tk::Tile::__define_LoadImages_proc_for_comaptibility__)

* ext/tk/lib/tk.rb, ext/tk/lib/tk/wm.rb: support dockable frames
  (Tcl/Tk8.5 feature). 'wm' command can treat many kinds of widgets 
  as toplevel widgets.

* ext/tk/lib/tkextlib/tile/style.rb: ditto.
  (Tk::Tile::Style.__define_wrapper_proc_for_compatibility__)

* ext/tk/lib/tk/font.rb: add actual_hash and metrics_hash to get 
  properties as a hash. metrics_hash method returns a boolean value 
  for 'fixed' option. But metrics method returns numeric value 
  (0 or 1) for 'fixed' option, because of backward compatibility. 

* ext/tk/lib/tk/timer.rb: somtimes fail to set callback procedure.

* ext/tk/lib/tk.rb: add Tk.sleep and Tk.wakeup method. Tk.sleep 
  doesn't block the eventloop. It will be better to use the method 
  in event callbacks.

* ext/tk/sample/tksleep_sample.rb: sample script about Tk.sleep.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15848 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nagai 2008-03-29 05:25:12 +00:00
parent b62af05a98
commit 3024ffdc3a
121 changed files with 7879 additions and 2218 deletions

View file

@ -19,8 +19,93 @@ end
class << Tk::Tile::Style
if Tk::Tile::TILE_SPEC_VERSION_ID < 8
TkCommandNames = ['style'.freeze].freeze
else
# --- Tk::Tile::Style.__define_wrapper_proc_for_compatibility__! ---
# On Ttk (Tile) extension, 'style' command has imcompatible changes
# depend on the version of the extention. It requires modifying the
# Tcl/Tk scripts to define local styles. The rule for modification
# is a simple one. But, if users want to keep compatibility between
# versions of the extension, they will have to contrive to do that.
# It may be troublesome, especially for Ruby/Tk users.
# This method may help such work. This method make some definitions
# on the Tcl/Tk interpreter to work with different version of style
# command format. Please give attention to use this method. It may
# conflict with some definitions on Tcl/Tk scripts.
if Tk::Tile::TILE_SPEC_VERSION_ID < 7
def __define_wrapper_proc_for_compatibility__!
unless Tk.info(:commands, '::ttk::style').empty?
fail RuntimeError,
"can't define ':ttk::style' command (already exist)"
end
TkCore::INTERP.add_tk_procs('::ttk::style', 'args', <<-'EOS')
if [string equal [lrange $args 0 1] {element create}] {
if [string equal [lindex $args 3] image] {
set spec [lindex $args 4]
set map [lrange $spec 1 end]
if [llength $map] {
# return [eval [concat [list ::style element create [lindex $args 2] image [lindex $spec 0] -map $map] [lrange $args 5 end]]]
return [uplevel 1 [list ::style element create [lindex $args 2] image [lindex $spec 0] -map $map] [lrange $args 5 end]]
}
}
}
# return [eval "::style $args"]
return [uplevel 1 ::style $args]
EOS
#########################
end
else ### TILE_SPEC_VERSION_ID == 7
def __define_wrapper_proc_for_compatibility__!
unless Tk.info(:commands, '::ttk::style').empty?
fail RuntimeError,
"can't define ':ttk::style' command (already exist)"
end
TkCore::INTERP.add_tk_procs('::ttk::style', 'args', <<-'EOS')
if [string equal [lrange $args 0 1] {element create}] {
if [string equal [lindex $args 3] image] {
set spec [lindex $args 4]
set map [lrange $spec 1 end]
if [llength $map] {
# return [eval [concat [list ::style element create [lindex $args 2] image [lindex $spec 0] -map $map] [lrange $args 5 end]]]
return [uplevel 1 [list ::style element create [lindex $args 2] image [lindex $spec 0] -map $map] [lrange $args 5 end]]]
}
}
} elseif [string equal [lindex $args 0] default] {
# return [eval "::style [lreplace $args 0 0 configure]"]
return [uplevel 1 ::style [lreplace $args 0 0 configure]]
}
# return [eval "::style $args"]
return [uplevel 1 ::style $args]
EOS
#########################
end
end
else ### TILE_SPEC_VERSION_ID >= 8
TkCommandNames = ['::ttk::style'.freeze].freeze
def __define_wrapper_proc_for_compatibility__!
unless Tk.info(:commands, '::style').empty?
fail RuntimeError, "can't define '::style' command (already exist)"
end
TkCore::INTERP.add_tk_procs('::style', 'args', <<-'EOS')
if [string equal [lrange $args 0 1] {element create}] {
if [string equal [lindex $args 3] image] {
set name [lindex $args 4]
set opts [lrange $args 5 end]
set idx [lsearch $opts -map]
if {$idx >= 0 && [expr $idx % 2 == 0]} {
# return [eval [concat [list ::ttk::style element create [lindex $args 2] image [concat $name [lindex $opts [expr $idx + 1]]]] [lreplace $opts $idx [expr $idx + 1]]]]
return [uplevel 1 [list ::ttk::style element create [lindex $args 2] image [concat $name [lindex $opts [expr $idx + 1]]]] [lreplace $opts $idx [expr $idx + 1]]]
}
}
} elseif [string equal [lindex $args 0] default] {
# return [eval "::ttk::style [lreplace $args 0 0 configure]"]
return [uplevel 1 ::ttk::style [lreplace $args 0 0 configure]]
}
# return [eval "::ttk::style $args"]
return [uplevel 1 ::ttk::style $args]
EOS
#########################
end
end
def configure(style=nil, keys=nil)
@ -98,7 +183,52 @@ class << Tk::Tile::Style
end
def element_create(name, type, *args)
tk_call(TkCommandNames[0], 'element', 'create', name, type, *args)
if type == 'image' || type == :image
element_create_image(name, *args)
else
tk_call(TkCommandNames[0], 'element', 'create', name, type, *args)
end
end
def element_create_image(name, *args)
fail ArgumentError, 'Must supply a base image' unless (spec = args.shift)
if (opts = args.shift)
if opts.kind_of?(Hash)
opts = _symbolkey2str(opts)
else
fail ArgumentError, 'bad option'
end
end
fail ArgumentError, 'too many arguments' unless args.empty?
if spec.kind_of?(Array)
# probably, command format is tile 0.8+ (Tcl/Tk8.5+) style
if Tk::Tile::TILE_SPEC_VERSION_ID >= 8
if opts
tk_call(TkCommandNames[0],
'element', 'create', name, 'image', spec, opts)
else
tk_call(TkCommandNames[0], 'element', 'create', name, 'image', spec)
end
else
fail ArgumentError, 'illegal arguments' if opts.key?('map')
base = spec.shift
opts['map'] = spec
tk_call(TkCommandNames[0],
'element', 'create', name, 'image', base, opts)
end
else
# probably, command format is tile 0.7.8 or older style
if Tk::Tile::TILE_SPEC_VERSION_ID >= 8
spec = [spec, *(opts.delete('map'))] if opts.key?('map')
end
if opts
tk_call(TkCommandNames[0],
'element', 'create', name, 'image', spec, opts)
else
tk_call(TkCommandNames[0], 'element', 'create', name, 'image', spec)
end
end
end
def element_names()

View file

@ -381,7 +381,7 @@ module Tk::Tile::TreeviewConfig
when :item, 'item'
['width']
when :column, 'column'
super(id[1])
super(id[1]) + ['minwidth']
when :tag, 'tag'
super(id[1])
when :heading, 'heading'
@ -413,7 +413,7 @@ module Tk::Tile::TreeviewConfig
when :item, 'item'
['open']
when :column, 'column'
super(id[1])
super(id[1]) + ['stretch']
when :tag, 'tag'
super(id[1])
when :heading, 'heading'
@ -617,30 +617,43 @@ end
class Tk::Tile::Treeview::Item < TkObject
ItemID_TBL = TkCore::INTERP.create_table
TkCore::INTERP.init_ip_env{ Tk::Tile::Treeview::Item::ItemID_TBL.clear }
TkCore::INTERP.init_ip_env{
Tk::Tile::Treeview::Item::ItemID_TBL.mutex.synchronize{
Tk::Tile::Treeview::Item::ItemID_TBL.clear
}
}
def self.id2obj(tree, id)
tpath = tree.path
return id unless Tk::Tile::Treeview::Item::ItemID_TBL[tpath]
(Tk::Tile::Treeview::Item::ItemID_TBL[tpath][id])? \
Tk::Tile::Treeview::Item::ItemID_TBL[tpath][id]: id
Tk::Tile::Treeview::Item::ItemID_TBL.mutex.synchronize{
if Tk::Tile::Treeview::Item::ItemID_TBL[tpath]
(Tk::Tile::Treeview::Item::ItemID_TBL[tpath][id])? \
Tk::Tile::Treeview::Item::ItemID_TBL[tpath][id]: id
else
id
end
}
end
def self.assign(tree, id)
tpath = tree.path
if Tk::Tile::Treeview::Item::ItemID_TBL[tpath] &&
Tk::Tile::Treeview::Item::ItemID_TBL[tpath][id]
return Tk::Tile::Treeview::Item::ItemID_TBL[tpath][id]
end
obj = nil
Tk::Tile::Treeview::Item::ItemID_TBL.mutex.synchronize{
if Tk::Tile::Treeview::Item::ItemID_TBL[tpath] &&
Tk::Tile::Treeview::Item::ItemID_TBL[tpath][id]
return Tk::Tile::Treeview::Item::ItemID_TBL[tpath][id]
end
obj = self.allocate
obj.instance_eval{
@parent = @t = tree
@tpath = tpath
@path = @id = id
obj = self.allocate
obj.instance_eval{
@parent = @t = tree
@tpath = tpath
@path = @id = id
}
Tk::Tile::Treeview::Item::ItemID_TBL[tpath] ||= {}
Tk::Tile::Treeview::Item::ItemID_TBL[tpath][id] = obj
}
ItemID_TBL[tpath] = {} unless ItemID_TBL[tpath]
Tk::Tile::Treeview::Item::ItemID_TBL[tpath][id] = obj
obj
end
@ -669,8 +682,10 @@ class Tk::Tile::Treeview::Item < TkObject
@parent = @t = tree
@tpath = tree.path
@path = @id = _insert_item(@t, parent_item, idx, keys)
ItemID_TBL[@tpath] = {} unless ItemID_TBL[@tpath]
ItemID_TBL[@tpath][@id] = self
Tk::Tile::Treeview::Item::ItemID_TBL.mutex.synchronize{
ItemID_TBL[@tpath] = {} unless ItemID_TBL[@tpath]
ItemID_TBL[@tpath][@id] = self
}
end
def id
@id
@ -804,22 +819,35 @@ end
class Tk::Tile::Treeview::Root < Tk::Tile::Treeview::Item
def self.new(tree, keys = {})
tpath = tree.path
if Tk::Tile::Treeview::Item::ItemID_TBL[tpath] &&
Tk::Tile::Treeview::Item::ItemID_TBL[tpath]['']
Tk::Tile::Treeview::Item::ItemID_TBL[tpath]['']
else
super(tree, keys)
end
obj = nil
Tk::Tile::Treeview::Item::ItemID_TBL.mutex.synchronize{
if Tk::Tile::Treeview::Item::ItemID_TBL[tpath] &&
Tk::Tile::Treeview::Item::ItemID_TBL[tpath]['']
obj = Tk::Tile::Treeview::Item::ItemID_TBL[tpath]['']
else
#super(tree, keys)
(obj = self.allocate).instance_eval{
@parent = @t = tree
@tpath = tree.path
@path = @id = ''
Tk::Tile::Treeview::Item::ItemID_TBL[@tpath] ||= {}
Tk::Tile::Treeview::Item::ItemID_TBL[@tpath][@id] = self
}
end
}
obj.configure(keys) if keys && ! keys.empty?
obj
end
def initialize(tree, keys = {})
# dummy:: not called by 'new' method
@parent = @t = tree
@tpath = tree.path
@path = @id = ''
unless Tk::Tile::Treeview::Item::ItemID_TBL[@tpath]
Tk::Tile::Treeview::Item::ItemID_TBL[@tpath] = {}
end
Tk::Tile::Treeview::Item::ItemID_TBL[@tpath][@id] = self
Tk::Tile::Treeview::Item::ItemID_TBL.mutex.synchronize{
Tk::Tile::Treeview::Item::ItemID_TBL[@tpath] ||= {}
Tk::Tile::Treeview::Item::ItemID_TBL[@tpath][@id] = self
}
end
end
@ -829,24 +857,42 @@ class Tk::Tile::Treeview::Tag < TkObject
include TkTreatTagFont
TagID_TBL = TkCore::INTERP.create_table
Tag_ID = ['tile_treeview_tag'.freeze, '00000'.taint].freeze
TkCore::INTERP.init_ip_env{ Tk::Tile::Treeview::Tag::TagID_TBL.clear }
(Tag_ID = ['tile_treeview_tag'.freeze, '00000'.taint]).instance_eval{
@mutex = Mutex.new
def mutex; @mutex; end
freeze
}
TkCore::INTERP.init_ip_env{
Tk::Tile::Treeview::Tag::TagID_TBL.mutex.synchronize{
Tk::Tile::Treeview::Tag::TagID_TBL.clear
}
}
def self.id2obj(tree, id)
tpath = tree.path
return id unless Tk::Tile::Treeview::Tag::TagID_TBL[tpath]
(Tk::Tile::Treeview::Tag::TagID_TBL[tpath][id])? \
Tk::Tile::Treeview::Tag::TagID_TBL[tpath][id]: id
Tk::Tile::Treeview::Tag::TagID_TBL.mutex.synchronize{
if Tk::Tile::Treeview::Tag::TagID_TBL[tpath]
(Tk::Tile::Treeview::Tag::TagID_TBL[tpath][id])? \
Tk::Tile::Treeview::Tag::TagID_TBL[tpath][id]: id
else
id
end
}
end
def initialize(tree, keys=nil)
@parent = @t = tree
@tpath = tree.path
@path = @id = Tag_ID.join(TkCore::INTERP._ip_id_)
TagID_TBL[@tpath] = {} unless TagID_TBL[@tpath]
TagID_TBL[@tpath][@id] = self
Tag_ID[1].succ!
Tag_ID.mutex.synchronize{
@path = @id = Tag_ID.join(TkCore::INTERP._ip_id_)
Tag_ID[1].succ!
}
TagID_TBL.mutex.synchronize{
TagID_TBL[@tpath] = {} unless TagID_TBL[@tpath]
TagID_TBL[@tpath][@id] = self
}
if keys && keys != None
tk_call_without_enc(@tpath, 'tag', 'configure', *hash_kv(keys, true))
end
@ -919,8 +965,12 @@ class Tk::Tile::Treeview < TkWindow
WidgetClassNames[WidgetClassName] = self
def __destroy_hook__
Tk::Tile::Treeview::Item::ItemID_TBL.delete(@path)
Tk::Tile::Treeview::Tag::ItemID_TBL.delete(@path)
Tk::Tile::Treeview::Item::ItemID_TBL.mutex.synchronize{
Tk::Tile::Treeview::Item::ItemID_TBL.delete(@path)
}
Tk::Tile::Treeview::Tag::ItemID_TBL.mutex.synchronize{
Tk::Tile::Treeview::Tag::ItemID_TBL.delete(@path)
}
end
def self.style(*args)