vtk-ruby 5.0.4.0-x86-mswin32-60

Sign up to get free protection for your applications and to get access to all the features.
Files changed (200) hide show
  1. data/lib/VTK/common.rb +7 -0
  2. data/lib/VTK/common.rb.rule +1 -0
  3. data/lib/VTK/filtering.rb +7 -0
  4. data/lib/VTK/filtering.rb.rule +1 -0
  5. data/lib/VTK/genericfiltering.rb +7 -0
  6. data/lib/VTK/genericfiltering.rb.rule +1 -0
  7. data/lib/VTK/graphics.rb +7 -0
  8. data/lib/VTK/graphics.rb.rule +1 -0
  9. data/lib/VTK/gtk.rb +5 -0
  10. data/lib/VTK/gtk.rb.rule +1 -0
  11. data/lib/VTK/gtk/GtkGLExtVTKRenderWindow.rb +635 -0
  12. data/lib/VTK/gtk/GtkGLExtVTKRenderWindow.rb.rule +1 -0
  13. data/lib/VTK/gtk/GtkGLExtVTKRenderWindowInteractor.rb +355 -0
  14. data/lib/VTK/gtk/GtkGLExtVTKRenderWindowInteractor.rb.rule +1 -0
  15. data/lib/VTK/gtk/GtkVTKRenderWindow.rb +615 -0
  16. data/lib/VTK/gtk/GtkVTKRenderWindow.rb.rule +1 -0
  17. data/lib/VTK/gtk/GtkVTKRenderWindowInteractor.rb +336 -0
  18. data/lib/VTK/gtk/GtkVTKRenderWindowInteractor.rb.rule +1 -0
  19. data/lib/VTK/hybrid.rb +7 -0
  20. data/lib/VTK/hybrid.rb.rule +1 -0
  21. data/lib/VTK/imaging.rb +7 -0
  22. data/lib/VTK/imaging.rb.rule +1 -0
  23. data/lib/VTK/io.rb +7 -0
  24. data/lib/VTK/io.rb.rule +1 -0
  25. data/lib/VTK/parallel.rb +7 -0
  26. data/lib/VTK/parallel.rb.rule +1 -0
  27. data/lib/VTK/rendering.rb +7 -0
  28. data/lib/VTK/rendering.rb.rule +1 -0
  29. data/lib/VTK/tk.rb +4 -0
  30. data/lib/VTK/tk.rb.rule +1 -0
  31. data/lib/VTK/tk/vtkLoadRubyTkWidgets.rb +54 -0
  32. data/lib/VTK/tk/vtkLoadRubyTkWidgets.rb.rule +1 -0
  33. data/lib/VTK/tk/vtkTkImageViewerWidget.rb +377 -0
  34. data/lib/VTK/tk/vtkTkImageViewerWidget.rb.rule +1 -0
  35. data/lib/VTK/tk/vtkTkPhotoImage.rb +28 -0
  36. data/lib/VTK/tk/vtkTkPhotoImage.rb.rule +1 -0
  37. data/lib/VTK/tk/vtkTkRenderWidget.rb +486 -0
  38. data/lib/VTK/tk/vtkTkRenderWidget.rb.rule +1 -0
  39. data/lib/VTK/tk/vtkTkRenderWindowInteractor.rb +394 -0
  40. data/lib/VTK/tk/vtkTkRenderWindowInteractor.rb.rule +1 -0
  41. data/lib/VTK/util.rb +6 -0
  42. data/lib/VTK/util.rb.rule +1 -0
  43. data/lib/VTK/util/colors.rb +223 -0
  44. data/lib/VTK/util/colors.rb.rule +1 -0
  45. data/lib/VTK/util/misc.rb +68 -0
  46. data/lib/VTK/util/misc.rb.rule +1 -0
  47. data/lib/VTK/util/vtkConstants.rb +123 -0
  48. data/lib/VTK/util/vtkConstants.rb.rule +1 -0
  49. data/lib/VTK/util/vtkImageExportToArray.rb +96 -0
  50. data/lib/VTK/util/vtkImageExportToArray.rb.rule +1 -0
  51. data/lib/VTK/util/vtkImageImportFromArray.rb +116 -0
  52. data/lib/VTK/util/vtkImageImportFromArray.rb.rule +1 -0
  53. data/lib/VTK/volumerendering.rb +7 -0
  54. data/lib/VTK/volumerendering.rb.rule +1 -0
  55. data/lib/VTK/vtkCommon.dll +0 -0
  56. data/lib/VTK/vtkCommon.exp +0 -0
  57. data/lib/VTK/vtkCommon.lib +0 -0
  58. data/lib/VTK/vtkCommonRuby.dll +0 -0
  59. data/lib/VTK/vtkCommonRuby.exp +0 -0
  60. data/lib/VTK/vtkCommonRuby.lib +0 -0
  61. data/lib/VTK/vtkCommonRubyD.dll +0 -0
  62. data/lib/VTK/vtkCommonRubyD.exp +0 -0
  63. data/lib/VTK/vtkCommonRubyD.lib +0 -0
  64. data/lib/VTK/vtkDICOMParser.dll +0 -0
  65. data/lib/VTK/vtkDICOMParser.exp +0 -0
  66. data/lib/VTK/vtkDICOMParser.lib +0 -0
  67. data/lib/VTK/vtkFiltering.dll +0 -0
  68. data/lib/VTK/vtkFiltering.exp +0 -0
  69. data/lib/VTK/vtkFiltering.lib +0 -0
  70. data/lib/VTK/vtkFilteringRuby.dll +0 -0
  71. data/lib/VTK/vtkFilteringRuby.exp +0 -0
  72. data/lib/VTK/vtkFilteringRuby.lib +0 -0
  73. data/lib/VTK/vtkFilteringRubyD.dll +0 -0
  74. data/lib/VTK/vtkFilteringRubyD.exp +0 -0
  75. data/lib/VTK/vtkFilteringRubyD.lib +0 -0
  76. data/lib/VTK/vtkGenericFiltering.dll +0 -0
  77. data/lib/VTK/vtkGenericFiltering.exp +0 -0
  78. data/lib/VTK/vtkGenericFiltering.lib +0 -0
  79. data/lib/VTK/vtkGenericFilteringRuby.dll +0 -0
  80. data/lib/VTK/vtkGenericFilteringRuby.exp +0 -0
  81. data/lib/VTK/vtkGenericFilteringRuby.lib +0 -0
  82. data/lib/VTK/vtkGenericFilteringRubyD.dll +0 -0
  83. data/lib/VTK/vtkGenericFilteringRubyD.exp +0 -0
  84. data/lib/VTK/vtkGenericFilteringRubyD.lib +0 -0
  85. data/lib/VTK/vtkGraphics.dll +0 -0
  86. data/lib/VTK/vtkGraphics.exp +0 -0
  87. data/lib/VTK/vtkGraphics.lib +0 -0
  88. data/lib/VTK/vtkGraphicsRuby.dll +0 -0
  89. data/lib/VTK/vtkGraphicsRuby.exp +0 -0
  90. data/lib/VTK/vtkGraphicsRuby.lib +0 -0
  91. data/lib/VTK/vtkGraphicsRubyD.dll +0 -0
  92. data/lib/VTK/vtkGraphicsRubyD.exp +0 -0
  93. data/lib/VTK/vtkGraphicsRubyD.lib +0 -0
  94. data/lib/VTK/vtkHybrid.dll +0 -0
  95. data/lib/VTK/vtkHybrid.exp +0 -0
  96. data/lib/VTK/vtkHybrid.lib +0 -0
  97. data/lib/VTK/vtkHybridRuby.dll +0 -0
  98. data/lib/VTK/vtkHybridRuby.exp +0 -0
  99. data/lib/VTK/vtkHybridRuby.lib +0 -0
  100. data/lib/VTK/vtkHybridRubyD.dll +0 -0
  101. data/lib/VTK/vtkHybridRubyD.exp +0 -0
  102. data/lib/VTK/vtkHybridRubyD.lib +0 -0
  103. data/lib/VTK/vtkIO.dll +0 -0
  104. data/lib/VTK/vtkIO.exp +0 -0
  105. data/lib/VTK/vtkIO.lib +0 -0
  106. data/lib/VTK/vtkIORuby.dll +0 -0
  107. data/lib/VTK/vtkIORuby.exp +0 -0
  108. data/lib/VTK/vtkIORuby.lib +0 -0
  109. data/lib/VTK/vtkIORubyD.dll +0 -0
  110. data/lib/VTK/vtkIORubyD.exp +0 -0
  111. data/lib/VTK/vtkIORubyD.lib +0 -0
  112. data/lib/VTK/vtkImaging.dll +0 -0
  113. data/lib/VTK/vtkImaging.exp +0 -0
  114. data/lib/VTK/vtkImaging.lib +0 -0
  115. data/lib/VTK/vtkImagingRuby.dll +0 -0
  116. data/lib/VTK/vtkImagingRuby.exp +0 -0
  117. data/lib/VTK/vtkImagingRuby.lib +0 -0
  118. data/lib/VTK/vtkImagingRubyD.dll +0 -0
  119. data/lib/VTK/vtkImagingRubyD.exp +0 -0
  120. data/lib/VTK/vtkImagingRubyD.lib +0 -0
  121. data/lib/VTK/vtkNetCDF.dll +0 -0
  122. data/lib/VTK/vtkNetCDF.exp +0 -0
  123. data/lib/VTK/vtkNetCDF.lib +0 -0
  124. data/lib/VTK/vtkParallel.dll +0 -0
  125. data/lib/VTK/vtkParallel.exp +0 -0
  126. data/lib/VTK/vtkParallel.lib +0 -0
  127. data/lib/VTK/vtkParallelRuby.dll +0 -0
  128. data/lib/VTK/vtkParallelRuby.exp +0 -0
  129. data/lib/VTK/vtkParallelRuby.lib +0 -0
  130. data/lib/VTK/vtkParallelRubyD.dll +0 -0
  131. data/lib/VTK/vtkParallelRubyD.exp +0 -0
  132. data/lib/VTK/vtkParallelRubyD.lib +0 -0
  133. data/lib/VTK/vtkParseOGLExt.exe +0 -0
  134. data/lib/VTK/vtkRendering.dll +0 -0
  135. data/lib/VTK/vtkRendering.exp +0 -0
  136. data/lib/VTK/vtkRendering.lib +0 -0
  137. data/lib/VTK/vtkRenderingRuby.dll +0 -0
  138. data/lib/VTK/vtkRenderingRuby.exp +0 -0
  139. data/lib/VTK/vtkRenderingRuby.lib +0 -0
  140. data/lib/VTK/vtkRenderingRubyD.dll +0 -0
  141. data/lib/VTK/vtkRenderingRubyD.exp +0 -0
  142. data/lib/VTK/vtkRenderingRubyD.lib +0 -0
  143. data/lib/VTK/vtkVREncodeString.exe +0 -0
  144. data/lib/VTK/vtkVolumeRendering.dll +0 -0
  145. data/lib/VTK/vtkVolumeRendering.exp +0 -0
  146. data/lib/VTK/vtkVolumeRendering.lib +0 -0
  147. data/lib/VTK/vtkVolumeRenderingRuby.dll +0 -0
  148. data/lib/VTK/vtkVolumeRenderingRuby.exp +0 -0
  149. data/lib/VTK/vtkVolumeRenderingRuby.lib +0 -0
  150. data/lib/VTK/vtkVolumeRenderingRubyD.dll +0 -0
  151. data/lib/VTK/vtkVolumeRenderingRubyD.exp +0 -0
  152. data/lib/VTK/vtkVolumeRenderingRubyD.lib +0 -0
  153. data/lib/VTK/vtkWidgets.dll +0 -0
  154. data/lib/VTK/vtkWidgets.exp +0 -0
  155. data/lib/VTK/vtkWidgets.lib +0 -0
  156. data/lib/VTK/vtkWidgetsRuby.dll +0 -0
  157. data/lib/VTK/vtkWidgetsRuby.exp +0 -0
  158. data/lib/VTK/vtkWidgetsRuby.lib +0 -0
  159. data/lib/VTK/vtkWidgetsRubyD.dll +0 -0
  160. data/lib/VTK/vtkWidgetsRubyD.exp +0 -0
  161. data/lib/VTK/vtkWidgetsRubyD.lib +0 -0
  162. data/lib/VTK/vtkWrapRuby.exe +0 -0
  163. data/lib/VTK/vtkWrapRubyInit.exe +0 -0
  164. data/lib/VTK/vtk_dummy.rb +3 -0
  165. data/lib/VTK/vtkexoIIc.dll +0 -0
  166. data/lib/VTK/vtkexoIIc.exp +0 -0
  167. data/lib/VTK/vtkexoIIc.lib +0 -0
  168. data/lib/VTK/vtkexpat.dll +0 -0
  169. data/lib/VTK/vtkexpat.exp +0 -0
  170. data/lib/VTK/vtkexpat.lib +0 -0
  171. data/lib/VTK/vtkfreetype.dll +0 -0
  172. data/lib/VTK/vtkfreetype.exp +0 -0
  173. data/lib/VTK/vtkfreetype.lib +0 -0
  174. data/lib/VTK/vtkftgl.dll +0 -0
  175. data/lib/VTK/vtkftgl.exp +0 -0
  176. data/lib/VTK/vtkftgl.lib +0 -0
  177. data/lib/VTK/vtkjpeg.dll +0 -0
  178. data/lib/VTK/vtkjpeg.exp +0 -0
  179. data/lib/VTK/vtkjpeg.lib +0 -0
  180. data/lib/VTK/vtkpng.dll +0 -0
  181. data/lib/VTK/vtkpng.exp +0 -0
  182. data/lib/VTK/vtkpng.lib +0 -0
  183. data/lib/VTK/vtkruby.exe +0 -0
  184. data/lib/VTK/vtksys.dll +0 -0
  185. data/lib/VTK/vtksys.exp +0 -0
  186. data/lib/VTK/vtksys.lib +0 -0
  187. data/lib/VTK/vtksysEncodeExecutable.exe +0 -0
  188. data/lib/VTK/vtksysProcessFwd9x.exe +0 -0
  189. data/lib/VTK/vtktiff.dll +0 -0
  190. data/lib/VTK/vtktiff.exp +0 -0
  191. data/lib/VTK/vtktiff.lib +0 -0
  192. data/lib/VTK/vtkzlib.dll +0 -0
  193. data/lib/VTK/vtkzlib.exp +0 -0
  194. data/lib/VTK/vtkzlib.lib +0 -0
  195. data/lib/VTK/widgets.rb +7 -0
  196. data/lib/VTK/widgets.rb.rule +1 -0
  197. data/lib/setup.rb +104 -0
  198. data/lib/vtk.rb +35 -0
  199. data/lib/vtk_dummy.rb +3 -0
  200. metadata +256 -0
