ffi-tk 2009.11.29

Sign up to get free protection for your applications and to get access to all the features.
Files changed (189) hide show
  1. data/CHANGELOG +748 -0
  2. data/MANIFEST +188 -0
  3. data/README.md +85 -0
  4. data/Rakefile +47 -0
  5. data/TODO.md +62 -0
  6. data/bin/rwish +33 -0
  7. data/doc/MIT_LICENSE +18 -0
  8. data/doc/TCL_LICENSE +39 -0
  9. data/example/choose_color.rb +22 -0
  10. data/example/choose_directory.rb +22 -0
  11. data/example/dialog.rb +37 -0
  12. data/example/hello.rb +11 -0
  13. data/example/message_box.rb +26 -0
  14. data/example/option_menu.rb +17 -0
  15. data/example/popup.rb +24 -0
  16. data/example/set_palette.rb +32 -0
  17. data/example/text.rb +47 -0
  18. data/example/tile/kroc_demo_small.rb +123 -0
  19. data/example/tile/kroc_rb_demo.rb +135 -0
  20. data/example/tile/notebook.rb +48 -0
  21. data/example/tile/theme_hello.rb +38 -0
  22. data/example/tile/treeview.rb +71 -0
  23. data/example/various.rb +25 -0
  24. data/example/wait.rb +16 -0
  25. data/ffi-tk.gemspec +33 -0
  26. data/lib/ffi-tk.rb +76 -0
  27. data/lib/ffi-tk/command.rb +39 -0
  28. data/lib/ffi-tk/command/after.rb +36 -0
  29. data/lib/ffi-tk/command/bell.rb +34 -0
  30. data/lib/ffi-tk/command/bind.rb +11 -0
  31. data/lib/ffi-tk/command/bindtags.rb +69 -0
  32. data/lib/ffi-tk/command/cget.rb +92 -0
  33. data/lib/ffi-tk/command/choose_color.rb +29 -0
  34. data/lib/ffi-tk/command/choose_directory.rb +45 -0
  35. data/lib/ffi-tk/command/clipboard.rb +102 -0
  36. data/lib/ffi-tk/command/configure.rb +88 -0
  37. data/lib/ffi-tk/command/destroy.rb +12 -0
  38. data/lib/ffi-tk/command/dialog.rb +54 -0
  39. data/lib/ffi-tk/command/event.rb +79 -0
  40. data/lib/ffi-tk/command/focus.rb +70 -0
  41. data/lib/ffi-tk/command/font.rb +124 -0
  42. data/lib/ffi-tk/command/get_open_file.rb +85 -0
  43. data/lib/ffi-tk/command/get_save_file.rb +83 -0
  44. data/lib/ffi-tk/command/grab.rb +141 -0
  45. data/lib/ffi-tk/command/grid.rb +246 -0
  46. data/lib/ffi-tk/command/image.rb +79 -0
  47. data/lib/ffi-tk/command/lower.rb +23 -0
  48. data/lib/ffi-tk/command/message_box.rb +65 -0
  49. data/lib/ffi-tk/command/option_menu.rb +8 -0
  50. data/lib/ffi-tk/command/pack.rb +99 -0
  51. data/lib/ffi-tk/command/place.rb +91 -0
  52. data/lib/ffi-tk/command/popup.rb +14 -0
  53. data/lib/ffi-tk/command/raise.rb +25 -0
  54. data/lib/ffi-tk/command/scrollable.rb +151 -0
  55. data/lib/ffi-tk/command/selection.rb +132 -0
  56. data/lib/ffi-tk/command/set_palette.rb +9 -0
  57. data/lib/ffi-tk/command/tk_cmd.rb +155 -0
  58. data/lib/ffi-tk/command/vars.rb +82 -0
  59. data/lib/ffi-tk/command/wait.rb +39 -0
  60. data/lib/ffi-tk/command/winfo.rb +668 -0
  61. data/lib/ffi-tk/command/wm.rb +1025 -0
  62. data/lib/ffi-tk/core_extensions.rb +154 -0
  63. data/lib/ffi-tk/event/data.rb +60 -0
  64. data/lib/ffi-tk/event/handler.rb +44 -0
  65. data/lib/ffi-tk/ffi/tcl.rb +92 -0
  66. data/lib/ffi-tk/ffi/tcl/cmd_proc.rb +10 -0
  67. data/lib/ffi-tk/ffi/tcl/eval_result.rb +148 -0
  68. data/lib/ffi-tk/ffi/tcl/interp.rb +95 -0
  69. data/lib/ffi-tk/ffi/tcl/obj.rb +89 -0
  70. data/lib/ffi-tk/ffi/tcl/time.rb +36 -0
  71. data/lib/ffi-tk/ffi/tk.rb +35 -0
  72. data/lib/ffi-tk/geometry.rb +32 -0
  73. data/lib/ffi-tk/thread_sender.rb +26 -0
  74. data/lib/ffi-tk/tk.rb +222 -0
  75. data/lib/ffi-tk/variable.rb +46 -0
  76. data/lib/ffi-tk/widget.rb +68 -0
  77. data/lib/ffi-tk/widget/button.rb +41 -0
  78. data/lib/ffi-tk/widget/canvas.rb +806 -0
  79. data/lib/ffi-tk/widget/canvas/arc.rb +18 -0
  80. data/lib/ffi-tk/widget/canvas/bitmap.rb +13 -0
  81. data/lib/ffi-tk/widget/canvas/image.rb +10 -0
  82. data/lib/ffi-tk/widget/canvas/item.rb +170 -0
  83. data/lib/ffi-tk/widget/canvas/line.rb +16 -0
  84. data/lib/ffi-tk/widget/canvas/oval.rb +15 -0
  85. data/lib/ffi-tk/widget/canvas/polygon.rb +16 -0
  86. data/lib/ffi-tk/widget/canvas/rectangle.rb +15 -0
  87. data/lib/ffi-tk/widget/canvas/text.rb +15 -0
  88. data/lib/ffi-tk/widget/canvas/window.rb +11 -0
  89. data/lib/ffi-tk/widget/checkbutton.rb +63 -0
  90. data/lib/ffi-tk/widget/entry.rb +208 -0
  91. data/lib/ffi-tk/widget/frame.rb +12 -0
  92. data/lib/ffi-tk/widget/label.rb +26 -0
  93. data/lib/ffi-tk/widget/labelframe.rb +7 -0
  94. data/lib/ffi-tk/widget/listbox.rb +192 -0
  95. data/lib/ffi-tk/widget/menu.rb +318 -0
  96. data/lib/ffi-tk/widget/menubutton.rb +7 -0
  97. data/lib/ffi-tk/widget/message.rb +36 -0
  98. data/lib/ffi-tk/widget/panedwindow.rb +164 -0
  99. data/lib/ffi-tk/widget/radiobutton.rb +43 -0
  100. data/lib/ffi-tk/widget/root.rb +8 -0
  101. data/lib/ffi-tk/widget/scale.rb +44 -0
  102. data/lib/ffi-tk/widget/scrollbar.rb +114 -0
  103. data/lib/ffi-tk/widget/spinbox.rb +198 -0
  104. data/lib/ffi-tk/widget/text.rb +893 -0
  105. data/lib/ffi-tk/widget/text/peer.rb +10 -0
  106. data/lib/ffi-tk/widget/tile.rb +70 -0
  107. data/lib/ffi-tk/widget/tile/button.rb +8 -0
  108. data/lib/ffi-tk/widget/tile/checkbutton.rb +8 -0
  109. data/lib/ffi-tk/widget/tile/combobox.rb +43 -0
  110. data/lib/ffi-tk/widget/tile/entry.rb +8 -0
  111. data/lib/ffi-tk/widget/tile/frame.rb +13 -0
  112. data/lib/ffi-tk/widget/tile/label.rb +9 -0
  113. data/lib/ffi-tk/widget/tile/labelframe.rb +8 -0
  114. data/lib/ffi-tk/widget/tile/menubutton.rb +8 -0
  115. data/lib/ffi-tk/widget/tile/notebook.rb +93 -0
  116. data/lib/ffi-tk/widget/tile/panedwindow.rb +9 -0
  117. data/lib/ffi-tk/widget/tile/progressbar.rb +59 -0
  118. data/lib/ffi-tk/widget/tile/radiobutton.rb +8 -0
  119. data/lib/ffi-tk/widget/tile/scale.rb +8 -0
  120. data/lib/ffi-tk/widget/tile/scrollbar.rb +41 -0
  121. data/lib/ffi-tk/widget/tile/separator.rb +23 -0
  122. data/lib/ffi-tk/widget/tile/sizegrip.rb +24 -0
  123. data/lib/ffi-tk/widget/tile/style.rb +114 -0
  124. data/lib/ffi-tk/widget/tile/treeview.rb +414 -0
  125. data/lib/ffi-tk/widget/toplevel.rb +14 -0
  126. data/spec/ffi-tk/command/bindtags.rb +18 -0
  127. data/spec/ffi-tk/command/clipboard.rb +18 -0
  128. data/spec/ffi-tk/command/font.rb +67 -0
  129. data/spec/ffi-tk/command/grid.rb +6 -0
  130. data/spec/ffi-tk/command/image.rb +26 -0
  131. data/spec/ffi-tk/command/pack.rb +20 -0
  132. data/spec/ffi-tk/command/place.rb +20 -0
  133. data/spec/ffi-tk/command/selection.rb +13 -0
  134. data/spec/ffi-tk/command/vars.rb +32 -0
  135. data/spec/ffi-tk/command/winfo.rb +233 -0
  136. data/spec/ffi-tk/command/wm.rb +185 -0
  137. data/spec/ffi-tk/event.rb +95 -0
  138. data/spec/ffi-tk/tile/button.rb +51 -0
  139. data/spec/ffi-tk/tile/checkbutton.rb +13 -0
  140. data/spec/ffi-tk/tile/combobox.rb +65 -0
  141. data/spec/ffi-tk/tile/entry.rb +61 -0
  142. data/spec/ffi-tk/tile/frame.rb +65 -0
  143. data/spec/ffi-tk/tile/label.rb +17 -0
  144. data/spec/ffi-tk/tile/labelframe.rb +13 -0
  145. data/spec/ffi-tk/tile/menubutton.rb +13 -0
  146. data/spec/ffi-tk/tile/notebook.rb +103 -0
  147. data/spec/ffi-tk/tile/panedwindow.rb +13 -0
  148. data/spec/ffi-tk/tile/progressbar.rb +78 -0
  149. data/spec/ffi-tk/tile/radiobutton.rb +13 -0
  150. data/spec/ffi-tk/tile/scale.rb +13 -0
  151. data/spec/ffi-tk/tile/scrollbar.rb +43 -0
  152. data/spec/ffi-tk/tile/separator.rb +22 -0
  153. data/spec/ffi-tk/tile/sizegrip.rb +13 -0
  154. data/spec/ffi-tk/tile/style.rb +161 -0
  155. data/spec/ffi-tk/tile/treeview.rb +101 -0
  156. data/spec/ffi-tk/variable.rb +24 -0
  157. data/spec/ffi-tk/widget/button.rb +22 -0
  158. data/spec/ffi-tk/widget/canvas.rb +169 -0
  159. data/spec/ffi-tk/widget/checkbutton.rb +44 -0
  160. data/spec/ffi-tk/widget/entry.rb +155 -0
  161. data/spec/ffi-tk/widget/frame.rb +8 -0
  162. data/spec/ffi-tk/widget/label.rb +16 -0
  163. data/spec/ffi-tk/widget/labelframe.rb +12 -0
  164. data/spec/ffi-tk/widget/listbox.rb +19 -0
  165. data/spec/ffi-tk/widget/menu.rb +12 -0
  166. data/spec/ffi-tk/widget/menubutton.rb +12 -0
  167. data/spec/ffi-tk/widget/message.rb +12 -0
  168. data/spec/ffi-tk/widget/panedwindow.rb +12 -0
  169. data/spec/ffi-tk/widget/radiobutton.rb +12 -0
  170. data/spec/ffi-tk/widget/root.rb +9 -0
  171. data/spec/ffi-tk/widget/scale.rb +12 -0
  172. data/spec/ffi-tk/widget/scrollbar.rb +12 -0
  173. data/spec/ffi-tk/widget/spinbox.rb +12 -0
  174. data/spec/ffi-tk/widget/text.rb +246 -0
  175. data/spec/ffi-tk/widget/toplevel.rb +12 -0
  176. data/spec/helper.rb +3 -0
  177. data/tasks/authors.rake +21 -0
  178. data/tasks/bacon.rake +66 -0
  179. data/tasks/changelog.rake +18 -0
  180. data/tasks/gem.rake +22 -0
  181. data/tasks/gem_setup.rake +113 -0
  182. data/tasks/grancher.rake +12 -0
  183. data/tasks/manifest.rake +4 -0
  184. data/tasks/rcov.rake +17 -0
  185. data/tasks/release.rake +65 -0
  186. data/tasks/reversion.rake +8 -0
  187. data/tasks/setup.rake +12 -0
  188. data/tasks/ycov.rake +84 -0
  189. metadata +261 -0
