tk 0.1.0

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 (1060) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.travis.yml +6 -0
  4. data/BSDL +22 -0
  5. data/ChangeLog.tkextlib +949 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +56 -0
  8. data/MANUAL_tcltklib.eng +467 -0
  9. data/MANUAL_tcltklib.ja +578 -0
  10. data/README.1st +19 -0
  11. data/README.ActiveTcl +62 -0
  12. data/README.fork +34 -0
  13. data/README.macosx-aqua +67 -0
  14. data/README.md +33 -0
  15. data/README.tcltklib +152 -0
  16. data/Rakefile +16 -0
  17. data/bin/console +14 -0
  18. data/bin/setup +8 -0
  19. data/ext/tk/config_list.in +41 -0
  20. data/ext/tk/extconf.rb +2098 -0
  21. data/ext/tk/old-extconf.rb +441 -0
  22. data/ext/tk/stubs.c +592 -0
  23. data/ext/tk/stubs.h +33 -0
  24. data/ext/tk/tcltklib.c +11066 -0
  25. data/ext/tk/tkutil/extconf.rb +14 -0
  26. data/ext/tk/tkutil/tkutil.c +1900 -0
  27. data/lib/README +30 -0
  28. data/lib/multi-tk.rb +3743 -0
  29. data/lib/remote-tk.rb +527 -0
  30. data/lib/tcltk.rb +369 -0
  31. data/lib/tk.rb +5758 -0
  32. data/lib/tk/after.rb +7 -0
  33. data/lib/tk/autoload.rb +763 -0
  34. data/lib/tk/bgerror.rb +30 -0
  35. data/lib/tk/bindtag.rb +139 -0
  36. data/lib/tk/busy.rb +119 -0
  37. data/lib/tk/button.rb +32 -0
  38. data/lib/tk/canvas.rb +847 -0
  39. data/lib/tk/canvastag.rb +460 -0
  40. data/lib/tk/checkbutton.rb +33 -0
  41. data/lib/tk/clipboard.rb +76 -0
  42. data/lib/tk/clock.rb +72 -0
  43. data/lib/tk/composite.rb +485 -0
  44. data/lib/tk/console.rb +53 -0
  45. data/lib/tk/dialog.rb +327 -0
  46. data/lib/tk/encodedstr.rb +188 -0
  47. data/lib/tk/entry.rb +121 -0
  48. data/lib/tk/event.rb +563 -0
  49. data/lib/tk/font.rb +2352 -0
  50. data/lib/tk/fontchooser.rb +181 -0
  51. data/lib/tk/frame.rb +133 -0
  52. data/lib/tk/grid.rb +280 -0
  53. data/lib/tk/image.rb +396 -0
  54. data/lib/tk/itemconfig.rb +1222 -0
  55. data/lib/tk/itemfont.rb +328 -0
  56. data/lib/tk/kinput.rb +72 -0
  57. data/lib/tk/label.rb +23 -0
  58. data/lib/tk/labelframe.rb +32 -0
  59. data/lib/tk/listbox.rb +285 -0
  60. data/lib/tk/macpkg.rb +81 -0
  61. data/lib/tk/menu.rb +719 -0
  62. data/lib/tk/menubar.rb +138 -0
  63. data/lib/tk/menuspec.rb +457 -0
  64. data/lib/tk/message.rb +25 -0
  65. data/lib/tk/mngfocus.rb +34 -0
  66. data/lib/tk/msgcat.rb +300 -0
  67. data/lib/tk/namespace.rb +547 -0
  68. data/lib/tk/optiondb.rb +372 -0
  69. data/lib/tk/optionobj.rb +213 -0
  70. data/lib/tk/pack.rb +108 -0
  71. data/lib/tk/package.rb +144 -0
  72. data/lib/tk/palette.rb +56 -0
  73. data/lib/tk/panedwindow.rb +261 -0
  74. data/lib/tk/place.rb +129 -0
  75. data/lib/tk/radiobutton.rb +74 -0
  76. data/lib/tk/root.rb +96 -0
  77. data/lib/tk/scale.rb +113 -0
  78. data/lib/tk/scrollable.rb +83 -0
  79. data/lib/tk/scrollbar.rb +184 -0
  80. data/lib/tk/scrollbox.rb +40 -0
  81. data/lib/tk/selection.rb +87 -0
  82. data/lib/tk/spinbox.rb +145 -0
  83. data/lib/tk/tagfont.rb +44 -0
  84. data/lib/tk/text.rb +1605 -0
  85. data/lib/tk/textimage.rb +89 -0
  86. data/lib/tk/textmark.rb +205 -0
  87. data/lib/tk/texttag.rb +322 -0
  88. data/lib/tk/textwindow.rb +155 -0
  89. data/lib/tk/timer.rb +666 -0
  90. data/lib/tk/tk_mac.rb +159 -0
  91. data/lib/tk/toplevel.rb +265 -0
  92. data/lib/tk/ttk_selector.rb +99 -0
  93. data/lib/tk/txtwin_abst.rb +40 -0
  94. data/lib/tk/validation.rb +398 -0
  95. data/lib/tk/variable.rb +1797 -0
  96. data/lib/tk/virtevent.rb +140 -0
  97. data/lib/tk/winfo.rb +393 -0
  98. data/lib/tk/winpkg.rb +157 -0
  99. data/lib/tk/wm.rb +553 -0
  100. data/lib/tk/xim.rb +123 -0
  101. data/lib/tkafter.rb +5 -0
  102. data/lib/tkbgerror.rb +5 -0
  103. data/lib/tkcanvas.rb +5 -0
  104. data/lib/tkclass.rb +48 -0
  105. data/lib/tkconsole.rb +5 -0
  106. data/lib/tkdialog.rb +5 -0
  107. data/lib/tkentry.rb +5 -0
  108. data/lib/tkextlib/ICONS.rb +14 -0
  109. data/lib/tkextlib/ICONS/icons.rb +130 -0
  110. data/lib/tkextlib/ICONS/setup.rb +9 -0
  111. data/lib/tkextlib/SUPPORT_STATUS +193 -0
  112. data/lib/tkextlib/blt.rb +190 -0
  113. data/lib/tkextlib/blt/barchart.rb +80 -0
  114. data/lib/tkextlib/blt/bitmap.rb +113 -0
  115. data/lib/tkextlib/blt/busy.rb +84 -0
  116. data/lib/tkextlib/blt/component.rb +2219 -0
  117. data/lib/tkextlib/blt/container.rb +29 -0
  118. data/lib/tkextlib/blt/cutbuffer.rb +24 -0
  119. data/lib/tkextlib/blt/dragdrop.rb +270 -0
  120. data/lib/tkextlib/blt/eps.rb +33 -0
  121. data/lib/tkextlib/blt/graph.rb +68 -0
  122. data/lib/tkextlib/blt/htext.rb +113 -0
  123. data/lib/tkextlib/blt/setup.rb +9 -0
  124. data/lib/tkextlib/blt/spline.rb +24 -0
  125. data/lib/tkextlib/blt/stripchart.rb +75 -0
  126. data/lib/tkextlib/blt/table.rb +413 -0
  127. data/lib/tkextlib/blt/tabnotebook.rb +111 -0
  128. data/lib/tkextlib/blt/tabset.rb +505 -0
  129. data/lib/tkextlib/blt/ted.rb +69 -0
  130. data/lib/tkextlib/blt/tile.rb +26 -0
  131. data/lib/tkextlib/blt/tile/button.rb +17 -0
  132. data/lib/tkextlib/blt/tile/checkbutton.rb +18 -0
  133. data/lib/tkextlib/blt/tile/frame.rb +17 -0
  134. data/lib/tkextlib/blt/tile/label.rb +17 -0
  135. data/lib/tkextlib/blt/tile/radiobutton.rb +18 -0
  136. data/lib/tkextlib/blt/tile/scrollbar.rb +17 -0
  137. data/lib/tkextlib/blt/tile/toplevel.rb +17 -0
  138. data/lib/tkextlib/blt/tree.rb +1059 -0
  139. data/lib/tkextlib/blt/treeview.rb +1288 -0
  140. data/lib/tkextlib/blt/unix_dnd.rb +142 -0
  141. data/lib/tkextlib/blt/vector.rb +257 -0
  142. data/lib/tkextlib/blt/watch.rb +176 -0
  143. data/lib/tkextlib/blt/win_printer.rb +62 -0
  144. data/lib/tkextlib/blt/winop.rb +108 -0
  145. data/lib/tkextlib/bwidget.rb +154 -0
  146. data/lib/tkextlib/bwidget/arrowbutton.rb +22 -0
  147. data/lib/tkextlib/bwidget/bitmap.rb +22 -0
  148. data/lib/tkextlib/bwidget/button.rb +32 -0
  149. data/lib/tkextlib/bwidget/buttonbox.rb +91 -0
  150. data/lib/tkextlib/bwidget/combobox.rb +63 -0
  151. data/lib/tkextlib/bwidget/dialog.rb +195 -0
  152. data/lib/tkextlib/bwidget/dragsite.rb +32 -0
  153. data/lib/tkextlib/bwidget/dropsite.rb +40 -0
  154. data/lib/tkextlib/bwidget/dynamichelp.rb +64 -0
  155. data/lib/tkextlib/bwidget/entry.rb +44 -0
  156. data/lib/tkextlib/bwidget/label.rb +42 -0
  157. data/lib/tkextlib/bwidget/labelentry.rb +81 -0
  158. data/lib/tkextlib/bwidget/labelframe.rb +53 -0
  159. data/lib/tkextlib/bwidget/listbox.rb +362 -0
  160. data/lib/tkextlib/bwidget/mainframe.rb +133 -0
  161. data/lib/tkextlib/bwidget/messagedlg.rb +193 -0
  162. data/lib/tkextlib/bwidget/notebook.rb +167 -0
  163. data/lib/tkextlib/bwidget/pagesmanager.rb +74 -0
  164. data/lib/tkextlib/bwidget/panedwindow.rb +43 -0
  165. data/lib/tkextlib/bwidget/panelframe.rb +68 -0
  166. data/lib/tkextlib/bwidget/passwddlg.rb +45 -0
  167. data/lib/tkextlib/bwidget/progressbar.rb +21 -0
  168. data/lib/tkextlib/bwidget/progressdlg.rb +59 -0
  169. data/lib/tkextlib/bwidget/scrollableframe.rb +41 -0
  170. data/lib/tkextlib/bwidget/scrolledwindow.rb +49 -0
  171. data/lib/tkextlib/bwidget/scrollview.rb +26 -0
  172. data/lib/tkextlib/bwidget/selectcolor.rb +74 -0
  173. data/lib/tkextlib/bwidget/selectfont.rb +92 -0
  174. data/lib/tkextlib/bwidget/separator.rb +21 -0
  175. data/lib/tkextlib/bwidget/setup.rb +9 -0
  176. data/lib/tkextlib/bwidget/spinbox.rb +99 -0
  177. data/lib/tkextlib/bwidget/statusbar.rb +63 -0
  178. data/lib/tkextlib/bwidget/titleframe.rb +34 -0
  179. data/lib/tkextlib/bwidget/tree.rb +501 -0
  180. data/lib/tkextlib/bwidget/widget.rb +130 -0
  181. data/lib/tkextlib/itcl.rb +14 -0
  182. data/lib/tkextlib/itcl/incr_tcl.rb +179 -0
  183. data/lib/tkextlib/itcl/setup.rb +14 -0
  184. data/lib/tkextlib/itk.rb +14 -0
  185. data/lib/tkextlib/itk/incr_tk.rb +447 -0
  186. data/lib/tkextlib/itk/setup.rb +14 -0
  187. data/lib/tkextlib/iwidgets.rb +95 -0
  188. data/lib/tkextlib/iwidgets/buttonbox.rb +122 -0
  189. data/lib/tkextlib/iwidgets/calendar.rb +126 -0
  190. data/lib/tkextlib/iwidgets/canvasprintbox.rb +54 -0
  191. data/lib/tkextlib/iwidgets/canvasprintdialog.rb +39 -0
  192. data/lib/tkextlib/iwidgets/checkbox.rb +131 -0
  193. data/lib/tkextlib/iwidgets/combobox.rb +105 -0
  194. data/lib/tkextlib/iwidgets/dateentry.rb +21 -0
  195. data/lib/tkextlib/iwidgets/datefield.rb +59 -0
  196. data/lib/tkextlib/iwidgets/dialog.rb +21 -0
  197. data/lib/tkextlib/iwidgets/dialogshell.rb +122 -0
  198. data/lib/tkextlib/iwidgets/disjointlistbox.rb +51 -0
  199. data/lib/tkextlib/iwidgets/entryfield.rb +186 -0
  200. data/lib/tkextlib/iwidgets/extbutton.rb +41 -0
  201. data/lib/tkextlib/iwidgets/extfileselectionbox.rb +47 -0
  202. data/lib/tkextlib/iwidgets/extfileselectiondialog.rb +34 -0
  203. data/lib/tkextlib/iwidgets/feedback.rb +36 -0
  204. data/lib/tkextlib/iwidgets/fileselectionbox.rb +47 -0
  205. data/lib/tkextlib/iwidgets/fileselectiondialog.rb +34 -0
  206. data/lib/tkextlib/iwidgets/finddialog.rb +43 -0
  207. data/lib/tkextlib/iwidgets/hierarchy.rb +366 -0
  208. data/lib/tkextlib/iwidgets/hyperhelp.rb +51 -0
  209. data/lib/tkextlib/iwidgets/labeledframe.rb +40 -0
  210. data/lib/tkextlib/iwidgets/labeledwidget.rb +46 -0
  211. data/lib/tkextlib/iwidgets/mainwindow.rb +68 -0
  212. data/lib/tkextlib/iwidgets/menubar.rb +213 -0
  213. data/lib/tkextlib/iwidgets/messagebox.rb +94 -0
  214. data/lib/tkextlib/iwidgets/messagedialog.rb +21 -0
  215. data/lib/tkextlib/iwidgets/notebook.rb +176 -0
  216. data/lib/tkextlib/iwidgets/optionmenu.rb +93 -0
  217. data/lib/tkextlib/iwidgets/panedwindow.rb +135 -0
  218. data/lib/tkextlib/iwidgets/promptdialog.rb +132 -0
  219. data/lib/tkextlib/iwidgets/pushbutton.rb +36 -0
  220. data/lib/tkextlib/iwidgets/radiobox.rb +122 -0
  221. data/lib/tkextlib/iwidgets/scopedobject.rb +25 -0
  222. data/lib/tkextlib/iwidgets/scrolledcanvas.rb +354 -0
  223. data/lib/tkextlib/iwidgets/scrolledframe.rb +60 -0
  224. data/lib/tkextlib/iwidgets/scrolledhtml.rb +59 -0
  225. data/lib/tkextlib/iwidgets/scrolledlistbox.rb +208 -0
  226. data/lib/tkextlib/iwidgets/scrolledtext.rb +569 -0
  227. data/lib/tkextlib/iwidgets/scrolledwidget.rb +21 -0
  228. data/lib/tkextlib/iwidgets/selectionbox.rb +103 -0
  229. data/lib/tkextlib/iwidgets/selectiondialog.rb +93 -0
  230. data/lib/tkextlib/iwidgets/setup.rb +9 -0
  231. data/lib/tkextlib/iwidgets/shell.rb +39 -0
  232. data/lib/tkextlib/iwidgets/spindate.rb +49 -0
  233. data/lib/tkextlib/iwidgets/spinint.rb +31 -0
  234. data/lib/tkextlib/iwidgets/spinner.rb +170 -0
  235. data/lib/tkextlib/iwidgets/spintime.rb +49 -0
  236. data/lib/tkextlib/iwidgets/tabnotebook.rb +182 -0
  237. data/lib/tkextlib/iwidgets/tabset.rb +146 -0
  238. data/lib/tkextlib/iwidgets/timeentry.rb +26 -0
  239. data/lib/tkextlib/iwidgets/timefield.rb +59 -0
  240. data/lib/tkextlib/iwidgets/toolbar.rb +113 -0
  241. data/lib/tkextlib/iwidgets/watch.rb +57 -0
  242. data/lib/tkextlib/pkg_checker.rb +185 -0
  243. data/lib/tkextlib/setup.rb +9 -0
  244. data/lib/tkextlib/tcllib.rb +106 -0
  245. data/lib/tkextlib/tcllib/README +135 -0
  246. data/lib/tkextlib/tcllib/autoscroll.rb +159 -0
  247. data/lib/tkextlib/tcllib/calendar.rb +56 -0
  248. data/lib/tkextlib/tcllib/canvas_sqmap.rb +37 -0
  249. data/lib/tkextlib/tcllib/canvas_zoom.rb +22 -0
  250. data/lib/tkextlib/tcllib/chatwidget.rb +152 -0
  251. data/lib/tkextlib/tcllib/crosshair.rb +118 -0
  252. data/lib/tkextlib/tcllib/ctext.rb +161 -0
  253. data/lib/tkextlib/tcllib/cursor.rb +98 -0
  254. data/lib/tkextlib/tcllib/dateentry.rb +63 -0
  255. data/lib/tkextlib/tcllib/datefield.rb +58 -0
  256. data/lib/tkextlib/tcllib/diagrams.rb +225 -0
  257. data/lib/tkextlib/tcllib/dialog.rb +85 -0
  258. data/lib/tkextlib/tcllib/getstring.rb +135 -0
  259. data/lib/tkextlib/tcllib/history.rb +74 -0
  260. data/lib/tkextlib/tcllib/ico.rb +147 -0
  261. data/lib/tkextlib/tcllib/ip_entry.rb +76 -0
  262. data/lib/tkextlib/tcllib/khim.rb +69 -0
  263. data/lib/tkextlib/tcllib/menuentry.rb +48 -0
  264. data/lib/tkextlib/tcllib/ntext.rb +147 -0
  265. data/lib/tkextlib/tcllib/panelframe.rb +79 -0
  266. data/lib/tkextlib/tcllib/plotchart.rb +1405 -0
  267. data/lib/tkextlib/tcllib/ruler.rb +66 -0
  268. data/lib/tkextlib/tcllib/screenruler.rb +69 -0
  269. data/lib/tkextlib/tcllib/scrolledwindow.rb +58 -0
  270. data/lib/tkextlib/tcllib/scrollwin.rb +62 -0
  271. data/lib/tkextlib/tcllib/setup.rb +9 -0
  272. data/lib/tkextlib/tcllib/statusbar.rb +80 -0
  273. data/lib/tkextlib/tcllib/style.rb +62 -0
  274. data/lib/tkextlib/tcllib/superframe.rb +52 -0
  275. data/lib/tkextlib/tcllib/swaplist.rb +151 -0
  276. data/lib/tkextlib/tcllib/tablelist.rb +29 -0
  277. data/lib/tkextlib/tcllib/tablelist_core.rb +1073 -0
  278. data/lib/tkextlib/tcllib/tablelist_tile.rb +44 -0
  279. data/lib/tkextlib/tcllib/tkpiechart.rb +315 -0
  280. data/lib/tkextlib/tcllib/toolbar.rb +176 -0
  281. data/lib/tkextlib/tcllib/tooltip.rb +105 -0
  282. data/lib/tkextlib/tcllib/validator.rb +66 -0
  283. data/lib/tkextlib/tcllib/widget.rb +83 -0
  284. data/lib/tkextlib/tclx.rb +14 -0
  285. data/lib/tkextlib/tclx/setup.rb +9 -0
  286. data/lib/tkextlib/tclx/tclx.rb +75 -0
  287. data/lib/tkextlib/tile.rb +450 -0
  288. data/lib/tkextlib/tile/dialog.rb +103 -0
  289. data/lib/tkextlib/tile/setup.rb +9 -0
  290. data/lib/tkextlib/tile/sizegrip.rb +33 -0
  291. data/lib/tkextlib/tile/style.rb +337 -0
  292. data/lib/tkextlib/tile/tbutton.rb +35 -0
  293. data/lib/tkextlib/tile/tcheckbutton.rb +39 -0
  294. data/lib/tkextlib/tile/tcombobox.rb +56 -0
  295. data/lib/tkextlib/tile/tentry.rb +50 -0
  296. data/lib/tkextlib/tile/tframe.rb +35 -0
  297. data/lib/tkextlib/tile/tlabel.rb +35 -0
  298. data/lib/tkextlib/tile/tlabelframe.rb +39 -0
  299. data/lib/tkextlib/tile/tmenubutton.rb +39 -0
  300. data/lib/tkextlib/tile/tnotebook.rb +148 -0
  301. data/lib/tkextlib/tile/tpaned.rb +246 -0
  302. data/lib/tkextlib/tile/tprogressbar.rb +58 -0
  303. data/lib/tkextlib/tile/tradiobutton.rb +39 -0
  304. data/lib/tkextlib/tile/treeview.rb +1337 -0
  305. data/lib/tkextlib/tile/tscale.rb +57 -0
  306. data/lib/tkextlib/tile/tscrollbar.rb +64 -0
  307. data/lib/tkextlib/tile/tseparator.rb +35 -0
  308. data/lib/tkextlib/tile/tspinbox.rb +108 -0
  309. data/lib/tkextlib/tile/tsquare.rb +31 -0
  310. data/lib/tkextlib/tkDND.rb +19 -0
  311. data/lib/tkextlib/tkDND/setup.rb +9 -0
  312. data/lib/tkextlib/tkDND/shape.rb +126 -0
  313. data/lib/tkextlib/tkDND/tkdnd.rb +183 -0
  314. data/lib/tkextlib/tkHTML.rb +14 -0
  315. data/lib/tkextlib/tkHTML/htmlwidget.rb +454 -0
  316. data/lib/tkextlib/tkHTML/setup.rb +9 -0
  317. data/lib/tkextlib/tkimg.rb +37 -0
  318. data/lib/tkextlib/tkimg/README +26 -0
  319. data/lib/tkextlib/tkimg/bmp.rb +34 -0
  320. data/lib/tkextlib/tkimg/dted.rb +34 -0
  321. data/lib/tkextlib/tkimg/gif.rb +34 -0
  322. data/lib/tkextlib/tkimg/ico.rb +34 -0
  323. data/lib/tkextlib/tkimg/jpeg.rb +34 -0
  324. data/lib/tkextlib/tkimg/pcx.rb +34 -0
  325. data/lib/tkextlib/tkimg/pixmap.rb +45 -0
  326. data/lib/tkextlib/tkimg/png.rb +34 -0
  327. data/lib/tkextlib/tkimg/ppm.rb +34 -0
  328. data/lib/tkextlib/tkimg/ps.rb +34 -0
  329. data/lib/tkextlib/tkimg/raw.rb +34 -0
  330. data/lib/tkextlib/tkimg/setup.rb +9 -0
  331. data/lib/tkextlib/tkimg/sgi.rb +34 -0
  332. data/lib/tkextlib/tkimg/sun.rb +34 -0
  333. data/lib/tkextlib/tkimg/tga.rb +34 -0
  334. data/lib/tkextlib/tkimg/tiff.rb +34 -0
  335. data/lib/tkextlib/tkimg/window.rb +34 -0
  336. data/lib/tkextlib/tkimg/xbm.rb +34 -0
  337. data/lib/tkextlib/tkimg/xpm.rb +34 -0
  338. data/lib/tkextlib/tktable.rb +15 -0
  339. data/lib/tkextlib/tktable/setup.rb +9 -0
  340. data/lib/tkextlib/tktable/tktable.rb +967 -0
  341. data/lib/tkextlib/tktrans.rb +15 -0
  342. data/lib/tkextlib/tktrans/setup.rb +9 -0
  343. data/lib/tkextlib/tktrans/tktrans.rb +65 -0
  344. data/lib/tkextlib/treectrl.rb +14 -0
  345. data/lib/tkextlib/treectrl/setup.rb +9 -0
  346. data/lib/tkextlib/treectrl/tktreectrl.rb +2523 -0
  347. data/lib/tkextlib/trofs.rb +14 -0
  348. data/lib/tkextlib/trofs/setup.rb +9 -0
  349. data/lib/tkextlib/trofs/trofs.rb +52 -0
  350. data/lib/tkextlib/version.rb +7 -0
  351. data/lib/tkextlib/vu.rb +49 -0
  352. data/lib/tkextlib/vu/bargraph.rb +62 -0
  353. data/lib/tkextlib/vu/charts.rb +54 -0
  354. data/lib/tkextlib/vu/dial.rb +103 -0
  355. data/lib/tkextlib/vu/pie.rb +287 -0
  356. data/lib/tkextlib/vu/setup.rb +9 -0
  357. data/lib/tkextlib/vu/spinbox.rb +23 -0
  358. data/lib/tkextlib/winico.rb +15 -0
  359. data/lib/tkextlib/winico/setup.rb +9 -0
  360. data/lib/tkextlib/winico/winico.rb +225 -0
  361. data/lib/tkfont.rb +5 -0
  362. data/lib/tkmacpkg.rb +5 -0
  363. data/lib/tkmenubar.rb +5 -0
  364. data/lib/tkmngfocus.rb +5 -0
  365. data/lib/tkpalette.rb +5 -0
  366. data/lib/tkscrollbox.rb +5 -0
  367. data/lib/tktext.rb +5 -0
  368. data/lib/tkvirtevent.rb +5 -0
  369. data/lib/tkwinpkg.rb +5 -0
  370. data/old-README.tcltklib.ja +159 -0
  371. data/sample/24hr_clock.rb +287 -0
  372. data/sample/binding_sample.rb +88 -0
  373. data/sample/bindtag_sample.rb +128 -0
  374. data/sample/binstr_usage.rb +46 -0
  375. data/sample/btn_with_frame.rb +21 -0
  376. data/sample/cd_timer.rb +82 -0
  377. data/sample/cmd_res_test.rb +18 -0
  378. data/sample/cmd_resource +5 -0
  379. data/sample/demos-en/ChangeLog +64 -0
  380. data/sample/demos-en/ChangeLog.prev +9 -0
  381. data/sample/demos-en/README +138 -0
  382. data/sample/demos-en/README.1st +18 -0
  383. data/sample/demos-en/README.tkencoding +29 -0
  384. data/sample/demos-en/anilabel.rb +175 -0
  385. data/sample/demos-en/aniwave.rb +119 -0
  386. data/sample/demos-en/arrow.rb +250 -0
  387. data/sample/demos-en/bind.rb +128 -0
  388. data/sample/demos-en/bitmap.rb +76 -0
  389. data/sample/demos-en/browse1 +63 -0
  390. data/sample/demos-en/browse2 +82 -0
  391. data/sample/demos-en/button.rb +85 -0
  392. data/sample/demos-en/check.rb +73 -0
  393. data/sample/demos-en/check2.rb +110 -0
  394. data/sample/demos-en/clrpick.rb +88 -0
  395. data/sample/demos-en/colors.rb +159 -0
  396. data/sample/demos-en/combo.rb +97 -0
  397. data/sample/demos-en/cscroll.rb +137 -0
  398. data/sample/demos-en/ctext.rb +208 -0
  399. data/sample/demos-en/dialog1.rb +39 -0
  400. data/sample/demos-en/dialog2.rb +42 -0
  401. data/sample/demos-en/doc.org/README +7 -0
  402. data/sample/demos-en/doc.org/README.JP +14 -0
  403. data/sample/demos-en/doc.org/README.tk80 +46 -0
  404. data/sample/demos-en/doc.org/license.terms +39 -0
  405. data/sample/demos-en/doc.org/license.terms.tk80 +39 -0
  406. data/sample/demos-en/entry1.rb +59 -0
  407. data/sample/demos-en/entry2.rb +94 -0
  408. data/sample/demos-en/entry3.rb +221 -0
  409. data/sample/demos-en/filebox.rb +103 -0
  410. data/sample/demos-en/floor.rb +1724 -0
  411. data/sample/demos-en/floor2.rb +1723 -0
  412. data/sample/demos-en/form.rb +65 -0
  413. data/sample/demos-en/goldberg.rb +2007 -0
  414. data/sample/demos-en/hello +14 -0
  415. data/sample/demos-en/hscale.rb +76 -0
  416. data/sample/demos-en/icon.rb +106 -0
  417. data/sample/demos-en/image1.rb +66 -0
  418. data/sample/demos-en/image2.rb +108 -0
  419. data/sample/demos-en/image3.rb +126 -0
  420. data/sample/demos-en/items.rb +382 -0
  421. data/sample/demos-en/ixset +333 -0
  422. data/sample/demos-en/ixset2 +367 -0
  423. data/sample/demos-en/knightstour.rb +272 -0
  424. data/sample/demos-en/label.rb +73 -0
  425. data/sample/demos-en/labelframe.rb +96 -0
  426. data/sample/demos-en/mclist.rb +118 -0
  427. data/sample/demos-en/menu.rb +197 -0
  428. data/sample/demos-en/menu84.rb +216 -0
  429. data/sample/demos-en/menubu.rb +238 -0
  430. data/sample/demos-en/msgbox.rb +91 -0
  431. data/sample/demos-en/msgbox2.rb +92 -0
  432. data/sample/demos-en/paned1.rb +48 -0
  433. data/sample/demos-en/paned2.rb +95 -0
  434. data/sample/demos-en/pendulum.rb +241 -0
  435. data/sample/demos-en/plot.rb +125 -0
  436. data/sample/demos-en/puzzle.rb +135 -0
  437. data/sample/demos-en/radio.rb +87 -0
  438. data/sample/demos-en/radio2.rb +110 -0
  439. data/sample/demos-en/radio3.rb +118 -0
  440. data/sample/demos-en/rmt +268 -0
  441. data/sample/demos-en/rolodex +320 -0
  442. data/sample/demos-en/ruler.rb +206 -0
  443. data/sample/demos-en/sayings.rb +107 -0
  444. data/sample/demos-en/search.rb +188 -0
  445. data/sample/demos-en/spin.rb +66 -0
  446. data/sample/demos-en/square +81 -0
  447. data/sample/demos-en/states.rb +81 -0
  448. data/sample/demos-en/style.rb +232 -0
  449. data/sample/demos-en/tcolor +526 -0
  450. data/sample/demos-en/text.rb +129 -0
  451. data/sample/demos-en/textpeer.rb +77 -0
  452. data/sample/demos-en/timer +136 -0
  453. data/sample/demos-en/tkencoding.rb +43 -0
  454. data/sample/demos-en/toolbar.rb +131 -0
  455. data/sample/demos-en/tree.rb +120 -0
  456. data/sample/demos-en/ttkbut.rb +140 -0
  457. data/sample/demos-en/ttkmenu.rb +86 -0
  458. data/sample/demos-en/ttknote.rb +90 -0
  459. data/sample/demos-en/ttkpane.rb +214 -0
  460. data/sample/demos-en/ttkprogress.rb +67 -0
  461. data/sample/demos-en/twind.rb +292 -0
  462. data/sample/demos-en/twind2.rb +385 -0
  463. data/sample/demos-en/unicodeout.rb +115 -0
  464. data/sample/demos-en/vscale.rb +80 -0
  465. data/sample/demos-en/widget +1087 -0
  466. data/sample/demos-jp/README +54 -0
  467. data/sample/demos-jp/README.1st +20 -0
  468. data/sample/demos-jp/anilabel.rb +178 -0
  469. data/sample/demos-jp/aniwave.rb +121 -0
  470. data/sample/demos-jp/arrow.rb +248 -0
  471. data/sample/demos-jp/bind.rb +126 -0
  472. data/sample/demos-jp/bitmap.rb +75 -0
  473. data/sample/demos-jp/browse1 +63 -0
  474. data/sample/demos-jp/browse2 +82 -0
  475. data/sample/demos-jp/button.rb +84 -0
  476. data/sample/demos-jp/check.rb +71 -0
  477. data/sample/demos-jp/check2.rb +111 -0
  478. data/sample/demos-jp/clrpick.rb +85 -0
  479. data/sample/demos-jp/colors.rb +156 -0
  480. data/sample/demos-jp/combo.rb +99 -0
  481. data/sample/demos-jp/cscroll.rb +135 -0
  482. data/sample/demos-jp/ctext.rb +205 -0
  483. data/sample/demos-jp/dialog1.rb +40 -0
  484. data/sample/demos-jp/dialog2.rb +44 -0
  485. data/sample/demos-jp/doc.org/README +7 -0
  486. data/sample/demos-jp/doc.org/README.JP +14 -0
  487. data/sample/demos-jp/doc.org/README.tk80 +46 -0
  488. data/sample/demos-jp/doc.org/license.terms +39 -0
  489. data/sample/demos-jp/doc.org/license.terms.tk80 +39 -0
  490. data/sample/demos-jp/entry1.rb +61 -0
  491. data/sample/demos-jp/entry2.rb +92 -0
  492. data/sample/demos-jp/entry3.rb +226 -0
  493. data/sample/demos-jp/filebox.rb +103 -0
  494. data/sample/demos-jp/floor.rb +1722 -0
  495. data/sample/demos-jp/floor2.rb +1720 -0
  496. data/sample/demos-jp/form.rb +67 -0
  497. data/sample/demos-jp/goldberg.rb +2012 -0
  498. data/sample/demos-jp/hello +10 -0
  499. data/sample/demos-jp/hscale.rb +79 -0
  500. data/sample/demos-jp/icon.rb +104 -0
  501. data/sample/demos-jp/image1.rb +65 -0
  502. data/sample/demos-jp/image2.rb +107 -0
  503. data/sample/demos-jp/image3.rb +128 -0
  504. data/sample/demos-jp/items.rb +380 -0
  505. data/sample/demos-jp/ixset +333 -0
  506. data/sample/demos-jp/ixset2 +369 -0
  507. data/sample/demos-jp/knightstour.rb +274 -0
  508. data/sample/demos-jp/label.rb +70 -0
  509. data/sample/demos-jp/labelframe.rb +103 -0
  510. data/sample/demos-jp/mclist.rb +122 -0
  511. data/sample/demos-jp/menu.rb +202 -0
  512. data/sample/demos-jp/menu84.rb +214 -0
  513. data/sample/demos-jp/menu8x.rb +234 -0
  514. data/sample/demos-jp/menubu.rb +239 -0
  515. data/sample/demos-jp/msgbox.rb +90 -0
  516. data/sample/demos-jp/msgbox2.rb +91 -0
  517. data/sample/demos-jp/paned1.rb +53 -0
  518. data/sample/demos-jp/paned2.rb +101 -0
  519. data/sample/demos-jp/pendulum.rb +243 -0
  520. data/sample/demos-jp/plot.rb +127 -0
  521. data/sample/demos-jp/puzzle.rb +132 -0
  522. data/sample/demos-jp/radio.rb +85 -0
  523. data/sample/demos-jp/radio2.rb +113 -0
  524. data/sample/demos-jp/radio3.rb +120 -0
  525. data/sample/demos-jp/rmt +268 -0
  526. data/sample/demos-jp/rolodex +320 -0
  527. data/sample/demos-jp/rolodex-j +300 -0
  528. data/sample/demos-jp/ruler.rb +204 -0
  529. data/sample/demos-jp/sayings.rb +104 -0
  530. data/sample/demos-jp/search.rb +185 -0
  531. data/sample/demos-jp/spin.rb +72 -0
  532. data/sample/demos-jp/square +81 -0
  533. data/sample/demos-jp/states.rb +75 -0
  534. data/sample/demos-jp/style.rb +271 -0
  535. data/sample/demos-jp/tcolor +534 -0
  536. data/sample/demos-jp/text.rb +121 -0
  537. data/sample/demos-jp/textpeer.rb +83 -0
  538. data/sample/demos-jp/timer +136 -0
  539. data/sample/demos-jp/toolbar.rb +137 -0
  540. data/sample/demos-jp/tree.rb +121 -0
  541. data/sample/demos-jp/ttkbut.rb +146 -0
  542. data/sample/demos-jp/ttkmenu.rb +92 -0
  543. data/sample/demos-jp/ttknote.rb +98 -0
  544. data/sample/demos-jp/ttkpane.rb +217 -0
  545. data/sample/demos-jp/ttkprogress.rb +72 -0
  546. data/sample/demos-jp/twind.rb +293 -0
  547. data/sample/demos-jp/twind2.rb +385 -0
  548. data/sample/demos-jp/unicodeout.rb +120 -0
  549. data/sample/demos-jp/vscale.rb +81 -0
  550. data/sample/demos-jp/widget +1122 -0
  551. data/sample/editable_listbox.rb +149 -0
  552. data/sample/encstr_usage.rb +31 -0
  553. data/sample/figmemo_sample.rb +457 -0
  554. data/sample/images/earth.gif +0 -0
  555. data/sample/images/earthris.gif +0 -0
  556. data/sample/images/face.xbm +173 -0
  557. data/sample/images/flagdown.xbm +27 -0
  558. data/sample/images/flagup.xbm +27 -0
  559. data/sample/images/gray25.xbm +6 -0
  560. data/sample/images/grey.25 +6 -0
  561. data/sample/images/grey.5 +6 -0
  562. data/sample/images/letters.xbm +27 -0
  563. data/sample/images/noletter.xbm +27 -0
  564. data/sample/images/pattern.xbm +6 -0
  565. data/sample/images/tcllogo.gif +0 -0
  566. data/sample/images/teapot.ppm +31 -0
  567. data/sample/irbtk.rb +31 -0
  568. data/sample/irbtkw.rbw +156 -0
  569. data/sample/iso2022-kr.txt +2 -0
  570. data/sample/menubar1.rb +52 -0
  571. data/sample/menubar2.rb +57 -0
  572. data/sample/menubar3.rb +73 -0
  573. data/sample/msgs_rb/README +3 -0
  574. data/sample/msgs_rb/cs.msg +84 -0
  575. data/sample/msgs_rb/de.msg +88 -0
  576. data/sample/msgs_rb/el.msg +98 -0
  577. data/sample/msgs_rb/en.msg +83 -0
  578. data/sample/msgs_rb/en_gb.msg +7 -0
  579. data/sample/msgs_rb/eo.msg +87 -0
  580. data/sample/msgs_rb/es.msg +84 -0
  581. data/sample/msgs_rb/fr.msg +84 -0
  582. data/sample/msgs_rb/it.msg +84 -0
  583. data/sample/msgs_rb/ja.msg +13 -0
  584. data/sample/msgs_rb/nl.msg +123 -0
  585. data/sample/msgs_rb/pl.msg +87 -0
  586. data/sample/msgs_rb/ru.msg +87 -0
  587. data/sample/msgs_rb2/README +5 -0
  588. data/sample/msgs_rb2/de.msg +88 -0
  589. data/sample/msgs_rb2/ja.msg +85 -0
  590. data/sample/msgs_tk/README +4 -0
  591. data/sample/msgs_tk/cs.msg +84 -0
  592. data/sample/msgs_tk/de.msg +88 -0
  593. data/sample/msgs_tk/el.msg +103 -0
  594. data/sample/msgs_tk/en.msg +83 -0
  595. data/sample/msgs_tk/en_gb.msg +7 -0
  596. data/sample/msgs_tk/eo.msg +87 -0
  597. data/sample/msgs_tk/es.msg +84 -0
  598. data/sample/msgs_tk/fr.msg +84 -0
  599. data/sample/msgs_tk/it.msg +84 -0
  600. data/sample/msgs_tk/ja.msg +13 -0
  601. data/sample/msgs_tk/license.terms +39 -0
  602. data/sample/msgs_tk/nl.msg +123 -0
  603. data/sample/msgs_tk/pl.msg +87 -0
  604. data/sample/msgs_tk/ru.msg +87 -0
  605. data/sample/multi-ip_sample.rb +104 -0
  606. data/sample/multi-ip_sample2.rb +30 -0
  607. data/sample/optobj_sample.rb +68 -0
  608. data/sample/propagate.rb +31 -0
  609. data/sample/remote-ip_sample.rb +34 -0
  610. data/sample/remote-ip_sample2.rb +57 -0
  611. data/sample/resource.en +13 -0
  612. data/sample/resource.ja +13 -0
  613. data/sample/safe-tk.rb +132 -0
  614. data/sample/scrollframe.rb +250 -0
  615. data/sample/tcltklib/batsu.gif +0 -0
  616. data/sample/tcltklib/lines0.tcl +42 -0
  617. data/sample/tcltklib/lines1.rb +51 -0
  618. data/sample/tcltklib/lines2.rb +55 -0
  619. data/sample/tcltklib/lines3.rb +55 -0
  620. data/sample/tcltklib/lines4.rb +55 -0
  621. data/sample/tcltklib/maru.gif +0 -0
  622. data/sample/tcltklib/safeTk.rb +23 -0
  623. data/sample/tcltklib/sample0.rb +40 -0
  624. data/sample/tcltklib/sample1.rb +635 -0
  625. data/sample/tcltklib/sample2.rb +452 -0
  626. data/sample/tkalignbox.rb +236 -0
  627. data/sample/tkballoonhelp.rb +221 -0
  628. data/sample/tkbiff.rb +156 -0
  629. data/sample/tkbrowse.rb +80 -0
  630. data/sample/tkcombobox.rb +498 -0
  631. data/sample/tkdialog.rb +62 -0
  632. data/sample/tkextlib/ICONS/Orig_LICENSE.txt +61 -0
  633. data/sample/tkextlib/ICONS/tkIcons +195 -0
  634. data/sample/tkextlib/ICONS/tkIcons-sample.kde +658 -0
  635. data/sample/tkextlib/ICONS/tkIcons.kde +195 -0
  636. data/sample/tkextlib/ICONS/viewIcons.rb +330 -0
  637. data/sample/tkextlib/blt/barchart5.rb +102 -0
  638. data/sample/tkextlib/blt/calendar.rb +118 -0
  639. data/sample/tkextlib/blt/graph6.rb +2223 -0
  640. data/sample/tkextlib/blt/graph7.rb +41 -0
  641. data/sample/tkextlib/blt/graph7a.rb +64 -0
  642. data/sample/tkextlib/blt/graph7b.rb +42 -0
  643. data/sample/tkextlib/blt/graph7c.rb +46 -0
  644. data/sample/tkextlib/blt/images/buckskin.gif +0 -0
  645. data/sample/tkextlib/blt/images/chalk.gif +0 -0
  646. data/sample/tkextlib/blt/images/qv100.t.gif +0 -0
  647. data/sample/tkextlib/blt/images/rain.gif +0 -0
  648. data/sample/tkextlib/blt/images/sample.gif +0 -0
  649. data/sample/tkextlib/blt/pareto.rb +91 -0
  650. data/sample/tkextlib/blt/plot1.rb +10 -0
  651. data/sample/tkextlib/blt/plot1b.rb +11 -0
  652. data/sample/tkextlib/blt/readme.txt +2 -0
  653. data/sample/tkextlib/blt/scripts/stipples.rb +157 -0
  654. data/sample/tkextlib/blt/winop1.rb +41 -0
  655. data/sample/tkextlib/blt/winop2.rb +29 -0
  656. data/sample/tkextlib/bwidget/Orig_LICENSE.txt +53 -0
  657. data/sample/tkextlib/bwidget/basic.rb +199 -0
  658. data/sample/tkextlib/bwidget/bwidget.xbm +46 -0
  659. data/sample/tkextlib/bwidget/demo.rb +244 -0
  660. data/sample/tkextlib/bwidget/dnd.rb +47 -0
  661. data/sample/tkextlib/bwidget/manager.rb +151 -0
  662. data/sample/tkextlib/bwidget/select.rb +83 -0
  663. data/sample/tkextlib/bwidget/tmpldlg.rb +222 -0
  664. data/sample/tkextlib/bwidget/tree.rb +290 -0
  665. data/sample/tkextlib/bwidget/x1.xbm +2258 -0
  666. data/sample/tkextlib/iwidgets/catalog_demo/Orig_LICENSE.txt +42 -0
  667. data/sample/tkextlib/iwidgets/catalog_demo/images/box.xbm +14 -0
  668. data/sample/tkextlib/iwidgets/catalog_demo/images/clear.gif +0 -0
  669. data/sample/tkextlib/iwidgets/catalog_demo/images/close.gif +0 -0
  670. data/sample/tkextlib/iwidgets/catalog_demo/images/copy.gif +0 -0
  671. data/sample/tkextlib/iwidgets/catalog_demo/images/cut.gif +0 -0
  672. data/sample/tkextlib/iwidgets/catalog_demo/images/exit.gif +0 -0
  673. data/sample/tkextlib/iwidgets/catalog_demo/images/find.gif +0 -0
  674. data/sample/tkextlib/iwidgets/catalog_demo/images/help.gif +0 -0
  675. data/sample/tkextlib/iwidgets/catalog_demo/images/line.xbm +14 -0
  676. data/sample/tkextlib/iwidgets/catalog_demo/images/mag.gif +0 -0
  677. data/sample/tkextlib/iwidgets/catalog_demo/images/new.gif +0 -0
  678. data/sample/tkextlib/iwidgets/catalog_demo/images/open.gif +0 -0
  679. data/sample/tkextlib/iwidgets/catalog_demo/images/oval.xbm +14 -0
  680. data/sample/tkextlib/iwidgets/catalog_demo/images/paste.gif +0 -0
  681. data/sample/tkextlib/iwidgets/catalog_demo/images/points.xbm +14 -0
  682. data/sample/tkextlib/iwidgets/catalog_demo/images/poly.gif +0 -0
  683. data/sample/tkextlib/iwidgets/catalog_demo/images/print.gif +0 -0
  684. data/sample/tkextlib/iwidgets/catalog_demo/images/ruler.gif +0 -0
  685. data/sample/tkextlib/iwidgets/catalog_demo/images/save.gif +0 -0
  686. data/sample/tkextlib/iwidgets/catalog_demo/images/select.gif +0 -0
  687. data/sample/tkextlib/iwidgets/catalog_demo/images/text.xbm +14 -0
  688. data/sample/tkextlib/iwidgets/sample/buttonbox.rb +23 -0
  689. data/sample/tkextlib/iwidgets/sample/calendar.rb +11 -0
  690. data/sample/tkextlib/iwidgets/sample/canvasprintbox.rb +9 -0
  691. data/sample/tkextlib/iwidgets/sample/canvasprintdialog.rb +9 -0
  692. data/sample/tkextlib/iwidgets/sample/checkbox.rb +13 -0
  693. data/sample/tkextlib/iwidgets/sample/combobox.rb +33 -0
  694. data/sample/tkextlib/iwidgets/sample/dateentry.rb +8 -0
  695. data/sample/tkextlib/iwidgets/sample/datefield.rb +9 -0
  696. data/sample/tkextlib/iwidgets/sample/dialog.rb +21 -0
  697. data/sample/tkextlib/iwidgets/sample/dialogshell.rb +15 -0
  698. data/sample/tkextlib/iwidgets/sample/disjointlistbox.rb +17 -0
  699. data/sample/tkextlib/iwidgets/sample/entryfield-1.rb +40 -0
  700. data/sample/tkextlib/iwidgets/sample/entryfield-2.rb +45 -0
  701. data/sample/tkextlib/iwidgets/sample/entryfield-3.rb +41 -0
  702. data/sample/tkextlib/iwidgets/sample/extbutton.rb +21 -0
  703. data/sample/tkextlib/iwidgets/sample/extfileselectionbox.rb +9 -0
  704. data/sample/tkextlib/iwidgets/sample/extfileselectiondialog.rb +30 -0
  705. data/sample/tkextlib/iwidgets/sample/feedback.rb +11 -0
  706. data/sample/tkextlib/iwidgets/sample/fileselectionbox.rb +9 -0
  707. data/sample/tkextlib/iwidgets/sample/fileselectiondialog.rb +29 -0
  708. data/sample/tkextlib/iwidgets/sample/finddialog.rb +16 -0
  709. data/sample/tkextlib/iwidgets/sample/hierarchy.rb +26 -0
  710. data/sample/tkextlib/iwidgets/sample/hyperhelp.rb +15 -0
  711. data/sample/tkextlib/iwidgets/sample/labeledframe.rb +15 -0
  712. data/sample/tkextlib/iwidgets/sample/labeledwidget.rb +14 -0
  713. data/sample/tkextlib/iwidgets/sample/mainwindow.rb +65 -0
  714. data/sample/tkextlib/iwidgets/sample/menubar.rb +125 -0
  715. data/sample/tkextlib/iwidgets/sample/menubar2.rb +45 -0
  716. data/sample/tkextlib/iwidgets/sample/messagebox1.rb +20 -0
  717. data/sample/tkextlib/iwidgets/sample/messagebox2.rb +20 -0
  718. data/sample/tkextlib/iwidgets/sample/messagedialog.rb +45 -0
  719. data/sample/tkextlib/iwidgets/sample/notebook.rb +31 -0
  720. data/sample/tkextlib/iwidgets/sample/notebook2.rb +31 -0
  721. data/sample/tkextlib/iwidgets/sample/optionmenu.rb +15 -0
  722. data/sample/tkextlib/iwidgets/sample/panedwindow.rb +23 -0
  723. data/sample/tkextlib/iwidgets/sample/panedwindow2.rb +23 -0
  724. data/sample/tkextlib/iwidgets/sample/promptdialog.rb +18 -0
  725. data/sample/tkextlib/iwidgets/sample/pushbutton.rb +10 -0
  726. data/sample/tkextlib/iwidgets/sample/radiobox.rb +14 -0
  727. data/sample/tkextlib/iwidgets/sample/scrolledcanvas.rb +14 -0
  728. data/sample/tkextlib/iwidgets/sample/scrolledframe.rb +19 -0
  729. data/sample/tkextlib/iwidgets/sample/scrolledhtml.rb +16 -0
  730. data/sample/tkextlib/iwidgets/sample/scrolledlistbox.rb +23 -0
  731. data/sample/tkextlib/iwidgets/sample/scrolledtext.rb +12 -0
  732. data/sample/tkextlib/iwidgets/sample/selectionbox.rb +20 -0
  733. data/sample/tkextlib/iwidgets/sample/selectiondialog.rb +13 -0
  734. data/sample/tkextlib/iwidgets/sample/shell.rb +18 -0
  735. data/sample/tkextlib/iwidgets/sample/spindate.rb +8 -0
  736. data/sample/tkextlib/iwidgets/sample/spinint.rb +11 -0
  737. data/sample/tkextlib/iwidgets/sample/spinner.rb +34 -0
  738. data/sample/tkextlib/iwidgets/sample/spintime.rb +8 -0
  739. data/sample/tkextlib/iwidgets/sample/tabnotebook.rb +27 -0
  740. data/sample/tkextlib/iwidgets/sample/tabnotebook2.rb +31 -0
  741. data/sample/tkextlib/iwidgets/sample/tabset.rb +35 -0
  742. data/sample/tkextlib/iwidgets/sample/timeentry.rb +8 -0
  743. data/sample/tkextlib/iwidgets/sample/timefield.rb +9 -0
  744. data/sample/tkextlib/iwidgets/sample/toolbar.rb +153 -0
  745. data/sample/tkextlib/iwidgets/sample/watch.rb +19 -0
  746. data/sample/tkextlib/tcllib/Orig_LICENSE.txt +46 -0
  747. data/sample/tkextlib/tcllib/datefield.rb +30 -0
  748. data/sample/tkextlib/tcllib/plotdemos1.rb +159 -0
  749. data/sample/tkextlib/tcllib/plotdemos2.rb +72 -0
  750. data/sample/tkextlib/tcllib/plotdemos3.rb +84 -0
  751. data/sample/tkextlib/tcllib/xyplot.rb +18 -0
  752. data/sample/tkextlib/tile/Orig_LICENSE.txt +30 -0
  753. data/sample/tkextlib/tile/demo.rb +984 -0
  754. data/sample/tkextlib/tile/iconlib.tcl +110 -0
  755. data/sample/tkextlib/tile/readme.txt +2 -0
  756. data/sample/tkextlib/tile/repeater.tcl +117 -0
  757. data/sample/tkextlib/tile/themes/blue/blue.tcl +149 -0
  758. data/sample/tkextlib/tile/themes/blue/blue/arrowdown-h.gif +0 -0
  759. data/sample/tkextlib/tile/themes/blue/blue/arrowdown-p.gif +0 -0
  760. data/sample/tkextlib/tile/themes/blue/blue/arrowdown.gif +0 -0
  761. data/sample/tkextlib/tile/themes/blue/blue/arrowleft-h.gif +0 -0
  762. data/sample/tkextlib/tile/themes/blue/blue/arrowleft-p.gif +0 -0
  763. data/sample/tkextlib/tile/themes/blue/blue/arrowleft.gif +0 -0
  764. data/sample/tkextlib/tile/themes/blue/blue/arrowright-h.gif +0 -0
  765. data/sample/tkextlib/tile/themes/blue/blue/arrowright-p.gif +0 -0
  766. data/sample/tkextlib/tile/themes/blue/blue/arrowright.gif +0 -0
  767. data/sample/tkextlib/tile/themes/blue/blue/arrowup-h.gif +0 -0
  768. data/sample/tkextlib/tile/themes/blue/blue/arrowup-p.gif +0 -0
  769. data/sample/tkextlib/tile/themes/blue/blue/arrowup.gif +0 -0
  770. data/sample/tkextlib/tile/themes/blue/blue/button-h.gif +0 -0
  771. data/sample/tkextlib/tile/themes/blue/blue/button-n.gif +0 -0
  772. data/sample/tkextlib/tile/themes/blue/blue/button-n.xcf +0 -0
  773. data/sample/tkextlib/tile/themes/blue/blue/button-p.gif +0 -0
  774. data/sample/tkextlib/tile/themes/blue/blue/check-hc.gif +0 -0
  775. data/sample/tkextlib/tile/themes/blue/blue/check-hu.gif +0 -0
  776. data/sample/tkextlib/tile/themes/blue/blue/check-nc.gif +0 -0
  777. data/sample/tkextlib/tile/themes/blue/blue/check-nu.gif +0 -0
  778. data/sample/tkextlib/tile/themes/blue/blue/radio-hc.gif +0 -0
  779. data/sample/tkextlib/tile/themes/blue/blue/radio-hu.gif +0 -0
  780. data/sample/tkextlib/tile/themes/blue/blue/radio-nc.gif +0 -0
  781. data/sample/tkextlib/tile/themes/blue/blue/radio-nu.gif +0 -0
  782. data/sample/tkextlib/tile/themes/blue/blue/sb-thumb-p.gif +0 -0
  783. data/sample/tkextlib/tile/themes/blue/blue/sb-thumb.gif +0 -0
  784. data/sample/tkextlib/tile/themes/blue/blue/sb-vthumb-p.gif +0 -0
  785. data/sample/tkextlib/tile/themes/blue/blue/sb-vthumb.gif +0 -0
  786. data/sample/tkextlib/tile/themes/blue/blue/slider-p.gif +0 -0
  787. data/sample/tkextlib/tile/themes/blue/blue/slider.gif +0 -0
  788. data/sample/tkextlib/tile/themes/blue/blue/vslider-p.gif +0 -0
  789. data/sample/tkextlib/tile/themes/blue/blue/vslider.gif +0 -0
  790. data/sample/tkextlib/tile/themes/blue/pkgIndex.tcl +6 -0
  791. data/sample/tkextlib/tile/themes/keramik/keramik.tcl +194 -0
  792. data/sample/tkextlib/tile/themes/keramik/keramik/arrowdown-n.gif +0 -0
  793. data/sample/tkextlib/tile/themes/keramik/keramik/arrowdown-p.gif +0 -0
  794. data/sample/tkextlib/tile/themes/keramik/keramik/arrowleft-n.gif +0 -0
  795. data/sample/tkextlib/tile/themes/keramik/keramik/arrowleft-p.gif +0 -0
  796. data/sample/tkextlib/tile/themes/keramik/keramik/arrowright-n.gif +0 -0
  797. data/sample/tkextlib/tile/themes/keramik/keramik/arrowright-p.gif +0 -0
  798. data/sample/tkextlib/tile/themes/keramik/keramik/arrowup-n.gif +0 -0
  799. data/sample/tkextlib/tile/themes/keramik/keramik/arrowup-p.gif +0 -0
  800. data/sample/tkextlib/tile/themes/keramik/keramik/button-d.gif +0 -0
  801. data/sample/tkextlib/tile/themes/keramik/keramik/button-h.gif +0 -0
  802. data/sample/tkextlib/tile/themes/keramik/keramik/button-n.gif +0 -0
  803. data/sample/tkextlib/tile/themes/keramik/keramik/button-p.gif +0 -0
  804. data/sample/tkextlib/tile/themes/keramik/keramik/button-s.gif +0 -0
  805. data/sample/tkextlib/tile/themes/keramik/keramik/check-c.gif +0 -0
  806. data/sample/tkextlib/tile/themes/keramik/keramik/check-u.gif +0 -0
  807. data/sample/tkextlib/tile/themes/keramik/keramik/hsb-n.gif +0 -0
  808. data/sample/tkextlib/tile/themes/keramik/keramik/hsb-p.gif +0 -0
  809. data/sample/tkextlib/tile/themes/keramik/keramik/hslider-n.gif +0 -0
  810. data/sample/tkextlib/tile/themes/keramik/keramik/mbut-a.gif +0 -0
  811. data/sample/tkextlib/tile/themes/keramik/keramik/mbut-arrow-n.gif +0 -0
  812. data/sample/tkextlib/tile/themes/keramik/keramik/mbut-d.gif +0 -0
  813. data/sample/tkextlib/tile/themes/keramik/keramik/mbut-n.gif +0 -0
  814. data/sample/tkextlib/tile/themes/keramik/keramik/radio-c.gif +0 -0
  815. data/sample/tkextlib/tile/themes/keramik/keramik/radio-u.gif +0 -0
  816. data/sample/tkextlib/tile/themes/keramik/keramik/tab-n.gif +0 -0
  817. data/sample/tkextlib/tile/themes/keramik/keramik/tab-p.gif +0 -0
  818. data/sample/tkextlib/tile/themes/keramik/keramik/tbar-a.gif +0 -0
  819. data/sample/tkextlib/tile/themes/keramik/keramik/tbar-n.gif +0 -0
  820. data/sample/tkextlib/tile/themes/keramik/keramik/tbar-p.gif +0 -0
  821. data/sample/tkextlib/tile/themes/keramik/keramik/vsb-n.gif +0 -0
  822. data/sample/tkextlib/tile/themes/keramik/keramik/vsb-p.gif +0 -0
  823. data/sample/tkextlib/tile/themes/keramik/keramik/vslider-n.gif +0 -0
  824. data/sample/tkextlib/tile/themes/keramik/pkgIndex.tcl +15 -0
  825. data/sample/tkextlib/tile/themes/kroc.rb +227 -0
  826. data/sample/tkextlib/tile/themes/kroc/kroc.tcl +163 -0
  827. data/sample/tkextlib/tile/themes/kroc/kroc/button-h.gif +0 -0
  828. data/sample/tkextlib/tile/themes/kroc/kroc/button-n.gif +0 -0
  829. data/sample/tkextlib/tile/themes/kroc/kroc/button-p.gif +0 -0
  830. data/sample/tkextlib/tile/themes/kroc/kroc/check-hc.gif +0 -0
  831. data/sample/tkextlib/tile/themes/kroc/kroc/check-hu.gif +0 -0
  832. data/sample/tkextlib/tile/themes/kroc/kroc/check-nc.gif +0 -0
  833. data/sample/tkextlib/tile/themes/kroc/kroc/check-nu.gif +0 -0
  834. data/sample/tkextlib/tile/themes/kroc/kroc/radio-hc.gif +0 -0
  835. data/sample/tkextlib/tile/themes/kroc/kroc/radio-hu.gif +0 -0
  836. data/sample/tkextlib/tile/themes/kroc/kroc/radio-nc.gif +0 -0
  837. data/sample/tkextlib/tile/themes/kroc/kroc/radio-nu.gif +0 -0
  838. data/sample/tkextlib/tile/themes/kroc/pkgIndex.tcl +15 -0
  839. data/sample/tkextlib/tile/themes/plastik/pkgIndex.tcl +16 -0
  840. data/sample/tkextlib/tile/themes/plastik/plastik.tcl +125 -0
  841. data/sample/tkextlib/tile/themes/plastik/plastik/arrowdown-n.gif +0 -0
  842. data/sample/tkextlib/tile/themes/plastik/plastik/arrowdown-p.gif +0 -0
  843. data/sample/tkextlib/tile/themes/plastik/plastik/arrowleft-n.gif +0 -0
  844. data/sample/tkextlib/tile/themes/plastik/plastik/arrowleft-p.gif +0 -0
  845. data/sample/tkextlib/tile/themes/plastik/plastik/arrowright-n.gif +0 -0
  846. data/sample/tkextlib/tile/themes/plastik/plastik/arrowright-p.gif +0 -0
  847. data/sample/tkextlib/tile/themes/plastik/plastik/arrowup-n.gif +0 -0
  848. data/sample/tkextlib/tile/themes/plastik/plastik/arrowup-p.gif +0 -0
  849. data/sample/tkextlib/tile/themes/plastik/plastik/button-h.gif +0 -0
  850. data/sample/tkextlib/tile/themes/plastik/plastik/button-n.gif +0 -0
  851. data/sample/tkextlib/tile/themes/plastik/plastik/button-p.gif +0 -0
  852. data/sample/tkextlib/tile/themes/plastik/plastik/check-hc.gif +0 -0
  853. data/sample/tkextlib/tile/themes/plastik/plastik/check-hu.gif +0 -0
  854. data/sample/tkextlib/tile/themes/plastik/plastik/check-nc.gif +0 -0
  855. data/sample/tkextlib/tile/themes/plastik/plastik/check-nu.gif +0 -0
  856. data/sample/tkextlib/tile/themes/plastik/plastik/check-pc.gif +0 -0
  857. data/sample/tkextlib/tile/themes/plastik/plastik/hsb-n.gif +0 -0
  858. data/sample/tkextlib/tile/themes/plastik/plastik/hslider-n.gif +0 -0
  859. data/sample/tkextlib/tile/themes/plastik/plastik/radio-hc.gif +0 -0
  860. data/sample/tkextlib/tile/themes/plastik/plastik/radio-hu.gif +0 -0
  861. data/sample/tkextlib/tile/themes/plastik/plastik/radio-nc.gif +0 -0
  862. data/sample/tkextlib/tile/themes/plastik/plastik/radio-nu.gif +0 -0
  863. data/sample/tkextlib/tile/themes/plastik/plastik/radio-pc.gif +0 -0
  864. data/sample/tkextlib/tile/themes/plastik/plastik/vsb-n.gif +0 -0
  865. data/sample/tkextlib/tile/themes/plastik/plastik/vslider-n.gif +0 -0
  866. data/sample/tkextlib/tile/toolbutton.tcl +152 -0
  867. data/sample/tkextlib/tkHTML/Orig_COPYRIGHT.txt +12 -0
  868. data/sample/tkextlib/tkHTML/README +12 -0
  869. data/sample/tkextlib/tkHTML/hv.rb +314 -0
  870. data/sample/tkextlib/tkHTML/page1/image1 +0 -0
  871. data/sample/tkextlib/tkHTML/page1/image10 +0 -0
  872. data/sample/tkextlib/tkHTML/page1/image11 +0 -0
  873. data/sample/tkextlib/tkHTML/page1/image12 +0 -0
  874. data/sample/tkextlib/tkHTML/page1/image13 +0 -0
  875. data/sample/tkextlib/tkHTML/page1/image14 +0 -0
  876. data/sample/tkextlib/tkHTML/page1/image2 +0 -0
  877. data/sample/tkextlib/tkHTML/page1/image3 +0 -0
  878. data/sample/tkextlib/tkHTML/page1/image4 +0 -0
  879. data/sample/tkextlib/tkHTML/page1/image5 +0 -0
  880. data/sample/tkextlib/tkHTML/page1/image6 +0 -0
  881. data/sample/tkextlib/tkHTML/page1/image7 +0 -0
  882. data/sample/tkextlib/tkHTML/page1/image8 +0 -0
  883. data/sample/tkextlib/tkHTML/page1/image9 +0 -0
  884. data/sample/tkextlib/tkHTML/page1/index.html +115 -0
  885. data/sample/tkextlib/tkHTML/page2/image1 +0 -0
  886. data/sample/tkextlib/tkHTML/page2/image10 +0 -0
  887. data/sample/tkextlib/tkHTML/page2/image11 +0 -0
  888. data/sample/tkextlib/tkHTML/page2/image12 +0 -0
  889. data/sample/tkextlib/tkHTML/page2/image13 +0 -0
  890. data/sample/tkextlib/tkHTML/page2/image14 +0 -0
  891. data/sample/tkextlib/tkHTML/page2/image15 +0 -0
  892. data/sample/tkextlib/tkHTML/page2/image16 +0 -0
  893. data/sample/tkextlib/tkHTML/page2/image17 +0 -0
  894. data/sample/tkextlib/tkHTML/page2/image18 +0 -0
  895. data/sample/tkextlib/tkHTML/page2/image19 +0 -0
  896. data/sample/tkextlib/tkHTML/page2/image2 +0 -0
  897. data/sample/tkextlib/tkHTML/page2/image20 +0 -0
  898. data/sample/tkextlib/tkHTML/page2/image21 +0 -0
  899. data/sample/tkextlib/tkHTML/page2/image22 +0 -0
  900. data/sample/tkextlib/tkHTML/page2/image23 +0 -0
  901. data/sample/tkextlib/tkHTML/page2/image24 +0 -0
  902. data/sample/tkextlib/tkHTML/page2/image25 +0 -0
  903. data/sample/tkextlib/tkHTML/page2/image26 +0 -0
  904. data/sample/tkextlib/tkHTML/page2/image27 +0 -0
  905. data/sample/tkextlib/tkHTML/page2/image28 +0 -0
  906. data/sample/tkextlib/tkHTML/page2/image29 +0 -0
  907. data/sample/tkextlib/tkHTML/page2/image3 +0 -0
  908. data/sample/tkextlib/tkHTML/page2/image30 +0 -0
  909. data/sample/tkextlib/tkHTML/page2/image31 +0 -0
  910. data/sample/tkextlib/tkHTML/page2/image32 +0 -0
  911. data/sample/tkextlib/tkHTML/page2/image33 +0 -0
  912. data/sample/tkextlib/tkHTML/page2/image34 +0 -0
  913. data/sample/tkextlib/tkHTML/page2/image35 +0 -0
  914. data/sample/tkextlib/tkHTML/page2/image36 +0 -0
  915. data/sample/tkextlib/tkHTML/page2/image37 +0 -0
  916. data/sample/tkextlib/tkHTML/page2/image38 +0 -0
  917. data/sample/tkextlib/tkHTML/page2/image39 +0 -0
  918. data/sample/tkextlib/tkHTML/page2/image4 +0 -0
  919. data/sample/tkextlib/tkHTML/page2/image5 +0 -0
  920. data/sample/tkextlib/tkHTML/page2/image6 +0 -0
  921. data/sample/tkextlib/tkHTML/page2/image7 +0 -0
  922. data/sample/tkextlib/tkHTML/page2/image8 +0 -0
  923. data/sample/tkextlib/tkHTML/page2/image9 +0 -0
  924. data/sample/tkextlib/tkHTML/page2/index.html +433 -0
  925. data/sample/tkextlib/tkHTML/page3/image1 +0 -0
  926. data/sample/tkextlib/tkHTML/page3/image10 +0 -0
  927. data/sample/tkextlib/tkHTML/page3/image11 +0 -0
  928. data/sample/tkextlib/tkHTML/page3/image12 +0 -0
  929. data/sample/tkextlib/tkHTML/page3/image13 +0 -0
  930. data/sample/tkextlib/tkHTML/page3/image14 +0 -0
  931. data/sample/tkextlib/tkHTML/page3/image2 +0 -0
  932. data/sample/tkextlib/tkHTML/page3/image3 +0 -0
  933. data/sample/tkextlib/tkHTML/page3/image4 +0 -0
  934. data/sample/tkextlib/tkHTML/page3/image5 +0 -0
  935. data/sample/tkextlib/tkHTML/page3/image6 +0 -0
  936. data/sample/tkextlib/tkHTML/page3/image7 +0 -0
  937. data/sample/tkextlib/tkHTML/page3/image8 +0 -0
  938. data/sample/tkextlib/tkHTML/page3/image9 +0 -0
  939. data/sample/tkextlib/tkHTML/page3/index.html +2787 -0
  940. data/sample/tkextlib/tkHTML/page4/image1 +0 -0
  941. data/sample/tkextlib/tkHTML/page4/image2 +0 -0
  942. data/sample/tkextlib/tkHTML/page4/image3 +0 -0
  943. data/sample/tkextlib/tkHTML/page4/image4 +0 -0
  944. data/sample/tkextlib/tkHTML/page4/image5 +0 -0
  945. data/sample/tkextlib/tkHTML/page4/image6 +0 -0
  946. data/sample/tkextlib/tkHTML/page4/image7 +0 -0
  947. data/sample/tkextlib/tkHTML/page4/image8 +0 -0
  948. data/sample/tkextlib/tkHTML/page4/image9 +0 -0
  949. data/sample/tkextlib/tkHTML/page4/index.html +768 -0
  950. data/sample/tkextlib/tkHTML/ss.rb +437 -0
  951. data/sample/tkextlib/tkimg/demo.rb +1479 -0
  952. data/sample/tkextlib/tkimg/license_terms_of_Img_extension +41 -0
  953. data/sample/tkextlib/tkimg/readme.txt +3 -0
  954. data/sample/tkextlib/tktable/Orig_LICENSE.txt +52 -0
  955. data/sample/tkextlib/tktable/basic.rb +61 -0
  956. data/sample/tkextlib/tktable/buttons.rb +77 -0
  957. data/sample/tkextlib/tktable/command.rb +90 -0
  958. data/sample/tkextlib/tktable/debug.rb +102 -0
  959. data/sample/tkextlib/tktable/dynarows.rb +100 -0
  960. data/sample/tkextlib/tktable/maxsize.rb +68 -0
  961. data/sample/tkextlib/tktable/spreadsheet.rb +138 -0
  962. data/sample/tkextlib/tktable/tcllogo.gif +0 -0
  963. data/sample/tkextlib/tktable/valid.rb +89 -0
  964. data/sample/tkextlib/treectrl/bitmaps.rb +77 -0
  965. data/sample/tkextlib/treectrl/demo.rb +1306 -0
  966. data/sample/tkextlib/treectrl/explorer.rb +431 -0
  967. data/sample/tkextlib/treectrl/help.rb +405 -0
  968. data/sample/tkextlib/treectrl/imovie.rb +131 -0
  969. data/sample/tkextlib/treectrl/layout.rb +160 -0
  970. data/sample/tkextlib/treectrl/mailwasher.rb +270 -0
  971. data/sample/tkextlib/treectrl/outlook-folders.rb +125 -0
  972. data/sample/tkextlib/treectrl/outlook-newgroup.rb +449 -0
  973. data/sample/tkextlib/treectrl/pics/big-dll.gif +0 -0
  974. data/sample/tkextlib/treectrl/pics/big-exe.gif +0 -0
  975. data/sample/tkextlib/treectrl/pics/big-file.gif +0 -0
  976. data/sample/tkextlib/treectrl/pics/big-folder.gif +0 -0
  977. data/sample/tkextlib/treectrl/pics/big-txt.gif +0 -0
  978. data/sample/tkextlib/treectrl/pics/checked.gif +0 -0
  979. data/sample/tkextlib/treectrl/pics/file.gif +0 -0
  980. data/sample/tkextlib/treectrl/pics/folder-closed.gif +0 -0
  981. data/sample/tkextlib/treectrl/pics/folder-open.gif +0 -0
  982. data/sample/tkextlib/treectrl/pics/help-book-closed.gif +0 -0
  983. data/sample/tkextlib/treectrl/pics/help-book-open.gif +0 -0
  984. data/sample/tkextlib/treectrl/pics/help-page.gif +0 -0
  985. data/sample/tkextlib/treectrl/pics/imovie-01.gif +0 -0
  986. data/sample/tkextlib/treectrl/pics/imovie-02.gif +0 -0
  987. data/sample/tkextlib/treectrl/pics/imovie-03.gif +0 -0
  988. data/sample/tkextlib/treectrl/pics/imovie-04.gif +0 -0
  989. data/sample/tkextlib/treectrl/pics/imovie-05.gif +0 -0
  990. data/sample/tkextlib/treectrl/pics/imovie-06.gif +0 -0
  991. data/sample/tkextlib/treectrl/pics/imovie-07.gif +0 -0
  992. data/sample/tkextlib/treectrl/pics/internet-check-off.gif +0 -0
  993. data/sample/tkextlib/treectrl/pics/internet-check-on.gif +0 -0
  994. data/sample/tkextlib/treectrl/pics/internet-print.gif +0 -0
  995. data/sample/tkextlib/treectrl/pics/internet-radio-off.gif +0 -0
  996. data/sample/tkextlib/treectrl/pics/internet-radio-on.gif +0 -0
  997. data/sample/tkextlib/treectrl/pics/internet-search.gif +0 -0
  998. data/sample/tkextlib/treectrl/pics/internet-security.gif +0 -0
  999. data/sample/tkextlib/treectrl/pics/mac-collapse.gif +0 -0
  1000. data/sample/tkextlib/treectrl/pics/mac-expand.gif +0 -0
  1001. data/sample/tkextlib/treectrl/pics/outlook-arrow.gif +0 -0
  1002. data/sample/tkextlib/treectrl/pics/outlook-clip.gif +0 -0
  1003. data/sample/tkextlib/treectrl/pics/outlook-deleted.gif +0 -0
  1004. data/sample/tkextlib/treectrl/pics/outlook-draft.gif +0 -0
  1005. data/sample/tkextlib/treectrl/pics/outlook-folder.gif +0 -0
  1006. data/sample/tkextlib/treectrl/pics/outlook-group.gif +0 -0
  1007. data/sample/tkextlib/treectrl/pics/outlook-inbox.gif +0 -0
  1008. data/sample/tkextlib/treectrl/pics/outlook-local.gif +0 -0
  1009. data/sample/tkextlib/treectrl/pics/outlook-main.gif +0 -0
  1010. data/sample/tkextlib/treectrl/pics/outlook-outbox.gif +0 -0
  1011. data/sample/tkextlib/treectrl/pics/outlook-read-2.gif +0 -0
  1012. data/sample/tkextlib/treectrl/pics/outlook-read.gif +0 -0
  1013. data/sample/tkextlib/treectrl/pics/outlook-sent.gif +0 -0
  1014. data/sample/tkextlib/treectrl/pics/outlook-server.gif +0 -0
  1015. data/sample/tkextlib/treectrl/pics/outlook-unread.gif +0 -0
  1016. data/sample/tkextlib/treectrl/pics/outlook-watch.gif +0 -0
  1017. data/sample/tkextlib/treectrl/pics/sky.gif +0 -0
  1018. data/sample/tkextlib/treectrl/pics/small-dll.gif +0 -0
  1019. data/sample/tkextlib/treectrl/pics/small-exe.gif +0 -0
  1020. data/sample/tkextlib/treectrl/pics/small-file.gif +0 -0
  1021. data/sample/tkextlib/treectrl/pics/small-folder.gif +0 -0
  1022. data/sample/tkextlib/treectrl/pics/small-txt.gif +0 -0
  1023. data/sample/tkextlib/treectrl/pics/unchecked.gif +0 -0
  1024. data/sample/tkextlib/treectrl/random.rb +509 -0
  1025. data/sample/tkextlib/treectrl/readme.txt +2 -0
  1026. data/sample/tkextlib/treectrl/www-options.rb +304 -0
  1027. data/sample/tkextlib/vu/Orig_LICENSE.txt +51 -0
  1028. data/sample/tkextlib/vu/README.txt +50 -0
  1029. data/sample/tkextlib/vu/canvItems.rb +91 -0
  1030. data/sample/tkextlib/vu/canvSticker.rb +83 -0
  1031. data/sample/tkextlib/vu/canvSticker2.rb +102 -0
  1032. data/sample/tkextlib/vu/dial_demo.rb +114 -0
  1033. data/sample/tkextlib/vu/m128_000.xbm +174 -0
  1034. data/sample/tkextlib/vu/oscilloscope.rb +69 -0
  1035. data/sample/tkextlib/vu/pie.rb +57 -0
  1036. data/sample/tkextlib/vu/vu_demo.rb +68 -0
  1037. data/sample/tkfrom.rb +133 -0
  1038. data/sample/tkhello.rb +11 -0
  1039. data/sample/tkline.rb +48 -0
  1040. data/sample/tkmenubutton.rb +136 -0
  1041. data/sample/tkmsgcat-load_rb.rb +103 -0
  1042. data/sample/tkmsgcat-load_rb2.rb +103 -0
  1043. data/sample/tkmsgcat-load_tk.rb +119 -0
  1044. data/sample/tkmulticolumnlist.rb +744 -0
  1045. data/sample/tkmultilistbox.rb +655 -0
  1046. data/sample/tkmultilistframe.rb +941 -0
  1047. data/sample/tkoptdb-safeTk.rb +74 -0
  1048. data/sample/tkoptdb.rb +107 -0
  1049. data/sample/tkrttimer.rb +78 -0
  1050. data/sample/tksleep_sample.rb +30 -0
  1051. data/sample/tktextframe.rb +282 -0
  1052. data/sample/tktextio.rb +1061 -0
  1053. data/sample/tktimer.rb +51 -0
  1054. data/sample/tktimer2.rb +48 -0
  1055. data/sample/tktimer3.rb +60 -0
  1056. data/sample/tktree.rb +104 -0
  1057. data/sample/tktree.tcl +305 -0
  1058. data/sample/ttk_wrapper.rb +155 -0
  1059. data/tk.gemspec +24 -0
  1060. metadata +1144 -0