@@ -0,0 +1 @@
1
+ # generated from CMake
@@ -0,0 +1,355 @@
1
+ =begin
2
+ Description:
3
+
4
+ Provides a Gtk vtkRenderWindowInteractor widget. This embeds a
5
+ vtkRenderWindow inside a GTK widget && uses the
6
+ vtkGenericRenderWindowInteractor for the event handling. This is
7
+ vtkGenericRenderWindowInteractor end
8
+ similar to GtkVTKRenderWindowInteractor.rb.
9
+
10
+ The extensions here allow the use of gtkglext rather than gtkgl &&
11
+ ruby-gtk2 rather than ruby-gtk. It requires ruby-gtk2.0.0 || later.
12
+
13
+ There is a working example at the bottom.
14
+
15
+ Credits:
16
+
17
+ License:
18
+
19
+ VTK license.
20
+
21
+ =end
22
+
23
+ require 'rbconfig'
24
+ require 'gtk2'
25
+ require 'gtkglext'
26
+ require 'vtk'
27
+
28
+ class GtkGLExtVTKRenderWindowInteractor < Gtk::DrawingArea
29
+ =begin
30
+ Embeds a vtkRenderWindow into a pyGTK widget && uses
31
+ vtkGenericRenderWindowInteractor for the event handling. This
32
+ class embeds the RenderWindow correctly. A __getattr__ hook is
33
+ provided that makes the class behave like a
34
+ vtkGenericRenderWindowInteractor.
35
+ =end
36
+ def initialize
37
+ super
38
+
39
+ glconfig = Gdk::GLConfig.new(Gdk::GLConfig::MODE_RGB|
40
+ Gdk::GLConfig::MODE_DEPTH)
41
+
42
+ set_gl_capability(glconfig)
43
+
44
+ @RenderWindow = Vtk::RenderWindow.new
45
+
46
+ # private attributes
47
+ @Created = false
48
+ @ActiveButton = nil
49
+
50
+ @Iren = Vtk::GenericRenderWindowInteractor.new
51
+ @Iren.SetRenderWindow(@RenderWindow)
52
+ @Iren.GetInteractorStyle.SetCurrentStyleToTrackballCamera
53
+
54
+ createTimer = Proc.new{|obj, event|
55
+ gtk.timeout_add(10, Proc.new{ @Iren.TimerEvent })
56
+ }
57
+
58
+ destroyTimer = Proc.new{|obj, event|
59
+ =begin
60
+ The timer is a one shot timer so will expire automatically.
61
+ =end
62
+ return 1
63
+ }
64
+
65
+ @Iren.AddObserver('CreateTimerEvent', createTimer)
66
+ @Iren.AddObserver('DestroyTimerEvent', destroyTimer)
67
+ self.ConnectSignals
68
+
69
+ # need this to be able to handle key_press events.
70
+ self.set_flags(Gtk::Window::CAN_FOCUS)
71
+ end
72
+
73
+ def set_size_request(w, h)
74
+ super(w,h)
75
+ @RenderWindow.SetSize(w, h)
76
+ @Iren.SetSize(w, h)
77
+ @Iren.ConfigureEvent
78
+ end
79
+
80
+ def ConnectSignals
81
+ self.signal_connect("realize"){|wid,event| OnRealize(wid,event) }
82
+ self.signal_connect("expose_event"){|wid,event| OnExpose(wid,event) }
83
+ self.signal_connect("configure_event"){|wid,event| OnConfigure(wid,event) }
84
+ self.signal_connect("button_press_event"){|wid,event| OnButtonDown(wid,event) }
85
+ self.signal_connect("button_release_event"){|wid,event| OnButtonUp(wid,event) }
86
+ self.signal_connect("motion_notify_event"){|wid,event| OnMouseMove(wid,event) }
87
+ self.signal_connect("enter_notify_event"){|wid,event| OnEnter(wid,event) }
88
+ self.signal_connect("leave_notify_event"){|wid,event| OnLeave(wid,event) }
89
+ self.signal_connect("key_press_event"){|wid,event| OnKeyPress(wid,event) }
90
+ self.signal_connect("delete_event"){|wid,event| OnDestroy(wid,event) }
91
+ self.add_events(Gdk::Event::EXPOSURE_MASK |
92
+ Gdk::Event::BUTTON_PRESS_MASK |
93
+ Gdk::Event::BUTTON_RELEASE_MASK |
94
+ Gdk::Event::KEY_PRESS_MASK |
95
+ Gdk::Event::POINTER_MOTION_MASK |
96
+ Gdk::Event::POINTER_MOTION_HINT_MASK |
97
+ Gdk::Event::ENTER_NOTIFY_MASK |
98
+ Gdk::Event::LEAVE_NOTIFY_MASK)
99
+ end
100
+
101
+ def GetRenderWindow
102
+ return @RenderWindow
103
+ end
104
+
105
+ def Render
106
+ if @Created
107
+ @RenderWindow.Render
108
+ end
109
+ end
110
+
111
+ def OnRealize(wid, event)
112
+ unless @Created
113
+ # you can't get the xid without the window being realized.
114
+ self.realize
115
+ if Config::CONFIG["host_os"] =~ /win32/
116
+ win_id = self.window.handle.to_s
117
+ else
118
+ win_id =self.window.xid.to_s
119
+ end
120
+
121
+ @RenderWindow.SetWindowInfo(win_id)
122
+ # @Iren.Initialize
123
+ @Created = true
124
+ end
125
+ return true
126
+ end
127
+
128
+ def OnConfigure(widget, event)
129
+ # self.widget=widget
130
+ @Iren.SetSize(event.width, event.height)
131
+ @Iren.ConfigureEvent
132
+ self.Render
133
+ return true
134
+ end
135
+
136
+ def OnExpose(wid, event)
137
+ self.Render
138
+ return true
139
+ end
140
+
141
+ def OnDestroy(wid, event=nil)
142
+ self.hide
143
+ @RenderWindow = nil
144
+ self.destroy
145
+ return true
146
+ end
147
+
148
+ private
149
+ def _GetCtrlShift(event)
150
+ ctrl, shift = 0, 0
151
+ if ((event.state & Gdk::Window::ModifierType::CONTROL_MASK) == Gdk::Window::ModifierType::CONTROL_MASK)
152
+ ctrl = 1
153
+ end
154
+ if ((event.state & Gdk::Window::ModifierType::SHIFT_MASK) == Gdk::Window::ModifierType::SHIFT_MASK)
155
+ shift = 1
156
+ end
157
+ return ctrl, shift
158
+ end
159
+
160
+
161
+ public
162
+ def OnButtonDown(wid, event)
163
+ =begin
164
+ Mouse button pressed.
165
+ =end
166
+ m = self.pointer
167
+ ctrl, shift = _GetCtrlShift(event)
168
+ @Iren.SetEventInformationFlipY(m[0], m[1], ctrl, shift, 0.chr, 0, nil)
169
+ button = event.button
170
+ if button == 3
171
+ @Iren.RightButtonPressEvent
172
+ return true
173
+ elsif button == 1
174
+ @Iren.LeftButtonPressEvent
175
+ return true
176
+ elsif button == 2
177
+ @Iren.MiddleButtonPressEvent
178
+ return true
179
+ else
180
+ return ralse
181
+ end
182
+ end
183
+
184
+ def OnButtonUp(wid, event)
185
+ =begin
186
+ Mouse button released.
187
+ =end
188
+ m = self.pointer
189
+ ctrl, shift = _GetCtrlShift(event)
190
+ @Iren.SetEventInformationFlipY(m[0], m[1], ctrl, shift, 0.chr, 0, nil)
191
+ button = event.button
192
+ if button == 3
193
+ @Iren.RightButtonReleaseEvent
194
+ return true
195
+ elsif button == 1
196
+ @Iren.LeftButtonReleaseEvent
197
+ return true
198
+ elsif button == 2
199
+ @Iren.MiddleButtonReleaseEvent
200
+ return true
201
+ end
202
+
203
+ return false
204
+ end
205
+
206
+ def OnMouseMove(wid, event)
207
+ =begin
208
+ Mouse has moved.
209
+ =end
210
+ m = self.pointer
211
+ ctrl, shift = _GetCtrlShift(event)
212
+ @Iren.SetEventInformationFlipY(m[0], m[1], ctrl, shift, 0.chr, 0, nil)
213
+ @Iren.MouseMoveEvent
214
+ return true
215
+ end
216
+
217
+ def OnEnter(wid, event)
218
+ =begin
219
+ Entering the vtkRenderWindow.
220
+ =end
221
+ self.grab_focus
222
+ m = self.pointer
223
+ ctrl, shift = _GetCtrlShift(event)
224
+ @Iren.SetEventInformationFlipY(m[0], m[1], ctrl, shift, 0.chr, 0, nil)
225
+ @Iren.EnterEvent
226
+ return true
227
+ end
228
+
229
+ def OnLeave(wid, event)
230
+ =begin
231
+ Leaving the vtkRenderWindow.
232
+ =end
233
+ m = self.pointer
234
+ ctrl, shift = _GetCtrlShift(event)
235
+ @Iren.SetEventInformationFlipY(m[0], m[1], ctrl, shift, 0.chr, 0, nil)
236
+ @Iren.LeaveEvent
237
+ return true
238
+ end
239
+
240
+ def OnKeyPress(wid, event)
241
+ =begin
242
+ Key pressed.
243
+ =end
244
+ m = self.pointer
245
+ ctrl, shift = _GetCtrlShift(event)
246
+ # keycode, keysym = event.keyval, event.string
247
+ keycode, keysym = event.keyval, nil
248
+ key = 0.chr
249
+ if keycode < 256
250
+ key = keycode.chr
251
+ end
252
+ @Iren.SetEventInformationFlipY(m[0], m[1], ctrl, shift, key, 0, keysym)
253
+ @Iren.KeyPressEvent
254
+ @Iren.CharEvent
255
+ return true
256
+ end
257
+
258
+ def OnKeyRelease(wid, event)
259
+ =begin
260
+ Key released.
261
+ =end
262
+ m = self.pointer
263
+ ctrl, shift = _GetCtrlShift(event)
264
+ # keycode, keysym = event.keyval, event.string
265
+ keycode, keysym = event.keyval, nil
266
+ key = 0.chr
267
+ if keycode < 256
268
+ key = keycode.chr
269
+ end
270
+ @Iren.SetEventInformationFlipY(m[0], m[1], ctrl, shift, key, 0, keysym)
271
+ @Iren.KeyReleaseEvent
272
+ return true
273
+ end
274
+
275
+ def Initialize
276
+ if @Created
277
+ @Iren.Initialize
278
+ end
279
+ end
280
+
281
+ def Start
282
+ if @Created
283
+ @Iren.Start
284
+ end
285
+ end
286
+
287
+ def SetPicker(picker)
288
+ @Iren.SetPicker(picker)
289
+ end
290
+
291
+ def GetPicker(picker)
292
+ return @Iren.GetPicker
293
+ end
294
+
295
+ end
296
+
297
+ def main
298
+
299
+ Gtk.init
300
+ Gtk::GL.init
301
+
302
+ # The main window
303
+ window = Gtk::Window.new(Gtk::Window::TOPLEVEL)
304
+ window.set_title("A GtkVTKRenderWindow Demo!")
305
+ window.signal_connect("destroy"){ gtk.main_quit }
306
+ window.signal_connect("delete_event"){ gtk.main_quit }
307
+ window.set_border_width(10)
308
+
309
+ # A VBox into which widgets are packed.
310
+ vbox = Gtk::VBox.new(false, 3)
311
+ window.add(vbox)
312
+ vbox.show
313
+
314
+ # The GtkVTKRenderWindow
315
+ gvtk = GtkGLExtVTKRenderWindowInteractor.new
316
+ #gvtk.SetDesiredUpdateRate(1000)
317
+ gvtk.set_size_request(400, 400)
318
+ vbox.pack_start(gvtk)
319
+ gvtk.show
320
+ gvtk.Initialize
321
+ gvtk.Start
322
+ # prevents 'q' from exiting the app.
323
+ exit = Proc.new{|obj, event, x|
324
+ x
325
+ }
326
+ # gvtk.AddObserver("ExitEvent", exit)
327
+
328
+ # The VTK stuff.
329
+ cone = Vtk::ConeSource.new
330
+ cone.SetResolution(80)
331
+ coneMapper = Vtk::PolyDataMapper.new
332
+ coneMapper.SetInput(cone.GetOutput)
333
+ #coneActor = Vtk::LODActor.new
334
+ coneActor = Vtk::Actor.new
335
+ coneActor.SetMapper(coneMapper)
336
+ coneActor.GetProperty.SetColor(0.5, 0.5, 1.0)
337
+ ren = Vtk::Renderer.new
338
+ gvtk.GetRenderWindow.AddRenderer(ren)
339
+ ren.AddActor(coneActor)
340
+
341
+ # A simple quit button
342
+ quit = Gtk::Button.new("Quit!")
343
+ quit.signal_connect("clicked"){ Gtk.main_quit }
344
+ vbox.pack_start(quit)
345
+ quit.show
346
+
347
+ # show the main window && start event processing.
348
+ window.show
349
+ Gtk.main
350
+ end
351
+
352
+
353
+ if $0 == __FILE__
354
+ main
355
+ end
@@ -0,0 +1 @@
1
+ # generated from CMake
@@ -0,0 +1,615 @@
1
+ =begin
2
+ Description:
3
+
4
+ Provides a simple VTK widget for Gtk. This embeds a
5
+ vtkRenderWindow inside a GTK widget. This is based on
6
+ vtkTkRenderWidget.rb. The GtkVTKRenderWindowBase class provides the
7
+ abstraction necessary for someone to use their own interaction
8
+ behaviour. The method names are similar to those in
9
+ vtkInteractorStyle.h.
10
+
11
+ The class uses the gtkgl.GtkGLArea widget (gtkglarea). This avoids
12
+ a lot of problems with flicker.
13
+
14
+ There is a working example at the bottom.
15
+
16
+ Credits:
17
+
18
+
19
+ Bugs:
20
+
21
+ (*) There is a focus related problem. Tkinter has a focus object
22
+ that handles focus events. I dont know of an equivalent object
23
+ under GTK. So, when an 'enter_notify_event' is received on the
24
+ GtkVTKRenderWindow I grab the focus but I dont know what to do when
25
+ I get a 'leave_notify_event'.
26
+
27
+ (*) Will !work under Win32 because it uses the XID of a window in
28
+ OnRealize. Suggestions to fix this will be appreciated.
29
+
30
+ =end
31
+
32
+ require 'gtk2'
33
+ require 'gtkglext'
34
+ require 'vtk'
35
+
36
+
37
+ class GtkVTKRenderWindowBase < Gtk::GL::Area
38
+
39
+ =begin
40
+ A base class that enables one to embed a vtkRenderWindow into
41
+ a pyGTK widget. This class embeds the RenderWindow correctly.
42
+ Provided are some empty methods that can be overloaded to provide
43
+ a user defined interaction behaviour. The event handling
44
+ functions have names that are somewhat similar to the ones in the
45
+ vtkInteractorStyle class included with VTK.
46
+ =end
47
+
48
+ def initialize
49
+ super
50
+
51
+ glconfig = Gdk::GLConfig.new(Gdk::GLConfig::MODE_RGB|
52
+ Gdk::GLConfig::MODE_DOUBLE)
53
+
54
+ set_gl_capability(glconfig)
55
+
56
+
57
+ @RenderWindow = Vtk::RenderWindow.new
58
+
59
+ # private attributes
60
+ @Created = false
61
+
62
+ # used by the LOD actors
63
+ @DesiredUpdateRate = 15
64
+ @StillUpdateRate = 0.0001
65
+
66
+ self.ConnectSignals
67
+
68
+ # need this to be able to handle key_press events.
69
+ self.set_flags(Gtk::Window::CAN_FOCUS)
70
+ # default size
71
+ self.set_usize(300, 300)
72
+ end
73
+
74
+ def ConnectSignals
75
+ self.signal_connect("realize"){|wid, event| OnRealize(wid,event) }
76
+ self.signal_connect("expose_event"){|wid, event| OnExpose(wid,event) }
77
+ self.signal_connect("configure_event"){|wid, event| OnConfigure(wid,event) }
78
+ self.signal_connect("button_press_event"){|wid, event| OnButtonDown(wid,event) }
79
+ self.signal_connect("button_release_event"){|wid, event| OnButtonUp(wid,event) }
80
+ self.signal_connect("motion_notify_event"){|wid, event| OnMouseMove(wid,event) }
81
+ self.signal_connect("enter_notify_event"){|wid, event| OnEnter(wid,event) }
82
+ self.signal_connect("leave_notify_event"){|wid, event| OnLeave(wid,event) }
83
+ self.signal_connect("key_press_event"){|wid, event| OnKeyPress(wid,event) }
84
+ self.signal_connect("delete_event"){|wid, event| OnDestroy(wid,event) }
85
+ self.add_events(Gdk::Event::EXPOSURE_MASK|
86
+ Gdk::Event::BUTTON_PRESS_MASK |
87
+ Gdk::Event::BUTTON_RELEASE_MASK |
88
+ Gdk::Event::KEY_PRESS_MASK |
89
+ Gdk::Event::POINTER_MOTION_MASK |
90
+ Gdk::Event::POINTER_MOTION_HINT_MASK |
91
+ Gdk::Event::ENTER_NOTIFY_MASK |
92
+ Gdk::Event::LEAVE_NOTIFY_MASK)
93
+ end
94
+
95
+ def GetRenderWindow
96
+ return @RenderWindow
97
+ end
98
+
99
+ def GetRenderer
100
+ @RenderWindow.GetRenderers.InitTraversal
101
+ return @RenderWindow.GetRenderers.GetNextItem
102
+ end
103
+
104
+ def SetDesiredUpdateRate(rate)
105
+ =begin
106
+ Mirrors the method with the same name in vtkRenderWindowInteractor.
107
+ =end
108
+ @DesiredUpdateRate = rate
109
+ end
110
+
111
+ def GetDesiredUpdateRate
112
+ =begin
113
+ Mirrors the method with the same name in vtkRenderWindowInteractor.
114
+ =end
115
+ return @DesiredUpdateRate
116
+ end
117
+
118
+ def SetStillUpdateRate(rate)
119
+ =begin
120
+ Mirrors the method with the same name in vtkRenderWindowInteractor.
121
+ =end
122
+ @StillUpdateRate = rate
123
+ end
124
+
125
+ def GetStillUpdateRate
126
+ =begin
127
+ Mirrors the method with the same name in vtkRenderWindowInteractor.
128
+ =end
129
+ return @StillUpdateRate
130
+ end
131
+
132
+ def Render
133
+ if @Created
134
+ @RenderWindow.Render
135
+ end
136
+ end
137
+
138
+ def OnRealize(wid, event)
139
+ if @Created == 0
140
+ # you can't get the xid without the window being realized.
141
+ self.realize
142
+ win_id = self.get_window.xid.to_s
143
+ @RenderWindow.SetWindowInfo(win_id)
144
+ @Created = true
145
+ end
146
+ return true
147
+ end
148
+
149
+ def OnConfigure(wid, event=nil)
150
+ sz = @RenderWindow.GetSize
151
+ if (event.width != sz[0]) || (event.height != sz[1])
152
+ @RenderWindow.SetSize(event.width, event.height)
153
+ end
154
+ return true
155
+ end
156
+
157
+ def OnExpose(wid, event)
158
+ self.Render
159
+ return true
160
+ end
161
+
162
+ def OnDestroy(wid, event=nil)
163
+ self.hide
164
+ @RenderWindow = nil
165
+ self.destroy
166
+ return true
167
+ end
168
+
169
+ def OnButtonDown(wid, event)
170
+ =begin
171
+ Mouse button pressed.
172
+ =end
173
+ @RenderWindow.SetDesiredUpdateRate(@DesiredUpdateRate)
174
+ return true
175
+ end
176
+
177
+ def OnButtonUp(wid, event)
178
+ =begin
179
+ Mouse button released.
180
+ =end
181
+ @RenderWindow.SetDesiredUpdateRate(@StillUpdateRate)
182
+ return true
183
+ end
184
+
185
+ def OnMouseMove(wid, event)
186
+ =begin
187
+ Mouse has moved.
188
+ =end
189
+ return true
190
+ end
191
+
192
+ def OnEnter(wid, event)
193
+ =begin
194
+ Entering the vtkRenderWindow.
195
+ =end
196
+ return true
197
+ end
198
+
199
+ def OnLeave(wid, event)
200
+ =begin
201
+ Leaving the vtkRenderWindow.
202
+ =end
203
+ return true
204
+ end
205
+
206
+ def OnKeyPress(wid, event)
207
+ =begin
208
+ Key pressed.
209
+ =end
210
+ return true
211
+ end
212
+
213
+ def OnKeyRelease(wid, event)
214
+ =begin
215
+ Key released.
216
+ =end
217
+ return true
218
+ end
219
+ end
220
+
221
+
222
+ class GtkVTKRenderWindow < GtkVTKRenderWindowBase
223
+ =begin
224
+ An example of a fully functional GtkVTKRenderWindow that is
225
+ based on the vtkRenderWidget.py provided with the VTK sources.
226
+ =end
227
+
228
+ def initialize
229
+ super
230
+
231
+ @CurrentRenderer = nil
232
+ @CurrentCamera = nil
233
+ @CurrentZoom = 1.0
234
+ @CurrentLight = nil
235
+
236
+ @ViewportCenterX = 0
237
+ @ViewportCenterY = 0
238
+
239
+ @Picker = Vtk::CellPicker.new
240
+ @PickedAssembly = nil
241
+ @PickedProperty = Vtk::Property.new
242
+ @PickedProperty.SetColor(1, 0, 0)
243
+ @PrePickedProperty = nil
244
+
245
+ @OldFocus = nil
246
+
247
+ # these record the previous mouse position
248
+ @LastX = 0
249
+ @LastY = 0
250
+ end
251
+
252
+ def OnButtonDown(wid, event)
253
+ @RenderWindow.SetDesiredUpdateRate(@DesiredUpdateRate)
254
+ return self.StartMotion(wid, event)
255
+ end
256
+
257
+ def OnButtonUp(wid, event)
258
+ @RenderWindow.SetDesiredUpdateRate(@StillUpdateRate)
259
+ return self.EndMotion(wid, event)
260
+ end
261
+
262
+ def OnMouseMove(wid, event=nil)
263
+ if ((event.state & Gdk::Window::ModifierType::BUTTON1_MASK) == Gdk::Window::ModifierType::BUTTON1_MASK)
264
+ if ((event.state & Gdk::Window::ModifierType::SHIFT_MASK) == Gdk::Window::ModifierType::SHIFT_MASK)
265
+ m = self.pointer
266
+ self.Pan(m[0], m[1])
267
+ return true
268
+ else
269
+ m = self.pointer
270
+ self.Rotate(m[0], m[1])
271
+ return true
272
+ end
273
+ elsif ((event.state & Gdk::Window::ModifierType::BUTTON2_MASK) == Gdk::Window::ModifierType::BUTTON2_MASK)
274
+ m = self.pointer
275
+ self.Pan(m[0], m[1])
276
+ return true
277
+ elsif ((event.state & Gdk::Window::ModifierType::BUTTON3_MASK) == Gdk::Window::ModifierType::BUTTON3_MASK)
278
+ m = self.pointer
279
+ self.Zoom(m[0], m[1])
280
+ return true
281
+ else
282
+ return false
283
+ end
284
+ end
285
+
286
+ def OnEnter(wid, event=nil)
287
+ self.grab_focus
288
+ w = self.pointer
289
+ self.UpdateRenderer(w[0], w[1])
290
+ return true
291
+ end
292
+
293
+ def OnLeave(wid, event)
294
+ return true
295
+ end
296
+
297
+ def OnKeyPress(wid, event=nil)
298
+ if (event.keyval == "r") || (event.keyval == "R")
299
+ self.Reset
300
+ return true
301
+ elsif (event.keyval == "w") || (event.keyval == "W")
302
+ self.Wireframe
303
+ return true
304
+ elsif (event.keyval == "s") || (event.keyval == "S")
305
+ self.Surface
306
+ return true
307
+ elsif (event.keyval == "p") || (event.keyval == "P")
308
+ m = self.pointer
309
+ self.PickActor(m[0], m[1])
310
+ return true
311
+ else
312
+ return false
313
+ end
314
+ end
315
+
316
+ def GetZoomFactor
317
+ return @CurrentZoom
318
+ end
319
+
320
+ def SetZoomFactor(zf)
321
+ @CurrentZoom = zf
322
+ end
323
+
324
+ def GetPicker
325
+ return @Picker
326
+ end
327
+
328
+ def Render
329
+ if (@CurrentLight)
330
+ light = @CurrentLight
331
+ light.SetPosition(@CurrentCamera.GetPosition)
332
+ light.SetFocalPoint(@CurrentCamera.GetFocalPoint)
333
+ end
334
+
335
+ GtkVTKRenderWindowBase.Render
336
+ end
337
+
338
+ def UpdateRenderer(x,y)
339
+ =begin
340
+ UpdateRenderer will identify the renderer under the mouse && set
341
+ up _CurrentRenderer, _CurrentCamera, && _CurrentLight.
342
+ =end
343
+ windowX = self.get_window.width
344
+ windowY = self.get_window.height
345
+
346
+ renderers = @RenderWindow.GetRenderers
347
+ numRenderers = renderers.GetNumberOfItems
348
+
349
+ @CurrentRenderer = nil
350
+ renderers.InitTraversal
351
+ for i in 0...numRenderers
352
+ renderer = renderers.GetNextItem
353
+ vx,vy = [0,0]
354
+ if (windowX > 1)
355
+ vx = x.to_f/(windowX-1)
356
+ end
357
+ if (windowY > 1)
358
+ vy = (windowY-y.to_f-1)/(windowY-1)
359
+ end
360
+ (vpxmin,vpymin,vpxmax,vpymax) = renderer.GetViewport
361
+
362
+ if (vx >= vpxmin && vx <= vpxmax && vy >= vpymin && vy <= vpymax)
363
+ @CurrentRenderer = renderer
364
+ @ViewportCenterX = windowX.to_f*(vpxmax-vpxmin)/2.0 +vpxmin
365
+ @ViewportCenterY = windowY.to_f*(vpymax-vpymin)/2.0 +vpymin
366
+ @CurrentCamera = @CurrentRenderer.GetActiveCamera
367
+ lights = @CurrentRenderer.GetLights
368
+ lights.InitTraversal
369
+ break if @CurrentLight = lights.GetNextItem
370
+ end
371
+ end
372
+
373
+ @LastX = x
374
+ @LastY = y
375
+ end
376
+
377
+ def GetCurrentRenderer
378
+ return @CurrentRenderer
379
+ end
380
+
381
+ def StartMotion(wid, event=nil)
382
+ x = event.x
383
+ y = event.y
384
+ self.UpdateRenderer(x,y)
385
+ return true
386
+ end
387
+
388
+ def EndMotion(wid, event=nil)
389
+ if @CurrentRenderer
390
+ self.Render
391
+ end
392
+ return true
393
+ end
394
+
395
+ def Rotate(x,y)
396
+ if @CurrentRenderer
397
+
398
+ @CurrentCamera.Azimuth(@LastX - x)
399
+ @CurrentCamera.Elevation(y - @LastY)
400
+ @CurrentCamera.OrthogonalizeViewUp
401
+
402
+ @LastX = x
403
+ @LastY = y
404
+
405
+ @CurrentRenderer.ResetCameraClippingRange
406
+ self.Render
407
+ end
408
+ end
409
+
410
+ def Pan(x,y)
411
+ if @CurrentRenderer
412
+
413
+ renderer = @CurrentRenderer
414
+ camera = @CurrentCamera
415
+ (pPoint0,pPoint1,pPoint2) = camera.GetPosition
416
+ (fPoint0,fPoint1,fPoint2) = camera.GetFocalPoint
417
+
418
+ if (camera.GetParallelProjection)
419
+ renderer.SetWorldPoint(fPoint0,fPoint1,fPoint2,1.0)
420
+ renderer.WorldToDisplay
421
+ fx,fy,fz = renderer.GetDisplayPoint
422
+ renderer.SetDisplayPoint(fx-x+@LastX,
423
+ fy+y-@LastY,
424
+ fz)
425
+ renderer.DisplayToWorld
426
+ fx,fy,fz,fw = renderer.GetWorldPoint
427
+ camera.SetFocalPoint(fx,fy,fz)
428
+
429
+ renderer.SetWorldPoint(pPoint0,pPoint1,pPoint2,1.0)
430
+ renderer.WorldToDisplay
431
+ fx,fy,fz = renderer.GetDisplayPoint
432
+ renderer.SetDisplayPoint(fx-x+@LastX,
433
+ fy+y-@LastY,
434
+ fz)
435
+ renderer.DisplayToWorld
436
+ fx,fy,fz,fw = renderer.GetWorldPoint
437
+ camera.SetPosition(fx,fy,fz)
438
+
439
+ else
440
+ (fPoint0,fPoint1,fPoint2) = camera.GetFocalPoint
441
+ # Specify a point location in world coordinates
442
+ renderer.SetWorldPoint(fPoint0,fPoint1,fPoint2,1.0)
443
+ renderer.WorldToDisplay
444
+ # Convert world point coordinates to display coordinates
445
+ dPoint = renderer.GetDisplayPoint
446
+ focalDepth = dPoint[2]
447
+
448
+ aPoint0 = @ViewportCenterX + (x - @LastX)
449
+ aPoint1 = @ViewportCenterY - (y - @LastY)
450
+
451
+ renderer.SetDisplayPoint(aPoint0,aPoint1,focalDepth)
452
+ renderer.DisplayToWorld
453
+
454
+ (rPoint0,rPoint1,rPoint2,rPoint3) = renderer.GetWorldPoint
455
+ if (rPoint3 != 0.0)
456
+ rPoint0 = rPoint0/rPoint3
457
+ rPoint1 = rPoint1/rPoint3
458
+ rPoint2 = rPoint2/rPoint3
459
+ end
460
+
461
+ camera.SetFocalPoint((fPoint0 - rPoint0) + fPoint0,
462
+ (fPoint1 - rPoint1) + fPoint1,
463
+ (fPoint2 - rPoint2) + fPoint2)
464
+
465
+ camera.SetPosition((fPoint0 - rPoint0) + pPoint0,
466
+ (fPoint1 - rPoint1) + pPoint1,
467
+ (fPoint2 - rPoint2) + pPoint2)
468
+ end
469
+
470
+ @LastX = x
471
+ @LastY = y
472
+
473
+ self.Render
474
+ end
475
+ end
476
+
477
+ def Zoom(x,y)
478
+ if @CurrentRenderer
479
+
480
+ renderer = @CurrentRenderer
481
+ camera = @CurrentCamera
482
+
483
+ zoomFactor = 1.02**(0.5*(@LastY - y))
484
+ @CurrentZoom = @CurrentZoom * zoomFactor
485
+
486
+ if camera.GetParallelProjection
487
+ parallelScale = camera.GetParallelScale/zoomFactor
488
+ camera.SetParallelScale(parallelScale)
489
+ else
490
+ camera.Dolly(zoomFactor)
491
+ renderer.ResetCameraClippingRange
492
+ end
493
+
494
+ @LastX = x
495
+ @LastY = y
496
+
497
+ self.Render
498
+ end
499
+ end
500
+
501
+ def Reset
502
+ if @CurrentRenderer
503
+ @CurrentRenderer.ResetCamera
504
+ end
505
+
506
+ self.Render
507
+ end
508
+
509
+ def Wireframe
510
+ actors = @CurrentRenderer.GetActors
511
+ numActors = actors.GetNumberOfItems
512
+ actors.InitTraversal
513
+ for i in 0...numActors
514
+ actor = actors.GetNextItem
515
+ actor.GetProperty.SetRepresentationToWireframe
516
+ end
517
+
518
+ self.Render
519
+ end
520
+
521
+ def Surface
522
+ actors = @CurrentRenderer.GetActors
523
+ numActors = actors.GetNumberOfItems
524
+ actors.InitTraversal
525
+ for i in 0...numActors
526
+ actor = actors.GetNextItem
527
+ actor.GetProperty.SetRepresentationToSurface
528
+ end
529
+
530
+ self.Render
531
+ end
532
+
533
+ def PickActor(x,y)
534
+ if @CurrentRenderer
535
+
536
+ renderer = @CurrentRenderer
537
+ picker = @Picker
538
+
539
+ windowY = self.get_window.height
540
+ picker.Pick(x,(windowY - y - 1),0.0,renderer)
541
+ assembly = picker.GetAssembly
542
+
543
+ if (@PickedAssembly != nil && @PrePickedProperty != nil)
544
+ @PickedAssembly.SetProperty(@PrePickedProperty)
545
+ # release hold of the property
546
+ @PrePickedProperty.UnRegister(@PrePickedProperty)
547
+ @PrePickedProperty = nil
548
+ end
549
+
550
+ if (assembly != nil)
551
+ @PickedAssembly = assembly
552
+ @PrePickedProperty = @PickedAssembly.GetProperty
553
+ # hold onto the property
554
+ @PrePickedProperty.Register(@PrePickedProperty)
555
+ @PickedAssembly.SetProperty(@PickedProperty)
556
+ end
557
+
558
+ self.Render
559
+ end
560
+ end
561
+ end
562
+
563
+
564
+ def main
565
+
566
+ Gtk.init
567
+ Gtk::GL.init
568
+
569
+ # The main window
570
+ window = Gtk::Window.new(Gtk::Window::TOPLEVEL)
571
+ window.set_title("A GtkVTKRenderWindow Demo!")
572
+ window.signal_connect("destroy"){ Gtk.main_quit }
573
+ window.signal_connect("delete_event"){ Gtk.main_quit }
574
+ window.set_border_width(10)
575
+
576
+ # A VBox into which widgets are packed.
577
+ vbox = Gtk::VBox.new(false, 3)
578
+ window.add(vbox)
579
+ vbox.show
580
+
581
+ # The GtkVTKRenderWindow
582
+ gvtk = GtkVTKRenderWindow.new
583
+ #gvtk.SetDesiredUpdateRate(1000)
584
+ gvtk.set_usize(400, 400)
585
+ vbox.pack_start(gvtk)
586
+ gvtk.show
587
+
588
+ # The VTK stuff.
589
+ cone = Vtk::ConeSource.new
590
+ cone.SetResolution(80)
591
+ coneMapper = Vtk::PolyDataMapper.new
592
+ coneMapper.SetInput(cone.GetOutput)
593
+ #coneActor = Vtk::LODActor.new
594
+ coneActor = Vtk::Actor.new
595
+ coneActor.SetMapper(coneMapper)
596
+ coneActor.GetProperty.SetColor(0.5, 0.5, 1.0)
597
+ ren = Vtk::Renderer.new
598
+ gvtk.GetRenderWindow.AddRenderer(ren)
599
+ ren.AddActor(coneActor)
600
+
601
+ # A simple quit button
602
+ quit = Gtk::Button.new("Quit!")
603
+ quit.signal_connect("clicked"){ Gtk.main_quit }
604
+ vbox.pack_start(quit)
605
+ quit.show
606
+
607
+ # show the main window && start event processing.
608
+ window.show
609
+ Gtk.main
610
+ end
611
+
612
+
613
+ if $0 == __FILE__
614
+ main
615
+ end