ffi-tk 2009.11.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|