ffi-tk 2009.11.29
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +748 -0
- data/MANIFEST +188 -0
- data/README.md +85 -0
- data/Rakefile +47 -0
- data/TODO.md +62 -0
- data/bin/rwish +33 -0
- data/doc/MIT_LICENSE +18 -0
- data/doc/TCL_LICENSE +39 -0
- data/example/choose_color.rb +22 -0
- data/example/choose_directory.rb +22 -0
- data/example/dialog.rb +37 -0
- data/example/hello.rb +11 -0
- data/example/message_box.rb +26 -0
- data/example/option_menu.rb +17 -0
- data/example/popup.rb +24 -0
- data/example/set_palette.rb +32 -0
- data/example/text.rb +47 -0
- data/example/tile/kroc_demo_small.rb +123 -0
- data/example/tile/kroc_rb_demo.rb +135 -0
- data/example/tile/notebook.rb +48 -0
- data/example/tile/theme_hello.rb +38 -0
- data/example/tile/treeview.rb +71 -0
- data/example/various.rb +25 -0
- data/example/wait.rb +16 -0
- data/ffi-tk.gemspec +33 -0
- data/lib/ffi-tk.rb +76 -0
- data/lib/ffi-tk/command.rb +39 -0
- data/lib/ffi-tk/command/after.rb +36 -0
- data/lib/ffi-tk/command/bell.rb +34 -0
- data/lib/ffi-tk/command/bind.rb +11 -0
- data/lib/ffi-tk/command/bindtags.rb +69 -0
- data/lib/ffi-tk/command/cget.rb +92 -0
- data/lib/ffi-tk/command/choose_color.rb +29 -0
- data/lib/ffi-tk/command/choose_directory.rb +45 -0
- data/lib/ffi-tk/command/clipboard.rb +102 -0
- data/lib/ffi-tk/command/configure.rb +88 -0
- data/lib/ffi-tk/command/destroy.rb +12 -0
- data/lib/ffi-tk/command/dialog.rb +54 -0
- data/lib/ffi-tk/command/event.rb +79 -0
- data/lib/ffi-tk/command/focus.rb +70 -0
- data/lib/ffi-tk/command/font.rb +124 -0
- data/lib/ffi-tk/command/get_open_file.rb +85 -0
- data/lib/ffi-tk/command/get_save_file.rb +83 -0
- data/lib/ffi-tk/command/grab.rb +141 -0
- data/lib/ffi-tk/command/grid.rb +246 -0
- data/lib/ffi-tk/command/image.rb +79 -0
- data/lib/ffi-tk/command/lower.rb +23 -0
- data/lib/ffi-tk/command/message_box.rb +65 -0
- data/lib/ffi-tk/command/option_menu.rb +8 -0
- data/lib/ffi-tk/command/pack.rb +99 -0
- data/lib/ffi-tk/command/place.rb +91 -0
- data/lib/ffi-tk/command/popup.rb +14 -0
- data/lib/ffi-tk/command/raise.rb +25 -0
- data/lib/ffi-tk/command/scrollable.rb +151 -0
- data/lib/ffi-tk/command/selection.rb +132 -0
- data/lib/ffi-tk/command/set_palette.rb +9 -0
- data/lib/ffi-tk/command/tk_cmd.rb +155 -0
- data/lib/ffi-tk/command/vars.rb +82 -0
- data/lib/ffi-tk/command/wait.rb +39 -0
- data/lib/ffi-tk/command/winfo.rb +668 -0
- data/lib/ffi-tk/command/wm.rb +1025 -0
- data/lib/ffi-tk/core_extensions.rb +154 -0
- data/lib/ffi-tk/event/data.rb +60 -0
- data/lib/ffi-tk/event/handler.rb +44 -0
- data/lib/ffi-tk/ffi/tcl.rb +92 -0
- data/lib/ffi-tk/ffi/tcl/cmd_proc.rb +10 -0
- data/lib/ffi-tk/ffi/tcl/eval_result.rb +148 -0
- data/lib/ffi-tk/ffi/tcl/interp.rb +95 -0
- data/lib/ffi-tk/ffi/tcl/obj.rb +89 -0
- data/lib/ffi-tk/ffi/tcl/time.rb +36 -0
- data/lib/ffi-tk/ffi/tk.rb +35 -0
- data/lib/ffi-tk/geometry.rb +32 -0
- data/lib/ffi-tk/thread_sender.rb +26 -0
- data/lib/ffi-tk/tk.rb +222 -0
- data/lib/ffi-tk/variable.rb +46 -0
- data/lib/ffi-tk/widget.rb +68 -0
- data/lib/ffi-tk/widget/button.rb +41 -0
- data/lib/ffi-tk/widget/canvas.rb +806 -0
- data/lib/ffi-tk/widget/canvas/arc.rb +18 -0
- data/lib/ffi-tk/widget/canvas/bitmap.rb +13 -0
- data/lib/ffi-tk/widget/canvas/image.rb +10 -0
- data/lib/ffi-tk/widget/canvas/item.rb +170 -0
- data/lib/ffi-tk/widget/canvas/line.rb +16 -0
- data/lib/ffi-tk/widget/canvas/oval.rb +15 -0
- data/lib/ffi-tk/widget/canvas/polygon.rb +16 -0
- data/lib/ffi-tk/widget/canvas/rectangle.rb +15 -0
- data/lib/ffi-tk/widget/canvas/text.rb +15 -0
- data/lib/ffi-tk/widget/canvas/window.rb +11 -0
- data/lib/ffi-tk/widget/checkbutton.rb +63 -0
- data/lib/ffi-tk/widget/entry.rb +208 -0
- data/lib/ffi-tk/widget/frame.rb +12 -0
- data/lib/ffi-tk/widget/label.rb +26 -0
- data/lib/ffi-tk/widget/labelframe.rb +7 -0
- data/lib/ffi-tk/widget/listbox.rb +192 -0
- data/lib/ffi-tk/widget/menu.rb +318 -0
- data/lib/ffi-tk/widget/menubutton.rb +7 -0
- data/lib/ffi-tk/widget/message.rb +36 -0
- data/lib/ffi-tk/widget/panedwindow.rb +164 -0
- data/lib/ffi-tk/widget/radiobutton.rb +43 -0
- data/lib/ffi-tk/widget/root.rb +8 -0
- data/lib/ffi-tk/widget/scale.rb +44 -0
- data/lib/ffi-tk/widget/scrollbar.rb +114 -0
- data/lib/ffi-tk/widget/spinbox.rb +198 -0
- data/lib/ffi-tk/widget/text.rb +893 -0
- data/lib/ffi-tk/widget/text/peer.rb +10 -0
- data/lib/ffi-tk/widget/tile.rb +70 -0
- data/lib/ffi-tk/widget/tile/button.rb +8 -0
- data/lib/ffi-tk/widget/tile/checkbutton.rb +8 -0
- data/lib/ffi-tk/widget/tile/combobox.rb +43 -0
- data/lib/ffi-tk/widget/tile/entry.rb +8 -0
- data/lib/ffi-tk/widget/tile/frame.rb +13 -0
- data/lib/ffi-tk/widget/tile/label.rb +9 -0
- data/lib/ffi-tk/widget/tile/labelframe.rb +8 -0
- data/lib/ffi-tk/widget/tile/menubutton.rb +8 -0
- data/lib/ffi-tk/widget/tile/notebook.rb +93 -0
- data/lib/ffi-tk/widget/tile/panedwindow.rb +9 -0
- data/lib/ffi-tk/widget/tile/progressbar.rb +59 -0
- data/lib/ffi-tk/widget/tile/radiobutton.rb +8 -0
- data/lib/ffi-tk/widget/tile/scale.rb +8 -0
- data/lib/ffi-tk/widget/tile/scrollbar.rb +41 -0
- data/lib/ffi-tk/widget/tile/separator.rb +23 -0
- data/lib/ffi-tk/widget/tile/sizegrip.rb +24 -0
- data/lib/ffi-tk/widget/tile/style.rb +114 -0
- data/lib/ffi-tk/widget/tile/treeview.rb +414 -0
- data/lib/ffi-tk/widget/toplevel.rb +14 -0
- data/spec/ffi-tk/command/bindtags.rb +18 -0
- data/spec/ffi-tk/command/clipboard.rb +18 -0
- data/spec/ffi-tk/command/font.rb +67 -0
- data/spec/ffi-tk/command/grid.rb +6 -0
- data/spec/ffi-tk/command/image.rb +26 -0
- data/spec/ffi-tk/command/pack.rb +20 -0
- data/spec/ffi-tk/command/place.rb +20 -0
- data/spec/ffi-tk/command/selection.rb +13 -0
- data/spec/ffi-tk/command/vars.rb +32 -0
- data/spec/ffi-tk/command/winfo.rb +233 -0
- data/spec/ffi-tk/command/wm.rb +185 -0
- data/spec/ffi-tk/event.rb +95 -0
- data/spec/ffi-tk/tile/button.rb +51 -0
- data/spec/ffi-tk/tile/checkbutton.rb +13 -0
- data/spec/ffi-tk/tile/combobox.rb +65 -0
- data/spec/ffi-tk/tile/entry.rb +61 -0
- data/spec/ffi-tk/tile/frame.rb +65 -0
- data/spec/ffi-tk/tile/label.rb +17 -0
- data/spec/ffi-tk/tile/labelframe.rb +13 -0
- data/spec/ffi-tk/tile/menubutton.rb +13 -0
- data/spec/ffi-tk/tile/notebook.rb +103 -0
- data/spec/ffi-tk/tile/panedwindow.rb +13 -0
- data/spec/ffi-tk/tile/progressbar.rb +78 -0
- data/spec/ffi-tk/tile/radiobutton.rb +13 -0
- data/spec/ffi-tk/tile/scale.rb +13 -0
- data/spec/ffi-tk/tile/scrollbar.rb +43 -0
- data/spec/ffi-tk/tile/separator.rb +22 -0
- data/spec/ffi-tk/tile/sizegrip.rb +13 -0
- data/spec/ffi-tk/tile/style.rb +161 -0
- data/spec/ffi-tk/tile/treeview.rb +101 -0
- data/spec/ffi-tk/variable.rb +24 -0
- data/spec/ffi-tk/widget/button.rb +22 -0
- data/spec/ffi-tk/widget/canvas.rb +169 -0
- data/spec/ffi-tk/widget/checkbutton.rb +44 -0
- data/spec/ffi-tk/widget/entry.rb +155 -0
- data/spec/ffi-tk/widget/frame.rb +8 -0
- data/spec/ffi-tk/widget/label.rb +16 -0
- data/spec/ffi-tk/widget/labelframe.rb +12 -0
- data/spec/ffi-tk/widget/listbox.rb +19 -0
- data/spec/ffi-tk/widget/menu.rb +12 -0
- data/spec/ffi-tk/widget/menubutton.rb +12 -0
- data/spec/ffi-tk/widget/message.rb +12 -0
- data/spec/ffi-tk/widget/panedwindow.rb +12 -0
- data/spec/ffi-tk/widget/radiobutton.rb +12 -0
- data/spec/ffi-tk/widget/root.rb +9 -0
- data/spec/ffi-tk/widget/scale.rb +12 -0
- data/spec/ffi-tk/widget/scrollbar.rb +12 -0
- data/spec/ffi-tk/widget/spinbox.rb +12 -0
- data/spec/ffi-tk/widget/text.rb +246 -0
- data/spec/ffi-tk/widget/toplevel.rb +12 -0
- data/spec/helper.rb +3 -0
- data/tasks/authors.rake +21 -0
- data/tasks/bacon.rake +66 -0
- data/tasks/changelog.rake +18 -0
- data/tasks/gem.rake +22 -0
- data/tasks/gem_setup.rake +113 -0
- data/tasks/grancher.rake +12 -0
- data/tasks/manifest.rake +4 -0
- data/tasks/rcov.rake +17 -0
- data/tasks/release.rake +65 -0
- data/tasks/reversion.rake +8 -0
- data/tasks/setup.rake +12 -0
- data/tasks/ycov.rake +84 -0
- metadata +261 -0
@@ -0,0 +1,91 @@
|
|
1
|
+
module Tk
|
2
|
+
# Geometry manager for fixed or rubber-sheet placement
|
3
|
+
#
|
4
|
+
# The placer is a geometry manager for Tk. It provides simple fixed placement
|
5
|
+
# of windows, where you specify the exact size and location of one window,
|
6
|
+
# called the slave, within another window, called the master.
|
7
|
+
# The placer also provides rubber-sheet placement, where you specify the size
|
8
|
+
# and location of the slave in terms of the dimensions of the master, so that
|
9
|
+
# the slave changes size and location in response to changes in the size of
|
10
|
+
# the master.
|
11
|
+
# Lastly, the placer allows you to mix these styles of placement so that, for
|
12
|
+
# example, the slave has a fixed width and height but is centered inside the
|
13
|
+
# master.
|
14
|
+
module Place
|
15
|
+
# Arrange for the placer to manage the geometry of a +window+.
|
16
|
+
# The remaining arguments consist of a hash that specifies the way in which
|
17
|
+
# +window+'s geometry is managed.
|
18
|
+
# Option may have any of the values accepted by [Place.configure].
|
19
|
+
def self.place(window, options = {})
|
20
|
+
args = options.map{|k,v| ["-#{k}", v] }.flatten
|
21
|
+
Tk.execute_only('place', window, *args)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Query or modify the geometry options of the slave given by window.
|
25
|
+
# If no option is specified, this command returns a list describing the
|
26
|
+
# available options (see Tk_ConfigureInfo for information on the format of
|
27
|
+
# this list).
|
28
|
+
# If option is specified with no value, then the command returns a list
|
29
|
+
# describing the one named option (this list will be identical to the
|
30
|
+
# corresponding sublist of the value returned if no option is specified).
|
31
|
+
# If one or more options are specified, then the command modifies the given
|
32
|
+
# option(s) to have the given value(s); in this case the command returns
|
33
|
+
# nil.
|
34
|
+
def self.configure(window, options = None)
|
35
|
+
if options == None
|
36
|
+
Tk.execute('place', 'configure', window)
|
37
|
+
else
|
38
|
+
Tk.execute_only('place', 'configure', window, options)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.forget(window)
|
43
|
+
Tk.execute_only('place', 'forget', window)
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.info(window)
|
47
|
+
info = Tk.execute('place', 'info', window).to_s
|
48
|
+
|
49
|
+
array = info.split.each_slice(2).map{|key, value|
|
50
|
+
case key = key[1..-1].to_sym
|
51
|
+
when :anchor, :in
|
52
|
+
[key, value]
|
53
|
+
when :bordermode
|
54
|
+
[key, value.to_sym]
|
55
|
+
when :height, :width, :x, :y
|
56
|
+
[key, value.to_i]
|
57
|
+
when :relheight, :relwidth, :relx, :rely
|
58
|
+
[key, value.to_f]
|
59
|
+
else
|
60
|
+
raise "Unknown info pair: %p => %p" % [key, value]
|
61
|
+
end
|
62
|
+
}
|
63
|
+
|
64
|
+
Hash[array]
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.slaves(window)
|
68
|
+
Tk.execute('place', 'slaves', window)
|
69
|
+
end
|
70
|
+
|
71
|
+
def place(options = {})
|
72
|
+
Place.place(self, options)
|
73
|
+
end
|
74
|
+
|
75
|
+
def place_configure(options = None)
|
76
|
+
Place.configure(self, options)
|
77
|
+
end
|
78
|
+
|
79
|
+
def place_forget
|
80
|
+
Place.forget(self)
|
81
|
+
end
|
82
|
+
|
83
|
+
def place_info
|
84
|
+
Place.info(self)
|
85
|
+
end
|
86
|
+
|
87
|
+
def place_slaves
|
88
|
+
Place.slaves(self)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Tk
|
2
|
+
# This procedure posts a menu at a given position on the screen and configures
|
3
|
+
# Tk so that the menu and its cascaded children can be traversed with the
|
4
|
+
# mouse or the keyboard.
|
5
|
+
# +menu+ is the name of a menu widget and +x+ and +y+ are the root coordinates
|
6
|
+
# at which to display the menu.
|
7
|
+
# If +entry+ is omitted, the menu's upper left corner is positioned at the
|
8
|
+
# given point.
|
9
|
+
# Otherwise +entry gives the index of an entry in +menu+ and the menu will be
|
10
|
+
# positioned so that the +entry+ is positioned over the given point.
|
11
|
+
def self.popup(menu, x, y, entry = None)
|
12
|
+
Tk.execute_only(:tk_popup, menu, x, y, entry)
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Tk
|
2
|
+
# Change a window's position in the stacking order
|
3
|
+
#
|
4
|
+
# FIXME: this will shadow Kernel#raise, alternatives?
|
5
|
+
module Raise
|
6
|
+
def raise(above = None)
|
7
|
+
Raise.raise(self, above)
|
8
|
+
end
|
9
|
+
|
10
|
+
module_function
|
11
|
+
|
12
|
+
# If the +above+ argument is omitted then the command raises window so that
|
13
|
+
# it is above all of its siblings in the stacking order (it will not be
|
14
|
+
# obscured by any siblings and will obscure any siblings that overlap it).
|
15
|
+
#
|
16
|
+
# If +above+ is specified then it must be the path name of a window that is
|
17
|
+
# either a sibling of window or the descendant of a sibling of window.
|
18
|
+
# In this case the raise command will insert window into the stacking order
|
19
|
+
# just above +above+ or the ancestor of +above+ that is a sibling of
|
20
|
+
# window); this could end up either raising or lowering window.
|
21
|
+
def raise(window, above = None)
|
22
|
+
Tk.execute_only(:raise, window, above)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,151 @@
|
|
1
|
+
module Tk
|
2
|
+
module Scrollable
|
3
|
+
|
4
|
+
# Returns a list containing two elements.
|
5
|
+
# Each element is a real fraction between 0 and 1; together they describe
|
6
|
+
# the portion of the document's horizontal span that is visible in the
|
7
|
+
# window. For example, if the first element is .2 and the second element is
|
8
|
+
# .6, 20% of the text is off-screen to the left, the middle 40% is visible
|
9
|
+
# in the window, and 40% of the text is off-screen to the right.
|
10
|
+
# The fractions refer only to the lines that are actually visible in the
|
11
|
+
# window: if the lines in the window are all very short, so that they are
|
12
|
+
# entirely visible, the returned fractions will be 0 and 1, even if there
|
13
|
+
# are other lines in the text that are much wider than the window.
|
14
|
+
# These are the same values passed to scrollbars via the -xscrollcommand
|
15
|
+
# option.
|
16
|
+
def xview(index = None)
|
17
|
+
if None == index
|
18
|
+
execute(:xview).to_a(&:to_f)
|
19
|
+
else
|
20
|
+
execute_only(:xview, index)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Adjusts the view in the window so that fraction of the horizontal span of
|
25
|
+
# the text is off-screen to the left.
|
26
|
+
# Fraction is a fraction between 0 and 1.
|
27
|
+
def xview_moveto(fraction)
|
28
|
+
execute_only(:xview, :moveto, fraction)
|
29
|
+
end
|
30
|
+
|
31
|
+
# This command shifts the view in the window left or right according to
|
32
|
+
# number and what.
|
33
|
+
# What must be units, pages or pixels.
|
34
|
+
# If what is units or pages then number │ must be an integer, otherwise
|
35
|
+
# number may be specified in any of the forms accept│ able to
|
36
|
+
# Tk_GetPixels, such as “2.0c” or “1i” (the result is rounded to the
|
37
|
+
# nearest │ integer value.
|
38
|
+
# If no units are given, pixels are assumed).
|
39
|
+
# If what is units, the │ view adjusts left or right by number
|
40
|
+
# average-width characters on the display; if │ it is pages then the view
|
41
|
+
# adjusts by number screenfuls; if it is pixels then the │ view adjusts by
|
42
|
+
# number pixels.
|
43
|
+
# If number is negative then characters farther to the left become visible;
|
44
|
+
# if it is positive then characters farther to the right become visible.
|
45
|
+
def xview_scroll(number, what)
|
46
|
+
execute_only(:xview, :scroll, number, what)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Returns a list containing two elements, both of which are real fractions
|
50
|
+
# between 0 and 1.
|
51
|
+
# The first element gives the position of the first visible pixel of the
|
52
|
+
# first character (or image, etc) in the top line in the window, relative
|
53
|
+
# to the text as a whole (0.5 means it is halfway through the text, for
|
54
|
+
# example). The second element gives the position of the first pixel just
|
55
|
+
# after the last visible one in the bottom line of the window, relative to
|
56
|
+
# the text as a whole.
|
57
|
+
# These are the same values passed to scrollbars via the -yscrollcommand
|
58
|
+
# option.
|
59
|
+
#
|
60
|
+
# This command makes the first character on the line after the one given by
|
61
|
+
# number visible at the top of the window.
|
62
|
+
# Number must be an integer.
|
63
|
+
# This command used to be used for scrolling, but now it is obsolete.
|
64
|
+
def yview(index = None)
|
65
|
+
if None == index
|
66
|
+
execute(:yview).to_a(&:to_f)
|
67
|
+
else
|
68
|
+
execute_only(:yview, index)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
# Adjusts the view in the window so that the pixel given by fraction
|
74
|
+
# appears at the top of the top line of the window.
|
75
|
+
# Fraction is a fraction between 0 and 1; 0 indicates the first pixel of
|
76
|
+
# the first character in the text, 0.33 indicates the pixel that is
|
77
|
+
# one-third the way through the text; and so on.
|
78
|
+
# Values close to 1 │ will indicate values close to the last pixel in the
|
79
|
+
# text (1 actually refers to one │ pixel beyond the last pixel), but in
|
80
|
+
# such cases the widget will never scroll │ beyond the last pixel, and so a
|
81
|
+
# value of 1 will effectively be rounded back to │ whatever fraction
|
82
|
+
# ensures the last pixel is at the bottom of the window, and some │ other
|
83
|
+
# pixel is at the top.
|
84
|
+
def yview_moveto(fraction)
|
85
|
+
execute_only(:yview, :moveto, fraction)
|
86
|
+
end
|
87
|
+
|
88
|
+
# This command adjust the view in the window up or down according to number
|
89
|
+
# and what.
|
90
|
+
# What must be units, pages or pixels.
|
91
|
+
# If what is units or pages then number │ must be an integer, otherwise
|
92
|
+
# number may be specified in any of the forms accept│ able to
|
93
|
+
# Tk_GetPixels, such as “2.0c” or “1i” (the result is rounded to the
|
94
|
+
# nearest │ integer value.
|
95
|
+
# If no units are given, pixels are assumed).
|
96
|
+
# If what is units, the │ view adjusts up or down by number lines on the
|
97
|
+
# display; if it is pages then the │ view adjusts by number screenfuls; if
|
98
|
+
# it is pixels then the view adjusts by number │ pixels.
|
99
|
+
# If number is negative then earlier positions in the text become visible;
|
100
|
+
# if it is positive then later positions in the text become visible.
|
101
|
+
def yview_scroll(number, what)
|
102
|
+
execute_only(:yview, :scroll, number, what)
|
103
|
+
end
|
104
|
+
|
105
|
+
# Changes the view in the widget's window to make index visible.
|
106
|
+
#
|
107
|
+
# The widget chooses where index appears in the window:
|
108
|
+
# [1] If index is already visible somewhere in the window then the command
|
109
|
+
# does nothing.
|
110
|
+
# [2] If index is only a few lines off-screen above the window then it will
|
111
|
+
# be positioned at the top of the window.
|
112
|
+
# [3] If index is only a few lines off-screen below the window then it will
|
113
|
+
# be positioned at the bottom of the window.
|
114
|
+
# [4] Otherwise, index will be centered in the window.
|
115
|
+
#
|
116
|
+
# The [yview_pickplace] method has been obsoleted by the [see] method.
|
117
|
+
# [see] handles both x- and y-motion to make a location visible, whereas the
|
118
|
+
# [yview_pickplace] mode only handles motion in y).
|
119
|
+
def yview_pickplace(index)
|
120
|
+
execute(:yview, '-pickplace', index)
|
121
|
+
end
|
122
|
+
|
123
|
+
def yscrollbar(sbar)
|
124
|
+
@yscrollbar = sbar
|
125
|
+
@yscrollbar.orient :vertical
|
126
|
+
|
127
|
+
self.yscrollcommand {|*arg| @yscrollbar.set(*arg); true }
|
128
|
+
@yscrollbar.command {|action,fraction| self.yview_moveto(fraction) }
|
129
|
+
@yscrollbar
|
130
|
+
end
|
131
|
+
|
132
|
+
def xscrollbar(sbar)
|
133
|
+
@xscrollbar = sbar
|
134
|
+
@xscrollbar.orient :horizontal
|
135
|
+
|
136
|
+
self.xscrollcommand {|*arg| @xscrollbar.set(*arg); true }
|
137
|
+
@xscrollbar.command {|action,fraction| self.xview_moveto(fraction) }
|
138
|
+
@xscrollbar
|
139
|
+
end
|
140
|
+
|
141
|
+
def xscrollcommand(&block)
|
142
|
+
configure(:xscrollcommand => block) if block
|
143
|
+
end
|
144
|
+
|
145
|
+
def yscrollcommand(&block)
|
146
|
+
configure(:yscrollcommand => block) if block
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
@@ -0,0 +1,132 @@
|
|
1
|
+
module Tk
|
2
|
+
# This command provides a Tcl interface to the X selection mechanism and
|
3
|
+
# implements the full selection functionality described in the X Inter-Client
|
4
|
+
# Communication Conventions Manual (ICCCM).
|
5
|
+
#
|
6
|
+
# Note that for management of the CLIPBOARD selection (see below), the
|
7
|
+
# clipboard command may also be used.
|
8
|
+
module Selection
|
9
|
+
def selection_clear(options = {})
|
10
|
+
Selection.clear({displayof: self}.merge(options))
|
11
|
+
end
|
12
|
+
|
13
|
+
def selection_get(options = {})
|
14
|
+
Selection.get({displayof: self}.merge(options))
|
15
|
+
end
|
16
|
+
|
17
|
+
def selection_handle(options = {}, &command)
|
18
|
+
Selection.handle(self, options, &command)
|
19
|
+
end
|
20
|
+
|
21
|
+
def selection_own(options, &command)
|
22
|
+
Selection.own(self, options, &command)
|
23
|
+
end
|
24
|
+
|
25
|
+
module_function
|
26
|
+
|
27
|
+
# If selection exists anywhere on window's display, clear it so that no
|
28
|
+
# window owns the selection anymore.
|
29
|
+
# Selection specifies the X selection that should be cleared, and should be
|
30
|
+
# an atom name such as PRIMARY or CLIPBOARD; see the Inter-Client
|
31
|
+
# Communication Conventions Manual for complete details.
|
32
|
+
# Selection defaults to PRIMARY and window defaults to ".".
|
33
|
+
def clear(options = {})
|
34
|
+
Tk.execute_only(:selection, :clear, options.to_tcl_options)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Retrieves the value of selection from window's display and returns it as a
|
38
|
+
# result. Selection defaults to PRIMARY and window defaults to â.â.
|
39
|
+
# Type specifies the form in which the selection is to be returned (the
|
40
|
+
# desired âtargetâ for conversion, in ICCCM terminology), and should be
|
41
|
+
# an atom name such as STRING or FILE_NAME; see the Inter-Client
|
42
|
+
# Communication Conventions Manual for complete details.
|
43
|
+
# Type defaults to STRING.
|
44
|
+
# The selection owner may choose to return the selection in any of several
|
45
|
+
# different representation formats, such as STRING, UTF8_STRING, ATOM,
|
46
|
+
# INTEGER, etc.
|
47
|
+
# (this format is different than the selection type; see the ICCCM for all
|
48
|
+
# the confusing details).
|
49
|
+
# If the selection is returned in a non-string format, such as INTEGER or
|
50
|
+
# ATOM, the selection command converts it to string format as a collection
|
51
|
+
# of fields separated by spaces: atoms are converted to their textual names,
|
52
|
+
# and anything else is converted to hexadecimal integers.
|
53
|
+
# Note that selection get does not retrieve the selection in the UTF8_STRING
|
54
|
+
# format unless told to.
|
55
|
+
def get(options = {})
|
56
|
+
Tk.execute(:selection, :get, options.to_tcl_options).to_s
|
57
|
+
end
|
58
|
+
|
59
|
+
# Creates a handler for selection requests, such that command will be
|
60
|
+
# executed whenever selection s is owned by window and someone attempts to
|
61
|
+
# retrieve it in the form given by type t (e.g.
|
62
|
+
# t is specified in the selection get command).
|
63
|
+
# S defaults to PRIMARY, t defaults to STRING, and f defaults to STRING.
|
64
|
+
# If command is an empty string then any existing handler for window, t, and
|
65
|
+
# s is removed.
|
66
|
+
# Note that when the selection is handled as type STRING it is also
|
67
|
+
# automatically handled as type UTF8_STRING as well.
|
68
|
+
#
|
69
|
+
# When selection is requested, window is the selection owner, and type is
|
70
|
+
# the requested type, command will be executed as a Tcl command with two
|
71
|
+
# additional numbers appended to it (with space separators).
|
72
|
+
# The two additional numbers are offset and maxChars: offset specifies a
|
73
|
+
# starting character position in the selection and maxChars gives the
|
74
|
+
# maximum number of characters to retrieve.
|
75
|
+
# The command should return a value consisting of at most maxChars of the
|
76
|
+
# selection, starting at position offset.
|
77
|
+
# For very large selections (larger than maxChars) the selection will be
|
78
|
+
# retrieved using several invocations of command with increasing offset
|
79
|
+
# values. If command returns a string whose length is less than maxChars,
|
80
|
+
# the return value is assumed to include all of the remainder of the
|
81
|
+
# selection; if the length of command's result is equal to maxChars then
|
82
|
+
# command will be invoked again, until it eventually returns a result
|
83
|
+
# shorter than maxChars.
|
84
|
+
# The value of maxChars will always be relatively large (thousands of
|
85
|
+
# characters). If command returns an error then the selection retrieval is
|
86
|
+
# rejected just as if the selection did not exist at all.
|
87
|
+
# The format argument specifies the representation that should be used to
|
88
|
+
# transmit the selection to the requester (the second column of Table 2 of
|
89
|
+
# the ICCCM), and defaults to STRING.
|
90
|
+
#
|
91
|
+
# If format is STRING, the selection is transmitted as 8-bit ASCII
|
92
|
+
# characters (i.e. just in the form returned by command, in the system
|
93
|
+
# encoding; the UTF8_STRING format always uses UTF-8 as its encoding).
|
94
|
+
#
|
95
|
+
# If format is ATOM, then the return value from command is divided into
|
96
|
+
# fields separated by white space; each field is converted to its atom
|
97
|
+
# value, and the 32-bit atom value is transmitted instead of the atom name.
|
98
|
+
# For any other format, the return value from command is divided into fields
|
99
|
+
# separated by white space and each field is converted to a 32-bit integer;
|
100
|
+
# an array of integers is transmitted to the selection requester.
|
101
|
+
#
|
102
|
+
# The format argument is needed only for compatibility with selection
|
103
|
+
# requesters that do not use Tk.
|
104
|
+
# If Tk is being used to retrieve the selection then the value is converted
|
105
|
+
# back to a string at the requesting end, so format is irrelevant.
|
106
|
+
def handle(window, options = {}, &command)
|
107
|
+
command = register_command(:selection_handle, &command)
|
108
|
+
Tk.execute_only(options.to_tcl_options, window, command)
|
109
|
+
end
|
110
|
+
|
111
|
+
# The first form of selection own returns the path name of the window in
|
112
|
+
# this application that owns selection on the display containing window, or
|
113
|
+
# an empty string if no window in this application owns the selection.
|
114
|
+
# Selection defaults to PRIMARY and window defaults to ".".
|
115
|
+
def own(window = None, options = {}, &command)
|
116
|
+
if window == None
|
117
|
+
Tk.execute(:selection, :own)
|
118
|
+
elsif window.is_a?(Hash)
|
119
|
+
options = window
|
120
|
+
|
121
|
+
if cmd = (options[:command] || command)
|
122
|
+
command = register_command(:selection_own, &cmd)
|
123
|
+
Tk.execute(:selection, :own, {command: command}.merge(options).to_tcl_options)
|
124
|
+
else
|
125
|
+
Tk.execute(:selection, :own, options.to_tcl_options)
|
126
|
+
end
|
127
|
+
else
|
128
|
+
Tk.execute(:selection, :own, options.to_tcl_options, window)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
# Manipulate Tk internal state
|
2
|
+
module Tk
|
3
|
+
module TkCmd
|
4
|
+
# @see TkCmd.appname
|
5
|
+
def tk_appname
|
6
|
+
TkCmd.appname(self)
|
7
|
+
end
|
8
|
+
|
9
|
+
# @see TkCmd.appname
|
10
|
+
def tk_appname=(new_name)
|
11
|
+
TkCmd.appname(self, new_name)
|
12
|
+
end
|
13
|
+
|
14
|
+
# @see TkCmd.caret
|
15
|
+
def tk_caret(options = None)
|
16
|
+
TkCmd.caret(self, options)
|
17
|
+
end
|
18
|
+
|
19
|
+
# @see TkCmd.scaling
|
20
|
+
def tk_scaling
|
21
|
+
TkCmd.scaling(None, self)
|
22
|
+
end
|
23
|
+
|
24
|
+
# @see TkCmd.scaling
|
25
|
+
def tk_scaling=(number)
|
26
|
+
TkCmd.scaling(number, self)
|
27
|
+
end
|
28
|
+
|
29
|
+
# @see TkCmd.inactive
|
30
|
+
def tk_inactive(reset = None)
|
31
|
+
TkCmd.inactive(reset, self)
|
32
|
+
end
|
33
|
+
|
34
|
+
# @see TkCmd.useinputmethods
|
35
|
+
def tk_useinputmethods
|
36
|
+
TkCmd.useinputmethods(None, self)
|
37
|
+
end
|
38
|
+
|
39
|
+
# @see TkCmd.useinputmethods
|
40
|
+
def tk_useinputmethods=(boolean)
|
41
|
+
TkCmd.useinputmethods(boolean, self)
|
42
|
+
end
|
43
|
+
|
44
|
+
def tk_windowingsystem
|
45
|
+
TkCmd.windowingsystem
|
46
|
+
end
|
47
|
+
|
48
|
+
module_function
|
49
|
+
|
50
|
+
# If newName is not specified, this command returns the name of the
|
51
|
+
# application (the name that may be used in send commands to communicate
|
52
|
+
# with the application).
|
53
|
+
# If newName is specified, then the name of the application is changed to
|
54
|
+
# newName. If the given name is already in use, then a suffix of the form “
|
55
|
+
# #2” or “ #3” is appended in order to make the name unique.
|
56
|
+
# The command's result is the name actually chosen.
|
57
|
+
# newName should not start with a capital letter.
|
58
|
+
# This will interfere with option processing, since names starting with
|
59
|
+
# capitals are assumed to be classes; as a result, Tk may not be able to
|
60
|
+
# find some options for the application.
|
61
|
+
# If sends have been disabled by deleting the send command, this command
|
62
|
+
# will reenable them and recreate the send command.
|
63
|
+
def appname(new_name = None)
|
64
|
+
Tk.execute(:tk, :appname, new_name)
|
65
|
+
end
|
66
|
+
|
67
|
+
# Sets and queries the caret location for the display of the specified Tk
|
68
|
+
# window window.
|
69
|
+
# The caret is the per-display cursor location used for indicating global
|
70
|
+
# focus (e.g.
|
71
|
+
# to comply with Microsoft Accessibility guidelines), as well as for
|
72
|
+
# location of the over-the-spot XIM (X Input Methods) or Windows IME
|
73
|
+
# windows. If no options are specified, the last values used for setting
|
74
|
+
# the caret are return in option-value pair format.
|
75
|
+
# -x and -y represent window-relative coordinates, and -height is the
|
76
|
+
# height of the current cursor location, or the height of the specified
|
77
|
+
# window if none is given.
|
78
|
+
def caret(window, options = None)
|
79
|
+
if None == options
|
80
|
+
Tk.execute(:tk, :caret, window).tcl_options_to_hash
|
81
|
+
else
|
82
|
+
Tk.execute_only(:tk, :caret, window, options.to_tcl_options)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# Sets and queries the current scaling factor used by Tk to convert between
|
87
|
+
# physical units (for example, points, inches, or millimeters) and pixels.
|
88
|
+
# The number argument is a floating point number that specifies the
|
89
|
+
# number of pixels per point on window's display.
|
90
|
+
# If the window argument is omitted, it defaults to the main window.
|
91
|
+
# If the number argument is omitted, the current value of the scaling
|
92
|
+
# factor is returned.
|
93
|
+
# A “point” is a unit of measurement equal to 1/72 inch.
|
94
|
+
# A scaling factor of 1.0 corresponds to 1 pixel per point, which is
|
95
|
+
# equivalent to a standard 72 dpi monitor.
|
96
|
+
# A scaling factor of 1.25 would mean 1.25 pixels per point, which is the
|
97
|
+
# setting for a 90 dpi monitor; setting the scaling factor to 1.25 on a 72
|
98
|
+
# dpi monitor would cause everything in the application to be displayed
|
99
|
+
# 1.25 times as large as normal.
|
100
|
+
# The initial value for the scaling factor is set when the application
|
101
|
+
# starts, based on properties of the installed monitor, but it can be
|
102
|
+
# changed at any time.
|
103
|
+
# Measurements made after the scaling factor is changed will use the new
|
104
|
+
# scaling factor, but it is undefined whether existing widgets will resize
|
105
|
+
# themselves dynamically to accommodate the new scaling factor.
|
106
|
+
def scaling(number = None, window = None)
|
107
|
+
if None == window
|
108
|
+
Tk.execute(:tk, :scaling, number)
|
109
|
+
else
|
110
|
+
Tk.execute(:tk, :scaling, '-displayof', window, number)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# Returns a positive integer, the number of milliseconds since the last
|
115
|
+
# time the user interacted with the system.
|
116
|
+
# If the -displayof option is given then the return value refers to the
|
117
|
+
# display of window; otherwise it refers to the display of the
|
118
|
+
# application's main window.
|
119
|
+
# tk inactive will return -1, if querying the user inactive time is not
|
120
|
+
# supported by the system, and in safe interpreters.
|
121
|
+
# If the literal string reset is given as an additional argument, the timer
|
122
|
+
# is reset and an empty string is returned.
|
123
|
+
# Resetting the inactivity time is forbidden in safe interpreters and will
|
124
|
+
# throw and error if tried.
|
125
|
+
def inactive(reset = None, window = None)
|
126
|
+
if None == window
|
127
|
+
Tk.execute(:tk, :inactive, reset)
|
128
|
+
else
|
129
|
+
Tk.execute(:tk, :inactive, '-displayof', window, reset)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
# Sets and queries the state of whether Tk should use XIM (X Input Methods)
|
134
|
+
# for filtering events.
|
135
|
+
# The resulting state is returned.
|
136
|
+
# XIM is used in some locales (i.e., Japanese, Korean), to handle special
|
137
|
+
# input devices.
|
138
|
+
# This feature is only significant on X.
|
139
|
+
# If XIM support is not available, this will always return 0.
|
140
|
+
# If the window argument is omitted, it defaults to the main window.
|
141
|
+
# If the boolean argument is omitted, the current state is returned.
|
142
|
+
# This is turned on by default for the main display.
|
143
|
+
def useinputmethods(boolean = None, window = None)
|
144
|
+
if None == window
|
145
|
+
Tk.execute(:tk, :useinputmethods, boolean ? true : false)
|
146
|
+
else
|
147
|
+
Tk.execute(:tk, :useinputmethods, '-displayof', window, boolean ? true : false)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def windowingsystem
|
152
|
+
Tk.execute(:tk, :windowingsystem).to_sym
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|