@@ -0,0 +1,30 @@
1
+ README this file
2
+ multi-tk.rb multiple Tk interpreter (included safe-Tk) support
3
+ remotei-tk.rb control remote Tk interpreter on the other process support
4
+ tk.rb Tk interface
5
+
6
+ tk/ library files construct Ruby/Tk
7
+
8
+ tkextlib/ non-standard Tcl/Tk extension support libraries
9
+
10
+ *********************************************************************
11
+ *** The followings exists for backward compatibility only.
12
+ *** The only thing which they work is that requires current
13
+ *** library files ( tk/*.rb ).
14
+ *********************************************************************
15
+ tkafter.rb handles Tcl after
16
+ tkbgerror.rb Tk error module
17
+ tkcanvas.rb Tk canvas interface
18
+ tkclass.rb provides generic names for Tk classes
19
+ tkconsole.rb console command support
20
+ tkdialog.rb Tk dialog class
21
+ tkentry.rb Tk entry class
22
+ tkfont.rb Tk font support
23
+ tkmacpkg.rb Mac resource support
24
+ tkmenubar.rb TK menubar utility
25
+ tkmngfocus.rb focus manager
26
+ tkpalette.rb palette support
27
+ tkscrollbox.rb scroll box, also example of compound widget
28
+ tktext.rb text classes
29
+ tkvirtevent.rb virtual event support
30
+ tkwinpkg.rb Win DDE and registry support
@@ -0,0 +1,3743 @@
1
+ # frozen_string_literal: false
2
+ #
3
+ # multi-tk.rb - supports multi Tk interpreters
4
+ # by Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
5
+
6
+ require 'tcltklib'
7
+ require 'tkutil'
8
+ require 'thread'
9
+
10
+ if defined? Tk
11
+ fail RuntimeError,"'multi-tk' library must be required before requiring 'tk'"
12
+ end
13
+
14
+ ################################################
15
+ # ignore exception on the mainloop?
16
+
17
+ TclTkLib.mainloop_abort_on_exception = true
18
+ # TclTkLib.mainloop_abort_on_exception = false
19
+ # TclTkLib.mainloop_abort_on_exception = nil
20
+
21
+
22
+ ################################################
23
+ # add ThreadGroup check to TclTkIp.new
24
+ class << TclTkIp
25
+ alias __new__ new
26
+ private :__new__
27
+
28
+ def new(*args)
29
+ if Thread.current.group != ThreadGroup::Default
30
+ raise SecurityError, 'only ThreadGroup::Default can call TclTkIp.new'
31
+ end
32
+ obj = __new__(*args)
33
+ obj.instance_eval{
34
+ @force_default_encoding ||= TkUtil.untrust([false])
35
+ @encoding ||= TkUtil.untrust([nil])
36
+ def @encoding.to_s; self.join(nil); end
37
+ }
38
+ obj
39
+ end
40
+ end
41
+
42
+
43
+ ################################################
44
+ # exception to treat the return value from IP
45
+ class MultiTkIp_OK < Exception
46
+ def self.send(thread, ret=nil)
47
+ thread.raise self.new(ret)
48
+ end
49
+
50
+ def initialize(ret=nil)
51
+ super('succeed')
52
+ @return_value = ret
53
+ end
54
+
55
+ attr_reader :return_value
56
+ alias value return_value
57
+ end
58
+ MultiTkIp_OK.freeze
59
+
60
+
61
+ ################################################
62
+ # methods for construction
63
+ class MultiTkIp
64
+ class Command_Queue < Queue
65
+ def initialize(interp)
66
+ @interp = interp
67
+ super()
68
+ end
69
+
70
+ def push(value)
71
+ if !@interp || @interp.deleted?
72
+ fail RuntimeError, "Tk interpreter is already deleted"
73
+ end
74
+ super(value)
75
+ end
76
+ alias << push
77
+ alias enq push
78
+
79
+ def close
80
+ @interp = nil
81
+ end
82
+ end
83
+ Command_Queue.freeze
84
+
85
+ BASE_DIR = File.dirname(__FILE__)
86
+
87
+ WITH_RUBY_VM = Object.const_defined?(:RubyVM) && ::RubyVM.class == Class
88
+ WITH_ENCODING = defined?(::Encoding.default_external)
89
+ #WITH_ENCODING = Object.const_defined?(:Encoding) && ::Encoding.class == Class
90
+
91
+ (@@SLAVE_IP_ID = ['slave'.freeze, TkUtil.untrust('0')]).instance_eval{
92
+ @mutex = Mutex.new
93
+ def mutex; @mutex; end
94
+ freeze
95
+ }
96
+
97
+ @@IP_TABLE = TkUtil.untrust({}) unless defined?(@@IP_TABLE)
98
+
99
+ @@INIT_IP_ENV = TkUtil.untrust([]) unless defined?(@@INIT_IP_ENV) # table of Procs
100
+ @@ADD_TK_PROCS = TkUtil.untrust([]) unless defined?(@@ADD_TK_PROCS) # table of [name, args, body]
101
+
102
+ @@TK_TABLE_LIST = TkUtil.untrust([]) unless defined?(@@TK_TABLE_LIST)
103
+
104
+ unless defined?(@@TK_CMD_TBL)
105
+ @@TK_CMD_TBL = TkUtil.untrust(Object.new)
106
+
107
+ # @@TK_CMD_TBL.instance_variable_set('@tbl', {}.taint)
108
+ tbl_obj = TkUtil.untrust(Hash.new{|hash,key|
109
+ fail IndexError, "unknown command ID '#{key}'"
110
+ })
111
+ @@TK_CMD_TBL.instance_variable_set('@tbl', tbl_obj)
112
+
113
+ class << @@TK_CMD_TBL
114
+ allow = [
115
+ '__send__', '__id__', 'freeze', 'inspect', 'kind_of?', 'object_id',
116
+ '[]', '[]=', 'delete', 'each', 'has_key?'
117
+ ]
118
+ instance_methods.each{|m| undef_method(m) unless allow.index(m.to_s)}
119
+
120
+ def kind_of?(klass)
121
+ @tbl.kind_of?(klass)
122
+ end
123
+
124
+ def inspect
125
+ if Thread.current.group == ThreadGroup::Default
126
+ @tbl.inspect
127
+ else
128
+ ip = MultiTkIp.__getip
129
+ @tbl.reject{|idx, ent| ent.respond_to?(:ip) && ent.ip != ip}.inspect
130
+ end
131
+ end
132
+
133
+ def [](idx)
134
+ return unless (ent = @tbl[idx])
135
+ if Thread.current.group == ThreadGroup::Default
136
+ ent
137
+ elsif ent.respond_to?(:ip)
138
+ (ent.ip == MultiTkIp.__getip)? ent: nil
139
+ else
140
+ ent
141
+ end
142
+ end
143
+
144
+ def []=(idx,val)
145
+ if self.has_key?(idx) && Thread.current.group != ThreadGroup::Default
146
+ fail SecurityError,"cannot change the entried command"
147
+ end
148
+ @tbl[idx] = val
149
+ end
150
+
151
+ def delete(idx, &blk)
152
+ # if gets an entry, is permitted to delete
153
+ if self[idx]
154
+ @tbl.delete(idx)
155
+ elsif blk
156
+ blk.call(idx)
157
+ else
158
+ nil
159
+ end
160
+ end
161
+
162
+ def each(&blk)
163
+ if Thread.current.group == ThreadGroup::Default
164
+ @tbl.each(&blk)
165
+ else
166
+ ip = MultiTkIp.__getip
167
+ @tbl.each{|idx, ent|
168
+ blk.call(idx, ent) unless ent.respond_to?(:ip) && ent.ip != ip
169
+ }
170
+ end
171
+ self
172
+ end
173
+
174
+ def has_key?(k)
175
+ @tbl.has_key?(k)
176
+ end
177
+ alias include? has_key?
178
+ alias key? has_key?
179
+ alias member? has_key?
180
+ end
181
+
182
+ @@TK_CMD_TBL.freeze
183
+ end
184
+
185
+ ######################################
186
+
187
+ @@CB_ENTRY_CLASS = Class.new(TkCallbackEntry){
188
+ def initialize(ip, cmd)
189
+ @ip = ip
190
+ @safe = safe = $SAFE
191
+ # @cmd = cmd
192
+ cmd = MultiTkIp._proc_on_safelevel(&cmd)
193
+ @cmd = proc{|*args| cmd.call(safe, *args)}
194
+ self.freeze
195
+ end
196
+ attr_reader :ip, :cmd
197
+ def inspect
198
+ cmd.inspect
199
+ end
200
+ def call(*args)
201
+ unless @ip.deleted?
202
+ current = Thread.current
203
+ backup_ip = current[:callback_ip]
204
+ current[:callback_ip] = @ip
205
+ begin
206
+ ret = @ip.cb_eval(@cmd, *args)
207
+ fail ret if ret.kind_of?(Exception)
208
+ ret
209
+ rescue TkCallbackBreak, TkCallbackContinue => e
210
+ fail e
211
+ rescue SecurityError => e
212
+ # in 'exit', 'exit!', and 'abort' : security error --> delete IP
213
+ if e.backtrace[0] =~ /^(.+?):(\d+):in `(exit|exit!|abort)'/
214
+ @ip.delete
215
+ elsif @ip.safe?
216
+ if @ip.respond_to?(:cb_error)
217
+ @ip.cb_error(e)
218
+ else
219
+ nil # ignore
220
+ end
221
+ else
222
+ fail e
223
+ end
224
+ rescue Exception => e
225
+ fail e if e.message =~ /^TkCallback/
226
+
227
+ if @ip.safe?
228
+ if @ip.respond_to?(:cb_error)
229
+ @ip.cb_error(e)
230
+ else
231
+ nil # ignore
232
+ end
233
+ else
234
+ fail e
235
+ end
236
+ ensure
237
+ current[:callback_ip] = backup_ip
238
+ end
239
+ end
240
+ end
241
+ }.freeze
242
+
243
+ ######################################
244
+
245
+ def _keys2opts(src_keys)
246
+ return nil if src_keys == nil
247
+ keys = {}; src_keys.each{|k, v| keys[k.to_s] = v}
248
+ #keys.collect{|k,v| "-#{k} #{v}"}.join(' ')
249
+ keys.collect{|k,v| "-#{k} #{TclTkLib._conv_listelement(TkComm::_get_eval_string(v))}"}.join(' ')
250
+ end
251
+ private :_keys2opts
252
+
253
+ def _check_and_return(thread, exception, wait=0)
254
+ unless thread
255
+ unless exception.kind_of?(MultiTkIp_OK)
256
+ msg = "#{exception.class}: #{exception.message}"
257
+
258
+ if @interp.deleted?
259
+ warn("Warning (#{self}): " + msg)
260
+ return nil
261
+ end
262
+
263
+ if safe?
264
+ warn("Warning (#{self}): " + msg) if $DEBUG
265
+ return nil
266
+ end
267
+
268
+ begin
269
+ @interp._eval_without_enc(@interp._merge_tklist('bgerror', msg))
270
+ rescue Exception => e
271
+ warn("Warning (#{self}): " + msg)
272
+ end
273
+ end
274
+ return nil
275
+ end
276
+
277
+ if wait == 0
278
+ # no wait
279
+ Thread.pass
280
+ if thread.stop?
281
+ thread.raise exception
282
+ end
283
+ return thread
284
+ end
285
+
286
+ # wait to stop the caller thread
287
+ wait.times{
288
+ if thread.stop?
289
+ # ready to send exception
290
+ thread.raise exception
291
+ return thread
292
+ end
293
+
294
+ # wait
295
+ Thread.pass
296
+ }
297
+
298
+ # unexpected error
299
+ thread.raise RuntimeError, "the thread may not wait for the return value"
300
+ return thread
301
+ end
302
+
303
+ ######################################
304
+
305
+ def set_cb_error(cmd = Proc.new)
306
+ @cb_error_proc[0] = cmd
307
+ end
308
+
309
+ def cb_error(e)
310
+ if @cb_error_proc[0].respond_to?(:call)
311
+ @cb_error_proc[0].call(e)
312
+ end
313
+ end
314
+
315
+ ######################################
316
+
317
+ def set_safe_level(safe)
318
+ if safe > @safe_level[0]
319
+ @safe_level[0] = safe
320
+ @cmd_queue.enq([@system, 'set_safe_level', safe])
321
+ end
322
+ @safe_level[0]
323
+ end
324
+ def safe_level=(safe)
325
+ set_safe_level(safe)
326
+ end
327
+ def self.set_safe_level(safe)
328
+ __getip.set_safe_level(safe)
329
+ end
330
+ def self.safe_level=(safe)
331
+ self.set_safe_level(safe)
332
+ end
333
+ def safe_level
334
+ @safe_level[0]
335
+ end
336
+ def self.safe_level
337
+ __getip.safe_level
338
+ end
339
+
340
+ def wait_on_mainloop?
341
+ @wait_on_mainloop[0]
342
+ end
343
+ def wait_on_mainloop=(bool)
344
+ @wait_on_mainloop[0] = bool
345
+ end
346
+
347
+ def running_mainloop?
348
+ @wait_on_mainloop[1] > 0
349
+ end
350
+
351
+ def _destroy_slaves_of_slaveIP(ip)
352
+ unless ip.deleted?
353
+ # ip._split_tklist(ip._invoke('interp', 'slaves')).each{|name|
354
+ ip._split_tklist(ip._invoke_without_enc('interp', 'slaves')).each{|name|
355
+ name = _fromUTF8(name)
356
+ begin
357
+ # ip._eval_without_enc("#{name} eval {foreach i [after info] {after cancel $i}}")
358
+ after_ids = ip._eval_without_enc("#{name} eval {after info}")
359
+ ip._eval_without_enc("#{name} eval {foreach i {#{after_ids}} {after cancel $i}}")
360
+ rescue Exception
361
+ end
362
+ begin
363
+ # ip._invoke('interp', 'eval', name, 'destroy', '.')
364
+ ip._invoke(name, 'eval', 'destroy', '.')
365
+ rescue Exception
366
+ end
367
+
368
+ # safe_base?
369
+ if ip._eval_without_enc("catch {::safe::interpConfigure #{name}}") == '0'
370
+ begin
371
+ ip._eval_without_enc("::safe::interpDelete #{name}")
372
+ rescue Exception
373
+ end
374
+ end
375
+ =begin
376
+ if ip._invoke('interp', 'exists', name) == '1'
377
+ begin
378
+ ip._invoke(name, 'eval', 'exit')
379
+ rescue Exception
380
+ end
381
+ end
382
+ =end
383
+ unless ip.deleted?
384
+ if ip._invoke('interp', 'exists', name) == '1'
385
+ begin
386
+ ip._invoke('interp', 'delete', name)
387
+ rescue Exception
388
+ end
389
+ end
390
+ end
391
+ }
392
+ end
393
+ end
394
+
395
+ def _receiver_eval_proc_core(safe_level, thread, cmd, *args)
396
+ begin
397
+ #ret = proc{$SAFE = safe_level; cmd.call(*args)}.call
398
+ #ret = cmd.call(safe_level, *args)
399
+ normal_ret = false
400
+ ret = catch(:IRB_EXIT) do # IRB hack
401
+ retval = cmd.call(safe_level, *args)
402
+ normal_ret = true
403
+ retval
404
+ end
405
+ unless normal_ret
406
+ # catch IRB_EXIT
407
+ exit(ret)
408
+ end
409
+ ret
410
+ rescue SystemExit => e
411
+ # delete IP
412
+ unless @interp.deleted?
413
+ @slave_ip_tbl.each{|name, subip|
414
+ _destroy_slaves_of_slaveIP(subip)
415
+ begin
416
+ # subip._eval_without_enc("foreach i [after info] {after cancel $i}")
417
+ after_ids = subip._eval_without_enc("after info")
418
+ subip._eval_without_enc("foreach i {#{after_ids}} {after cancel $i}")
419
+ rescue Exception
420
+ end
421
+ =begin
422
+ begin
423
+ subip._invoke('destroy', '.') unless subip.deleted?
424
+ rescue Exception
425
+ end
426
+ =end
427
+ # safe_base?
428
+ if @interp._eval_without_enc("catch {::safe::interpConfigure #{name}}") == '0'
429
+ begin
430
+ @interp._eval_without_enc("::safe::interpDelete #{name}")
431
+ rescue Exception
432
+ else
433
+ next if subip.deleted?
434
+ end
435
+ end
436
+ if subip.respond_to?(:safe_base?) && subip.safe_base? &&
437
+ !subip.deleted?
438
+ # do 'exit' to call the delete_hook procedure
439
+ begin
440
+ subip._eval_without_enc('exit')
441
+ rescue Exception
442
+ end
443
+ else
444
+ begin
445
+ subip.delete unless subip.deleted?
446
+ rescue Exception
447
+ end
448
+ end
449
+ }
450
+
451
+ begin
452
+ # @interp._eval_without_enc("foreach i [after info] {after cancel $i}")
453
+ after_ids = @interp._eval_without_enc("after info")
454
+ @interp._eval_without_enc("foreach i {#{after_ids}} {after cancel $i}")
455
+ rescue Exception
456
+ end
457
+ begin
458
+ @interp._invoke('destroy', '.') unless @interp.deleted?
459
+ rescue Exception
460
+ end
461
+ if @safe_base && !@interp.deleted?
462
+ # do 'exit' to call the delete_hook procedure
463
+ @interp._eval_without_enc('exit')
464
+ else
465
+ @interp.delete unless @interp.deleted?
466
+ end
467
+ end
468
+
469
+ if e.backtrace[0] =~ /^(.+?):(\d+):in `(exit|exit!|abort)'/
470
+ _check_and_return(thread, MultiTkIp_OK.new($3 == 'exit'))
471
+ else
472
+ _check_and_return(thread, MultiTkIp_OK.new(nil))
473
+ end
474
+
475
+ # if master? && !safe? && allow_ruby_exit?
476
+ if !@interp.deleted? && master? && !safe? && allow_ruby_exit?
477
+ =begin
478
+ ObjectSpace.each_object(TclTkIp){|obj|
479
+ obj.delete unless obj.deleted?
480
+ }
481
+ =end
482
+ #exit(e.status)
483
+ fail e
484
+ end
485
+ # break
486
+
487
+ rescue SecurityError => e
488
+ # in 'exit', 'exit!', and 'abort' : security error --> delete IP
489
+ if e.backtrace[0] =~ /^(.+?):(\d+):in `(exit|exit!|abort)'/
490
+ ret = ($3 == 'exit')
491
+ unless @interp.deleted?
492
+ @slave_ip_tbl.each{|name, subip|
493
+ _destroy_slaves_of_slaveIP(subip)
494
+ begin
495
+ # subip._eval_without_enc("foreach i [after info] {after cancel $i}")
496
+ after_ids = subip._eval_without_enc("after info")
497
+ subip._eval_without_enc("foreach i {#{after_ids}} {after cancel $i}")
498
+ rescue Exception
499
+ end
500
+ =begin
501
+ begin
502
+ subip._invoke('destroy', '.') unless subip.deleted?
503
+ rescue Exception
504
+ end
505
+ =end
506
+ # safe_base?
507
+ if @interp._eval_without_enc("catch {::safe::interpConfigure #{name}}") == '0'
508
+ begin
509
+ @interp._eval_without_enc("::safe::interpDelete #{name}")
510
+ rescue Exception
511
+ else
512
+ next if subip.deleted?
513
+ end
514
+ end
515
+ if subip.respond_to?(:safe_base?) && subip.safe_base? &&
516
+ !subip.deleted?
517
+ # do 'exit' to call the delete_hook procedure
518
+ begin
519
+ subip._eval_without_enc('exit')
520
+ rescue Exception
521
+ end
522
+ else
523
+ begin
524
+ subip.delete unless subip.deleted?
525
+ rescue Exception
526
+ end
527
+ end
528
+ }
529
+
530
+ begin
531
+ # @interp._eval_without_enc("foreach i [after info] {after cancel $i}")
532
+ after_ids = @interp._eval_without_enc("after info")
533
+ @interp._eval_without_enc("foreach i {#{after_ids}} {after cancel $i}")
534
+ rescue Exception
535
+ end
536
+ =begin
537
+ begin
538
+ @interp._invoke('destroy', '.') unless @interp.deleted?
539
+ rescue Exception
540
+ end
541
+ =end
542
+ if @safe_base && !@interp.deleted?
543
+ # do 'exit' to call the delete_hook procedure
544
+ @interp._eval_without_enc('exit')
545
+ else
546
+ @interp.delete unless @interp.deleted?
547
+ end
548
+ end
549
+ _check_and_return(thread, MultiTkIp_OK.new(ret))
550
+ # break
551
+
552
+ else
553
+ # raise security error
554
+ _check_and_return(thread, e)
555
+ end
556
+
557
+ rescue Exception => e
558
+ # raise exception
559
+ begin
560
+ bt = _toUTF8(e.backtrace.join("\n"))
561
+ if MultiTkIp::WITH_ENCODING
562
+ bt.force_encoding('utf-8')
563
+ else
564
+ bt.instance_variable_set(:@encoding, 'utf-8')
565
+ end
566
+ rescue Exception
567
+ bt = e.backtrace.join("\n")
568
+ end
569
+ begin
570
+ @interp._set_global_var('errorInfo', bt)
571
+ rescue Exception
572
+ end
573
+ _check_and_return(thread, e)
574
+
575
+ else
576
+ # no exception
577
+ _check_and_return(thread, MultiTkIp_OK.new(ret))
578
+ end
579
+ end
580
+
581
+ def _receiver_eval_proc(last_thread, safe_level, thread, cmd, *args)
582
+ if thread
583
+ Thread.new{
584
+ last_thread.join if last_thread
585
+ unless @interp.deleted?
586
+ _receiver_eval_proc_core(safe_level, thread, cmd, *args)
587
+ end
588
+ }
589
+ else
590
+ Thread.new{
591
+ unless @interp.deleted?
592
+ _receiver_eval_proc_core(safe_level, thread, cmd, *args)
593
+ end
594
+ }
595
+ last_thread
596
+ end
597
+ end
598
+
599
+ private :_receiver_eval_proc, :_receiver_eval_proc_core
600
+
601
+ def _receiver_mainloop(check_root)
602
+ if @evloop_thread[0] && @evloop_thread[0].alive?
603
+ @evloop_thread[0]
604
+ else
605
+ @evloop_thread[0] = Thread.new{
606
+ while !@interp.deleted?
607
+ #if check_root
608
+ # inf = @interp._invoke_without_enc('info', 'command', '.')
609
+ # break if !inf.kind_of?(String) || inf != '.'
610
+ #end
611
+ break if check_root && !@interp.has_mainwindow?
612
+ sleep 0.5
613
+ end
614
+ }
615
+ @evloop_thread[0]
616
+ end
617
+ end
618
+
619
+ def _create_receiver_and_watchdog(lvl = $SAFE)
620
+ lvl = $SAFE if lvl < $SAFE
621
+
622
+ # command-procedures receiver
623
+ receiver = Thread.new(lvl){|safe_level|
624
+ last_thread = {}
625
+
626
+ loop do
627
+ break if @interp.deleted?
628
+ thread, cmd, *args = @cmd_queue.deq
629
+ if thread == @system
630
+ # control command
631
+ case cmd
632
+ when 'set_safe_level'
633
+ begin
634
+ safe_level = args[0] if safe_level < args[0]
635
+ rescue Exception
636
+ end
637
+ when 'call_mainloop'
638
+ thread = args.shift
639
+ _check_and_return(thread,
640
+ MultiTkIp_OK.new(_receiver_mainloop(*args)))
641
+ else
642
+ # ignore
643
+ end
644
+
645
+ else
646
+ # procedure
647
+ last_thread[thread] = _receiver_eval_proc(last_thread[thread],
648
+ safe_level, thread,
649
+ cmd, *args)
650
+ end
651
+ end
652
+ }
653
+
654
+ # watchdog of receiver
655
+ watchdog = Thread.new{
656
+ begin
657
+ loop do
658
+ sleep 1
659
+ if @interp.deleted?
660
+ receiver.kill
661
+ @cmd_queue.close
662
+ end
663
+ break unless receiver.alive?
664
+ end
665
+ rescue Exception
666
+ # ignore all kind of Exception
667
+ end
668
+
669
+ # receiver is dead
670
+ retry_count = 3
671
+ loop do
672
+ Thread.pass
673
+ begin
674
+ thread, cmd, *args = @cmd_queue.deq(true) # non-block
675
+ rescue ThreadError
676
+ # queue is empty
677
+ retry_count -= 1
678
+ break if retry_count <= 0
679
+ sleep 0.5
680
+ retry
681
+ end
682
+ next unless thread
683
+ if thread.alive?
684
+ if @interp.deleted?
685
+ thread.raise RuntimeError, 'the interpreter is already deleted'
686
+ else
687
+ thread.raise RuntimeError,
688
+ 'the interpreter no longer receives command procedures'
689
+ end
690
+ end
691
+ end
692
+ }
693
+
694
+ # return threads
695
+ [receiver, watchdog]
696
+ end
697
+ private :_check_and_return, :_create_receiver_and_watchdog
698
+
699
+ ######################################
700
+
701
+ unless self.const_defined? :RUN_EVENTLOOP_ON_MAIN_THREAD
702
+ ### Ruby 1.9 !!!!!!!!!!!!!!!!!!!!!!!!!!
703
+ RUN_EVENTLOOP_ON_MAIN_THREAD = false
704
+ end
705
+
706
+ if self.const_defined? :DEFAULT_MASTER_NAME
707
+ name = DEFAULT_MASTER_NAME.to_s
708
+ else
709
+ name = nil
710
+ end
711
+ if self.const_defined?(:DEFAULT_MASTER_OPTS) &&
712
+ DEFAULT_MASTER_OPTS.kind_of?(Hash)
713
+ keys = DEFAULT_MASTER_OPTS
714
+ else
715
+ keys = {}
716
+ end
717
+
718
+ @@DEFAULT_MASTER = self.allocate
719
+ @@DEFAULT_MASTER.instance_eval{
720
+ @tk_windows = TkUtil.untrust({})
721
+
722
+ @tk_table_list = TkUtil.untrust([])
723
+
724
+ @slave_ip_tbl = TkUtil.untrust({})
725
+
726
+ @slave_ip_top = TkUtil.untrust({})
727
+
728
+ @evloop_thread = TkUtil.untrust([])
729
+
730
+ unless keys.kind_of? Hash
731
+ fail ArgumentError, "expecting a Hash object for the 2nd argument"
732
+ end
733
+
734
+ if !WITH_RUBY_VM || RUN_EVENTLOOP_ON_MAIN_THREAD ### check Ruby 1.9 !!!!!!!
735
+ @interp = TclTkIp.new(name, _keys2opts(keys))
736
+ else ### Ruby 1.9 !!!!!!!!!!!
737
+ @interp_thread = Thread.new{
738
+ current = Thread.current
739
+ begin
740
+ current[:interp] = interp = TclTkIp.new(name, _keys2opts(keys))
741
+ rescue e
742
+ current[:interp] = e
743
+ raise e
744
+ end
745
+ #sleep
746
+ current[:mutex] = mutex = Mutex.new
747
+ current[:root_check] = cond_var = ConditionVariable.new
748
+
749
+ status = [nil]
750
+ def status.value
751
+ self[0]
752
+ end
753
+ def status.value=(val)
754
+ self[0] = val
755
+ end
756
+ current[:status] = status
757
+
758
+ begin
759
+ begin
760
+ #TclTkLib.mainloop_abort_on_exception = false
761
+ #Thread.current[:status].value = TclTkLib.mainloop(true)
762
+ interp.mainloop_abort_on_exception = true
763
+ current[:status].value = interp.mainloop(true)
764
+ rescue SystemExit=>e
765
+ current[:status].value = e
766
+ rescue Exception=>e
767
+ current[:status].value = e
768
+ retry if interp.has_mainwindow?
769
+ ensure
770
+ mutex.synchronize{ cond_var.broadcast }
771
+ end
772
+
773
+ #Thread.current[:status].value = TclTkLib.mainloop(false)
774
+ current[:status].value = interp.mainloop(false)
775
+
776
+ ensure
777
+ # interp must be deleted before the thread for interp is dead.
778
+ # If not, raise Tcl_Panic on Tcl_AsyncDelete because async handler
779
+ # deleted by the wrong thread.
780
+ interp.delete
781
+ end
782
+ }
783
+ until @interp_thread[:interp]
784
+ Thread.pass
785
+ end
786
+ # INTERP_THREAD.run
787
+ raise @interp_thread[:interp] if @interp_thread[:interp].kind_of? Exception
788
+ @interp = @interp_thread[:interp]
789
+
790
+ # delete the interpreter and kill the eventloop thread at exit
791
+ interp = @interp
792
+ interp_thread = @interp_thread
793
+ END{
794
+ if interp_thread.alive?
795
+ interp.delete
796
+ interp_thread.kill
797
+ end
798
+ }
799
+
800
+ def self.mainloop(check_root = true)
801
+ begin
802
+ TclTkLib.set_eventloop_window_mode(true)
803
+ @interp_thread.value
804
+ ensure
805
+ TclTkLib.set_eventloop_window_mode(false)
806
+ end
807
+ end
808
+ end
809
+
810
+ @interp.instance_eval{
811
+ @force_default_encoding ||= TkUtil.untrust([false])
812
+ @encoding ||= TkUtil.untrust([nil])
813
+ def @encoding.to_s; self.join(nil); end
814
+ }
815
+
816
+ @ip_name = nil
817
+
818
+ @callback_status = TkUtil.untrust([])
819
+
820
+ @system = Object.new
821
+
822
+ @wait_on_mainloop = TkUtil.untrust([true, 0])
823
+
824
+ @threadgroup = Thread.current.group
825
+
826
+ @safe_base = false
827
+
828
+ @safe_level = [$SAFE]
829
+
830
+ @cmd_queue = MultiTkIp::Command_Queue.new(@interp)
831
+
832
+ @cmd_receiver, @receiver_watchdog = _create_receiver_and_watchdog(@safe_level[0])
833
+
834
+ @threadgroup.add @cmd_receiver
835
+ @threadgroup.add @receiver_watchdog
836
+
837
+ # NOT enclose @threadgroup for @@DEFAULT_MASTER
838
+
839
+ @@IP_TABLE[ThreadGroup::Default] = self
840
+ @@IP_TABLE[@threadgroup] = self
841
+
842
+ #################################
843
+
844
+ @pseudo_toplevel = [false, nil]
845
+
846
+ def self.__pseudo_toplevel
847
+ Thread.current.group == ThreadGroup::Default &&
848
+ MultiTkIp.__getip == @@DEFAULT_MASTER &&
849
+ self.__pseudo_toplevel_evaluable? && @pseudo_toplevel[1]
850
+ end
851
+
852
+ def self.__pseudo_toplevel=(m)
853
+ unless (Thread.current.group == ThreadGroup::Default &&
854
+ MultiTkIp.__getip == @@DEFAULT_MASTER)
855
+ fail SecurityError, "no permission to manipulate"
856
+ end
857
+
858
+ # if m.kind_of?(Module) && m.respond_to?(:pseudo_toplevel_evaluable?)
859
+ if m.respond_to?(:pseudo_toplevel_evaluable?)
860
+ @pseudo_toplevel[0] = true
861
+ @pseudo_toplevel[1] = m
862
+ else
863
+ fail ArgumentError, 'fail to set pseudo-toplevel'
864
+ end
865
+ self
866
+ end
867
+
868
+ def self.__pseudo_toplevel_evaluable?
869
+ begin
870
+ @pseudo_toplevel[0] && @pseudo_toplevel[1].pseudo_toplevel_evaluable?
871
+ rescue Exception
872
+ false
873
+ end
874
+ end
875
+
876
+ def self.__pseudo_toplevel_evaluable=(mode)
877
+ unless (Thread.current.group == ThreadGroup::Default &&
878
+ MultiTkIp.__getip == @@DEFAULT_MASTER)
879
+ fail SecurityError, "no permission to manipulate"
880
+ end
881
+
882
+ @pseudo_toplevel[0] = (mode)? true: false
883
+ end
884
+
885
+ #################################
886
+
887
+ @assign_request = Class.new(Exception){
888
+ def self.new(target, ret)
889
+ obj = super()
890
+ obj.target = target
891
+ obj.ret = ret
892
+ obj
893
+ end
894
+ attr_accessor :target, :ret
895
+ }
896
+
897
+ @assign_thread = Thread.new{
898
+ loop do
899
+ begin
900
+ Thread.stop
901
+ rescue @assign_request=>req
902
+ begin
903
+ req.ret[0] = req.target.instance_eval{
904
+ @cmd_receiver, @receiver_watchdog =
905
+ _create_receiver_and_watchdog(@safe_level[0])
906
+ @threadgroup.add @cmd_receiver
907
+ @threadgroup.add @receiver_watchdog
908
+ @threadgroup.enclose
909
+ true
910
+ }
911
+ rescue Exception=>e
912
+ begin
913
+ req.ret[0] = e
914
+ rescue Exception
915
+ # ignore
916
+ end
917
+ end
918
+ rescue Exception
919
+ # ignore
920
+ end
921
+ end
922
+ }
923
+
924
+ def self.assign_receiver_and_watchdog(target)
925
+ ret = [nil]
926
+ @assign_thread.raise(@assign_request.new(target, ret))
927
+ while ret[0] == nil
928
+ unless @assign_thread.alive?
929
+ raise RuntimeError, 'lost the thread to assign a receiver and a watchdog thread'
930
+ end
931
+ end
932
+ if ret[0].kind_of?(Exception)
933
+ raise ret[0]
934
+ else
935
+ ret[0]
936
+ end
937
+ end
938
+
939
+ #################################
940
+
941
+ @init_ip_env_queue = Queue.new
942
+ Thread.new{
943
+ current = Thread.current
944
+ loop {
945
+ mtx, cond, ret, table, script = @init_ip_env_queue.deq
946
+ begin
947
+ ret[0] = table.each{|tg, ip| ip._init_ip_env(script) }
948
+ rescue Exception => e
949
+ ret[0] = e
950
+ ensure
951
+ mtx.synchronize{ cond.signal }
952
+ end
953
+ mtx = cond = ret = table = script = nil # clear variables for GC
954
+ }
955
+ }
956
+
957
+ def self.__init_ip_env__(table, script)
958
+ ret = []
959
+ mtx = (Thread.current[:MultiTk_ip_Mutex] ||= Mutex.new)
960
+ cond = (Thread.current[:MultiTk_ip_CondVar] ||= ConditionVariable.new)
961
+ mtx.synchronize{
962
+ @init_ip_env_queue.enq([mtx, cond, ret, table, script])
963
+ cond.wait(mtx)
964
+ }
965
+ if ret[0].kind_of?(Exception)
966
+ raise ret[0]
967
+ else
968
+ ret[0]
969
+ end
970
+ end
971
+
972
+ #################################
973
+
974
+ class << self
975
+ undef :instance_eval
976
+ end
977
+ }
978
+
979
+ @@DEFAULT_MASTER.freeze # defend against modification
980
+
981
+ ######################################
982
+
983
+ def self.inherited(subclass)
984
+ # trust if on ThreadGroup::Default or @@DEFAULT_MASTER's ThreadGroup
985
+ if @@IP_TABLE[Thread.current.group] == @@DEFAULT_MASTER
986
+ begin
987
+ class << subclass
988
+ self.methods.each{|m|
989
+ name = m.to_s
990
+ begin
991
+ unless name == '__id__' || name == '__send__' || name == 'freeze'
992
+ undef_method(m)
993
+ end
994
+ rescue Exception
995
+ # ignore all exceptions
996
+ end
997
+ }
998
+ end
999
+ ensure
1000
+ subclass.freeze
1001
+ fail SecurityError,
1002
+ "cannot create subclass of MultiTkIp on a untrusted ThreadGroup"
1003
+ end
1004
+ end
1005
+ end
1006
+
1007
+ ######################################
1008
+
1009
+ @@SAFE_OPT_LIST = [
1010
+ 'accessPath'.freeze,
1011
+ 'statics'.freeze,
1012
+ 'nested'.freeze,
1013
+ 'deleteHook'.freeze
1014
+ ].freeze
1015
+
1016
+ def _parse_slaveopts(keys)
1017
+ name = nil
1018
+ safe = false
1019
+ safe_opts = {}
1020
+ tk_opts = {}
1021
+
1022
+ keys.each{|k,v|
1023
+ k_str = k.to_s
1024
+ if k_str == 'name'
1025
+ name = v
1026
+ elsif k_str == 'safe'
1027
+ safe = v
1028
+ elsif @@SAFE_OPT_LIST.member?(k_str)
1029
+ safe_opts[k_str] = v
1030
+ else
1031
+ tk_opts[k_str] = v
1032
+ end
1033
+ }
1034
+
1035
+ if keys['without_tk'] || keys[:without_tk]
1036
+ [name, safe, safe_opts, nil]
1037
+ else
1038
+ [name, safe, safe_opts, tk_opts]
1039
+ end
1040
+ end
1041
+ private :_parse_slaveopts
1042
+
1043
+ def _create_slave_ip_name
1044
+ @@SLAVE_IP_ID.mutex.synchronize{
1045
+ name = @@SLAVE_IP_ID.join('')
1046
+ @@SLAVE_IP_ID[1].succ!
1047
+ name.freeze
1048
+ }
1049
+ end
1050
+ private :_create_slave_ip_name
1051
+
1052
+ ######################################
1053
+
1054
+ def __check_safetk_optkeys(optkeys)
1055
+ # based on 'safetk.tcl'
1056
+ new_keys = {}
1057
+ optkeys.each{|k,v| new_keys[k.to_s] = v}
1058
+
1059
+ # check 'display'
1060
+ if !new_keys.key?('display')
1061
+ begin
1062
+ #new_keys['display'] = @interp._invoke('winfo screen .')
1063
+ new_keys['display'] = @interp._invoke('winfo', 'screen', '.')
1064
+ rescue
1065
+ if ENV[DISPLAY]
1066
+ new_keys['display'] = ENV[DISPLAY]
1067
+ elsif !new_keys.key?('use')
1068
+ warn "Warning: no screen info or ENV[DISPLAY], so use ':0.0'"
1069
+ new_keys['display'] = ':0.0'
1070
+ end
1071
+ end
1072
+ end
1073
+
1074
+ # check 'use'
1075
+ if new_keys.key?('use')
1076
+ # given 'use'
1077
+ case new_keys['use']
1078
+ when TkWindow
1079
+ new_keys['use'] = TkWinfo.id(new_keys['use'])
1080
+ #assoc_display = @interp._eval('winfo screen .')
1081
+ assoc_display = @interp._invoke('winfo', 'screen', '.')
1082
+ when /^\..*/
1083
+ new_keys['use'] = @interp._invoke('winfo', 'id', new_keys['use'])
1084
+ assoc_display = @interp._invoke('winfo', 'screen', new_keys['use'])
1085
+ else
1086
+ begin
1087
+ pathname = @interp._invoke('winfo', 'pathname', new_keys['use'])
1088
+ assoc_display = @interp._invoke('winfo', 'screen', pathname)
1089
+ rescue
1090
+ assoc_display = new_keys['display']
1091
+ end
1092
+ end
1093
+
1094
+ # match display?
1095
+ if assoc_display != new_keys['display']
1096
+ if optkeys.key?(:display) || optkeys.key?('display')
1097
+ fail RuntimeError,
1098
+ "conflicting 'display'=>#{new_keys['display']} " +
1099
+ "and display '#{assoc_display}' on 'use'=>#{new_keys['use']}"
1100
+ else
1101
+ new_keys['display'] = assoc_display
1102
+ end
1103
+ end
1104
+ end
1105
+
1106
+ # return
1107
+ new_keys
1108
+ end
1109
+ private :__check_safetk_optkeys
1110
+
1111
+ def __create_safetk_frame(slave_ip, slave_name, app_name, keys)
1112
+ # display option is used by ::safe::loadTk
1113
+ loadTk_keys = {}
1114
+ loadTk_keys['display'] = keys['display']
1115
+ dup_keys = keys.dup
1116
+
1117
+ # keys for toplevel : allow followings
1118
+ toplevel_keys = {}
1119
+ ['height', 'width', 'background', 'menu'].each{|k|
1120
+ toplevel_keys[k] = dup_keys.delete(k) if dup_keys.key?(k)
1121
+ }
1122
+ toplevel_keys['classname'] = 'SafeTk'
1123
+ toplevel_keys['screen'] = dup_keys.delete('display')
1124
+
1125
+ # other keys used by pack option of container frame
1126
+
1127
+ # create toplevel widget
1128
+ begin
1129
+ top = TkToplevel.new(toplevel_keys)
1130
+ rescue NameError => e
1131
+ fail e unless @interp.safe?
1132
+ fail SecurityError, "unable create toplevel on the safe interpreter"
1133
+ end
1134
+ msg = "Untrusted Ruby/Tk applet (#{slave_name})"
1135
+ if app_name.kind_of?(String)
1136
+ top.title "#{app_name} (#{slave_name})"
1137
+ else
1138
+ top.title msg
1139
+ end
1140
+
1141
+ # procedure to delete slave interpreter
1142
+ slave_delete_proc = proc{
1143
+ unless slave_ip.deleted?
1144
+ #if slave_ip._invoke('info', 'command', '.') != ""
1145
+ # slave_ip._invoke('destroy', '.')
1146
+ #end
1147
+ #slave_ip.delete
1148
+ slave_ip._eval_without_enc('exit')
1149
+ end
1150
+ begin
1151
+ top.destroy if top.winfo_exist?
1152
+ rescue
1153
+ # ignore
1154
+ end
1155
+ }
1156
+ tag = TkBindTag.new.bind('Destroy', slave_delete_proc)
1157
+
1158
+ top.bindtags = top.bindtags.unshift(tag)
1159
+
1160
+ # create control frame
1161
+ TkFrame.new(top, :bg=>'red', :borderwidth=>3, :relief=>'ridge') {|fc|
1162
+ fc.bindtags = fc.bindtags.unshift(tag)
1163
+
1164
+ TkFrame.new(fc, :bd=>0){|f|
1165
+ TkButton.new(f,
1166
+ :text=>'Delete', :bd=>1, :padx=>2, :pady=>0,
1167
+ :highlightthickness=>0, :command=>slave_delete_proc
1168
+ ).pack(:side=>:right, :fill=>:both)
1169
+ f.pack(:side=>:right, :fill=>:both, :expand=>true)
1170
+ }
1171
+
1172
+ TkLabel.new(fc, :text=>msg, :padx=>2, :pady=>0,
1173
+ :anchor=>:w).pack(:side=>:left, :fill=>:both, :expand=>true)
1174
+
1175
+ fc.pack(:side=>:bottom, :fill=>:x)
1176
+ }
1177
+
1178
+ # container frame for slave interpreter
1179
+ dup_keys['fill'] = :both unless dup_keys.key?('fill')
1180
+ dup_keys['expand'] = true unless dup_keys.key?('expand')
1181
+ c = TkFrame.new(top, :container=>true).pack(dup_keys)
1182
+ c.bind('Destroy', proc{top.destroy})
1183
+
1184
+ # return keys
1185
+ loadTk_keys['use'] = TkWinfo.id(c)
1186
+ [loadTk_keys, top.path]
1187
+ end
1188
+ private :__create_safetk_frame
1189
+
1190
+ def __create_safe_slave_obj(safe_opts, app_name, tk_opts)
1191
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
1192
+
1193
+ # safe interpreter
1194
+ ip_name = _create_slave_ip_name
1195
+ slave_ip = @interp.create_slave(ip_name, true)
1196
+ slave_ip.instance_eval{
1197
+ @force_default_encoding ||= TkUtil.untrust([false])
1198
+ @encoding ||= TkUtil.untrust([nil])
1199
+ def @encoding.to_s; self.join(nil); end
1200
+ }
1201
+ @slave_ip_tbl[ip_name] = slave_ip
1202
+ def slave_ip.safe_base?
1203
+ true
1204
+ end
1205
+
1206
+ @interp._eval("::safe::interpInit #{ip_name}")
1207
+
1208
+ slave_ip._invoke('set', 'argv0', app_name) if app_name.kind_of?(String)
1209
+
1210
+ if tk_opts
1211
+ tk_opts = __check_safetk_optkeys(tk_opts)
1212
+ if tk_opts.key?('use')
1213
+ @slave_ip_top[ip_name] = ''
1214
+ else
1215
+ tk_opts, top_path = __create_safetk_frame(slave_ip, ip_name, app_name,
1216
+ tk_opts)
1217
+ @slave_ip_top[ip_name] = top_path
1218
+ end
1219
+ @interp._eval("::safe::loadTk #{ip_name} #{_keys2opts(tk_opts)}")
1220
+ @interp._invoke('__replace_slave_tk_commands__', ip_name)
1221
+ else
1222
+ @slave_ip_top[ip_name] = nil
1223
+ end
1224
+
1225
+ if safe_opts.key?('deleteHook') || safe_opts.key?(:deleteHook)
1226
+ @interp._eval("::safe::interpConfigure #{ip_name} " +
1227
+ _keys2opts(safe_opts))
1228
+ else
1229
+ @interp._eval("::safe::interpConfigure #{ip_name} " +
1230
+ _keys2opts(safe_opts) + '-deleteHook {' +
1231
+ TkComm._get_eval_string(proc{|slave|
1232
+ self._default_delete_hook(slave)
1233
+ }) + '}')
1234
+ end
1235
+
1236
+ [slave_ip, ip_name]
1237
+ end
1238
+
1239
+ def __create_trusted_slave_obj(name, keys)
1240
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
1241
+
1242
+ ip_name = _create_slave_ip_name
1243
+ slave_ip = @interp.create_slave(ip_name, false)
1244
+ slave_ip.instance_eval{
1245
+ @force_default_encoding ||= TkUtil.untrust([false])
1246
+ @encoding ||= TkUtil.untrust([nil])
1247
+ def @encoding.to_s; self.join(nil); end
1248
+ }
1249
+ slave_ip._invoke('set', 'argv0', name) if name.kind_of?(String)
1250
+ slave_ip._invoke('set', 'argv', _keys2opts(keys))
1251
+ @interp._invoke('load', '', 'Tk', ip_name)
1252
+ @interp._invoke('__replace_slave_tk_commands__', ip_name)
1253
+ @slave_ip_tbl[ip_name] = slave_ip
1254
+ [slave_ip, ip_name]
1255
+ end
1256
+
1257
+ ######################################
1258
+
1259
+ def _create_slave_object(keys={})
1260
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
1261
+
1262
+ ip = MultiTkIp.new_slave(self, keys={})
1263
+ @slave_ip_tbl[ip.name] = ip
1264
+ end
1265
+
1266
+ ######################################
1267
+
1268
+ def initialize(master, safeip=true, keys={})
1269
+ if master.deleted? && safeip == nil
1270
+ fail RuntimeError, "cannot create a slave of a deleted interpreter"
1271
+ end
1272
+
1273
+ if !master.deleted? && !master.master? && master.safe?
1274
+ fail SecurityError, "safe-slave-ip cannot create a new interpreter"
1275
+ end
1276
+
1277
+ if safeip == nil && !master.master?
1278
+ fail SecurityError, "slave-ip cannot create a master-ip"
1279
+ end
1280
+
1281
+ unless keys.kind_of? Hash
1282
+ fail ArgumentError, "expecting a Hash object for the 2nd argument"
1283
+ end
1284
+
1285
+ @tk_windows = {}
1286
+ @tk_table_list = []
1287
+ @slave_ip_tbl = {}
1288
+ @slave_ip_top = {}
1289
+ @cb_error_proc = []
1290
+ @evloop_thread = []
1291
+
1292
+ TkUtil.untrust(@tk_windows) unless @tk_windows.tainted?
1293
+ TkUtil.untrust(@tk_table_list) unless @tk_table_list.tainted?
1294
+ TkUtil.untrust(@slave_ip_tbl) unless @slave_ip_tbl.tainted?
1295
+ TkUtil.untrust(@slave_ip_top) unless @slave_ip_top.tainted?
1296
+ TkUtil.untrust(@cb_error_proc) unless @cb_error_proc.tainted?
1297
+ TkUtil.untrust(@evloop_thread) unless @evloop_thread.tainted?
1298
+
1299
+ @callback_status = []
1300
+
1301
+ name, safe, safe_opts, tk_opts = _parse_slaveopts(keys)
1302
+
1303
+ safe = 1 if safe && !safe.kind_of?(Fixnum)
1304
+
1305
+ @safe_base = false
1306
+
1307
+ if safeip == nil
1308
+ # create master-ip
1309
+ unless WITH_RUBY_VM
1310
+ @interp = TclTkIp.new(name, _keys2opts(tk_opts))
1311
+ @interp.instance_eval{
1312
+ @force_default_encoding ||= TkUtil.untrust([false])
1313
+ @encoding ||= TkUtil.untrust([nil])
1314
+ def @encoding.to_s; self.join(nil); end
1315
+ }
1316
+
1317
+ else ### Ruby 1.9 !!!!!!!!!!!
1318
+ =begin
1319
+ @interp_thread = Thread.new{
1320
+ Thread.current[:interp] = interp = TclTkIp.new(name, _keys2opts(tk_opts))
1321
+ interp.instance_eval{
1322
+ @force_default_encoding ||= TkUtil.untrust([false])
1323
+ @encoding ||= TkUtil.untrust([nil])
1324
+ def @encoding.to_s; self.join(nil); end
1325
+ }
1326
+
1327
+ #sleep
1328
+ TclTkLib.mainloop(true)
1329
+ }
1330
+ until @interp_thread[:interp]
1331
+ Thread.pass
1332
+ end
1333
+ # INTERP_THREAD.run
1334
+ @interp = @interp_thread[:interp]
1335
+ =end
1336
+ @interp_thread = Thread.new{
1337
+ current = Thread.current
1338
+ begin
1339
+ current[:interp] = interp = TclTkIp.new(name, _keys2opts(tk_opts))
1340
+ rescue e
1341
+ current[:interp] = e
1342
+ raise e
1343
+ end
1344
+ #sleep
1345
+ #TclTkLib.mainloop(true)
1346
+ current[:mutex] = mutex = Mutex.new
1347
+ current[:root_check] = cond_ver = ConditionVariable.new
1348
+
1349
+ status = [nil]
1350
+ def status.value
1351
+ self[0]
1352
+ end
1353
+ def status.value=(val)
1354
+ self[0] = val
1355
+ end
1356
+ current[:status] = status
1357
+
1358
+ begin
1359
+ begin
1360
+ current[:status].value = interp.mainloop(true)
1361
+ rescue SystemExit=>e
1362
+ current[:status].value = e
1363
+ rescue Exception=>e
1364
+ current[:status].value = e
1365
+ retry if interp.has_mainwindow?
1366
+ ensure
1367
+ mutex.synchronize{ cond_var.broadcast }
1368
+ end
1369
+ current[:status].value = interp.mainloop(false)
1370
+ ensure
1371
+ interp.delete
1372
+ end
1373
+ }
1374
+ until @interp_thread[:interp]
1375
+ Thread.pass
1376
+ end
1377
+ # INTERP_THREAD.run
1378
+ @interp = @interp_thread[:interp]
1379
+
1380
+ @evloop_thread[0] = @interp_thread
1381
+
1382
+ def self.mainloop(check_root = true)
1383
+ begin
1384
+ TclTkLib.set_eventloop_window_mode(true)
1385
+ @interp_thread.value
1386
+ ensure
1387
+ TclTkLib.set_eventloop_window_mode(false)
1388
+ end
1389
+ end
1390
+ end
1391
+
1392
+ @interp.instance_eval{
1393
+ @force_default_encoding ||= TkUtil.untrust([false])
1394
+ @encoding ||= TkUtil.untrust([nil])
1395
+ def @encoding.to_s; self.join(nil); end
1396
+ }
1397
+
1398
+ @ip_name = nil
1399
+
1400
+ if safe
1401
+ safe = $SAFE if safe < $SAFE
1402
+ @safe_level = [safe]
1403
+ else
1404
+ @safe_level = [$SAFE]
1405
+ end
1406
+
1407
+ else
1408
+ # create slave-ip
1409
+ if safeip || master.safe?
1410
+ @safe_base = true
1411
+ @interp, @ip_name = master.__create_safe_slave_obj(safe_opts,
1412
+ name, tk_opts)
1413
+ # @interp_thread = nil if RUBY_VERSION < '1.9.0' ### !!!!!!!!!!!
1414
+ @interp_thread = nil unless WITH_RUBY_VM ### Ruby 1.9 !!!!!!!!!!!
1415
+ if safe
1416
+ safe = master.safe_level if safe < master.safe_level
1417
+ @safe_level = [safe]
1418
+ else
1419
+ @safe_level = [1]
1420
+ end
1421
+ else
1422
+ @interp, @ip_name = master.__create_trusted_slave_obj(name, tk_opts)
1423
+ # @interp_thread = nil if RUBY_VERSION < '1.9.0' ### !!!!!!!!!!!
1424
+ @interp_thread = nil unless WITH_RUBY_VM ### Ruby 1.9 !!!!!!!!!!!
1425
+ if safe
1426
+ safe = master.safe_level if safe < master.safe_level
1427
+ @safe_level = [safe]
1428
+ else
1429
+ @safe_level = [master.safe_level]
1430
+ end
1431
+ end
1432
+ @set_alias_proc = proc{|name|
1433
+ master._invoke('interp', 'alias', @ip_name, name, '', name)
1434
+ }.freeze
1435
+ end
1436
+
1437
+ @system = Object.new
1438
+
1439
+ @wait_on_mainloop = TkUtil.untrust([true, 0])
1440
+ # @wait_on_mainloop = TkUtil.untrust([false, 0])
1441
+
1442
+ @threadgroup = ThreadGroup.new
1443
+
1444
+ @pseudo_toplevel = [false, nil]
1445
+
1446
+ @cmd_queue = MultiTkIp::Command_Queue.new(@interp)
1447
+
1448
+ =begin
1449
+ @cmd_receiver, @receiver_watchdog = _create_receiver_and_watchdog(@safe_level[0])
1450
+
1451
+ @threadgroup.add @cmd_receiver
1452
+ @threadgroup.add @receiver_watchdog
1453
+
1454
+ @threadgroup.enclose
1455
+ =end
1456
+ @@DEFAULT_MASTER.assign_receiver_and_watchdog(self)
1457
+
1458
+ @@IP_TABLE[@threadgroup] = self
1459
+ @@TK_TABLE_LIST.size.times{
1460
+ @tk_table_list << TkUtil.untrust({})
1461
+ }
1462
+ _init_ip_internal(@@INIT_IP_ENV, @@ADD_TK_PROCS)
1463
+
1464
+ class << self
1465
+ undef :instance_eval
1466
+ end
1467
+
1468
+ # dummy call for initialization
1469
+ self.eval_proc{ Tk.tk_call('set', 'tcl_patchLevel') }
1470
+
1471
+ self.freeze # defend against modification
1472
+ end
1473
+
1474
+ ######################################
1475
+
1476
+ def _default_delete_hook(slave)
1477
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
1478
+ @slave_ip_tbl.delete(slave)
1479
+ top = @slave_ip_top.delete(slave)
1480
+ if top.kind_of?(String)
1481
+ # call default hook of safetk.tcl (ignore exceptions)
1482
+ if top == ''
1483
+ begin
1484
+ @interp._eval("::safe::disallowTk #{slave}")
1485
+ rescue
1486
+ warn("Warning: fail to call '::safe::disallowTk'") if $DEBUG
1487
+ end
1488
+ else # toplevel path
1489
+ begin
1490
+ @interp._eval("::safe::tkDelete {} #{top} #{slave}")
1491
+ rescue
1492
+ warn("Warning: fail to call '::safe::tkDelete'") if $DEBUG
1493
+ begin
1494
+ @interp._eval("destroy #{top}")
1495
+ rescue
1496
+ warn("Warning: fail to destroy toplevel") if $DEBUG
1497
+ end
1498
+ end
1499
+ end
1500
+ end
1501
+ end
1502
+
1503
+ end
1504
+
1505
+
1506
+ # get target IP
1507
+ class MultiTkIp
1508
+ @@CALLBACK_SUBTHREAD = Class.new(Thread){
1509
+ def self.new(interp, &blk)
1510
+ super(interp){|ip| Thread.current[:callback_ip] = ip; blk.call}
1511
+ end
1512
+
1513
+ @table = TkUtil.untrust(Hash.new{|h,k| h[k] = TkUtil.untrust([])})
1514
+ def self.table
1515
+ @table
1516
+ end
1517
+ }
1518
+
1519
+ def self._ip_id_
1520
+ __getip._ip_id_
1521
+ end
1522
+ def _ip_id_
1523
+ # for RemoteTkIp
1524
+ ''
1525
+ end
1526
+
1527
+ def self.__getip
1528
+ current = Thread.current
1529
+ if current.kind_of?(@@CALLBACK_SUBTHREAD)
1530
+ return current[:callback_ip]
1531
+ end
1532
+ if TclTkLib.mainloop_thread? != false && current[:callback_ip]
1533
+ return current[:callback_ip]
1534
+ end
1535
+ if current.group == ThreadGroup::Default
1536
+ @@DEFAULT_MASTER
1537
+ else
1538
+ ip = @@IP_TABLE[current.group]
1539
+ unless ip
1540
+ fail SecurityError,
1541
+ "cannot call Tk methods on #{Thread.current.inspect}"
1542
+ end
1543
+ ip
1544
+ end
1545
+ end
1546
+ end
1547
+
1548
+
1549
+ # aliases of constructor
1550
+ class << MultiTkIp
1551
+ alias __new new
1552
+ private :__new
1553
+
1554
+ def new_master(safe=nil, keys={}, &blk)
1555
+ if MultiTkIp::WITH_RUBY_VM
1556
+ #### TODO !!!!!!
1557
+ fail RuntimeError,
1558
+ 'sorry, still not support multiple master-interpreters on RubyVM'
1559
+ end
1560
+
1561
+ if safe.kind_of?(Hash)
1562
+ keys = safe
1563
+ elsif safe.kind_of?(Integer)
1564
+ raise ArgumentError, "unexpected argument(s)" unless keys.kind_of?(Hash)
1565
+ if !keys.key?(:safe) && !keys.key?('safe')
1566
+ keys[:safe] = safe
1567
+ end
1568
+ elsif safe == nil
1569
+ # do nothing
1570
+ else
1571
+ raise ArgumentError, "unexpected argument(s)"
1572
+ end
1573
+
1574
+ ip = __new(__getip, nil, keys)
1575
+ #ip.eval_proc(proc{$SAFE=ip.safe_level; Proc.new}.call) if block_given?
1576
+ if block_given?
1577
+ #Thread.new{ip.eval_proc(proc{$SAFE=ip.safe_level; Proc.new}.call)}
1578
+ #Thread.new{ip.eval_proc(proc{$SAFE=ip.safe_level; yield}.call)}
1579
+ ip._proc_on_safelevel(&blk).call(ip.safe_level)
1580
+ end
1581
+ ip
1582
+ end
1583
+
1584
+ alias new new_master
1585
+
1586
+ def new_slave(safe=nil, keys={}, &blk)
1587
+ if safe.kind_of?(Hash)
1588
+ keys = safe
1589
+ elsif safe.kind_of?(Integer)
1590
+ raise ArgumentError, "unexpected argument(s)" unless keys.kind_of?(Hash)
1591
+ if !keys.key?(:safe) && !keys.key?('safe')
1592
+ keys[:safe] = safe
1593
+ end
1594
+ elsif safe == nil
1595
+ # do nothing
1596
+ else
1597
+ raise ArgumentError, "unexpected argument(s)"
1598
+ end
1599
+
1600
+ ip = __new(__getip, false, keys)
1601
+ # ip.eval_proc(proc{$SAFE=ip.safe_level; Proc.new}.call) if block_given?
1602
+ if block_given?
1603
+ #Thread.new{ip.eval_proc(proc{$SAFE=ip.safe_level; Proc.new}.call)}
1604
+ #Thread.new{ip.eval_proc(proc{$SAFE=ip.safe_level; yield}.call)}
1605
+ ip._proc_on_safelevel(&blk).call(ip.safe_level)
1606
+ end
1607
+ ip
1608
+ end
1609
+ alias new_trusted_slave new_slave
1610
+
1611
+ def new_safe_slave(safe=1, keys={}, &blk)
1612
+ if safe.kind_of?(Hash)
1613
+ keys = safe
1614
+ elsif safe.kind_of?(Integer)
1615
+ raise ArgumentError, "unexpected argument(s)" unless keys.kind_of?(Hash)
1616
+ if !keys.key?(:safe) && !keys.key?('safe')
1617
+ keys[:safe] = safe
1618
+ end
1619
+ else
1620
+ raise ArgumentError, "unexpected argument(s)"
1621
+ end
1622
+
1623
+ ip = __new(__getip, true, keys)
1624
+ # ip.eval_proc(proc{$SAFE=ip.safe_level; Proc.new}.call) if block_given?
1625
+ if block_given?
1626
+ #Thread.new{ip.eval_proc(proc{$SAFE=ip.safe_level; Proc.new}.call)}
1627
+ #Thread.new{ip.eval_proc(proc{$SAFE=ip.safe_level; yield}.call)}
1628
+ ip._proc_on_safelevel(&blk).call(ip.safe_level)
1629
+ end
1630
+ ip
1631
+ end
1632
+ alias new_safeTk new_safe_slave
1633
+ end
1634
+
1635
+
1636
+ # get info
1637
+ class MultiTkIp
1638
+ def inspect
1639
+ s = self.to_s.chop!
1640
+ if self.manipulable?
1641
+ if master?
1642
+ if @interp.deleted?
1643
+ s << ':deleted-master'
1644
+ else
1645
+ s << ':master'
1646
+ end
1647
+ else
1648
+ if @interp.deleted?
1649
+ s << ':deleted-slave'
1650
+ elsif @interp.safe?
1651
+ s << ':safe-slave'
1652
+ else
1653
+ s << ':trusted-slave'
1654
+ end
1655
+ end
1656
+ end
1657
+ s << '>'
1658
+ end
1659
+
1660
+ def master?
1661
+ if @ip_name
1662
+ false
1663
+ else
1664
+ true
1665
+ end
1666
+ end
1667
+ def self.master?
1668
+ __getip.master?
1669
+ end
1670
+
1671
+ def slave?
1672
+ not master?
1673
+ end
1674
+ def self.slave?
1675
+ not self.master?
1676
+ end
1677
+
1678
+ def alive?
1679
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
1680
+ begin
1681
+ return false unless @cmd_receiver.alive?
1682
+ return false if @interp.deleted?
1683
+ return false if @interp._invoke('interp', 'exists', '') == '0'
1684
+ rescue Exception
1685
+ return false
1686
+ end
1687
+ true
1688
+ end
1689
+ def self.alive?
1690
+ __getip.alive?
1691
+ end
1692
+
1693
+ def path
1694
+ @ip_name || ''
1695
+ end
1696
+ def self.path
1697
+ __getip.path
1698
+ end
1699
+ def ip_name
1700
+ @ip_name || ''
1701
+ end
1702
+ def self.ip_name
1703
+ __getip.ip_name
1704
+ end
1705
+ def to_eval
1706
+ @ip_name || ''
1707
+ end
1708
+ def self.to_eval
1709
+ __getip.to_eval
1710
+ end
1711
+
1712
+ def slaves(all = false)
1713
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
1714
+ @interp._invoke('interp','slaves').split.map!{|name|
1715
+ if @slave_ip_tbl.key?(name)
1716
+ @slave_ip_tbl[name]
1717
+ elsif all
1718
+ name
1719
+ else
1720
+ nil
1721
+ end
1722
+ }.compact!
1723
+ end
1724
+ def self.slaves(all = false)
1725
+ __getip.slaves(all)
1726
+ end
1727
+
1728
+ def manipulable?
1729
+ return true if (Thread.current.group == ThreadGroup::Default)
1730
+ ip = MultiTkIp.__getip
1731
+ (ip == self) || ip._is_master_of?(@interp)
1732
+ end
1733
+ def self.manipulable?
1734
+ true
1735
+ end
1736
+
1737
+ def _is_master_of?(tcltkip_obj)
1738
+ tcltkip_obj.slave_of?(@interp)
1739
+ end
1740
+ protected :_is_master_of?
1741
+ end
1742
+
1743
+
1744
+ # instance methods to treat tables
1745
+ class MultiTkIp
1746
+ def _tk_cmd_tbl
1747
+ tbl = {}
1748
+ MultiTkIp.tk_cmd_tbl.each{|id, ent| tbl[id] = ent if ent.ip == self }
1749
+ tbl
1750
+ end
1751
+
1752
+ def _tk_windows
1753
+ @tk_windows
1754
+ end
1755
+
1756
+ def _tk_table_list
1757
+ @tk_table_list
1758
+ end
1759
+
1760
+ def _add_new_tables
1761
+ (@@TK_TABLE_LIST.size - @tk_table_list.size).times{
1762
+ @tk_table_list << TkUtil.untrust({})
1763
+ }
1764
+ end
1765
+
1766
+ def _init_ip_env(script)
1767
+ self.eval_proc{script.call(self)}
1768
+ end
1769
+
1770
+ def _add_tk_procs(name, args, body)
1771
+ return if slave?
1772
+ @interp._invoke('proc', name, args, body) if args && body
1773
+ @interp._invoke('interp', 'slaves').split.each{|slave|
1774
+ @interp._invoke('interp', 'alias', slave, name, '', name)
1775
+ }
1776
+ end
1777
+
1778
+ def _remove_tk_procs(*names)
1779
+ return if slave?
1780
+ names.each{|name|
1781
+ name = name.to_s
1782
+
1783
+ return if @interp.deleted?
1784
+ @interp._invoke('rename', name, '')
1785
+
1786
+ return if @interp.deleted?
1787
+ @interp._invoke('interp', 'slaves').split.each{|slave|
1788
+ return if @interp.deleted?
1789
+ @interp._invoke('interp', 'alias', slave, name, '') rescue nil
1790
+ }
1791
+ }
1792
+ end
1793
+
1794
+ def _init_ip_internal(init_ip_env, add_tk_procs)
1795
+ #init_ip_env.each{|script| self.eval_proc{script.call(self)}}
1796
+ init_ip_env.each{|script| self._init_ip_env(script)}
1797
+ add_tk_procs.each{|name, args, body|
1798
+ if master?
1799
+ @interp._invoke('proc', name, args, body) if args && body
1800
+ else
1801
+ @set_alias_proc.call(name)
1802
+ end
1803
+ }
1804
+ end
1805
+ end
1806
+
1807
+
1808
+ # class methods to treat tables
1809
+ class MultiTkIp
1810
+ def self.tk_cmd_tbl
1811
+ @@TK_CMD_TBL
1812
+ end
1813
+ def self.tk_windows
1814
+ __getip._tk_windows
1815
+ end
1816
+ def self.tk_object_table(id)
1817
+ __getip._tk_table_list[id]
1818
+ end
1819
+ def self.create_table
1820
+ if __getip.slave?
1821
+ begin
1822
+ raise SecurityError, "slave-IP has no permission creating a new table"
1823
+ rescue SecurityError => e
1824
+ #p e.backtrace
1825
+ # Is called on a Ruby/Tk library?
1826
+ caller_info = e.backtrace[1]
1827
+ if caller_info =~ %r{^#{MultiTkIp::BASE_DIR}/(tk|tkextlib)/[^:]+\.rb:}
1828
+ # Probably, caller is a Ruby/Tk library --> allow creating
1829
+ else
1830
+ raise e
1831
+ end
1832
+ end
1833
+ end
1834
+
1835
+ id = @@TK_TABLE_LIST.size
1836
+ obj = Object.new
1837
+ @@TK_TABLE_LIST << obj
1838
+ obj.instance_variable_set(:@id, id)
1839
+ obj.instance_variable_set(:@mutex, Mutex.new)
1840
+ obj.instance_eval{
1841
+ def self.mutex
1842
+ @mutex
1843
+ end
1844
+ def self.method_missing(m, *args)
1845
+ MultiTkIp.tk_object_table(@id).__send__(m, *args)
1846
+ end
1847
+ }
1848
+ obj.freeze
1849
+ @@IP_TABLE.each{|tg, ip| ip._add_new_tables }
1850
+ return obj
1851
+ end
1852
+
1853
+ def self.init_ip_env(script = Proc.new)
1854
+ @@INIT_IP_ENV << script
1855
+ if __getip.slave?
1856
+ begin
1857
+ raise SecurityError, "slave-IP has no permission initializing IP env"
1858
+ rescue SecurityError => e
1859
+ #p e.backtrace
1860
+ # Is called on a Ruby/Tk library?
1861
+ caller_info = e.backtrace[1]
1862
+ if caller_info =~ %r{^#{MultiTkIp::BASE_DIR}/(tk|tkextlib)/[^:]+\.rb:}
1863
+ # Probably, caller is a Ruby/Tk library --> allow creating
1864
+ else
1865
+ raise e
1866
+ end
1867
+ end
1868
+ end
1869
+
1870
+ # @@IP_TABLE.each{|tg, ip|
1871
+ # ip._init_ip_env(script)
1872
+ # }
1873
+ @@DEFAULT_MASTER.__init_ip_env__(@@IP_TABLE, script)
1874
+ end
1875
+
1876
+ def self.add_tk_procs(name, args=nil, body=nil)
1877
+ if name.kind_of?(Array) # => an array of [name, args, body]
1878
+ name.each{|param| self.add_tk_procs(*param)}
1879
+ else
1880
+ name = name.to_s
1881
+ @@ADD_TK_PROCS << [name, args, body]
1882
+ @@IP_TABLE.each{|tg, ip|
1883
+ ip._add_tk_procs(name, args, body)
1884
+ }
1885
+ end
1886
+ end
1887
+
1888
+ def self.remove_tk_procs(*names)
1889
+ names.each{|name|
1890
+ name = name.to_s
1891
+ @@ADD_TK_PROCS.delete_if{|elem|
1892
+ elem.kind_of?(Array) && elem[0].to_s == name
1893
+ }
1894
+ }
1895
+ @@IP_TABLE.each{|tg, ip|
1896
+ ip._remove_tk_procs(*names)
1897
+ }
1898
+ end
1899
+
1900
+ def self.init_ip_internal
1901
+ __getip._init_ip_internal(@@INIT_IP_ENV, @@ADD_TK_PROCS)
1902
+ end
1903
+ end
1904
+
1905
+ # for callback operation
1906
+ class MultiTkIp
1907
+ def self.cb_entry_class
1908
+ @@CB_ENTRY_CLASS
1909
+ end
1910
+ def self.get_cb_entry(cmd)
1911
+ @@CB_ENTRY_CLASS.new(__getip, cmd).freeze
1912
+ end
1913
+
1914
+ =begin
1915
+ def cb_eval(cmd, *args)
1916
+ #self.eval_callback{ TkComm._get_eval_string(TkUtil.eval_cmd(cmd, *args)) }
1917
+ #ret = self.eval_callback{ TkComm._get_eval_string(TkUtil.eval_cmd(cmd, *args)) }
1918
+ ret = self.eval_callback(*args){|safe, *params|
1919
+ $SAFE=safe if $SAFE < safe
1920
+ TkComm._get_eval_string(TkUtil.eval_cmd(cmd, *params))
1921
+ }
1922
+ if ret.kind_of?(Exception)
1923
+ raise ret
1924
+ end
1925
+ ret
1926
+ end
1927
+ =end
1928
+ def cb_eval(cmd, *args)
1929
+ self.eval_callback(*args,
1930
+ &_proc_on_safelevel{|*params|
1931
+ TkComm._get_eval_string(TkUtil.eval_cmd(cmd, *params))
1932
+ })
1933
+ end
1934
+ =begin
1935
+ def cb_eval(cmd, *args)
1936
+ self.eval_callback(*args){|safe, *params|
1937
+ $SAFE=safe if $SAFE < safe
1938
+ # TkUtil.eval_cmd(cmd, *params)
1939
+ TkComm._get_eval_string(TkUtil.eval_cmd(cmd, *params))
1940
+ }
1941
+ end
1942
+ =end
1943
+ =begin
1944
+ def cb_eval(cmd, *args)
1945
+ @callback_status[0] ||= TkVariable.new
1946
+ @callback_status[1] ||= TkVariable.new
1947
+ st, val = @callback_status
1948
+ th = Thread.new{
1949
+ self.eval_callback(*args){|safe, *params|
1950
+ #p [status, val, safe, *params]
1951
+ $SAFE=safe if $SAFE < safe
1952
+ begin
1953
+ TkComm._get_eval_string(TkUtil.eval_cmd(cmd, *params))
1954
+ rescue TkCallbackContinue
1955
+ st.value = 4
1956
+ rescue TkCallbackBreak
1957
+ st.value = 3
1958
+ rescue TkCallbackReturn
1959
+ st.value = 2
1960
+ rescue Exception => e
1961
+ val.value = e.message
1962
+ st.value = 1
1963
+ else
1964
+ st.value = 0
1965
+ end
1966
+ }
1967
+ }
1968
+ begin
1969
+ st.wait
1970
+ status = st.numeric
1971
+ retval = val.value
1972
+ rescue => e
1973
+ fail e
1974
+ end
1975
+
1976
+ if status == 1
1977
+ fail RuntimeError, retval
1978
+ elsif status == 2
1979
+ fail TkCallbackReturn, "Tk callback returns 'return' status"
1980
+ elsif status == 3
1981
+ fail TkCallbackBreak, "Tk callback returns 'break' status"
1982
+ elsif status == 4
1983
+ fail TkCallbackContinue, "Tk callback returns 'continue' status"
1984
+ else
1985
+ ''
1986
+ end
1987
+ end
1988
+ =end
1989
+
1990
+ end
1991
+
1992
+ # pseudo-toplevel operation support
1993
+ class MultiTkIp
1994
+ # instance method
1995
+ def __pseudo_toplevel
1996
+ ip = MultiTkIp.__getip
1997
+ (ip == @@DEFAULT_MASTER || ip == self) &&
1998
+ self.__pseudo_toplevel_evaluable? && @pseudo_toplevel[1]
1999
+ end
2000
+
2001
+ def __pseudo_toplevel=(m)
2002
+ unless (Thread.current.group == ThreadGroup::Default &&
2003
+ MultiTkIp.__getip == @@DEFAULT_MASTER)
2004
+ fail SecurityError, "no permission to manipulate"
2005
+ end
2006
+
2007
+ # if m.kind_of?(Module) && m.respond_to?(:pseudo_toplevel_evaluable?)
2008
+ if m.respond_to?(:pseudo_toplevel_evaluable?)
2009
+ @pseudo_toplevel[0] = true
2010
+ @pseudo_toplevel[1] = m
2011
+ else
2012
+ fail ArgumentError, 'fail to set pseudo-toplevel'
2013
+ end
2014
+ self
2015
+ end
2016
+
2017
+ def __pseudo_toplevel_evaluable?
2018
+ begin
2019
+ @pseudo_toplevel[0] && @pseudo_toplevel[1].pseudo_toplevel_evaluable?
2020
+ rescue Exception
2021
+ false
2022
+ end
2023
+ end
2024
+
2025
+ def __pseudo_toplevel_evaluable=(mode)
2026
+ unless (Thread.current.group == ThreadGroup::Default &&
2027
+ MultiTkIp.__getip == @@DEFAULT_MASTER)
2028
+ fail SecurityError, "no permission to manipulate"
2029
+ end
2030
+
2031
+ @pseudo_toplevel[0] = (mode)? true: false
2032
+ end
2033
+ end
2034
+
2035
+
2036
+ ################################################
2037
+ # use pseudo-toplevel feature of MultiTkIp ?
2038
+ if (!defined?(Use_PseudoToplevel_Feature_of_MultiTkIp) ||
2039
+ Use_PseudoToplevel_Feature_of_MultiTkIp)
2040
+ module MultiTkIp_PseudoToplevel_Evaluable
2041
+ #def pseudo_toplevel_eval(body = Proc.new)
2042
+ # Thread.current[:TOPLEVEL] = self
2043
+ # begin
2044
+ # body.call
2045
+ # ensure
2046
+ # Thread.current[:TOPLEVEL] = nil
2047
+ # end
2048
+ #end
2049
+
2050
+ def pseudo_toplevel_evaluable?
2051
+ @pseudo_toplevel_evaluable
2052
+ end
2053
+
2054
+ def pseudo_toplevel_evaluable=(mode)
2055
+ @pseudo_toplevel_evaluable = (mode)? true: false
2056
+ end
2057
+
2058
+ def self.extended(mod)
2059
+ mod.__send__(:extend_object, mod)
2060
+ mod.instance_variable_set('@pseudo_toplevel_evaluable', true)
2061
+ end
2062
+ end
2063
+
2064
+ class Object
2065
+ alias __method_missing_alias_for_MultiTkIp__ method_missing
2066
+ private :__method_missing_alias_for_MultiTkIp__
2067
+
2068
+ def method_missing(id, *args)
2069
+ begin
2070
+ has_top = (top = MultiTkIp.__getip.__pseudo_toplevel) &&
2071
+ top.respond_to?(:pseudo_toplevel_evaluable?) &&
2072
+ top.pseudo_toplevel_evaluable? &&
2073
+ top.respond_to?(id)
2074
+ rescue Exception => e
2075
+ has_top = false
2076
+ end
2077
+
2078
+ if has_top
2079
+ top.__send__(id, *args)
2080
+ else
2081
+ __method_missing_alias_for_MultiTkIp__(id, *args)
2082
+ end
2083
+ end
2084
+ end
2085
+ else
2086
+ # dummy
2087
+ module MultiTkIp_PseudoToplevel_Evaluable
2088
+ def pseudo_toplevel_evaluable?
2089
+ false
2090
+ end
2091
+ end
2092
+ end
2093
+
2094
+
2095
+ ################################################
2096
+ # evaluate a procedure on the proper interpreter
2097
+ class MultiTkIp
2098
+ # instance & class method
2099
+ def _proc_on_safelevel(cmd=nil) # require a block for eval
2100
+ if cmd
2101
+ if cmd.kind_of?(Method)
2102
+ _proc_on_safelevel{|*args| cmd.call(*args)}
2103
+ else
2104
+ _proc_on_safelevel(&cmd)
2105
+ end
2106
+ else
2107
+ #Proc.new{|safe, *args| $SAFE=safe if $SAFE < safe; yield(*args)}
2108
+ Proc.new{|safe, *args|
2109
+ # avoid security error on Exception objects
2110
+ untrust_proc = proc{|err|
2111
+ begin
2112
+ err.untrust if err.respond_to?(:untrust)
2113
+ rescue SecurityError
2114
+ end
2115
+ err
2116
+ }
2117
+ $SAFE=safe if $SAFE < safe;
2118
+ begin
2119
+ yield(*args)
2120
+ rescue Exception => e
2121
+ fail untrust_proc.call(e)
2122
+ end
2123
+ }
2124
+ end
2125
+ end
2126
+ def MultiTkIp._proc_on_safelevel(cmd=nil, &blk)
2127
+ MultiTkIp.__getip._proc_on_safelevel(cmd, &blk)
2128
+ end
2129
+
2130
+ def _proc_on_current_safelevel(cmd=nil, &blk) # require a block for eval
2131
+ safe = $SAFE
2132
+ cmd = _proc_on_safelevel(cmd, &blk)
2133
+ Proc.new{|*args| cmd.call(safe, *args)}
2134
+ end
2135
+ def MultiTkIp._proc_on_current_safelevel(cmd=nil, &blk)
2136
+ MultiTkIp.__getip._proc_on_current_safelevel(cmd, &blk)
2137
+ end
2138
+
2139
+ ######################################
2140
+ # instance method
2141
+ def eval_proc_core(req_val, cmd, *args)
2142
+ # check
2143
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
2144
+ unless cmd.kind_of?(Proc) || cmd.kind_of?(Method)
2145
+ raise RuntimeError, "A Proc/Method object is expected for the 'cmd' argument"
2146
+ end
2147
+
2148
+ # on IP thread
2149
+ if @cmd_receiver == Thread.current ||
2150
+ (!req_val && TclTkLib.mainloop_thread? != false) # callback
2151
+ begin
2152
+ ret = cmd.call(safe_level, *args)
2153
+ rescue SystemExit => e
2154
+ # exit IP
2155
+ warn("Warning: "+ e.inspect + " on " + self.inspect) if $DEBUG
2156
+ begin
2157
+ self._eval_without_enc('exit')
2158
+ rescue Exception => e
2159
+ end
2160
+ self.delete
2161
+ ret = nil
2162
+ rescue Exception => e
2163
+ if $DEBUG
2164
+ warn("Warning: " + e.class.inspect +
2165
+ ((e.message.length > 0)? ' "' + e.message + '"': '') +
2166
+ " on " + self.inspect)
2167
+ end
2168
+ =begin
2169
+ begin
2170
+ bt = _toUTF8(e.backtrace.join("\n"))
2171
+ bt.instance_variable_set(:@encoding, 'utf-8')
2172
+ rescue Exception
2173
+ bt = e.backtrace.join("\n")
2174
+ end
2175
+ begin
2176
+ @interp._set_global_var('errorInfo', bt)
2177
+ rescue Exception
2178
+ end
2179
+ =end
2180
+ ret = e
2181
+ end
2182
+ return ret
2183
+ end
2184
+
2185
+ # send cmd to the proc-queue
2186
+ unless req_val
2187
+ begin
2188
+ @cmd_queue.enq([nil, cmd, *args])
2189
+ rescue Exception => e
2190
+ # ignore
2191
+ if $DEBUG
2192
+ warn("Warning: " + e.class.inspect +
2193
+ ((e.message.length > 0)? ' "' + e.message + '"': '') +
2194
+ " on " + self.inspect)
2195
+ end
2196
+ return e
2197
+ end
2198
+ return nil
2199
+ end
2200
+
2201
+ # send and get return value by exception
2202
+ begin
2203
+ @cmd_queue.enq([Thread.current, cmd, *args])
2204
+ Thread.stop
2205
+ rescue MultiTkIp_OK => ret
2206
+ # return value
2207
+ return ret.value
2208
+ rescue SystemExit => e
2209
+ # exit IP
2210
+ warn("Warning: " + e.inspect + " on " + self.inspect) if $DEBUG
2211
+ begin
2212
+ self._eval_without_enc('exit')
2213
+ rescue Exception
2214
+ end
2215
+ if !self.deleted? && !safe? && allow_ruby_exit?
2216
+ self.delete
2217
+ fail e
2218
+ else
2219
+ self.delete
2220
+ end
2221
+ rescue Exception => e
2222
+ if $DEBUG
2223
+ warn("Warning: " + e.class.inspect +
2224
+ ((e.message.length > 0)? ' "' + e.message + '"': '') +
2225
+ " on " + self.inspect)
2226
+ end
2227
+ return e
2228
+ end
2229
+ return nil
2230
+ end
2231
+ private :eval_proc_core
2232
+
2233
+ if false && WITH_RUBY_VM ### Ruby 1.9
2234
+ # Not stable, so disable this feature
2235
+ def eval_callback(*args)
2236
+ if block_given?
2237
+ cmd = Proc.new
2238
+ else
2239
+ cmd = args.shift
2240
+ end
2241
+ begin
2242
+ if @@CALLBACK_SUBTHREAD.table[self].index(Thread.current)
2243
+ last_th = nil
2244
+ else
2245
+ last_th = @@CALLBACK_SUBTHREAD.table[self][-1]
2246
+ end
2247
+ @@CALLBACK_SUBTHREAD.new(self){
2248
+ @@CALLBACK_SUBTHREAD.table[self] << Thread.current
2249
+ begin
2250
+ last_th.join if last_th
2251
+ eval_proc_core(false, cmd, *args)
2252
+ rescue Exception=>e
2253
+ e
2254
+ ensure
2255
+ @@CALLBACK_SUBTHREAD.table[self].delete(Thread.current)
2256
+ end
2257
+ }
2258
+ end
2259
+ end
2260
+ else ### Ruby 1.8
2261
+ def eval_callback(*args)
2262
+ if block_given?
2263
+ cmd = Proc.new
2264
+ else
2265
+ cmd = args.shift
2266
+ end
2267
+ begin
2268
+ eval_proc_core(false, cmd, *args)
2269
+ rescue Exception=>e
2270
+ e
2271
+ ensure
2272
+ end
2273
+ end
2274
+ end
2275
+
2276
+ def eval_proc(*args, &blk)
2277
+ if block_given?
2278
+ cmd = _proc_on_safelevel(&blk)
2279
+ else
2280
+ unless (cmd = args.shift)
2281
+ fail ArgumentError, "A Proc or Method object is expected for 1st argument"
2282
+ end
2283
+ cmd = _proc_on_safelevel(&cmd)
2284
+ end
2285
+ if TclTkLib.mainloop_thread? == true
2286
+ # call from eventloop
2287
+ current = Thread.current
2288
+ backup_ip = current[:callback_ip]
2289
+ current[:callback_ip] = self
2290
+ begin
2291
+ eval_proc_core(false, cmd, *args)
2292
+ ensure
2293
+ current[:callback_ip] = backup_ip
2294
+ end
2295
+ else
2296
+ eval_proc_core(true,
2297
+ proc{|safe, *params|
2298
+ Thread.new{cmd.call(safe, *params)}.value
2299
+ },
2300
+ *args)
2301
+ end
2302
+ end
2303
+ =begin
2304
+ def eval_proc(*args)
2305
+ # The scope of the eval-block of 'eval_proc' method is different from
2306
+ # the external. If you want to pass local values to the eval-block,
2307
+ # use arguments of eval_proc method. They are passed to block-arguments.
2308
+ if block_given?
2309
+ cmd = Proc.new
2310
+ else
2311
+ unless (cmd = args.shift)
2312
+ fail ArgumentError, "A Proc or Method object is expected for 1st argument"
2313
+ end
2314
+ end
2315
+ if TclTkLib.mainloop_thread? == true
2316
+ # call from eventloop
2317
+ current = Thread.current
2318
+ backup_ip = current[:callback_ip]
2319
+ current[:callback_ip] = self
2320
+ begin
2321
+ eval_proc_core(false,
2322
+ proc{|safe, *params|
2323
+ $SAFE=safe if $SAFE < safe
2324
+ cmd.call(*params)
2325
+ }, *args)
2326
+ ensure
2327
+ current[:callback_ip] = backup_ip
2328
+ end
2329
+ else
2330
+ eval_proc_core(true,
2331
+ proc{|safe, *params|
2332
+ $SAFE=safe if $SAFE < safe
2333
+ Thread.new(*params, &cmd).value
2334
+ },
2335
+ *args)
2336
+ end
2337
+ end
2338
+ =end
2339
+ alias call eval_proc
2340
+
2341
+ def bg_eval_proc(*args)
2342
+ if block_given?
2343
+ cmd = Proc.new
2344
+ else
2345
+ unless (cmd = args.shift)
2346
+ fail ArgumentError, "A Proc or Method object is expected for 1st argument"
2347
+ end
2348
+ end
2349
+ Thread.new{
2350
+ eval_proc(cmd, *args)
2351
+ =begin
2352
+ eval_proc_core(false,
2353
+ proc{|safe, *params|
2354
+ $SAFE=safe if $SAFE < safe
2355
+ Thread.new(*params, &cmd).value
2356
+ },
2357
+ safe_level, *args)
2358
+ =end
2359
+ }
2360
+ end
2361
+ alias background_eval_proc bg_eval_proc
2362
+ alias thread_eval_proc bg_eval_proc
2363
+ alias bg_call bg_eval_proc
2364
+ alias background_call bg_eval_proc
2365
+
2366
+ def eval_string(cmd, *eval_args)
2367
+ # cmd string ==> proc
2368
+ unless cmd.kind_of?(String)
2369
+ raise RuntimeError, "A String object is expected for the 'cmd' argument"
2370
+ end
2371
+
2372
+ eval_proc_core(true,
2373
+ proc{|safe|
2374
+ Kernel.eval("$SAFE=#{safe} if $SAFE < #{safe};" << cmd,
2375
+ *eval_args)
2376
+ })
2377
+ end
2378
+ alias eval_str eval_string
2379
+
2380
+ def bg_eval_string(cmd, *eval_args)
2381
+ # cmd string ==> proc
2382
+ unless cmd.kind_of?(String)
2383
+ raise RuntimeError, "A String object is expected for the 'cmd' argument"
2384
+ end
2385
+ Thread.new{
2386
+ eval_proc_core(true,
2387
+ proc{|safe|
2388
+ Kernel.eval("$SAFE=#{safe} if $SAFE < #{safe};" << cmd,
2389
+ *eval_args)
2390
+ })
2391
+ }
2392
+ end
2393
+ alias background_eval_string bg_eval_string
2394
+ alias bg_eval_str bg_eval_string
2395
+ alias background_eval_str bg_eval_string
2396
+
2397
+ def eval(*args, &blk)
2398
+ if block_given?
2399
+ eval_proc(*args, &blk)
2400
+ elsif args[0]
2401
+ if args[0].respond_to?(:call)
2402
+ eval_proc(*args)
2403
+ else
2404
+ eval_string(*args)
2405
+ end
2406
+ else
2407
+ fail ArgumentError, "no argument to eval"
2408
+ end
2409
+ end
2410
+
2411
+ def bg_eval(*args, &blk)
2412
+ if block_given?
2413
+ bg_eval_proc(*args, &blk)
2414
+ elsif args[0]
2415
+ if args[0].respond_to?(:call)
2416
+ bg_eval_proc(*args)
2417
+ else
2418
+ bg_eval_string(*args)
2419
+ end
2420
+ else
2421
+ fail ArgumentError, "no argument to eval"
2422
+ end
2423
+ end
2424
+ alias background_eval bg_eval
2425
+ end
2426
+
2427
+ class << MultiTkIp
2428
+ # class method
2429
+ def eval_proc(*args, &blk)
2430
+ # class ==> interp object
2431
+ __getip.eval_proc(*args, &blk)
2432
+ end
2433
+ alias call eval_proc
2434
+
2435
+ def bg_eval_proc(*args, &blk)
2436
+ # class ==> interp object
2437
+ __getip.bg_eval_proc(*args, &blk)
2438
+ end
2439
+ alias background_eval_proc bg_eval_proc
2440
+ alias thread_eval_proc bg_eval_proc
2441
+ alias bg_call bg_eval_proc
2442
+ alias background_call bg_eval_proc
2443
+
2444
+ def eval_string(cmd, *eval_args)
2445
+ # class ==> interp object
2446
+ __getip.eval_string(cmd, *eval_args)
2447
+ end
2448
+ alias eval_str eval_string
2449
+
2450
+ def bg_eval_string(cmd, *eval_args)
2451
+ # class ==> interp object
2452
+ __getip.bg_eval_string(cmd, *eval_args)
2453
+ end
2454
+ alias background_eval_string bg_eval_string
2455
+ alias bg_eval_str bg_eval_string
2456
+ alias background_eval_str bg_eval_string
2457
+
2458
+ def eval(*args, &blk)
2459
+ # class ==> interp object
2460
+ __getip.eval(*args, &blk)
2461
+ end
2462
+ def bg_eval(*args, &blk)
2463
+ # class ==> interp object
2464
+ __getip.bg_eval(*args, &blk)
2465
+ end
2466
+ alias background_eval bg_eval
2467
+ end
2468
+
2469
+
2470
+ # event loop
2471
+ # all master/slave IPs are controlled by only one event-loop
2472
+ class MultiTkIp
2473
+ def self.default_master?
2474
+ __getip == @@DEFAULT_MASTER
2475
+ end
2476
+ end
2477
+ class << MultiTkIp
2478
+ def mainloop(check_root = true)
2479
+ __getip.mainloop(check_root)
2480
+ end
2481
+ def mainloop_watchdog(check_root = true)
2482
+ __getip.mainloop_watchdog(check_root)
2483
+ end
2484
+ def do_one_event(flag = TclTkLib::EventFlag::ALL)
2485
+ __getip.do_one_event(flag)
2486
+ end
2487
+ def mainloop_abort_on_exception
2488
+ # __getip.mainloop_abort_on_exception
2489
+ TclTkLib.mainloop_abort_on_exception
2490
+ end
2491
+ def mainloop_abort_on_exception=(mode)
2492
+ # __getip.mainloop_abort_on_exception=(mode)
2493
+ TclTkLib.mainloop_abort_on_exception=(mode)
2494
+ end
2495
+ def set_eventloop_tick(tick)
2496
+ __getip.set_eventloop_tick(tick)
2497
+ end
2498
+ def get_eventloop_tick
2499
+ __getip.get_eventloop_tick
2500
+ end
2501
+ def set_no_event_wait(tick)
2502
+ __getip.set_no_event_wait(tick)
2503
+ end
2504
+ def get_no_event_wait
2505
+ __getip.get_no_event_wait
2506
+ end
2507
+ def set_eventloop_weight(loop_max, no_event_tick)
2508
+ __getip.set_eventloop_weight(loop_max, no_event_tick)
2509
+ end
2510
+ def get_eventloop_weight
2511
+ __getip.get_eventloop_weight
2512
+ end
2513
+ end
2514
+
2515
+ # class methods to delegate to TclTkIp
2516
+ class << MultiTkIp
2517
+ def method_missing(id, *args)
2518
+ __getip.__send__(id, *args)
2519
+ end
2520
+
2521
+ def make_safe
2522
+ __getip.make_safe
2523
+ end
2524
+
2525
+ def safe?
2526
+ __getip.safe?
2527
+ end
2528
+
2529
+ def safe_base?
2530
+ begin
2531
+ __getip.safe_base?
2532
+ rescue
2533
+ false
2534
+ end
2535
+ end
2536
+
2537
+ def allow_ruby_exit?
2538
+ __getip.allow_ruby_exit?
2539
+ end
2540
+
2541
+ def allow_ruby_exit= (mode)
2542
+ __getip.allow_ruby_exit = mode
2543
+ end
2544
+
2545
+ def delete
2546
+ __getip.delete
2547
+ end
2548
+
2549
+ def deleted?
2550
+ __getip.deleted?
2551
+ end
2552
+
2553
+ def has_mainwindow?
2554
+ __getip.has_mainwindow?
2555
+ end
2556
+
2557
+ def invalid_namespace?
2558
+ __getip.invalid_namespace?
2559
+ end
2560
+
2561
+ def abort(msg = nil)
2562
+ __getip.abort(msg)
2563
+ end
2564
+
2565
+ def exit(st = true)
2566
+ __getip.exit(st)
2567
+ end
2568
+
2569
+ def exit!(st = false)
2570
+ __getip.exit!(st)
2571
+ end
2572
+
2573
+ def restart(app_name = nil, keys = {})
2574
+ init_ip_internal
2575
+
2576
+ __getip._invoke('set', 'argv0', app_name) if app_name
2577
+ if keys.kind_of?(Hash)
2578
+ __getip._invoke('set', 'argv', _keys2opts(keys))
2579
+ end
2580
+
2581
+ __getip.restart
2582
+ end
2583
+
2584
+ def _eval(str)
2585
+ __getip._eval(str)
2586
+ end
2587
+
2588
+ def _invoke(*args)
2589
+ __getip._invoke(*args)
2590
+ end
2591
+
2592
+ def _eval_without_enc(str)
2593
+ __getip._eval_without_enc(str)
2594
+ end
2595
+
2596
+ def _invoke_without_enc(*args)
2597
+ __getip._invoke_without_enc(*args)
2598
+ end
2599
+
2600
+ def _eval_with_enc(str)
2601
+ __getip._eval_with_enc(str)
2602
+ end
2603
+
2604
+ def _invoke_with_enc(*args)
2605
+ __getip._invoke_with_enc(*args)
2606
+ end
2607
+
2608
+ def _toUTF8(str, encoding=nil)
2609
+ __getip._toUTF8(str, encoding)
2610
+ end
2611
+
2612
+ def _fromUTF8(str, encoding=nil)
2613
+ __getip._fromUTF8(str, encoding)
2614
+ end
2615
+
2616
+ def _thread_vwait(var)
2617
+ __getip._thread_vwait(var)
2618
+ end
2619
+
2620
+ def _thread_tkwait(mode, target)
2621
+ __getip._thread_tkwait(mode, target)
2622
+ end
2623
+
2624
+ def _return_value
2625
+ __getip._return_value
2626
+ end
2627
+
2628
+ def _get_variable(var, flag)
2629
+ __getip._get_variable(var, flag)
2630
+ end
2631
+ def _get_variable2(var, idx, flag)
2632
+ __getip._get_variable2(var, idx, flag)
2633
+ end
2634
+ def _set_variable(var, value, flag)
2635
+ __getip._set_variable(var, value, flag)
2636
+ end
2637
+ def _set_variable2(var, idx, value, flag)
2638
+ __getip._set_variable2(var, idx, value, flag)
2639
+ end
2640
+ def _unset_variable(var, flag)
2641
+ __getip._unset_variable(var, flag)
2642
+ end
2643
+ def _unset_variable2(var, idx, flag)
2644
+ __getip._unset_variable2(var, idx, flag)
2645
+ end
2646
+
2647
+ def _get_global_var(var)
2648
+ __getip._get_global_var(var)
2649
+ end
2650
+ def _get_global_var2(var, idx)
2651
+ __getip._get_global_var2(var, idx)
2652
+ end
2653
+ def _set_global_var(var, value)
2654
+ __getip._set_global_var(var, value)
2655
+ end
2656
+ def _set_global_var2(var, idx, value)
2657
+ __getip._set_global_var2(var, idx, value)
2658
+ end
2659
+ def _unset_global_var(var)
2660
+ __getip._unset_global_var(var)
2661
+ end
2662
+ def _unset_global_var2(var, idx)
2663
+ __getip._unset_global_var2(var, idx)
2664
+ end
2665
+
2666
+ def _make_menu_embeddable(menu_path)
2667
+ __getip._make_menu_embeddable(menu_path)
2668
+ end
2669
+
2670
+ def _split_tklist(str)
2671
+ __getip._split_tklist(str)
2672
+ end
2673
+ def _merge_tklist(*args)
2674
+ __getip._merge_tklist(*args)
2675
+ end
2676
+ def _conv_listelement(arg)
2677
+ __getip._conv_listelement(arg)
2678
+ end
2679
+
2680
+ def _create_console
2681
+ __getip._create_console
2682
+ end
2683
+ end
2684
+
2685
+
2686
+ # wrap methods on TclTkLib : not permit calling TclTkLib module methods
2687
+ class << TclTkLib
2688
+ def mainloop(check_root = true)
2689
+ MultiTkIp.mainloop(check_root)
2690
+ end
2691
+ def mainloop_watchdog(check_root = true)
2692
+ MultiTkIp.mainloop_watchdog(check_root)
2693
+ end
2694
+ def do_one_event(flag = TclTkLib::EventFlag::ALL)
2695
+ MultiTkIp.do_one_event(flag)
2696
+ end
2697
+ #def mainloop_abort_on_exception
2698
+ # MultiTkIp.mainloop_abort_on_exception
2699
+ #end
2700
+ #def mainloop_abort_on_exception=(mode)
2701
+ # MultiTkIp.mainloop_abort_on_exception=(mode)
2702
+ #end
2703
+ def set_eventloop_tick(tick)
2704
+ MultiTkIp.set_eventloop_tick(tick)
2705
+ end
2706
+ def get_eventloop_tick
2707
+ MultiTkIp.get_eventloop_tick
2708
+ end
2709
+ def set_no_event_wait(tick)
2710
+ MultiTkIp.set_no_event_wait(tick)
2711
+ end
2712
+ def get_no_event_wait
2713
+ MultiTkIp.get_no_event_wait
2714
+ end
2715
+ def set_eventloop_weight(loop_max, no_event_tick)
2716
+ MultiTkIp.set_eventloop_weight(loop_max, no_event_tick)
2717
+ end
2718
+ def get_eventloop_weight
2719
+ MultiTkIp.get_eventloop_weight
2720
+ end
2721
+ def restart(*args)
2722
+ MultiTkIp.restart(*args)
2723
+ end
2724
+
2725
+ def _merge_tklist(*args)
2726
+ MultiTkIp._merge_tklist(*args)
2727
+ end
2728
+ def _conv_listelement(arg)
2729
+ MultiTkIp._conv_listelement(arg)
2730
+ end
2731
+ end
2732
+
2733
+
2734
+ # depend on TclTkIp
2735
+ class MultiTkIp
2736
+ # def mainloop(check_root = true, restart_on_dead = true)
2737
+ def mainloop(check_root = true, restart_on_dead = false)
2738
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
2739
+
2740
+ if WITH_RUBY_VM ### Ruby 1.9 !!!!!!!!!!!
2741
+ return @interp_thread.value if @interp_thread
2742
+ end
2743
+
2744
+ #return self if self.slave?
2745
+ #return self if self != @@DEFAULT_MASTER
2746
+ if self != @@DEFAULT_MASTER
2747
+ if @wait_on_mainloop[0]
2748
+ begin
2749
+ @wait_on_mainloop[1] += 1
2750
+ @cmd_queue.enq([@system, 'call_mainloop',
2751
+ Thread.current, check_root])
2752
+ Thread.stop
2753
+ rescue MultiTkIp_OK => ret
2754
+ # return value
2755
+ if ret.value.kind_of?(Thread)
2756
+ return ret.value.value
2757
+ else
2758
+ return ret.value
2759
+ end
2760
+ rescue SystemExit => e
2761
+ # exit IP
2762
+ warn("Warning: " + e.inspect + " on " + self.inspect) if $DEBUG
2763
+ begin
2764
+ self._eval_without_enc('exit')
2765
+ rescue Exception
2766
+ end
2767
+ self.delete
2768
+ rescue StandardError => e
2769
+ if $DEBUG
2770
+ warn("Warning: " + e.class.inspect +
2771
+ ((e.message.length > 0)? ' "' + e.message + '"': '') +
2772
+ " on " + self.inspect)
2773
+ end
2774
+ return e
2775
+ rescue Exception => e
2776
+ return e
2777
+ ensure
2778
+ @wait_on_mainloop[1] -= 1
2779
+ end
2780
+ end
2781
+ return
2782
+ end
2783
+
2784
+ unless restart_on_dead
2785
+ @wait_on_mainloop[1] += 1
2786
+ =begin
2787
+ begin
2788
+ @interp.mainloop(check_root)
2789
+ rescue StandardError => e
2790
+ if $DEBUG
2791
+ warn("Warning: " + e.class.inspect +
2792
+ ((e.message.length > 0)? ' "' + e.message + '"': '') +
2793
+ " on " + self.inspect)
2794
+ end
2795
+ end
2796
+ =end
2797
+ begin
2798
+ @interp.mainloop(check_root)
2799
+ ensure
2800
+ @wait_on_mainloop[1] -= 1
2801
+ end
2802
+ else
2803
+ loop do
2804
+ break unless self.alive?
2805
+ if check_root
2806
+ begin
2807
+ break if TclTkLib.num_of_mainwindows == 0
2808
+ rescue StandardError
2809
+ break
2810
+ end
2811
+ end
2812
+ break if @interp.deleted?
2813
+ begin
2814
+ @wait_on_mainloop[1] += 1
2815
+ @interp.mainloop(check_root)
2816
+ rescue StandardError => e
2817
+ if TclTkLib.mainloop_abort_on_exception != nil
2818
+ #STDERR.print("Warning: Tk mainloop receives ", $!.class.inspect,
2819
+ # " exception (ignore) : ", $!.message, "\n");
2820
+ if $DEBUG
2821
+ warn("Warning: Tk mainloop receives " << e.class.inspect <<
2822
+ " exception (ignore) : " << e.message);
2823
+ end
2824
+ end
2825
+ #raise e
2826
+ rescue Exception => e
2827
+ =begin
2828
+ if TclTkLib.mainloop_abort_on_exception != nil
2829
+ #STDERR.print("Warning: Tk mainloop receives ", $!.class.inspect,
2830
+ # " exception (ignore) : ", $!.message, "\n");
2831
+ if $DEBUG
2832
+ warn("Warning: Tk mainloop receives " << e.class.inspect <<
2833
+ " exception (ignore) : " << e.message);
2834
+ end
2835
+ end
2836
+ =end
2837
+ raise e
2838
+ ensure
2839
+ @wait_on_mainloop[1] -= 1
2840
+ Thread.pass # avoid eventloop conflict
2841
+ end
2842
+ end
2843
+ end
2844
+ self
2845
+ end
2846
+
2847
+ def make_safe
2848
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
2849
+ @interp.make_safe
2850
+ end
2851
+
2852
+ def safe?
2853
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
2854
+ @interp.safe?
2855
+ end
2856
+
2857
+ def safe_base?
2858
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
2859
+ @safe_base
2860
+ end
2861
+
2862
+ def allow_ruby_exit?
2863
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
2864
+ @interp.allow_ruby_exit?
2865
+ end
2866
+
2867
+ def allow_ruby_exit= (mode)
2868
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
2869
+ @interp.allow_ruby_exit = mode
2870
+ end
2871
+
2872
+ def delete
2873
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
2874
+ @slave_ip_tbl.each{|name, subip|
2875
+ _destroy_slaves_of_slaveIP(subip)
2876
+ =begin
2877
+ begin
2878
+ subip._invoke('destroy', '.') unless subip.deleted?
2879
+ rescue Exception
2880
+ end
2881
+ =end
2882
+ begin
2883
+ # subip._eval_without_enc("foreach i [after info] {after cancel $i}")
2884
+ unless subip.deleted?
2885
+ after_ids = subip._eval_without_enc("after info")
2886
+ subip._eval_without_enc("foreach i {#{after_ids}} {after cancel $i}")
2887
+ end
2888
+ rescue Exception
2889
+ end
2890
+
2891
+ # safe_base?
2892
+ if @interp._eval_without_enc("catch {::safe::interpConfigure #{name}}") == '0'
2893
+ begin
2894
+ @interp._eval_without_enc("::safe::interpDelete #{name}")
2895
+ rescue Exception
2896
+ else
2897
+ next if subip.deleted?
2898
+ end
2899
+ end
2900
+ if subip.respond_to?(:safe_base?) && subip.safe_base? &&
2901
+ !subip.deleted?
2902
+ # do 'exit' to call the delete_hook procedure
2903
+ begin
2904
+ subip._eval_without_enc('exit')
2905
+ rescue Exception
2906
+ end
2907
+ else
2908
+ begin
2909
+ subip.delete unless subip.deleted?
2910
+ rescue Exception
2911
+ end
2912
+ end
2913
+ }
2914
+
2915
+ begin
2916
+ # @interp._eval_without_enc("foreach i [after info] {after cancel $i}")
2917
+ after_ids = @interp._eval_without_enc("after info")
2918
+ @interp._eval_without_enc("foreach i {#{after_ids}} {after cancel $i}")
2919
+ rescue Exception
2920
+ end
2921
+
2922
+ begin
2923
+ @interp._invoke('destroy', '.') unless @interp.deleted?
2924
+ rescue Exception
2925
+ end
2926
+
2927
+ if @safe_base && !@interp.deleted?
2928
+ # do 'exit' to call the delete_hook procedure
2929
+ @interp._eval_without_enc('exit')
2930
+ end
2931
+ @interp.delete
2932
+ self
2933
+ end
2934
+
2935
+ def deleted?
2936
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
2937
+ @interp.deleted?
2938
+ end
2939
+
2940
+ def has_mainwindow?
2941
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
2942
+ @interp.has_mainwindow?
2943
+ end
2944
+
2945
+ def invalid_namespace?
2946
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
2947
+ @interp.invalid_namespace?
2948
+ end
2949
+
2950
+ def abort(msg = nil)
2951
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
2952
+ if master? && !safe? && allow_ruby_exit?
2953
+ if msg
2954
+ Kernel.abort(msg)
2955
+ else
2956
+ Kernel.abort
2957
+ end
2958
+ else
2959
+ # ignore msg
2960
+ delete
2961
+ 1
2962
+ end
2963
+ end
2964
+
2965
+ def exit(st = true)
2966
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
2967
+ if master? && !safe? && allow_ruby_exit?
2968
+ Kernel.exit(st)
2969
+ else
2970
+ delete
2971
+ st
2972
+ end
2973
+ end
2974
+
2975
+ def exit!(st = false)
2976
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
2977
+ if master? && !safe? && allow_ruby_exit?
2978
+ Kernel.exit!(st)
2979
+ else
2980
+ delete
2981
+ st
2982
+ end
2983
+ end
2984
+
2985
+ def restart(app_name = nil, keys = {})
2986
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
2987
+
2988
+ _init_ip_internal(@@INIT_IP_ENV, @@ADD_TK_PROCS)
2989
+
2990
+ @interp._invoke('set', 'argv0', app_name) if app_name
2991
+ if keys.kind_of?(Hash)
2992
+ @interp._invoke('set', 'argv', _keys2opts(keys))
2993
+ end
2994
+
2995
+ @interp.restart
2996
+ end
2997
+
2998
+ def __eval(str)
2999
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3000
+ @interp.__eval(str)
3001
+ end
3002
+
3003
+ def __invoke(*args)
3004
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3005
+ @interp.__invoke(*args)
3006
+ end
3007
+
3008
+ def _eval(str)
3009
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3010
+ @interp._eval(str)
3011
+ end
3012
+
3013
+ def _invoke(*args)
3014
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3015
+ @interp._invoke(*args)
3016
+ end
3017
+
3018
+ def _eval_without_enc(str)
3019
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3020
+ @interp._eval_without_enc(str)
3021
+ end
3022
+
3023
+ def _invoke_without_enc(*args)
3024
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3025
+ @interp._invoke_without_enc(*args)
3026
+ end
3027
+
3028
+ def _eval_with_enc(str)
3029
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3030
+ @interp._eval_with_enc(str)
3031
+ end
3032
+
3033
+ def _invoke_with_enc(*args)
3034
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3035
+ @interp._invoke_with_enc(*args)
3036
+ end
3037
+
3038
+ def _toUTF8(str, encoding=nil)
3039
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3040
+ @interp._toUTF8(str, encoding)
3041
+ end
3042
+
3043
+ def _fromUTF8(str, encoding=nil)
3044
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3045
+ @interp._fromUTF8(str, encoding)
3046
+ end
3047
+
3048
+ def _thread_vwait(var)
3049
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3050
+ @interp._thread_vwait(var)
3051
+ end
3052
+
3053
+ def _thread_tkwait(mode, target)
3054
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3055
+ @interp._thread_tkwait(mode, target)
3056
+ end
3057
+
3058
+ def _return_value
3059
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3060
+ @interp._return_value
3061
+ end
3062
+
3063
+ def _get_variable(var, flag)
3064
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3065
+ @interp._get_variable(var, flag)
3066
+ end
3067
+ def _get_variable2(var, idx, flag)
3068
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3069
+ @interp._get_variable2(var, idx, flag)
3070
+ end
3071
+ def _set_variable(var, value, flag)
3072
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3073
+ @interp._set_variable(var, value, flag)
3074
+ end
3075
+ def _set_variable2(var, idx, value, flag)
3076
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3077
+ @interp._set_variable2(var, idx, value, flag)
3078
+ end
3079
+ def _unset_variable(var, flag)
3080
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3081
+ @interp._unset_variable(var, flag)
3082
+ end
3083
+ def _unset_variable2(var, idx, flag)
3084
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3085
+ @interp._unset_variable2(var, idx, flag)
3086
+ end
3087
+
3088
+ def _get_global_var(var)
3089
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3090
+ @interp._get_global_var(var)
3091
+ end
3092
+ def _get_global_var2(var, idx)
3093
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3094
+ @interp._get_global_var2(var, idx)
3095
+ end
3096
+ def _set_global_var(var, value)
3097
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3098
+ @interp._set_global_var(var, value)
3099
+ end
3100
+ def _set_global_var2(var, idx, value)
3101
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3102
+ @interp._set_global_var2(var, idx, value)
3103
+ end
3104
+ def _unset_global_var(var)
3105
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3106
+ @interp._unset_global_var(var)
3107
+ end
3108
+ def _unset_global_var2(var, idx)
3109
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3110
+ @interp._unset_global_var2(var, idx)
3111
+ end
3112
+
3113
+ def _make_menu_embeddable(menu_path)
3114
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3115
+ @interp._make_menu_embeddable(menu_path)
3116
+ end
3117
+
3118
+ def _split_tklist(str)
3119
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3120
+ @interp._split_tklist(str)
3121
+ end
3122
+ def _merge_tklist(*args)
3123
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3124
+ @interp._merge_tklist(*args)
3125
+ end
3126
+ def _conv_listelement(arg)
3127
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3128
+ @interp._conv_listelement(arg)
3129
+ end
3130
+ end
3131
+
3132
+
3133
+ # interp command support
3134
+ class MultiTkIp
3135
+ def _lst2ary(str)
3136
+ return [] if str == ""
3137
+ idx = str.index('{')
3138
+ while idx and idx > 0 and str[idx-1] == ?\\
3139
+ idx = str.index('{', idx+1)
3140
+ end
3141
+ return str.split unless idx
3142
+
3143
+ list = str[0,idx].split
3144
+ str = str[idx+1..-1]
3145
+ i = -1
3146
+ brace = 1
3147
+ str.each_byte {|c|
3148
+ c = c.chr
3149
+ i += 1
3150
+ brace += 1 if c == '{'
3151
+ brace -= 1 if c == '}'
3152
+ break if brace == 0
3153
+ }
3154
+ if i == 0
3155
+ list.push ''
3156
+ elsif str[0, i] == ' '
3157
+ list.push ' '
3158
+ else
3159
+ list.push str[0..i-1]
3160
+ end
3161
+ #list += _lst2ary(str[i+1..-1])
3162
+ list.concat(_lst2ary(str[i+1..-1]))
3163
+ list
3164
+ end
3165
+ private :_lst2ary
3166
+
3167
+ def _slavearg(slave)
3168
+ if slave.kind_of?(MultiTkIp)
3169
+ slave.path
3170
+ elsif slave.kind_of?(String)
3171
+ slave
3172
+ else
3173
+ slave.to_s
3174
+ end
3175
+ end
3176
+ private :_slavearg
3177
+
3178
+ def alias_info(slave, cmd_name)
3179
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3180
+ _lst2ary(@interp._invoke('interp', 'alias', _slavearg(slave), cmd_name))
3181
+ end
3182
+ def self.alias_info(slave, cmd_name)
3183
+ __getip.alias_info(slave, cmd_name)
3184
+ end
3185
+
3186
+ def alias_delete(slave, cmd_name)
3187
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3188
+ @interp._invoke('interp', 'alias', _slavearg(slave), cmd_name, '')
3189
+ self
3190
+ end
3191
+ def self.alias_delete(slave, cmd_name)
3192
+ __getip.alias_delete(slave, cmd_name)
3193
+ self
3194
+ end
3195
+
3196
+ def def_alias(slave, new_cmd, org_cmd, *args)
3197
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3198
+ ret = @interp._invoke('interp', 'alias', _slavearg(slave), new_cmd,
3199
+ '', org_cmd, *args)
3200
+ (ret == new_cmd)? self: nil
3201
+ end
3202
+ def self.def_alias(slave, new_cmd, org_cmd, *args)
3203
+ ret = __getip.def_alias(slave, new_cmd, org_cmd, *args)
3204
+ (ret == new_cmd)? self: nil
3205
+ end
3206
+
3207
+ def aliases(slave = '')
3208
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3209
+ _lst2ary(@interp._invoke('interp', 'aliases', _slavearg(slave)))
3210
+ end
3211
+ def self.aliases(slave = '')
3212
+ __getip.aliases(slave)
3213
+ end
3214
+
3215
+ def delete_slaves(*args)
3216
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3217
+ slaves = args.collect{|s| _slavearg(s)}
3218
+ @interp._invoke('interp', 'delete', *slaves) if slaves.size > 0
3219
+ self
3220
+ end
3221
+ def self.delete_slaves(*args)
3222
+ __getip.delete_slaves(*args)
3223
+ self
3224
+ end
3225
+
3226
+ def exist?(slave = '')
3227
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3228
+ ret = @interp._invoke('interp', 'exists', _slavearg(slave))
3229
+ (ret == '1')? true: false
3230
+ end
3231
+ def self.exist?(slave = '')
3232
+ __getip.exist?(slave)
3233
+ end
3234
+
3235
+ def delete_cmd(slave, cmd)
3236
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3237
+ slave_invoke = @interp._invoke('list', 'rename', cmd, '')
3238
+ @interp._invoke('interp', 'eval', _slavearg(slave), slave_invoke)
3239
+ self
3240
+ end
3241
+ def self.delete_cmd(slave, cmd)
3242
+ __getip.delete_cmd(slave, cmd)
3243
+ self
3244
+ end
3245
+
3246
+ def expose_cmd(slave, cmd, aliasname = nil)
3247
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3248
+ if aliasname
3249
+ @interp._invoke('interp', 'expose', _slavearg(slave), cmd, aliasname)
3250
+ else
3251
+ @interp._invoke('interp', 'expose', _slavearg(slave), cmd)
3252
+ end
3253
+ self
3254
+ end
3255
+ def self.expose_cmd(slave, cmd, aliasname = nil)
3256
+ __getip.expose_cmd(slave, cmd, aliasname)
3257
+ self
3258
+ end
3259
+
3260
+ def hide_cmd(slave, cmd, aliasname = nil)
3261
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3262
+ if aliasname
3263
+ @interp._invoke('interp', 'hide', _slavearg(slave), cmd, aliasname)
3264
+ else
3265
+ @interp._invoke('interp', 'hide', _slavearg(slave), cmd)
3266
+ end
3267
+ self
3268
+ end
3269
+ def self.hide_cmd(slave, cmd, aliasname = nil)
3270
+ __getip.hide_cmd(slave, cmd, aliasname)
3271
+ self
3272
+ end
3273
+
3274
+ def hidden_cmds(slave = '')
3275
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3276
+ _lst2ary(@interp._invoke('interp', 'hidden', _slavearg(slave)))
3277
+ end
3278
+ def self.hidden_cmds(slave = '')
3279
+ __getip.hidden_cmds(slave)
3280
+ end
3281
+
3282
+ def invoke_hidden(slave, cmd, *args)
3283
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3284
+ if args[-1].kind_of?(Hash)
3285
+ keys = _symbolkey2str(args.pop)
3286
+ else
3287
+ keys = []
3288
+ end
3289
+ keys << _slavearg(slave)
3290
+ if Tk::TCL_MAJOR_VERSION > 8 ||
3291
+ (Tk::TCL_MAJOR_VERSION == 8 && Tk::TCL_MINOR_VERSION >= 5)
3292
+ keys << '--'
3293
+ end
3294
+ keys << cmd
3295
+ keys.concat(args)
3296
+ @interp._invoke('interp', 'invokehidden', *keys)
3297
+ end
3298
+ def self.invoke_hidden(slave, cmd, *args)
3299
+ __getip.invoke_hidden(slave, cmd, *args)
3300
+ end
3301
+
3302
+ def invoke_hidden_on_global(slave, cmd, *args)
3303
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3304
+ if args[-1].kind_of?(Hash)
3305
+ keys = _symbolkey2str(args.pop)
3306
+ else
3307
+ keys = []
3308
+ end
3309
+ keys << _slavearg(slave)
3310
+ keys << '-global'
3311
+ if Tk::TCL_MAJOR_VERSION > 8 ||
3312
+ (Tk::TCL_MAJOR_VERSION == 8 && Tk::TCL_MINOR_VERSION >= 5)
3313
+ keys << '--'
3314
+ end
3315
+ keys << cmd
3316
+ keys.concat(args)
3317
+ @interp._invoke('interp', 'invokehidden', *keys)
3318
+ end
3319
+ def self.invoke_hidden_on_global(slave, cmd, *args)
3320
+ __getip.invoke_hidden_on_global(slave, cmd, *args)
3321
+ end
3322
+
3323
+ def invoke_hidden_on_namespace(slave, ns, cmd, *args)
3324
+ # for Tcl8.5 or later
3325
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3326
+ if args[-1].kind_of?(Hash)
3327
+ keys = _symbolkey2str(args.pop)
3328
+ else
3329
+ keys = []
3330
+ end
3331
+ keys << _slavearg(slave)
3332
+ keys << '-namespace' << TkComm._get_eval_string(ns)
3333
+ keys << '--' << cmd
3334
+ keys.concat(args)
3335
+ @interp._invoke('interp', 'invokehidden', *keys)
3336
+ end
3337
+ def self.invoke_hidden_on_namespace(slave, ns, cmd, *args)
3338
+ __getip.invoke_hidden_on_namespace(slave, ns, cmd, *args)
3339
+ end
3340
+
3341
+ def mark_trusted(slave = '')
3342
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3343
+ @interp._invoke('interp', 'marktrusted', _slavearg(slave))
3344
+ self
3345
+ end
3346
+ def self.mark_trusted(slave = '')
3347
+ __getip.mark_trusted(slave)
3348
+ self
3349
+ end
3350
+
3351
+ def set_bgerror_handler(cmd = Proc.new, slave = nil, &b)
3352
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3353
+
3354
+ unless TkComm._callback_entry?(cmd)
3355
+ if !slave && b
3356
+ slave = cmd
3357
+ cmd = Proc.new(&b)
3358
+ end
3359
+ end
3360
+ slave = '' unless slave
3361
+
3362
+ @interp._invoke('interp', 'bgerror', _slavearg(slave), cmd)
3363
+ end
3364
+ def self.bgerror(cmd = Proc.new, slave = nil, &b)
3365
+ __getip.bgerror(cmd, slave, &b)
3366
+ end
3367
+
3368
+ def get_bgerror_handler(slave = '')
3369
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3370
+ procedure(@interp._invoke('interp', 'bgerror', _slavearg(slave)))
3371
+ end
3372
+ def self.bgerror(slave = '')
3373
+ __getip.bgerror(slave)
3374
+ end
3375
+
3376
+ def set_limit(limit_type, slave = '', opts = {})
3377
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3378
+ @interp._invoke('interp', 'limit', _slavearg(slave), limit_type, opts)
3379
+ end
3380
+ def self.set_limit(limit_type, slave = '', opts = {})
3381
+ __getip.set_limit(limit_type, slave, opts)
3382
+ end
3383
+
3384
+ def get_limit(limit_type, slave = '', slot = nil)
3385
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3386
+
3387
+ if slot
3388
+ num_or_str(@interp._invoke('interp', 'limit', _slavearg(slave),
3389
+ limit_type, slot))
3390
+ else
3391
+ l = @interp._split_tklist(@interp._invoke_without_enc('interp', 'limit',
3392
+ _slavearg(slave),
3393
+ limit_type))
3394
+ l.map!{|s| _fromUTF8(s)}
3395
+ r = {}
3396
+ until l.empty?
3397
+ key = l.shift[1..-1]
3398
+ val = l.shift
3399
+ val = num_or_str(val) if val
3400
+ r[key] = val
3401
+ end
3402
+ r
3403
+ end
3404
+ end
3405
+ def self.get_limit(limit_type, slave = '', slot = nil)
3406
+ __getip.get_limit(limit_type, slave, slot)
3407
+ end
3408
+
3409
+ def recursion_limit(slave = '', limit = None)
3410
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3411
+ number(@interp._invoke('interp', 'recursionlimit',
3412
+ _slavearg(slave), limit))
3413
+ end
3414
+ def self.recursion_limit(slave = '', limit = None)
3415
+ __getip.recursion_limit(slave)
3416
+ end
3417
+
3418
+ def alias_target(aliascmd, slave = '')
3419
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3420
+ @interp._invoke('interp', 'target', _slavearg(slave), aliascmd)
3421
+ end
3422
+ def self.alias_target(aliascmd, slave = '')
3423
+ __getip.alias_target(aliascmd, slave)
3424
+ end
3425
+
3426
+ def share_stdin(dist, src = '')
3427
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3428
+ @interp._invoke('interp', 'share', src, 'stdin', dist)
3429
+ self
3430
+ end
3431
+ def self.share_stdin(dist, src = '')
3432
+ __getip.share_stdin(dist, src)
3433
+ self
3434
+ end
3435
+
3436
+ def share_stdout(dist, src = '')
3437
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3438
+ @interp._invoke('interp', 'share', src, 'stdout', dist)
3439
+ self
3440
+ end
3441
+ def self.share_stdout(dist, src = '')
3442
+ __getip.share_stdout(dist, src)
3443
+ self
3444
+ end
3445
+
3446
+ def share_stderr(dist, src = '')
3447
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3448
+ @interp._invoke('interp', 'share', src, 'stderr', dist)
3449
+ self
3450
+ end
3451
+ def self.share_stderr(dist, src = '')
3452
+ __getip.share_stderr(dist, src)
3453
+ self
3454
+ end
3455
+
3456
+ def transfer_stdin(dist, src = '')
3457
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3458
+ @interp._invoke('interp', 'transfer', src, 'stdin', dist)
3459
+ self
3460
+ end
3461
+ def self.transfer_stdin(dist, src = '')
3462
+ __getip.transfer_stdin(dist, src)
3463
+ self
3464
+ end
3465
+
3466
+ def transfer_stdout(dist, src = '')
3467
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3468
+ @interp._invoke('interp', 'transfer', src, 'stdout', dist)
3469
+ self
3470
+ end
3471
+ def self.transfer_stdout(dist, src = '')
3472
+ __getip.transfer_stdout(dist, src)
3473
+ self
3474
+ end
3475
+
3476
+ def transfer_stderr(dist, src = '')
3477
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3478
+ @interp._invoke('interp', 'transfer', src, 'stderr', dist)
3479
+ self
3480
+ end
3481
+ def self.transfer_stderr(dist, src = '')
3482
+ __getip.transfer_stderr(dist, src)
3483
+ self
3484
+ end
3485
+
3486
+ def share_stdio(dist, src = '')
3487
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3488
+ @interp._invoke('interp', 'share', src, 'stdin', dist)
3489
+ @interp._invoke('interp', 'share', src, 'stdout', dist)
3490
+ @interp._invoke('interp', 'share', src, 'stderr', dist)
3491
+ self
3492
+ end
3493
+ def self.share_stdio(dist, src = '')
3494
+ __getip.share_stdio(dist, src)
3495
+ self
3496
+ end
3497
+
3498
+ def transfer_stdio(dist, src = '')
3499
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3500
+ @interp._invoke('interp', 'transfer', src, 'stdin', dist)
3501
+ @interp._invoke('interp', 'transfer', src, 'stdout', dist)
3502
+ @interp._invoke('interp', 'transfer', src, 'stderr', dist)
3503
+ self
3504
+ end
3505
+ def self.transfer_stdio(dist, src = '')
3506
+ __getip.transfer_stdio(dist, src)
3507
+ self
3508
+ end
3509
+ end
3510
+
3511
+
3512
+ # Safe Base :: manipulating safe interpreter
3513
+ class MultiTkIp
3514
+ def safeip_configure(slot, value=None)
3515
+ # use for '-noStatics' option ==> {statics=>false}
3516
+ # for '-nestedLoadOk' option ==> {nested=>true}
3517
+ if slot.kind_of?(Hash)
3518
+ ip = MultiTkIp.__getip
3519
+ ip._eval('::safe::interpConfigure ' + @ip_name + ' ' + _keys2opts(slot))
3520
+ else
3521
+ ip._eval('::safe::interpConfigure ' + @ip_name + ' ' +
3522
+ "-#{slot} #{_get_eval_string(value)}")
3523
+ end
3524
+ self
3525
+ end
3526
+
3527
+ def safeip_configinfo(slot = nil)
3528
+ ip = MultiTkIp.__getip
3529
+ ret = {}
3530
+ if slot
3531
+ conf = _lst2ary(ip._eval("::safe::interpConfigure " +
3532
+ @ip_name + " -#{slot}"))
3533
+ if conf[0] == '-deleteHook'
3534
+ =begin
3535
+ if conf[1] =~ /^rb_out\S* (c(_\d+_)?\d+)/
3536
+ ret[conf[0][1..-1]] = MultiTkIp._tk_cmd_tbl[$1]
3537
+ =end
3538
+ if conf[1] =~ /rb_out\S*(?:\s+(::\S*|[{](::.*)[}]|["](::.*)["]))? (c(_\d+_)?(\d+))/
3539
+ ret[conf[0][1..-1]] = MultiTkIp._tk_cmd_tbl[$4]
3540
+ else
3541
+ ret[conf[0][1..-1]] = conf[1]
3542
+ end
3543
+ else
3544
+ ret[conf[0][1..-1]] = conf[1]
3545
+ end
3546
+ else
3547
+ Hash[*_lst2ary(ip._eval("::safe::interpConfigure " +
3548
+ @ip_name))].each{|k, v|
3549
+ if k == '-deleteHook'
3550
+ =begin
3551
+ if v =~ /^rb_out\S* (c(_\d+_)?\d+)/
3552
+ ret[k[1..-1]] = MultiTkIp._tk_cmd_tbl[$1]
3553
+ =end
3554
+ if v =~ /rb_out\S*(?:\s+(::\S*|[{](::.*)[}]|["](::.*)["]))? (c(_\d+_)?(\d+))/
3555
+ ret[k[1..-1]] = MultiTkIp._tk_cmd_tbl[$4]
3556
+ else
3557
+ ret[k[1..-1]] = v
3558
+ end
3559
+ else
3560
+ ret[k[1..-1]] = v
3561
+ end
3562
+ }
3563
+ end
3564
+ ret
3565
+ end
3566
+
3567
+ def safeip_delete
3568
+ ip = MultiTkIp.__getip
3569
+ ip._eval("::safe::interpDelete " + @ip_name)
3570
+ end
3571
+
3572
+ def safeip_add_to_access_path(dir)
3573
+ ip = MultiTkIp.__getip
3574
+ ip._eval("::safe::interpAddToAccessPath #{@ip_name} #{dir}")
3575
+ end
3576
+
3577
+ def safeip_find_in_access_path(dir)
3578
+ ip = MultiTkIp.__getip
3579
+ ip._eval("::safe::interpFindInAccessPath #{@ip_name} #{dir}")
3580
+ end
3581
+
3582
+ def safeip_set_log_cmd(cmd = Proc.new)
3583
+ ip = MultiTkIp.__getip
3584
+ ip._eval("::safe::setLogCmd #{@ip_name} #{_get_eval_string(cmd)}")
3585
+ end
3586
+ end
3587
+
3588
+
3589
+ # encoding convert
3590
+ class << MultiTkIp
3591
+ def encoding_table
3592
+ __getip.encoding_table
3593
+ end
3594
+
3595
+ def force_default_encoding=(mode)
3596
+ __getip.force_default_encoding=(mode)
3597
+ end
3598
+
3599
+ def force_default_encoding?
3600
+ __getip.force_default_encoding?
3601
+ end
3602
+
3603
+ def default_encoding=(enc)
3604
+ __getip.default_encoding=(enc)
3605
+ end
3606
+
3607
+ def encoding=(enc)
3608
+ __getip.encoding=(enc)
3609
+ end
3610
+
3611
+ def encoding_name
3612
+ __getip.encoding_name
3613
+ end
3614
+
3615
+ def encoding_obj
3616
+ __getip.encoding_obj
3617
+ end
3618
+ alias encoding encoding_name
3619
+ alias default_encoding encoding_name
3620
+
3621
+ def encoding_convertfrom(str, enc=None)
3622
+ __getip.encoding_convertfrom(str, enc)
3623
+ end
3624
+ alias encoding_convert_from encoding_convertfrom
3625
+
3626
+ def encoding_convertto(str, enc=None)
3627
+ __getip.encoding_convertto(str, enc)
3628
+ end
3629
+ alias encoding_convert_to encoding_convertto
3630
+ end
3631
+ class MultiTkIp
3632
+ def encoding_table
3633
+ @interp.encoding_table
3634
+ end
3635
+
3636
+ def force_default_encoding=(mode)
3637
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3638
+ @interp.force_default_encoding = mode
3639
+ end
3640
+ def force_default_encoding?
3641
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3642
+ @interp.force_default_encoding?
3643
+ end
3644
+
3645
+ def default_encoding=(enc)
3646
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3647
+ @interp.default_encoding = enc
3648
+ end
3649
+
3650
+ def encoding=(enc)
3651
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3652
+ @interp.encoding = enc
3653
+ end
3654
+ def encoding_name
3655
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3656
+ @interp.encoding_name
3657
+ end
3658
+ def encoding_obj
3659
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3660
+ @interp.encoding_obj
3661
+ end
3662
+ alias encoding encoding_name
3663
+ alias default_encoding encoding_name
3664
+
3665
+ def encoding_convertfrom(str, enc=None)
3666
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3667
+ @interp.encoding_convertfrom(str, enc)
3668
+ end
3669
+ alias encoding_convert_from encoding_convertfrom
3670
+
3671
+ def encoding_convertto(str, enc=None)
3672
+ raise SecurityError, "no permission to manipulate" unless self.manipulable?
3673
+ @interp.encoding_convertto(str, enc)
3674
+ end
3675
+ alias encoding_convert_to encoding_convertto
3676
+ end
3677
+
3678
+
3679
+ # remove methods for security
3680
+ =begin
3681
+ class MultiTkIp
3682
+ INTERP_THREAD = @@DEFAULT_MASTER.instance_variable_get('@interp_thread')
3683
+ INTERP_MUTEX = INTERP_THREAD[:mutex]
3684
+ INTERP_ROOT_CHECK = INTERP_THREAD[:root_check]
3685
+
3686
+ # undef_method :instance_eval
3687
+ undef_method :instance_variable_get
3688
+ undef_method :instance_variable_set
3689
+ end
3690
+
3691
+ module TkCore
3692
+ if MultiTkIp::WITH_RUBY_VM &&
3693
+ ! MultiTkIp::RUN_EVENTLOOP_ON_MAIN_THREAD ### check Ruby 1.9 !!!!!!!
3694
+ INTERP_THREAD = MultiTkIp::INTERP_THREAD
3695
+ INTERP_MUTEX = MultiTkIp::INTERP_MUTEX
3696
+ INTERP_ROOT_CHECK = MultiTkIp::INTERP_ROOT_CHECK
3697
+ end
3698
+ end
3699
+ class MultiTkIp
3700
+ remove_const(:INTERP_THREAD)
3701
+ remove_const(:INTERP_MUTEX)
3702
+ remove_const(:INTERP_ROOT_CHECK)
3703
+ end
3704
+ =end
3705
+ if MultiTkIp::WITH_RUBY_VM &&
3706
+ ! MultiTkIp::RUN_EVENTLOOP_ON_MAIN_THREAD ### check Ruby 1.9 !!!!!!!
3707
+ class MultiTkIp
3708
+ INTERP_THREAD = @@DEFAULT_MASTER.instance_variable_get('@interp_thread')
3709
+ INTERP_THREAD_STATUS = INTERP_THREAD[:status]
3710
+ INTERP_MUTEX = INTERP_THREAD[:mutex]
3711
+ INTERP_ROOT_CHECK = INTERP_THREAD[:root_check]
3712
+ end
3713
+ module TkCore
3714
+ INTERP_THREAD = MultiTkIp::INTERP_THREAD
3715
+ INTERP_THREAD_STATUS = MultiTkIp::INTERP_THREAD_STATUS
3716
+ INTERP_MUTEX = MultiTkIp::INTERP_MUTEX
3717
+ INTERP_ROOT_CHECK = MultiTkIp::INTERP_ROOT_CHECK
3718
+ end
3719
+ class MultiTkIp
3720
+ remove_const(:INTERP_THREAD)
3721
+ remove_const(:INTERP_THREAD_STATUS)
3722
+ remove_const(:INTERP_MUTEX)
3723
+ remove_const(:INTERP_ROOT_CHECK)
3724
+ end
3725
+ end
3726
+
3727
+ class MultiTkIp
3728
+ # undef_method :instance_eval
3729
+ undef_method :instance_variable_get
3730
+ undef_method :instance_variable_set
3731
+ end
3732
+ # end of MultiTkIp definition
3733
+
3734
+ # defend against modification
3735
+ #MultiTkIp.freeze
3736
+ #TclTkLib.freeze
3737
+
3738
+ ########################################
3739
+ # start Tk which depends on MultiTkIp
3740
+ module TkCore
3741
+ INTERP = MultiTkIp
3742
+ end
3743
+ require 'tk'