@@ -0,0 +1,14 @@
1
+ module Tk
2
+ # A toplevel is similar to a frame except that it is created as a top-level
3
+ # window: its X parent is the root window of a screen rather than the logical
4
+ # parent from its path name.
5
+ # The primary purpose of a toplevel is to serve as a container for dialog
6
+ # boxes and other collections of widgets.
7
+ # The only visible features of a toplevel are its background color and an
8
+ # optional 3-D border to make the toplevel appear raised or sunken.
9
+ class Toplevel < Widget
10
+ include Cget, Configure
11
+
12
+ def self.tk_command; 'toplevel'; end
13
+ end
14
+ end
@@ -0,0 +1,18 @@
1
+ require_relative '../../helper'
2
+
3
+ Tk.init
4
+
5
+ describe Tk::Bindtags do
6
+ @entry = Tk::Entry.new('.')
7
+ @entry.pack # only placed widgets have bindtags?
8
+
9
+ it 'lists bindtags of a widget' do
10
+ Tk::Bindtags.bindtags(@entry).should == [".entry0", "Entry", ".", "all"]
11
+ end
12
+
13
+ it 'reverses bindtags of a widget' do
14
+ tags = Tk::Bindtags.bindtags(@entry)
15
+ Tk::Bindtags.bindtags(@entry, tags.reverse)
16
+ Tk::Bindtags.bindtags(@entry).should == tags.reverse
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ require_relative '../../helper'
2
+
3
+ Tk.init
4
+
5
+ describe Tk::Clipboard do
6
+ C = Tk::Clipboard
7
+
8
+ it 'should clear the clipboard' do
9
+ C.clear
10
+ lambda{ C.get }.should.raise.message.
11
+ should =~ /^CLIPBOARD selection doesn't exist or form "STRING" not defined/
12
+ end
13
+
14
+ it 'should append to the clipboard' do
15
+ C.append data: 'something'
16
+ C.get.should == 'something'
17
+ end
18
+ end
@@ -0,0 +1,67 @@
1
+ require_relative '../../helper'
2
+
3
+ Tk.init
4
+
5
+ describe Tk::Font do
6
+ it 'lists names of all named fonts' do
7
+ Tk::Font.names.sort.should == [
8
+ "TkCaptionFont", "TkDefaultFont", "TkFixedFont", "TkHeadingFont",
9
+ "TkIconFont", "TkMenuFont", "TkSmallCaptionFont", "TkTextFont",
10
+ "TkTooltipFont"
11
+ ]
12
+ end
13
+
14
+ it 'measures a character' do
15
+ Tk::Font.measure('TkDefaultFont', '0').should >= 4
16
+ end
17
+
18
+ it 'shows metrics of a font' do
19
+ Tk::Font.metrics('TkDefaultFont', :ascent).should == 12
20
+ Tk::Font.metrics('TkDefaultFont', :descent).should == 3
21
+ Tk::Font.metrics('TkDefaultFont', :linespace).should == 15
22
+ Tk::Font.metrics('TkDefaultFont', :fixed).should == 0
23
+ end
24
+
25
+ it 'lists all font families on the system' do
26
+ Tk::Font.families.size.should > 0
27
+ end
28
+
29
+ it 'creates a font' do
30
+ Tk::Font.create('Awesome Font').should == "Awesome Font"
31
+ Tk::Font.names.sort.should.include('Awesome Font')
32
+
33
+ lambda{
34
+ Tk::Font.create('Awesome Font')
35
+ }.should.raise.message =~ /^named font "Awesome Font" already exists/
36
+ end
37
+
38
+ it 'show configuration for our font' do
39
+ conf = Tk::Font.configure('Awesome Font')
40
+ conf[:family].should == ''
41
+ conf[:size].should == 0
42
+ conf[:weight].should == :normal
43
+ conf[:slant].should == :roman
44
+ conf[:underline].should == false
45
+ conf[:overstrike].should == false
46
+ end
47
+
48
+ it 'manipulates configuration of our font' do
49
+ Tk::Font.configure('Awesome Font', size: 10)
50
+ Tk::Font.configure('Awesome Font')[:size].should == 10
51
+ end
52
+
53
+ it 'shows actual information about the font' do
54
+ conf = Tk::Font.actual('Awesome Font')
55
+ conf[:family].should.not == ''
56
+ conf[:size].should == 10
57
+ conf[:weight].should == :normal
58
+ conf[:slant].should == :roman
59
+ conf[:underline].should == false
60
+ conf[:overstrike].should == false
61
+ end
62
+
63
+ it 'deletes the font' do
64
+ Tk::Font.delete('Awesome Font')
65
+ Tk::Font.names.should.not.include('Awesome Font')
66
+ end
67
+ end
@@ -0,0 +1,6 @@
1
+ require_relative '../../helper'
2
+
3
+ Tk.init
4
+
5
+ describe Tk::Grid do
6
+ end
@@ -0,0 +1,26 @@
1
+ require_relative '../../helper'
2
+
3
+ Tk.init
4
+
5
+ describe Tk::Image do
6
+ Image = Tk::Image
7
+
8
+ it 'creates photo image and return path' do
9
+ Image.names.size.should == 0
10
+ Image.create('photo').to_s.should == 'image1'
11
+ Image.create('photo').to_s.should == 'image2'
12
+ Image.names.should == ['image1', 'image2']
13
+
14
+ Image.delete('image1', 'image2')
15
+ Image.names.size.should == 0
16
+ end
17
+
18
+ it 'creates bitmap image and return path' do
19
+ Image.create('bitmap').to_s.should == 'image3'
20
+ Image.names.should == ['image3']
21
+ end
22
+
23
+ it 'raise RuntimeError if wrong type' do
24
+ lambda { Image.create('unkown-') }.should.raise RuntimeError
25
+ end
26
+ end
@@ -0,0 +1,20 @@
1
+ require_relative '../../helper'
2
+
3
+ Tk.init
4
+
5
+ describe Tk::Pack do
6
+ @button = Tk::Button.new('.')
7
+
8
+ it 'packs a widget' do
9
+ Tk::Pack.pack(@button)
10
+ Tk::Pack.info(@button).should == {
11
+ in: '.', anchor: 'center', expand: false, fill: :none, ipadx: 0, ipady: 0,
12
+ padx: 0, pady: 0, side: :top
13
+ }
14
+ end
15
+
16
+ it 'forgets the packing' do
17
+ Tk::Pack.forget(@button)
18
+ lambda{ Tk::Pack.info(@button) }.should.raise
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ require_relative '../../helper'
2
+
3
+ Tk.init
4
+
5
+ describe Tk::Place do
6
+ @button = Tk::Button.new('.')
7
+
8
+ it 'places a widget' do
9
+ Tk::Place.place(@button, y: 42, x: 24)
10
+ Tk::Place.info(@button).should == {
11
+ in: ".", x: 24, relx: 0.0, y: 42, rely: 0.0, width: 0, relwidth: 0.0,
12
+ height: 0, relheight: 0.0, anchor: "nw", bordermode: :inside
13
+ }
14
+ end
15
+
16
+ it 'forgets the placement' do
17
+ Tk::Place.forget(@button)
18
+ Tk::Place.info(@button).should == {}
19
+ end
20
+ end
@@ -0,0 +1,13 @@
1
+ require_relative '../../helper'
2
+
3
+ Tk.init
4
+
5
+ describe Tk::Selection do
6
+ @entry = Tk::Entry.new('.')
7
+ @entry.insert :end, 'abc def ghi jkl mno pqr stu vwx yz'
8
+ @entry.selection_range(0, 3)
9
+
10
+ it 'gets selection' do
11
+ Tk::Selection.get.should == 'abc'
12
+ end
13
+ end
@@ -0,0 +1,32 @@
1
+ require_relative '../../helper'
2
+
3
+ Tk.init
4
+
5
+ describe 'tkvars' do
6
+ it 'has a library set' do
7
+ library = Tk.library
8
+ library.class.should == String
9
+ library.should.not.be.empty
10
+ end
11
+
12
+ it 'has a patchlevel' do
13
+ Tk.patchlevel.should =~ /\A(\d+)\.(\d+)\.(\d+)\Z/
14
+ end
15
+
16
+ it 'has a version' do
17
+ Tk.version.should =~ /\A(\d+)\.(\d+)\Z/
18
+ end
19
+
20
+ it 'is not set to strict motif' do
21
+ Tk.strict_motif.should.be.false
22
+ end
23
+
24
+ it 'sets to strict motif' do
25
+ Tk.strict_motif = true
26
+ Tk.strict_motif.should.be.true
27
+ end
28
+
29
+ it 'does not have text_relayout set' do
30
+ lambda{ Tk.text_relayout }.should.raise(NameError)
31
+ end
32
+ end
@@ -0,0 +1,233 @@
1
+ require_relative '../../helper'
2
+
3
+ Tk.init
4
+
5
+ describe Tk::Winfo do
6
+ root = Tk.root
7
+ entry = Tk::Entry.new(root)
8
+
9
+ it 'gives info about an atom' do
10
+ root.winfo_atom('STRING').should == 31
11
+ end
12
+
13
+ it 'gives name of an atom' do
14
+ root.winfo_atomname(31).should == 'STRING'
15
+ end
16
+
17
+ it 'gives info about cells' do
18
+ root.winfo_cells.should >= 2
19
+ root.winfo_cells.should.be.even?
20
+ end
21
+
22
+ it 'gives info about children' do
23
+ root.winfo_children.should.include?(entry.tk_pathname)
24
+ entry.winfo_children.should.be.empty
25
+ end
26
+
27
+ it 'gives class name of window' do
28
+ root.winfo_class.should == 'Tk'
29
+ entry.winfo_class.should == 'Entry'
30
+ end
31
+
32
+ it 'tell us whether colormap is full' do
33
+ root.winfo_colormapfull.should == false
34
+ end
35
+
36
+ should 'not contain any coordinates yet' do
37
+ root.winfo_containing(0, 0).should == nil
38
+ end
39
+
40
+ it 'tells us the depth of the window' do
41
+ root.winfo_depth.should >= 8
42
+ root.winfo_depth.should.even?
43
+ end
44
+
45
+ it 'tells us whether the window exists' do
46
+ root.winfo_exists.should == true
47
+ end
48
+
49
+ it 'gives us the amount of pixels for a given distance' do
50
+ @fpixels = root.winfo_fpixels('1c')
51
+ @fpixels.class.should == Float
52
+ @fpixels.should > 0
53
+ end
54
+
55
+ it 'knows distance in pixels' do
56
+ root.winfo_pixels('1c').should == @fpixels.round
57
+ end
58
+
59
+ it 'gives us the window geometry' do
60
+ @geometry = root.winfo_geometry
61
+ @geometry.width.should == 1
62
+ @geometry.height.should == 1
63
+ @geometry.x.should == 0
64
+ @geometry.y.should == 0
65
+ end
66
+
67
+ it 'gives us the window height' do
68
+ root.winfo_height.should == @geometry.height
69
+ end
70
+
71
+ it 'gives us the window id' do
72
+ root.winfo_id.should.not.be.empty?
73
+ end
74
+
75
+ it 'lists interps' do
76
+ root.winfo_interps.should.include?('tk')
77
+ end
78
+
79
+ it "knows whether it's mapped" do
80
+ root.winfo_ismapped.should == false
81
+ end
82
+
83
+ it 'knows the manager' do
84
+ root.winfo_manager.should == 'wm'
85
+ end
86
+
87
+ it "knows its name" do
88
+ root.winfo_name.should =~ /^tk/
89
+ end
90
+
91
+ it 'knows its parent' do
92
+ root.winfo_parent.should == nil
93
+ entry.winfo_parent.should == root.tk_pathname
94
+ end
95
+
96
+ it 'knows pathname of given id' do
97
+ root.winfo_pathname(entry.winfo_id).should == entry.tk_pathname
98
+ end
99
+
100
+ it 'knows location of pointer x coordinate' do
101
+ root.winfo_pointerx.class.should == Fixnum
102
+ end
103
+
104
+ it 'knows location of pointer y coordinate' do
105
+ root.winfo_pointery.class.should == Fixnum
106
+ end
107
+
108
+ # NOTE: hold still while the specs are running ;)
109
+ it 'lists location of pointer x/y coordinates' do
110
+ root.winfo_pointerxy.should == [root.winfo_pointerx, root.winfo_pointery]
111
+ end
112
+
113
+ it 'shows requested height of window' do
114
+ root.winfo_reqheight.should == 200
115
+ end
116
+
117
+ it 'shows requested width of window' do
118
+ root.winfo_reqwidth.should == 200
119
+ end
120
+
121
+ it 'gives r,g,b values of a color' do
122
+ root.winfo_rgb('red').should == [65535, 0, 0]
123
+ root.winfo_rgb('green').should == [0, 65535, 0]
124
+ root.winfo_rgb('blue').should == [0, 0, 65535]
125
+ end
126
+
127
+ it 'knows x coordinate of root window' do
128
+ entry.winfo_rootx.should == 0
129
+ end
130
+
131
+ it 'knows y coordinate of root window' do
132
+ entry.winfo_rooty.should == 0
133
+ end
134
+
135
+ it 'knows which screen it is on' do
136
+ root.winfo_screen.should.match(/\:(.+)\.\d/) # :0.0
137
+ end
138
+
139
+ it 'knows the number of cells in the default color map' do
140
+ root.winfo_screencells.should >= 2
141
+ root.winfo_screencells.should.be.even?
142
+ end
143
+
144
+ it 'knows the depth of the screen' do
145
+ root.winfo_screendepth.should >= 2
146
+ root.winfo_screendepth.should.be.even?
147
+ end
148
+
149
+ it 'knows the height of the screen' do
150
+ root.winfo_screenheight.should >= 200
151
+ root.winfo_screenheight.should.be.even?
152
+ end
153
+
154
+ it 'knows the width of the screen' do
155
+ root.winfo_screenwidth.should >= 320
156
+ root.winfo_screenwidth.should.be.even?
157
+ end
158
+
159
+ it 'knows the height of the screen in millimeter' do
160
+ root.winfo_screenmmheight.should >= 2
161
+ end
162
+
163
+ it 'knows the width of the screen in millimeter' do
164
+ root.winfo_screenmmwidth.should >= 2
165
+ end
166
+
167
+ it 'shows the default visual class for the screen' do
168
+ root.winfo_screenvisual.should == :truecolor
169
+ end
170
+
171
+ it 'knows its server' do
172
+ root.winfo_server.should.not.be.empty?
173
+ end
174
+
175
+ it 'knows its toplevel window' do
176
+ root.winfo_toplevel.should == '.'
177
+ entry.winfo_toplevel.should == '.'
178
+ end
179
+
180
+ it "knows whether it's viwable" do
181
+ root.winfo_viewable.should == false
182
+ end
183
+
184
+ it 'knows the visual class of the window' do
185
+ root.winfo_visual.should == :truecolor
186
+ end
187
+
188
+ it 'knows the visualid of the window' do
189
+ root.winfo_visualid.should.not.be.empty
190
+ end
191
+
192
+ it 'knows some stuff about visualavailable' do
193
+ root.winfo_visualsavailable.should.not.be.empty
194
+ root.winfo_visualsavailable(:directcolor).should.not.be.empty
195
+ end
196
+
197
+
198
+ it 'knows the height of the virtual root window' do
199
+ root.winfo_vrootheight.should >= 200
200
+ end
201
+
202
+ it 'knows the width of the virtual root window' do
203
+ root.winfo_vrootwidth.should >= 320
204
+ end
205
+
206
+ it 'knows the x coordinate of the virtual root window' do
207
+ root.winfo_vrootx.should == 0
208
+ end
209
+
210
+ it 'knows the y coordinate of the virtual root window' do
211
+ root.winfo_vrooty.should == 0
212
+ end
213
+
214
+ it 'knows the height of the window' do
215
+ root.winfo_width.should == 1
216
+ end
217
+
218
+ it 'knows the x coordinate of the window' do
219
+ root.winfo_x.should == 0
220
+ end
221
+
222
+ it 'knows the y coordinate of the window' do
223
+ root.winfo_y.should == 0
224
+ end
225
+
226
+ # TODO check real screen values? (xrandr only)
227
+ # For now it checks for a minimum of 320 x 200
228
+ #
229
+ # matcher = /Screen (.+?)\: (.+), current (.+) x (.+), /
230
+ # %x{xrandr -q}.scan(matcher).collect{|i|
231
+ # {name: i[0], width: i[2].to_i, height: i[3].to_i}
232
+ # }.first
233
+ end