зеркало из https://github.com/github/ruby.git
* ext/tk/lib/tk.rb: fail to start Tk.mainloop (exit immediately) on some environment (reported on [ruby-talk:381444]).
* ext/tk/lib/tk/canvas.rb: support creating a canvas item object from an item ID number. * ext/tk/lib/tk/image.rb: import documents which are pull-requested. [Ruby 1.9 - Feature #4595] * ext/tk/lib/tk/extconf.rb: search directories for 64bit library (e.g. /usr/lib64), add some new configure options (see README.tcltklib), and bug fix. * ext/tk/lib/tk/README.tcltklib: modify docs for some new configure options. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31717 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
08f2c46ce1
Коммит
3ca633b890
18
ChangeLog
18
ChangeLog
|
@ -1,3 +1,21 @@
|
|||
Tue May 24 07:06:34 2011 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
|
||||
|
||||
* ext/tk/lib/tk.rb: fail to start Tk.mainloop (exit immediately) on
|
||||
some environment (reported on [ruby-talk:381444]).
|
||||
|
||||
* ext/tk/lib/tk/canvas.rb: support creating a canvas item object from
|
||||
an item ID number.
|
||||
|
||||
* ext/tk/lib/tk/image.rb: import documents which are pull-requested.
|
||||
[Ruby 1.9 - Feature #4595]
|
||||
|
||||
* ext/tk/lib/tk/extconf.rb: search directories for 64bit library (e.g.
|
||||
/usr/lib64), add some new configure options (see README.tcltklib),
|
||||
and bug fix.
|
||||
|
||||
* ext/tk/lib/tk/README.tcltklib: modify docs for some new configure
|
||||
options.
|
||||
|
||||
Tue May 24 04:01:46 2011 Aaron Patterson <aaron@tenderlovemaking.com>
|
||||
|
||||
* lib/yaml.rb: switch default YAML engine to Psych, old syck engine
|
||||
|
|
|
@ -29,10 +29,35 @@ some or all of the following options.
|
|||
Old "extconf.rb" doesn't support this option.
|
||||
|
||||
--with-tcltkversion=<version>
|
||||
--with-tcltkversion=<tclversion>,<tkversion>
|
||||
force version of Tcl/Tk libaray
|
||||
(e.g. libtcl8.4g.so ==> --with-tcltkversion=8.4g)
|
||||
(e.g. libtcl8.4g.so & libtk8.4g.so ==> --with-tcltkversion=8.4g
|
||||
libtcl8.4.so & libtk8.4g.so ==> --with-tcltkversion=8.4,8.4g)
|
||||
|
||||
--enable-tcl-h-ver-check/--disable-tcl-h-ver-check
|
||||
--enable-tk-h-ver-check/--disable-tk-h-ver-check
|
||||
enable or disable for checking MAJOR_VERSION and
|
||||
MINOR_VERSION on tcl.h/tk.h whether match with
|
||||
Tcl/Tk libraries' version or not.
|
||||
|
||||
--with-tcl-build-dir=<dir>
|
||||
--with-tk-build-dir=<dir> If you want to compile with libraries on Tcl/Tk
|
||||
build dir (still NOT installed), you must use
|
||||
these options.
|
||||
(e.g. --with-tcl-build-dir=./build/tcl8.5.9/unix)
|
||||
When use these options, --with-tclConfig-dir and
|
||||
--with-tkConfig-dir options are ignored (however,
|
||||
--with-tclConfig-file and --with-tkConfig-file
|
||||
options are still available).
|
||||
|
||||
--with-tclConfig-file=<file>/--without-tclConfig-file
|
||||
--with-tkConfig-file=<file>/--without-tkConfig-file
|
||||
file path of tclConfig.sh/tkConfig.sh, or don't
|
||||
refer those.
|
||||
If you want use non-standard filenames of config
|
||||
files (e.g. tclConfig-static.sh), you must use
|
||||
these options.
|
||||
|
||||
--without-tcl-config / --without-tk-config
|
||||
--with-tclConfig-dir=<dir>
|
||||
--with-tkConfig-dir=<dir> the directory contains 'tclConfig.sh' and
|
||||
'tkConfig.sh'.
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -1248,6 +1248,9 @@ module TkCore
|
|||
raise e
|
||||
end
|
||||
|
||||
interp.mainloop_abort_on_exception = true
|
||||
Thread.current.instance_variable_set("@interp", interp)
|
||||
|
||||
status = [nil]
|
||||
def status.value
|
||||
self[0]
|
||||
|
@ -1283,19 +1286,23 @@ proc __startup_rbtk_mainloop__ {args} {
|
|||
}
|
||||
set __initial_state_of_rubytk__ 1
|
||||
trace add variable __initial_state_of_rubytk__ unset __startup_rbtk_mainloop__
|
||||
|
||||
# complete initializing
|
||||
ruby {TkCore::INTERP_THREAD[:interp] = TkCore::INTERP_THREAD.instance_variable_get('@interp')}
|
||||
EOS
|
||||
|
||||
begin
|
||||
begin
|
||||
#TclTkLib.mainloop_abort_on_exception = false
|
||||
#Thread.current[:status].value = TclTkLib.mainloop(true)
|
||||
interp.mainloop_abort_on_exception = true
|
||||
Thread.current[:interp] = interp
|
||||
#interp.mainloop_abort_on_exception = true
|
||||
#Thread.current[:interp] = interp
|
||||
Thread.current[:status].value = interp.mainloop(true)
|
||||
rescue SystemExit=>e
|
||||
Thread.current[:status].value = e
|
||||
rescue Exception=>e
|
||||
Thread.current[:status].value = e
|
||||
p e if $DEBUG
|
||||
retry if interp.has_mainwindow?
|
||||
ensure
|
||||
INTERP_MUTEX.synchronize{ INTERP_ROOT_CHECK.broadcast }
|
||||
|
@ -1312,12 +1319,20 @@ EOS
|
|||
end
|
||||
}
|
||||
|
||||
# check a Tcl/Tk interpreter is initialized
|
||||
until INTERP_THREAD[:interp]
|
||||
Thread.pass
|
||||
# Thread.pass
|
||||
INTERP_THREAD.run
|
||||
end
|
||||
|
||||
# INTERP_THREAD.run
|
||||
raise INTERP_THREAD[:interp] if INTERP_THREAD[:interp].kind_of? Exception
|
||||
|
||||
# check an eventloop is running
|
||||
while INTERP_THREAD.alive? && TclTkLib.mainloop_thread?.nil?
|
||||
INTERP_THREAD.run
|
||||
end
|
||||
|
||||
INTERP = INTERP_THREAD[:interp]
|
||||
INTERP_THREAD_STATUS = INTERP_THREAD[:status]
|
||||
|
||||
|
@ -1328,6 +1343,9 @@ EOS
|
|||
INTERP_THREAD.kill
|
||||
end
|
||||
}
|
||||
|
||||
# (for safety's sake) force the eventloop to run
|
||||
INTERP_THREAD.run
|
||||
end
|
||||
|
||||
def INTERP.__getip
|
||||
|
@ -1857,6 +1875,11 @@ EOS
|
|||
|
||||
begin
|
||||
TclTkLib.set_eventloop_window_mode(true)
|
||||
|
||||
# force run the eventloop
|
||||
TkCore::INTERP._eval_without_enc('update')
|
||||
TkCore::INTERP._eval_without_enc('catch {set __initial_state_of_rubytk__}')
|
||||
INTERP_THREAD.run
|
||||
if check_root
|
||||
INTERP_MUTEX.synchronize{
|
||||
INTERP_ROOT_CHECK.wait(INTERP_MUTEX)
|
||||
|
@ -1867,8 +1890,15 @@ EOS
|
|||
end
|
||||
}
|
||||
else
|
||||
INTERP_THREAD.value
|
||||
# INTERP_THREAD.value
|
||||
begin
|
||||
INTERP_THREAD.value
|
||||
rescue Exception => e
|
||||
raise e
|
||||
end
|
||||
end
|
||||
rescue Exception => e
|
||||
raise e
|
||||
ensure
|
||||
TclTkLib.set_eventloop_window_mode(false)
|
||||
end
|
||||
|
|
|
@ -85,6 +85,7 @@ class Tk::Canvas<TkWindow
|
|||
|
||||
# create a canvas item without creating a TkcItem object
|
||||
def create(type, *args)
|
||||
type = TkcItem.type2class(type.to_s) unless type.kind_of?(TkcItem)
|
||||
type.create(self, *args)
|
||||
end
|
||||
|
||||
|
@ -603,6 +604,30 @@ class Tk::Canvas<TkWindow
|
|||
def itemtype(tag)
|
||||
TkcItem.type2class(tk_send('type', tagid(tag)))
|
||||
end
|
||||
|
||||
def create_itemobj_from_id(idnum)
|
||||
id = TkcItem.id2obj(self, idnum.to_i)
|
||||
return id if id.kind_of?(TkcItem)
|
||||
|
||||
typename = tk_send('type', id)
|
||||
unless type = TkcItem.type2class(typename)
|
||||
(itemclass = typename.dup)[0,1] = typename[0,1].upcase
|
||||
type = TkcItem.const_set(itemclass, Class.new(TkcItem))
|
||||
type.const_set("CItemTypeName", typename.freeze)
|
||||
TkcItem::CItemTypeToClass[typename] = type
|
||||
end
|
||||
|
||||
canvas = self
|
||||
(obj = type.allocate).instance_eval{
|
||||
@parent = @c = canvas
|
||||
@path = canvas.path
|
||||
@id = id
|
||||
TkcItem::CItemID_TBL.mutex.synchronize{
|
||||
TkcItem::CItemID_TBL[@path] = {} unless TkcItem::CItemID_TBL[@path]
|
||||
TkcItem::CItemID_TBL[@path][@id] = self
|
||||
}
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
#TkCanvas = Tk::Canvas unless Object.const_defined? :TkCanvas
|
||||
|
|
|
@ -72,7 +72,6 @@ class TkImage<TkObject
|
|||
end
|
||||
unless @path
|
||||
Tk_Image_ID.mutex.synchronize{
|
||||
# @path = Tk_Image_ID.join('')
|
||||
@path = Tk_Image_ID.join(TkCore::INTERP._ip_id_)
|
||||
Tk_Image_ID[1].succ!
|
||||
}
|
||||
|
@ -128,6 +127,12 @@ class TkBitmapImage<TkImage
|
|||
end
|
||||
end
|
||||
|
||||
# A photo is an image whose pixels can display any color or be transparent.
|
||||
# At present, only GIF and PPM/PGM formats are supported, but an interface
|
||||
# exists to allow additional image file formats to be added easily.
|
||||
#
|
||||
# This class documentation is a copy from the original Tcl/Tk at
|
||||
# http://www.tcl.tk/man/tcl8.5/TkCmd/photo.htm with some rewrited parts.
|
||||
class TkPhotoImage<TkImage
|
||||
NullArgOptionKeys = [ "shrink", "grayscale" ]
|
||||
|
||||
|
@ -146,11 +151,49 @@ class TkPhotoImage<TkImage
|
|||
end
|
||||
private :_photo_hash_kv
|
||||
|
||||
# Create a new image with the given options.
|
||||
# == Examples of use :
|
||||
# === Create an empty image of 300x200 pixels
|
||||
#
|
||||
# image = TkPhotoImage.new(:height => 200, :width => 300)
|
||||
#
|
||||
# === Create an image from a file
|
||||
#
|
||||
# image = TkPhotoImage.new(:file: => 'my_image.gif')
|
||||
#
|
||||
# == Options
|
||||
# Photos support the following options:
|
||||
# * :data
|
||||
# Specifies the contents of the image as a string.
|
||||
# * :format
|
||||
# Specifies the name of the file format for the data.
|
||||
# * :file
|
||||
# Gives the name of a file that is to be read to supply data for the image.
|
||||
# * :gamma
|
||||
# Specifies that the colors allocated for displaying this image in a window
|
||||
# should be corrected for a non-linear display with the specified gamma
|
||||
# exponent value.
|
||||
# * height
|
||||
# Specifies the height of the image, in pixels. This option is useful
|
||||
# primarily in situations where the user wishes to build up the contents of
|
||||
# the image piece by piece. A value of zero (the default) allows the image
|
||||
# to expand or shrink vertically to fit the data stored in it.
|
||||
# * palette
|
||||
# Specifies the resolution of the color cube to be allocated for displaying
|
||||
# this image.
|
||||
# * width
|
||||
# Specifies the width of the image, in pixels. This option is useful
|
||||
# primarily in situations where the user wishes to build up the contents of
|
||||
# the image piece by piece. A value of zero (the default) allows the image
|
||||
# to expand or shrink horizontally to fit the data stored in it.
|
||||
def initialize(*args)
|
||||
@type = 'photo'
|
||||
super(*args)
|
||||
end
|
||||
|
||||
# Blank the image; that is, set the entire image to have no data, so it will
|
||||
# be displayed as transparent, and the background of whatever window it is
|
||||
# displayed in will show through.
|
||||
def blank
|
||||
tk_send_without_enc('blank')
|
||||
self
|
||||
|
@ -164,6 +207,10 @@ class TkPhotoImage<TkImage
|
|||
tk_tcl2ruby(tk_send('cget', '-' << option.to_s))
|
||||
end
|
||||
end
|
||||
|
||||
# Returns the current value of the configuration option given by option.
|
||||
# Example, display name of the file from which <tt>image</tt> was created:
|
||||
# puts image.cget :file
|
||||
def cget(option)
|
||||
unless TkConfigMethod.__IGNORE_UNKNOWN_CONFIGURE_OPTION__
|
||||
cget_strict(option)
|
||||
|
@ -182,6 +229,51 @@ class TkPhotoImage<TkImage
|
|||
end
|
||||
end
|
||||
|
||||
# Copies a region from the image called source to the image called
|
||||
# destination, possibly with pixel zooming and/or subsampling. If no options
|
||||
# are specified, this method copies the whole of source into destination,
|
||||
# starting at coordinates (0,0) in destination. The following options may be
|
||||
# specified:
|
||||
#
|
||||
# * :from [x1, y1, x2, y2]
|
||||
# Specifies a rectangular sub-region of the source image to be copied.
|
||||
# (x1,y1) and (x2,y2) specify diagonally opposite corners of the rectangle.
|
||||
# If x2 and y2 are not specified, the default value is the bottom-right
|
||||
# corner of the source image. The pixels copied will include the left and
|
||||
# top edges of the specified rectangle but not the bottom or right edges.
|
||||
# If the :from option is not given, the default is the whole source image.
|
||||
# * :to [x1, y1, x2, y2]
|
||||
# Specifies a rectangular sub-region of the destination image to be
|
||||
# affected. (x1,y1) and (x2,y2) specify diagonally opposite corners of the
|
||||
# rectangle. If x2 and y2 are not specified, the default value is (x1,y1)
|
||||
# plus the size of the source region (after subsampling and zooming, if
|
||||
# specified). If x2 and y2 are specified, the source region will be
|
||||
# replicated if necessary to fill the destination region in a tiled fashion.
|
||||
# * :shrink
|
||||
# Specifies that the size of the destination image should be reduced, if
|
||||
# necessary, so that the region being copied into is at the bottom-right
|
||||
# corner of the image. This option will not affect the width or height of
|
||||
# the image if the user has specified a non-zero value for the :width or
|
||||
# :height configuration option, respectively.
|
||||
# * :zoom [x, y]
|
||||
# Specifies that the source region should be magnified by a factor of x
|
||||
# in the X direction and y in the Y direction. If y is not given, the
|
||||
# default value is the same as x. With this option, each pixel in the
|
||||
# source image will be expanded into a block of x x y pixels in the
|
||||
# destination image, all the same color. x and y must be greater than 0.
|
||||
# * :subsample [x, y]
|
||||
# Specifies that the source image should be reduced in size by using only
|
||||
# every xth pixel in the X direction and yth pixel in the Y direction.
|
||||
# Negative values will cause the image to be flipped about the Y or X axes,
|
||||
# respectively. If y is not given, the default value is the same as x.
|
||||
# * :compositingrule rule
|
||||
# Specifies how transparent pixels in the source image are combined with
|
||||
# the destination image. When a compositing rule of <tt>overlay</tt> is set,
|
||||
# the old contents of the destination image are visible, as if the source
|
||||
# image were printed on a piece of transparent film and placed over the
|
||||
# top of the destination. When a compositing rule of <tt>set</tt> is set,
|
||||
# the old contents of the destination image are discarded and the source
|
||||
# image is used as-is. The default compositing rule is <tt>overlay</tt>.
|
||||
def copy(src, *opts)
|
||||
if opts.size == 0
|
||||
tk_send('copy', src)
|
||||
|
@ -201,11 +293,35 @@ class TkPhotoImage<TkImage
|
|||
self
|
||||
end
|
||||
|
||||
# Returns image data in the form of a string. The following options may be
|
||||
# specified:
|
||||
# * :background color
|
||||
# If the color is specified, the data will not contain any transparency
|
||||
# information. In all transparent pixels the color will be replaced by the
|
||||
# specified color.
|
||||
# * :format format-name
|
||||
# Specifies the name of the image file format handler to be used.
|
||||
# Specifically, this subcommand searches for the first handler whose name
|
||||
# matches an initial substring of format-name and which has the capability
|
||||
# to read this image data. If this option is not given, this subcommand
|
||||
# uses the first handler that has the capability to read the image data.
|
||||
# * :from [x1, y1, x2, y2]
|
||||
# Specifies a rectangular region of imageName to be returned. If only x1
|
||||
# and y1 are specified, the region extends from (x1,y1) to the bottom-right
|
||||
# corner of imageName. If all four coordinates are given, they specify
|
||||
# diagonally opposite corners of the rectangular region, including x1,y1
|
||||
# and excluding x2,y2. The default, if this option is not given, is the
|
||||
# whole image.
|
||||
# * :grayscale
|
||||
# If this options is specified, the data will not contain color information.
|
||||
# All pixel data will be transformed into grayscale.
|
||||
def data(keys={})
|
||||
#tk_send('data', *_photo_hash_kv(keys))
|
||||
tk_split_list(tk_send('data', *_photo_hash_kv(keys)))
|
||||
end
|
||||
|
||||
# Returns the color of the pixel at coordinates (x,y) in the image as a list
|
||||
# of three integers between 0 and 255, representing the red, green and blue
|
||||
# components respectively.
|
||||
def get(x, y)
|
||||
tk_send('get', x, y).split.collect{|n| n.to_i}
|
||||
end
|
||||
|
@ -246,11 +362,15 @@ class TkPhotoImage<TkImage
|
|||
self
|
||||
end
|
||||
|
||||
# Returns a boolean indicating if the pixel at (x,y) is transparent.
|
||||
def get_transparency(x, y)
|
||||
bool(tk_send('transparency', 'get', x, y))
|
||||
end
|
||||
def set_transparency(x, y, st)
|
||||
tk_send('transparency', 'set', x, y, st)
|
||||
|
||||
# Makes the pixel at (x,y) transparent if <tt>state</tt> is true, and makes
|
||||
# that pixel opaque otherwise.
|
||||
def set_transparency(x, y, state)
|
||||
tk_send('transparency', 'set', x, y, state)
|
||||
self
|
||||
end
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче