vtk-ruby 5.0.4.0-x86-mswin32-60

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.
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