tk 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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'