wxruby3 1.7.0 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (522) hide show
  1. checksums.yaml +4 -4
  2. data/INSTALL.md +27 -2
  3. data/README.md +15 -15
  4. data/ext/wxruby3/include/wxRubyApp.h +145 -46
  5. data/ext/wxruby3/include/wxruby-ComboPopup.h +25 -8
  6. data/ext/wxruby3/include/wxruby-GCTracking.h +262 -0
  7. data/ext/wxruby3/include/wxruby-MBConv.h +190 -0
  8. data/ext/wxruby3/include/wxruby-SharedEventHandler.h +183 -0
  9. data/ext/wxruby3/include/wxruby-SharedPtr.h +104 -0
  10. data/ext/wxruby3/include/wxruby-runtime.h +29 -0
  11. data/ext/wxruby3/swig/custom/rubytracking.swg +8 -22
  12. data/ext/wxruby3/swig/custom/wx_ruby_shared_ptr.i +434 -0
  13. data/ext/wxruby3/swig/custom/wx_shared_ptr.i +431 -0
  14. data/ext/wxruby3/swig/mark_free_impl.i +7 -132
  15. data/ext/wxruby3/swig/memory_management.i +8 -44
  16. data/ext/wxruby3/swig/wx.i +46 -73
  17. data/lib/wx/core/const.rb +0 -1
  18. data/lib/wx/core/context_help.rb +17 -0
  19. data/lib/wx/core/cursor.rb +1 -0
  20. data/lib/wx/core/helpcontrollerhelpprovider.rb +10 -2
  21. data/lib/wx/core/mbconv.rb +11 -0
  22. data/lib/wx/core/media_ctrl.rb +31 -0
  23. data/lib/wx/core/top_level_window.rb +7 -0
  24. data/lib/wx/core.rb +6 -0
  25. data/lib/wx/doc/art_provider.rb +17 -0
  26. data/lib/wx/doc/context_help.rb +42 -0
  27. data/lib/wx/doc/core.rb +0 -5
  28. data/lib/wx/doc/functions.rb +10 -0
  29. data/lib/wx/doc/html/html_help_controller.rb +23 -1
  30. data/lib/wx/doc/mbconv.rb +108 -0
  31. data/lib/wx/doc/rt/shared_event_handler.rb +49 -0
  32. data/lib/wx/doc/rt/thread_event.rb +28 -0
  33. data/lib/wx/doc/stream.rb +7 -3
  34. data/lib/wx/doc/webview.rb +40 -0
  35. data/lib/wx/helpers.rb +1 -1
  36. data/lib/wx/html/htmlhelpcontroller.rb +10 -0
  37. data/lib/wx/keyword_defs.rb +11 -0
  38. data/lib/wx/rt/require.rb +8 -0
  39. data/lib/wx/rt/thread_event.rb +14 -0
  40. data/lib/wx/rt.rb +16 -0
  41. data/lib/wx/version.rb +1 -1
  42. data/lib/wx/web/require.rb +8 -0
  43. data/lib/wx/web/webview.rb +106 -0
  44. data/lib/wx/web.rb +17 -0
  45. data/lib/wx/wxruby/cmd/setup.rb +15 -0
  46. data/lib/wx/wxruby/cmd/test.rb +8 -2
  47. data/lib/wx.rb +2 -0
  48. data/rakelib/configure.rb +24 -0
  49. data/rakelib/gem.rb +3 -2
  50. data/rakelib/install.rb +54 -27
  51. data/rakelib/lib/config/macosx.rb +7 -5
  52. data/rakelib/lib/config/mingw.rb +66 -5
  53. data/rakelib/lib/config/pkgman/linux.rb +4 -2
  54. data/rakelib/lib/config/pkgman/mingw.rb +1 -1
  55. data/rakelib/lib/config/unixish.rb +4 -2
  56. data/rakelib/lib/config.rb +37 -3
  57. data/rakelib/lib/core/include/client_data.inc +38 -17
  58. data/rakelib/lib/core/include/funcall.inc +1 -1
  59. data/rakelib/lib/core/include/swigdirector.inc +3 -3
  60. data/rakelib/lib/core/include/swigrubyrun.inc +14 -26
  61. data/rakelib/lib/core/package.rb +0 -2
  62. data/rakelib/lib/director/app.rb +1 -8
  63. data/rakelib/lib/director/art_provider.rb +7 -3
  64. data/rakelib/lib/director/comboctrl.rb +0 -7
  65. data/rakelib/lib/director/context_help_button.rb +35 -2
  66. data/rakelib/lib/director/derived_dc.rb +41 -32
  67. data/rakelib/lib/director/editable_listbox.rb +10 -8
  68. data/rakelib/lib/director/event_handler.rb +32 -28
  69. data/rakelib/lib/director/fs_file.rb +38 -10
  70. data/rakelib/lib/director/functions.rb +8 -0
  71. data/rakelib/lib/director/grid_cell_attr.rb +1 -3
  72. data/rakelib/lib/director/grid_cell_editor.rb +14 -12
  73. data/rakelib/lib/director/grid_cell_renderer.rb +11 -8
  74. data/rakelib/lib/director/grid_ctrl.rb +140 -121
  75. data/rakelib/lib/director/help_controller.rb +70 -2
  76. data/rakelib/lib/director/mb_conv.rb +30 -0
  77. data/rakelib/lib/director/menu.rb +92 -42
  78. data/rakelib/lib/director/menu_bar.rb +84 -45
  79. data/rakelib/lib/director/menu_item.rb +2 -2
  80. data/rakelib/lib/director/persistence_manager.rb +3 -2
  81. data/rakelib/lib/director/preview_frame.rb +2 -2
  82. data/rakelib/lib/director/ribbon_page.rb +11 -0
  83. data/rakelib/lib/director/richtext_buffer.rb +5 -2
  84. data/rakelib/lib/director/shared_evt_handler.rb +30 -0
  85. data/rakelib/lib/director/sizer.rb +8 -17
  86. data/rakelib/lib/director/sizer_item.rb +3 -4
  87. data/rakelib/lib/director/task_bar_icon.rb +7 -7
  88. data/rakelib/lib/director/thread_event.rb +33 -0
  89. data/rakelib/lib/director/top_level_window.rb +12 -4
  90. data/rakelib/lib/director/validator.rb +3 -1
  91. data/rakelib/lib/director/variant.rb +16 -12
  92. data/rakelib/lib/director/webview.rb +166 -0
  93. data/rakelib/lib/director/webview_event.rb +37 -0
  94. data/rakelib/lib/director/webview_handler.rb +63 -0
  95. data/rakelib/lib/generate/doc/thread_event.yaml +20 -0
  96. data/rakelib/lib/generate/doc/web_view.yaml +135 -0
  97. data/rakelib/lib/generate/doc/web_view_event.yaml +38 -0
  98. data/rakelib/lib/generate/doc/web_view_handler.yaml +58 -0
  99. data/rakelib/lib/specs/interfaces.rb +14 -2
  100. data/rakelib/lib/typemap/common.rb +34 -1
  101. data/rakelib/lib/typemap/mb_conv.rb +58 -0
  102. data/rakelib/prepost.rake +23 -31
  103. data/rakelib/prepost.rb +20 -0
  104. data/samples/event/threaded.rb +295 -42
  105. data/samples/event/tn_threaded.png +0 -0
  106. data/samples/help/doc/back.gif +0 -0
  107. data/samples/help/doc/contents.gif +0 -0
  108. data/samples/help/doc/cshelp.txt +9 -0
  109. data/samples/help/doc/doc.chm +0 -0
  110. data/samples/help/doc/doc.cnt +8 -0
  111. data/samples/help/doc/doc.h +7 -0
  112. data/samples/help/doc/doc.hhc +40 -0
  113. data/samples/help/doc/doc.hhk +31 -0
  114. data/samples/help/doc/doc.hhp +33 -0
  115. data/samples/help/doc/doc.hpj +21 -0
  116. data/samples/help/doc/doc.htm +27 -0
  117. data/samples/help/doc/doc1.htm +24 -0
  118. data/samples/help/doc/doc2.htm +12 -0
  119. data/samples/help/doc/doc3.htm +12 -0
  120. data/samples/help/doc/doc4.htm +12 -0
  121. data/samples/help/doc/doc5.htm +14 -0
  122. data/samples/help/doc/forward.gif +0 -0
  123. data/samples/help/doc/up.gif +0 -0
  124. data/samples/help/doc.chm +0 -0
  125. data/samples/help/doc.chw +0 -0
  126. data/samples/help/doc.zip +0 -0
  127. data/samples/help/help.rb +352 -0
  128. data/samples/help/tn_help.png +0 -0
  129. data/samples/webview/handler_advanced.html +55 -0
  130. data/samples/webview/tn_webview.png +0 -0
  131. data/samples/webview/webview.rb +1264 -0
  132. data/tests/assets/handler_advanced.html +55 -0
  133. data/tests/assets/test.zip +0 -0
  134. data/tests/lib/text_entry_tests.rb +2 -2
  135. data/tests/lib/wxapp_runner.rb +40 -0
  136. data/tests/lib/wxframe_runner.rb +17 -2
  137. data/tests/test_art.rb +8 -8
  138. data/tests/test_clipboard.rb +4 -4
  139. data/tests/test_config.rb +6 -6
  140. data/tests/test_exceptions.rb +8 -6
  141. data/tests/test_ext_controls.rb +3 -3
  142. data/tests/test_file_dialog.rb +5 -5
  143. data/tests/test_font.rb +7 -7
  144. data/tests/test_grid_ctrl.rb +133 -0
  145. data/tests/test_help.rb +88 -0
  146. data/tests/test_intl.rb +1 -1
  147. data/tests/test_media_ctrl.rb +14 -6
  148. data/tests/test_menu.rb +94 -86
  149. data/tests/test_persistence.rb +1 -1
  150. data/tests/test_proof_check.rb +5 -5
  151. data/tests/test_propgrid.rb +1 -1
  152. data/tests/test_shared_event_handler.rb +141 -0
  153. data/tests/test_std_controls.rb +5 -5
  154. data/tests/test_webview.rb +492 -0
  155. data/tests/test_window.rb +3 -3
  156. metadata +66 -368
  157. data/assets/repo-social-preview.odg +0 -0
  158. data/assets/repo-social-preview.xcf +0 -0
  159. data/lib/wx/aui/events/evt_list.rb +0 -148
  160. data/lib/wx/core/events/evt_list.rb +0 -1458
  161. data/lib/wx/core/font/encoding.rb +0 -113
  162. data/lib/wx/doc/gen/about_dialog_info.rb +0 -330
  163. data/lib/wx/doc/gen/accelerator.rb +0 -178
  164. data/lib/wx/doc/gen/activity_indicator.rb +0 -83
  165. data/lib/wx/doc/gen/affine_matrix2d.rb +0 -284
  166. data/lib/wx/doc/gen/animation.rb +0 -275
  167. data/lib/wx/doc/gen/animation_ctrl.rb +0 -300
  168. data/lib/wx/doc/gen/any_button.rb +0 -191
  169. data/lib/wx/doc/gen/app.rb +0 -463
  170. data/lib/wx/doc/gen/app_traits.rb +0 -396
  171. data/lib/wx/doc/gen/art_provider.rb +0 -605
  172. data/lib/wx/doc/gen/aui/aui_dock_art.rb +0 -455
  173. data/lib/wx/doc/gen/aui/aui_floating_frame.rb +0 -54
  174. data/lib/wx/doc/gen/aui/aui_manager.rb +0 -847
  175. data/lib/wx/doc/gen/aui/aui_manager_event.rb +0 -131
  176. data/lib/wx/doc/gen/aui/aui_mdi_child_frame.rb +0 -180
  177. data/lib/wx/doc/gen/aui/aui_mdi_client_window.rb +0 -59
  178. data/lib/wx/doc/gen/aui/aui_mdi_parent_frame.rb +0 -130
  179. data/lib/wx/doc/gen/aui/aui_notebook.rb +0 -631
  180. data/lib/wx/doc/gen/aui/aui_notebook_event.rb +0 -233
  181. data/lib/wx/doc/gen/aui/aui_pane_info.rb +0 -769
  182. data/lib/wx/doc/gen/aui/aui_tab_art.rb +0 -352
  183. data/lib/wx/doc/gen/aui/aui_tab_ctrl.rb +0 -14
  184. data/lib/wx/doc/gen/aui/aui_tool_bar.rb +0 -510
  185. data/lib/wx/doc/gen/aui/aui_tool_bar_art.rb +0 -340
  186. data/lib/wx/doc/gen/aui/aui_tool_bar_event.rb +0 -244
  187. data/lib/wx/doc/gen/aui/aui_tool_bar_item.rb +0 -257
  188. data/lib/wx/doc/gen/aui/event_list.rb +0 -179
  189. data/lib/wx/doc/gen/banner_window.rb +0 -124
  190. data/lib/wx/doc/gen/bitmap.rb +0 -731
  191. data/lib/wx/doc/gen/bitmap_button.rb +0 -123
  192. data/lib/wx/doc/gen/bitmap_combo_box.rb +0 -221
  193. data/lib/wx/doc/gen/book_ctrl_base.rb +0 -273
  194. data/lib/wx/doc/gen/book_ctrl_event.rb +0 -66
  195. data/lib/wx/doc/gen/box_sizer.rb +0 -85
  196. data/lib/wx/doc/gen/brush.rb +0 -251
  197. data/lib/wx/doc/gen/busy_info.rb +0 -157
  198. data/lib/wx/doc/gen/button.rb +0 -182
  199. data/lib/wx/doc/gen/calculate_layout_event.rb +0 -62
  200. data/lib/wx/doc/gen/calendar_ctrl.rb +0 -505
  201. data/lib/wx/doc/gen/calendar_date_attr.rb +0 -138
  202. data/lib/wx/doc/gen/calendar_event.rb +0 -147
  203. data/lib/wx/doc/gen/caret.rb +0 -97
  204. data/lib/wx/doc/gen/check_box.rb +0 -175
  205. data/lib/wx/doc/gen/check_list_box.rb +0 -121
  206. data/lib/wx/doc/gen/choice.rb +0 -175
  207. data/lib/wx/doc/gen/choicebook.rb +0 -116
  208. data/lib/wx/doc/gen/client_dc.rb +0 -43
  209. data/lib/wx/doc/gen/clipboard.rb +0 -144
  210. data/lib/wx/doc/gen/collapsible_pane.rb +0 -138
  211. data/lib/wx/doc/gen/collapsible_pane_event.rb +0 -46
  212. data/lib/wx/doc/gen/colour.rb +0 -333
  213. data/lib/wx/doc/gen/colour_dialog.rb +0 -190
  214. data/lib/wx/doc/gen/colour_picker_ctrl.rb +0 -110
  215. data/lib/wx/doc/gen/colour_picker_event.rb +0 -77
  216. data/lib/wx/doc/gen/combo_box.rb +0 -292
  217. data/lib/wx/doc/gen/combo_ctrl.rb +0 -662
  218. data/lib/wx/doc/gen/command_link_button.rb +0 -134
  219. data/lib/wx/doc/gen/config_base.rb +0 -10
  220. data/lib/wx/doc/gen/context_help_button.rb +0 -109
  221. data/lib/wx/doc/gen/control.rb +0 -277
  222. data/lib/wx/doc/gen/control_with_items.rb +0 -253
  223. data/lib/wx/doc/gen/core.rb +0 -45
  224. data/lib/wx/doc/gen/credential_entry_dialog.rb +0 -137
  225. data/lib/wx/doc/gen/cursor.rb +0 -193
  226. data/lib/wx/doc/gen/data_format.rb +0 -85
  227. data/lib/wx/doc/gen/data_object.rb +0 -436
  228. data/lib/wx/doc/gen/data_object_simple_base.rb +0 -10
  229. data/lib/wx/doc/gen/date_event.rb +0 -49
  230. data/lib/wx/doc/gen/date_picker_ctrl.rb +0 -161
  231. data/lib/wx/doc/gen/dc.rb +0 -1631
  232. data/lib/wx/doc/gen/dc_overlay.rb +0 -102
  233. data/lib/wx/doc/gen/defs.rb +0 -2802
  234. data/lib/wx/doc/gen/dial_up_event.rb +0 -45
  235. data/lib/wx/doc/gen/dial_up_manager.rb +0 -149
  236. data/lib/wx/doc/gen/dialog.rb +0 -541
  237. data/lib/wx/doc/gen/dir_dialog.rb +0 -164
  238. data/lib/wx/doc/gen/dir_filter_list_ctrl.rb +0 -90
  239. data/lib/wx/doc/gen/dir_picker_ctrl.rb +0 -125
  240. data/lib/wx/doc/gen/display.rb +0 -238
  241. data/lib/wx/doc/gen/drag_drop.rb +0 -299
  242. data/lib/wx/doc/gen/drag_image.rb +0 -116
  243. data/lib/wx/doc/gen/editable_list_box.rb +0 -109
  244. data/lib/wx/doc/gen/event.rb +0 -990
  245. data/lib/wx/doc/gen/event_blocker.rb +0 -50
  246. data/lib/wx/doc/gen/event_filter.rb +0 -92
  247. data/lib/wx/doc/gen/event_list.rb +0 -1644
  248. data/lib/wx/doc/gen/events.rb +0 -2809
  249. data/lib/wx/doc/gen/evt_handler.rb +0 -229
  250. data/lib/wx/doc/gen/ext_help_controller.rb +0 -109
  251. data/lib/wx/doc/gen/file_ctrl.rb +0 -231
  252. data/lib/wx/doc/gen/file_ctrl_event.rb +0 -83
  253. data/lib/wx/doc/gen/file_dialog.rb +0 -353
  254. data/lib/wx/doc/gen/file_dialog_custom_control.rb +0 -165
  255. data/lib/wx/doc/gen/file_dialog_customize_hook.rb +0 -158
  256. data/lib/wx/doc/gen/file_dir_picker_event.rb +0 -100
  257. data/lib/wx/doc/gen/file_picker_ctrl.rb +0 -132
  258. data/lib/wx/doc/gen/file_system.rb +0 -232
  259. data/lib/wx/doc/gen/find_dialog_event.rb +0 -126
  260. data/lib/wx/doc/gen/find_replace_data.rb +0 -60
  261. data/lib/wx/doc/gen/find_replace_dialog.rb +0 -58
  262. data/lib/wx/doc/gen/flex_grid_sizer.rb +0 -199
  263. data/lib/wx/doc/gen/font.rb +0 -1379
  264. data/lib/wx/doc/gen/font_data.rb +0 -151
  265. data/lib/wx/doc/gen/font_dialog.rb +0 -88
  266. data/lib/wx/doc/gen/font_picker_ctrl.rb +0 -143
  267. data/lib/wx/doc/gen/font_picker_event.rb +0 -65
  268. data/lib/wx/doc/gen/frame.rb +0 -352
  269. data/lib/wx/doc/gen/fs_file.rb +0 -337
  270. data/lib/wx/doc/gen/functions.rb +0 -10
  271. data/lib/wx/doc/gen/gauge.rb +0 -157
  272. data/lib/wx/doc/gen/gb_sizer_item.rb +0 -68
  273. data/lib/wx/doc/gen/gcdc.rb +0 -46
  274. data/lib/wx/doc/gen/gdi_common.rb +0 -1271
  275. data/lib/wx/doc/gen/gdi_object.rb +0 -31
  276. data/lib/wx/doc/gen/generic_about_dialog.rb +0 -140
  277. data/lib/wx/doc/gen/generic_dir_ctrl.rb +0 -223
  278. data/lib/wx/doc/gen/geometry.rb +0 -661
  279. data/lib/wx/doc/gen/graphics_context.rb +0 -1184
  280. data/lib/wx/doc/gen/graphics_object.rb +0 -750
  281. data/lib/wx/doc/gen/grid/event_list.rb +0 -191
  282. data/lib/wx/doc/gen/grid/grid_cell_activatable_editor.rb +0 -40
  283. data/lib/wx/doc/gen/grid/grid_cell_attr.rb +0 -280
  284. data/lib/wx/doc/gen/grid/grid_cell_auto_wrap_string_editor.rb +0 -35
  285. data/lib/wx/doc/gen/grid/grid_cell_auto_wrap_string_renderer.rb +0 -37
  286. data/lib/wx/doc/gen/grid/grid_cell_bool_editor.rb +0 -49
  287. data/lib/wx/doc/gen/grid/grid_cell_bool_renderer.rb +0 -35
  288. data/lib/wx/doc/gen/grid/grid_cell_choice_editor.rb +0 -46
  289. data/lib/wx/doc/gen/grid/grid_cell_date_editor.rb +0 -38
  290. data/lib/wx/doc/gen/grid/grid_cell_date_renderer.rb +0 -45
  291. data/lib/wx/doc/gen/grid/grid_cell_date_time_renderer.rb +0 -40
  292. data/lib/wx/doc/gen/grid/grid_cell_editor.rb +0 -197
  293. data/lib/wx/doc/gen/grid/grid_cell_enum_editor.rb +0 -39
  294. data/lib/wx/doc/gen/grid/grid_cell_enum_renderer.rb +0 -44
  295. data/lib/wx/doc/gen/grid/grid_cell_float_editor.rb +0 -45
  296. data/lib/wx/doc/gen/grid/grid_cell_float_renderer.rb +0 -79
  297. data/lib/wx/doc/gen/grid/grid_cell_number_editor.rb +0 -46
  298. data/lib/wx/doc/gen/grid/grid_cell_number_renderer.rb +0 -35
  299. data/lib/wx/doc/gen/grid/grid_cell_renderer.rb +0 -108
  300. data/lib/wx/doc/gen/grid/grid_cell_string_renderer.rb +0 -35
  301. data/lib/wx/doc/gen/grid/grid_cell_text_editor.rb +0 -49
  302. data/lib/wx/doc/gen/grid/grid_ctrl.rb +0 -3002
  303. data/lib/wx/doc/gen/grid/grid_editor_created_event.rb +0 -95
  304. data/lib/wx/doc/gen/grid/grid_event.rb +0 -129
  305. data/lib/wx/doc/gen/grid/grid_range_select_event.rb +0 -104
  306. data/lib/wx/doc/gen/grid/grid_size_event.rb +0 -85
  307. data/lib/wx/doc/gen/grid/grid_string_table.rb +0 -142
  308. data/lib/wx/doc/gen/grid/grid_table_base.rb +0 -317
  309. data/lib/wx/doc/gen/grid/grid_table_message.rb +0 -81
  310. data/lib/wx/doc/gen/grid_bag_sizer.rb +0 -323
  311. data/lib/wx/doc/gen/grid_sizer.rb +0 -195
  312. data/lib/wx/doc/gen/gui_event_loop.rb +0 -159
  313. data/lib/wx/doc/gen/h_scrolled_window.rb +0 -562
  314. data/lib/wx/doc/gen/header_ctrl.rb +0 -880
  315. data/lib/wx/doc/gen/header_ctrl_event.rb +0 -133
  316. data/lib/wx/doc/gen/help_controller.rb +0 -195
  317. data/lib/wx/doc/gen/help_provider.rb +0 -98
  318. data/lib/wx/doc/gen/html/event_list.rb +0 -38
  319. data/lib/wx/doc/gen/html/html_cell.rb +0 -536
  320. data/lib/wx/doc/gen/html/html_cell_event.rb +0 -69
  321. data/lib/wx/doc/gen/html/html_data_object.rb +0 -42
  322. data/lib/wx/doc/gen/html/html_easy_printing.rb +0 -203
  323. data/lib/wx/doc/gen/html/html_help_controller.rb +0 -340
  324. data/lib/wx/doc/gen/html/html_help_data.rb +0 -159
  325. data/lib/wx/doc/gen/html/html_help_window.rb +0 -258
  326. data/lib/wx/doc/gen/html/html_link_event.rb +0 -41
  327. data/lib/wx/doc/gen/html/html_list_box.rb +0 -346
  328. data/lib/wx/doc/gen/html/html_printout.rb +0 -109
  329. data/lib/wx/doc/gen/html/html_window.rb +0 -461
  330. data/lib/wx/doc/gen/hyperlink_ctrl.rb +0 -311
  331. data/lib/wx/doc/gen/hyperlink_event.rb +0 -44
  332. data/lib/wx/doc/gen/icon.rb +0 -267
  333. data/lib/wx/doc/gen/icon_location.rb +0 -40
  334. data/lib/wx/doc/gen/image.rb +0 -1371
  335. data/lib/wx/doc/gen/image_list.rb +0 -168
  336. data/lib/wx/doc/gen/info_bar.rb +0 -195
  337. data/lib/wx/doc/gen/keyboard_state.rb +0 -140
  338. data/lib/wx/doc/gen/list_box.rb +0 -304
  339. data/lib/wx/doc/gen/list_ctrl.rb +0 -1774
  340. data/lib/wx/doc/gen/list_event.rb +0 -208
  341. data/lib/wx/doc/gen/listbook.rb +0 -116
  342. data/lib/wx/doc/gen/locale.rb +0 -4293
  343. data/lib/wx/doc/gen/log.rb +0 -603
  344. data/lib/wx/doc/gen/mdi_client_window.rb +0 -47
  345. data/lib/wx/doc/gen/mdi_frame.rb +0 -324
  346. data/lib/wx/doc/gen/media_ctrl.rb +0 -269
  347. data/lib/wx/doc/gen/media_event.rb +0 -117
  348. data/lib/wx/doc/gen/memory_dc.rb +0 -174
  349. data/lib/wx/doc/gen/menu.rb +0 -509
  350. data/lib/wx/doc/gen/menu_bar.rb +0 -287
  351. data/lib/wx/doc/gen/menu_item.rb +0 -362
  352. data/lib/wx/doc/gen/message_dialog.rb +0 -238
  353. data/lib/wx/doc/gen/mini_frame.rb +0 -108
  354. data/lib/wx/doc/gen/mirror_dc.rb +0 -22
  355. data/lib/wx/doc/gen/mouse_state.rb +0 -150
  356. data/lib/wx/doc/gen/multi_choice_dialog.rb +0 -80
  357. data/lib/wx/doc/gen/non_owned_window.rb +0 -49
  358. data/lib/wx/doc/gen/notebook.rb +0 -278
  359. data/lib/wx/doc/gen/num_validator.rb +0 -37
  360. data/lib/wx/doc/gen/number_entry_dialog.rb +0 -93
  361. data/lib/wx/doc/gen/object.rb +0 -59
  362. data/lib/wx/doc/gen/owner_drawn_combo_box.rb +0 -395
  363. data/lib/wx/doc/gen/paint_dc.rb +0 -27
  364. data/lib/wx/doc/gen/palette.rb +0 -92
  365. data/lib/wx/doc/gen/panel.rb +0 -127
  366. data/lib/wx/doc/gen/pen.rb +0 -511
  367. data/lib/wx/doc/gen/persistence_manager.rb +0 -135
  368. data/lib/wx/doc/gen/persistent_object.rb +0 -52
  369. data/lib/wx/doc/gen/persistent_window.rb +0 -241
  370. data/lib/wx/doc/gen/pg/event_list.rb +0 -106
  371. data/lib/wx/doc/gen/pg/numeric_property_validator.rb +0 -54
  372. data/lib/wx/doc/gen/pg/pg_array_editor_dialog.rb +0 -292
  373. data/lib/wx/doc/gen/pg/pg_cell.rb +0 -177
  374. data/lib/wx/doc/gen/pg/pg_editor.rb +0 -721
  375. data/lib/wx/doc/gen/pg/pg_multi_button.rb +0 -152
  376. data/lib/wx/doc/gen/pg/pg_properties.rb +0 -2829
  377. data/lib/wx/doc/gen/pg/pg_property.rb +0 -2078
  378. data/lib/wx/doc/gen/pg/pg_validation_info.rb +0 -344
  379. data/lib/wx/doc/gen/pg/property_grid.rb +0 -740
  380. data/lib/wx/doc/gen/pg/property_grid_event.rb +0 -184
  381. data/lib/wx/doc/gen/pg/property_grid_interface.rb +0 -1098
  382. data/lib/wx/doc/gen/pg/property_grid_manager.rb +0 -415
  383. data/lib/wx/doc/gen/pg/property_grid_page.rb +0 -354
  384. data/lib/wx/doc/gen/pg/property_grid_page_state.rb +0 -165
  385. data/lib/wx/doc/gen/picker_base.rb +0 -152
  386. data/lib/wx/doc/gen/platform_info.rb +0 -622
  387. data/lib/wx/doc/gen/popup_window.rb +0 -107
  388. data/lib/wx/doc/gen/progress_dialog.rb +0 -100
  389. data/lib/wx/doc/gen/property_sheet_dialog.rb +0 -216
  390. data/lib/wx/doc/gen/prt/event_list.rb +0 -17
  391. data/lib/wx/doc/gen/prt/page_setup_dialog.rb +0 -44
  392. data/lib/wx/doc/gen/prt/post_script_dc.rb +0 -30
  393. data/lib/wx/doc/gen/prt/preview_frame.rb +0 -78
  394. data/lib/wx/doc/gen/prt/print_abort_dialog.rb +0 -151
  395. data/lib/wx/doc/gen/prt/print_data.rb +0 -804
  396. data/lib/wx/doc/gen/prt/print_dialog.rb +0 -55
  397. data/lib/wx/doc/gen/prt/printer.rb +0 -518
  398. data/lib/wx/doc/gen/prt/printer_dc.rb +0 -37
  399. data/lib/wx/doc/gen/query_layout_info_event.rb +0 -106
  400. data/lib/wx/doc/gen/radio_box.rb +0 -306
  401. data/lib/wx/doc/gen/radio_button.rb +0 -159
  402. data/lib/wx/doc/gen/rbn/event_list.rb +0 -136
  403. data/lib/wx/doc/gen/rbn/ribbon_art_provider.rb +0 -1132
  404. data/lib/wx/doc/gen/rbn/ribbon_bar.rb +0 -308
  405. data/lib/wx/doc/gen/rbn/ribbon_bar_event.rb +0 -45
  406. data/lib/wx/doc/gen/rbn/ribbon_button_bar.rb +0 -458
  407. data/lib/wx/doc/gen/rbn/ribbon_button_bar_event.rb +0 -63
  408. data/lib/wx/doc/gen/rbn/ribbon_control.rb +0 -143
  409. data/lib/wx/doc/gen/rbn/ribbon_gallery.rb +0 -229
  410. data/lib/wx/doc/gen/rbn/ribbon_gallery_event.rb +0 -55
  411. data/lib/wx/doc/gen/rbn/ribbon_page.rb +0 -174
  412. data/lib/wx/doc/gen/rbn/ribbon_panel.rb +0 -270
  413. data/lib/wx/doc/gen/rbn/ribbon_panel_event.rb +0 -45
  414. data/lib/wx/doc/gen/rbn/ribbon_tool_bar.rb +0 -360
  415. data/lib/wx/doc/gen/rbn/ribbon_tool_bar_event.rb +0 -42
  416. data/lib/wx/doc/gen/rearrange_ctrl.rb +0 -78
  417. data/lib/wx/doc/gen/rearrange_list.rb +0 -123
  418. data/lib/wx/doc/gen/region.rb +0 -380
  419. data/lib/wx/doc/gen/region_iterator.rb +0 -76
  420. data/lib/wx/doc/gen/rich_tool_tip.rb +0 -154
  421. data/lib/wx/doc/gen/rtc/event_list.rb +0 -125
  422. data/lib/wx/doc/gen/rtc/rich_text_box.rb +0 -445
  423. data/lib/wx/doc/gen/rtc/rich_text_buffer.rb +0 -1188
  424. data/lib/wx/doc/gen/rtc/rich_text_buffer_data_object.rb +0 -41
  425. data/lib/wx/doc/gen/rtc/rich_text_composite_object.rb +0 -538
  426. data/lib/wx/doc/gen/rtc/rich_text_ctrl.rb +0 -2103
  427. data/lib/wx/doc/gen/rtc/rich_text_event.rb +0 -173
  428. data/lib/wx/doc/gen/rtc/rich_text_file_handler.rb +0 -181
  429. data/lib/wx/doc/gen/rtc/rich_text_formatting_dialog.rb +0 -319
  430. data/lib/wx/doc/gen/rtc/rich_text_header_footer_data.rb +0 -193
  431. data/lib/wx/doc/gen/rtc/rich_text_html_handler.rb +0 -102
  432. data/lib/wx/doc/gen/rtc/rich_text_image.rb +0 -337
  433. data/lib/wx/doc/gen/rtc/rich_text_object.rb +0 -2922
  434. data/lib/wx/doc/gen/rtc/rich_text_paragraph_layout_box.rb +0 -1240
  435. data/lib/wx/doc/gen/rtc/rich_text_printing.rb +0 -258
  436. data/lib/wx/doc/gen/rtc/rich_text_style_list_box.rb +0 -344
  437. data/lib/wx/doc/gen/rtc/rich_text_style_organiser_dialog.rb +0 -227
  438. data/lib/wx/doc/gen/rtc/rich_text_xml_handler.rb +0 -59
  439. data/lib/wx/doc/gen/rtc/symbol_picker_dialog.rb +0 -169
  440. data/lib/wx/doc/gen/sash_event.rb +0 -147
  441. data/lib/wx/doc/gen/sash_layout_window.rb +0 -232
  442. data/lib/wx/doc/gen/sash_window.rb +0 -171
  443. data/lib/wx/doc/gen/scaled_dc.rb +0 -10
  444. data/lib/wx/doc/gen/screen_dc.rb +0 -30
  445. data/lib/wx/doc/gen/scroll_bar.rb +0 -204
  446. data/lib/wx/doc/gen/scrolled_canvas.rb +0 -410
  447. data/lib/wx/doc/gen/scrolled_control.rb +0 -410
  448. data/lib/wx/doc/gen/scrolled_window.rb +0 -430
  449. data/lib/wx/doc/gen/search_ctrl.rb +0 -159
  450. data/lib/wx/doc/gen/secret_store.rb +0 -116
  451. data/lib/wx/doc/gen/simplebook.rb +0 -110
  452. data/lib/wx/doc/gen/single_choice_dialog.rb +0 -89
  453. data/lib/wx/doc/gen/sizer.rb +0 -945
  454. data/lib/wx/doc/gen/sizer_item.rb +0 -244
  455. data/lib/wx/doc/gen/slider.rb +0 -342
  456. data/lib/wx/doc/gen/spin_button.rb +0 -157
  457. data/lib/wx/doc/gen/spin_ctrl.rb +0 -231
  458. data/lib/wx/doc/gen/spin_ctrl_double.rb +0 -192
  459. data/lib/wx/doc/gen/spin_double_event.rb +0 -55
  460. data/lib/wx/doc/gen/spin_event.rb +0 -51
  461. data/lib/wx/doc/gen/splash_screen.rb +0 -113
  462. data/lib/wx/doc/gen/splitter_event.rb +0 -99
  463. data/lib/wx/doc/gen/splitter_window.rb +0 -498
  464. data/lib/wx/doc/gen/static_bitmap.rb +0 -256
  465. data/lib/wx/doc/gen/static_box.rb +0 -180
  466. data/lib/wx/doc/gen/static_box_sizer.rb +0 -85
  467. data/lib/wx/doc/gen/static_line.rb +0 -83
  468. data/lib/wx/doc/gen/static_text.rb +0 -127
  469. data/lib/wx/doc/gen/status_bar.rb +0 -290
  470. data/lib/wx/doc/gen/stc/event_list.rb +0 -221
  471. data/lib/wx/doc/gen/stc/styled_text_ctrl.rb +0 -4474
  472. data/lib/wx/doc/gen/stc/styled_text_event.rb +0 -8762
  473. data/lib/wx/doc/gen/std_dialog_button_sizer.rb +0 -129
  474. data/lib/wx/doc/gen/svg_file_dc.rb +0 -164
  475. data/lib/wx/doc/gen/system_options.rb +0 -129
  476. data/lib/wx/doc/gen/system_settings.rb +0 -507
  477. data/lib/wx/doc/gen/task_bar_icon.rb +0 -127
  478. data/lib/wx/doc/gen/task_bar_icon_event.rb +0 -88
  479. data/lib/wx/doc/gen/text_attr.rb +0 -756
  480. data/lib/wx/doc/gen/text_ctrl.rb +0 -1033
  481. data/lib/wx/doc/gen/text_entry.rb +0 -441
  482. data/lib/wx/doc/gen/text_entry_dialog.rb +0 -220
  483. data/lib/wx/doc/gen/text_validator.rb +0 -245
  484. data/lib/wx/doc/gen/time_picker_ctrl.rb +0 -128
  485. data/lib/wx/doc/gen/timer.rb +0 -119
  486. data/lib/wx/doc/gen/timer_event.rb +0 -68
  487. data/lib/wx/doc/gen/tip_provider.rb +0 -63
  488. data/lib/wx/doc/gen/tip_window.rb +0 -51
  489. data/lib/wx/doc/gen/toggle_button.rb +0 -182
  490. data/lib/wx/doc/gen/tool_bar.rb +0 -890
  491. data/lib/wx/doc/gen/tool_tip.rb +0 -86
  492. data/lib/wx/doc/gen/toolbook.rb +0 -118
  493. data/lib/wx/doc/gen/top_level_window.rb +0 -497
  494. data/lib/wx/doc/gen/tree_ctrl.rb +0 -1052
  495. data/lib/wx/doc/gen/tree_event.rb +0 -127
  496. data/lib/wx/doc/gen/treebook.rb +0 -180
  497. data/lib/wx/doc/gen/ui_action_simulator.rb +0 -109
  498. data/lib/wx/doc/gen/utils.rb +0 -273
  499. data/lib/wx/doc/gen/v_list_box.rb +0 -272
  500. data/lib/wx/doc/gen/v_scrolled_canvas.rb +0 -195
  501. data/lib/wx/doc/gen/v_scrolled_window.rb +0 -191
  502. data/lib/wx/doc/gen/validator.rb +0 -68
  503. data/lib/wx/doc/gen/variant.rb +0 -294
  504. data/lib/wx/doc/gen/window.rb +0 -2917
  505. data/lib/wx/doc/gen/window_dc.rb +0 -38
  506. data/lib/wx/doc/gen/window_disabler.rb +0 -30
  507. data/lib/wx/doc/gen/with_images.rb +0 -84
  508. data/lib/wx/doc/gen/wizard.rb +0 -257
  509. data/lib/wx/doc/gen/wizard_event.rb +0 -113
  510. data/lib/wx/doc/gen/wizard_page.rb +0 -65
  511. data/lib/wx/doc/gen/wizard_page_simple.rb +0 -88
  512. data/lib/wx/doc/gen/wrap_sizer.rb +0 -79
  513. data/lib/wx/doc/gen/xml_node.rb +0 -316
  514. data/lib/wx/doc/gen/xml_resource.rb +0 -320
  515. data/lib/wx/grid/events/evt_list.rb +0 -166
  516. data/lib/wx/html/events/evt_list.rb +0 -27
  517. data/lib/wx/pg/events/evt_list.rb +0 -73
  518. data/lib/wx/rbn/events/evt_list.rb +0 -102
  519. data/lib/wx/rtc/events/evt_list.rb +0 -98
  520. data/lib/wx/rtc/ext/rich_text_ctrl.rb +0 -24
  521. data/lib/wx/stc/events/evt_list.rb +0 -178
  522. data/samples/art/wxruby-512x512.png +0 -0
@@ -0,0 +1,58 @@
1
+ # Copyright (c) 2023 M.J.N. Corino, The Netherlands
2
+ #
3
+ # This software is released under the MIT license.
4
+
5
+ ###
6
+ # wxRuby3 Common typemap definitions
7
+ ###
8
+
9
+ require_relative '../core/mapping'
10
+
11
+ module WXRuby3
12
+
13
+ module Typemap
14
+
15
+ module MBConv
16
+
17
+ include Typemap::Module
18
+
19
+ # wxMBConv classes are used for string text encoding conversion.
20
+ # We do not want to map these in wxRuby3 though as that serves little purpose there.
21
+ # So there are wxRuby3 specific versions implemented that get mapped to the actual
22
+ # wxw instances by the type mappings below.
23
+
24
+ define do
25
+
26
+ map 'const wxMBConv&' => 'Wx::MBConv' do
27
+
28
+ add_header_code <<~__CODE
29
+ WXRUBY_EXPORT std::unique_ptr<wxMBConv> wxRuby_MBConv2wxMBConv(VALUE rb_val);
30
+ __CODE
31
+
32
+ map_in temp: 'std::unique_ptr<wxMBConv> tmp_mbc',
33
+ code: <<~__CODE
34
+ tmp_mbc = wxRuby_MBConv2wxMBConv($input);
35
+ if (!tmp_mbc)
36
+ {
37
+ rb_raise(rb_eArgError, "Invalid MBConv value for %i", $argnum-1);
38
+ }
39
+ else
40
+ {
41
+ $1 = tmp_mbc.get();
42
+ }
43
+ __CODE
44
+
45
+ map_typecheck precedence: 'POINTER', code: <<~__CODE
46
+ std::unique_ptr<wxMBConv> mbc = wxRuby_MBConv2wxMBConv($input);
47
+ $1 = mbc ? true : false;
48
+ __CODE
49
+
50
+ end
51
+
52
+ end
53
+
54
+ end
55
+
56
+ end
57
+
58
+ end
data/rakelib/prepost.rake CHANGED
@@ -56,27 +56,18 @@ namespace 'wxruby' do
56
56
  if WXRuby3.config.windows?
57
57
  if WXRuby3.config.get_config('with-wxwin')
58
58
  WXRuby3::Post.create_startup <<~__CODE
59
- begin
60
- require 'ruby_installer'
61
- if RubyInstaller::Runtime.respond_to?(:add_dll_directory)
62
- RubyInstaller::Runtime.add_dll_directory('#{File.expand_path('ext')}')
63
- else
64
- RubyInstaller::Build.add_dll_directory('#{File.expand_path('ext')}')
65
- end
66
- rescue LoadError
67
- end
59
+ #{WXRuby3::Post.setup_add_dll_directory(File.expand_path(File.join('ext', 'lib')))}
60
+ #{WXRuby3::Post.setup_adjust_wx_prefix}
68
61
  __CODE
69
62
  elsif !WXRuby3.config.get_cfg_string('wxwin').empty? && File.directory?(WXRuby3.config.get_cfg_string('wxwininstdir'))
70
63
  WXRuby3::Post.create_startup <<~__CODE
71
- begin
72
- require 'ruby_installer'
73
- if RubyInstaller::Runtime.respond_to?(:add_dll_directory)
74
- RubyInstaller::Runtime.add_dll_directory('#{WXRuby3.config.get_cfg_string('wxwininstdir')}')
75
- else
76
- RubyInstaller::Build.add_dll_directory('#{WXRuby3.config.get_cfg_string('wxwininstdir')}')
77
- end
78
- rescue LoadError
79
- end
64
+ #{WXRuby3::Post.setup_add_dll_directory(WXRuby3.config.get_cfg_string('wxwininstdir'))}
65
+ __CODE
66
+ end
67
+ else
68
+ if WXRuby3.config.get_config('with-wxwin')
69
+ WXRuby3::Post.create_startup <<~__CODE
70
+ #{WXRuby3::Post.setup_adjust_wx_prefix}
80
71
  __CODE
81
72
  end
82
73
  end
@@ -84,19 +75,20 @@ namespace 'wxruby' do
84
75
  end
85
76
 
86
77
  task :install do
87
- if WXRuby3.config.windows? && WXRuby3.config.get_config('with-wxwin') && !Rake::FileUtilsExt.nowrite_flag
88
- File.open(File.join(WXRuby3.config.get_cfg_string('siterubyver'), 'wx/startup.rb'), 'w') do |f|
89
- f.puts <<~__CODE
90
- begin
91
- require 'ruby_installer'
92
- if RubyInstaller::Runtime.respond_to?(:add_dll_directory)
93
- RubyInstaller::Runtime.add_dll_directory('#{WXRuby3.config.get_cfg_string('siterubyverarch')}')
94
- else
95
- RubyInstaller::Build.add_dll_directory('#{WXRuby3.config.get_cfg_string('siterubyverarch')}')
96
- end
97
- rescue LoadError
98
- end
99
- __CODE
78
+ if WXRuby3.config.get_config('with-wxwin') && !Rake::FileUtilsExt.nowrite_flag
79
+ if WXRuby3.config.windows?
80
+ File.open(File.join(WXRuby3.config.get_cfg_string('siterubyver'), 'wx/startup.rb'), 'w') do |f|
81
+ f.puts <<~__CODE
82
+ #{WXRuby3::Post.setup_add_dll_directory(WXRuby3.config.get_cfg_string('siterubyverarch'))}
83
+ #{WXRuby3::Post.setup_adjust_wx_prefix}
84
+ __CODE
85
+ end
86
+ else
87
+ File.open(File.join(WXRuby3.config.get_cfg_string('siterubyver'), 'wx/startup.rb'), 'w') do |f|
88
+ f.puts <<~__CODE
89
+ #{WXRuby3::Post.setup_adjust_wx_prefix}
90
+ __CODE
91
+ end
100
92
  end
101
93
  end
102
94
  end
data/rakelib/prepost.rb CHANGED
@@ -24,6 +24,26 @@ module WXRuby3
24
24
  end
25
25
  end
26
26
 
27
+ def self.setup_add_dll_directory(dll_directory)
28
+ <<~__CODE
29
+ begin
30
+ require 'ruby_installer'
31
+ if RubyInstaller::Runtime.respond_to?(:add_dll_directory)
32
+ RubyInstaller::Runtime.add_dll_directory('#{dll_directory}')
33
+ else
34
+ RubyInstaller::Build.add_dll_directory('#{dll_directory}')
35
+ end
36
+ rescue LoadError
37
+ end
38
+ __CODE
39
+ end
40
+
41
+ def self.setup_adjust_wx_prefix
42
+ <<~__CODE
43
+ ENV['WXPREFIX'] = File.realpath(File.join(__dir__, '..', '..', 'ext'))
44
+ __CODE
45
+ end
46
+
27
47
  end
28
48
 
29
49
  end
@@ -12,20 +12,18 @@
12
12
  require 'wx'
13
13
 
14
14
  # This simple sample demonstrates how to use Ruby (green) threads
15
- # to execute non-GUI code in parallel with a wxRuby
15
+ # or fibers to execute non-GUI code concurrently with a wxRuby
16
16
  # GUI. This strategy is useful in a number of situations:
17
17
  #
18
18
  # * To keep the GUI responsive whilst computationally intensive
19
19
  # operations are carried out in the background
20
20
  # * To keep the GUI responsive while waiting for networking operations
21
- # to complete
22
- #
23
- # The basic problem is that, as with other Ruby GUI toolkits, non-GUI
24
- # threads will not, by default, get allocated time to run while Ruby is
25
- # busy in Wx code - the main wxRuby event loop. Strategies to deal with
26
- # this include using non-blocking IO, and, more generically, using
27
- # wxRuby's Timer class to explicitly allocate time for non-GUI threads
28
- # to run. The latter technique is shown here.
21
+ # to complete
22
+ #
23
+ # This sample showcases how to use Ruby threading (Thread or Ractor) or
24
+ # cooperative concurrency (Fiber) in a wxRuby GUI application, how to
25
+ # communicate thread safely with the main thread and, if needed, how to
26
+ # provide processing time for non-GUI threads of execution.
29
27
 
30
28
  module Threaded
31
29
 
@@ -51,42 +49,244 @@ end
51
49
 
52
50
  # This frame shows a set of progress bars which monitor progress of
53
51
  # long-running tasks. In this example, this long-running task is
54
- # emulated by simply sleep-ing for random periods, but could equally be
55
- # downloading from a socket or parsing a file.
52
+ # a (partially) simulated word counter, but could equally be
53
+ # downloading from a socket or anything else requiring substantial
54
+ # computation or blocking IO operations.
56
55
  class ProgressFrame < Wx::Frame
57
- STEPS = 20
56
+
57
+ module ID
58
+ include Wx::IDHelper
59
+ RUN_GT_WITH_CUSTOM_EVENT = self.next_id
60
+ RUN_GT_WITH_ASYNC_CALL = self.next_id
61
+ RUN_GT_WITH_QUEUE = self.next_id
62
+ RUN_FIBER_YIELD = self.next_id
63
+ RUN_FIBER_UPDATE = self.next_id
64
+ RUN_RACTOR_THREADS = self.next_id
65
+ end
66
+
67
+ WORKERS = 8
68
+ STEPS = 100
69
+
70
+ # word count simulator
71
+ class Simulator
72
+ class << self
73
+ def run(timeslice)
74
+ start = Time.now
75
+ count = 0
76
+ # use max timeslice time to analyze max 100 files
77
+ 100.times do
78
+ text = File.read(__FILE__)
79
+ text.gsub(/\w+/) { count += 1; '' }
80
+ break unless (Time.now - start) < timeslice
81
+ end
82
+ count
83
+ end
84
+ end
85
+ end
86
+
58
87
  def initialize
59
- super(nil, :title => 'Threading demo')
88
+ super(nil, :title => 'Threading demo', size: [600, 400])
60
89
 
61
90
  self.icon = Wx.Icon(:sample, Wx::BITMAP_TYPE_XPM, art_path: File.join(__dir__, '..'))
62
91
 
92
+ menuFile = Wx::Menu.new
93
+ helpMenu = Wx::Menu.new
94
+ helpMenu.append(Wx::ID_ABOUT, "&About...\tF1", "Show about dialog")
95
+ gt_submenu = Wx::Menu.new
96
+ gt_submenu.append(ID::RUN_GT_WITH_CUSTOM_EVENT, "Run with custom event", 'Run Green threads simulation with custom events')
97
+ gt_submenu.append(ID::RUN_GT_WITH_ASYNC_CALL, "Run with async calls", 'Run Green threads simulation with asynchronous calls')
98
+ gt_submenu.append(ID::RUN_GT_WITH_QUEUE, "Run with thread queue", 'Run Green threads simulation with thread queue')
99
+ @mi_gt = menuFile.append_sub_menu(gt_submenu, "Run &Green Threads", 'Run simulation using standard Ruby Green threads')
100
+ fb_submenu = Wx::Menu.new
101
+ fb_submenu.append(ID::RUN_FIBER_YIELD, "Run Fibers with yield", 'Run Ruby fibers with update through yield')
102
+ fb_submenu.append(ID::RUN_FIBER_UPDATE, "Run Fibers with update", 'Run Ruby fibers with direct GUI update')
103
+ @mi_fb = menuFile.append_sub_menu(fb_submenu, "Run &Fibers", 'Run simulation using Ruby Fibers')
104
+ @mi_rt = menuFile.append(ID::RUN_RACTOR_THREADS, "Run &Ractor Threads", 'Run simulation using Ruby Ractor threads')
105
+ menuFile.append_separator
106
+ menuFile.append(Wx::ID_EXIT, "E&xit\tAlt-X", "Quit this program")
107
+ menuBar = Wx::MenuBar.new
108
+ menuBar.append(menuFile, "&File")
109
+ menuBar.append(helpMenu, "&Help")
110
+ set_menu_bar(menuBar)
111
+
112
+ create_status_bar
113
+
63
114
  @gauges = []
115
+ @workers = []
116
+ @queue = nil
64
117
  panel = Wx::Panel.new(self)
65
118
  sizer = Wx::BoxSizer.new(Wx::VERTICAL)
66
119
  # progress update handler
67
120
  evt_update_progress(:on_progress_update)
68
- frame = self
69
- # show ten gauges
70
- 10.times do |gauge_ix|
71
- gauge = Wx::Gauge.new(panel, :range => STEPS)
72
- # For each gauge, start a new thread in which the task runs
73
- Thread.new do
121
+ # show a gauge for each worker
122
+ WORKERS.times do
123
+ gauge = Wx::Gauge.new(panel, size: [-1, 30], :range => STEPS)
124
+ @gauges << gauge
125
+ sizer.add(gauge, 0, Wx::GROW|Wx::ALL, 2)
126
+ end
127
+ panel.sizer = sizer
128
+ sizer.fit(panel)
129
+
130
+ evt_menu Wx::ID_EXIT, :on_quit
131
+ evt_menu Wx::ID_ABOUT, :on_about
132
+ evt_menu_range ID::RUN_GT_WITH_CUSTOM_EVENT, ID::RUN_GT_WITH_QUEUE, :on_run_green_threads
133
+ evt_menu_range ID::RUN_FIBER_YIELD, ID::RUN_FIBER_UPDATE, :on_run_fibers
134
+ evt_menu ID::RUN_RACTOR_THREADS, :on_run_ractor_threads
135
+
136
+ evt_thread Wx::ID_ANY, :on_thread_event
137
+
138
+ evt_idle :on_idle
139
+ end
140
+
141
+ private def start_run
142
+ @mi_gt.enable(false)
143
+ @mi_fb.enable(false)
144
+ @mi_rt.enable(false)
145
+ reset_gauges
146
+ @total = 0
147
+ @run_start = Time.now
148
+ end
149
+
150
+ private def end_run(total)
151
+ set_status_text("#{Time.now - @run_start} seconds | #{total} words counted")
152
+ @mi_gt.enable
153
+ @mi_fb.enable
154
+ @mi_rt.enable
155
+ @queue = nil
156
+ @workers.clear
157
+ self.refresh
158
+ end
159
+
160
+ def on_run_green_threads(evt)
161
+ start_run
162
+ @queue = Thread::Queue.new if evt.id == ID::RUN_GT_WITH_QUEUE
163
+ # run a Thread for each worker
164
+ @workers = (0...WORKERS).collect do |worker|
165
+ # For each worker, start a new thread in which the task runs
166
+ Thread.new(evt.id, evt.id == ID::RUN_GT_WITH_QUEUE ? @queue : self) do |evt_id, queue_or_frame|
74
167
  # The long-running task
168
+ count = 0
75
169
  STEPS.times do | i |
76
- sleep rand(100) / 50.0
170
+ # simulate processing step
171
+ count += Simulator.run(0.1) # give each processing cycle a maximum timeslice of 100 msec
77
172
  # Update the main GUI asynchronously (more ways than 1)
78
- if (gauge_ix % 2) == 0
79
- frame.event_handler.queue_event(ProgressUpdateEvent.new(i+1, gauge_ix))
173
+ case evt_id
174
+ when ID::RUN_GT_WITH_QUEUE
175
+ queue_or_frame << [worker, i+1]
176
+ when ID::RUN_GT_WITH_CUSTOM_EVENT
177
+ queue_or_frame.event_handler.queue_event(ProgressUpdateEvent.new(i+1, worker))
178
+ else # ID::RUN_GT_WITH_ASYNC_CALL
179
+ queue_or_frame.call_after(:update_gauge, worker, i+1)
180
+ end
181
+ end
182
+ count
183
+ end
184
+ end
185
+ end
186
+
187
+ def on_run_fibers(evt)
188
+ start_run
189
+ # run a Fiber for each worker
190
+ evt_id = evt.id
191
+ @workers = (0...WORKERS).collect do |worker|
192
+ # For each worker, start a new fiber in which the task runs
193
+ # Use a smaller time slice for each worker cycle, so as not to block the
194
+ # event loop too long, but increase cycles so the workers still get a decent
195
+ # amount of 'CPU' time running the simulated process.
196
+ Fiber.new do
197
+ # The long-running task
198
+ count = 0
199
+ (4*STEPS).times do | i |
200
+ # simulate processing step
201
+ count += Simulator.run(0.01) # give each processing cycle a maximum timeslice of 10 msec
202
+ # Communicate update
203
+ if evt_id == ID::RUN_FIBER_YIELD
204
+ Fiber.yield [worker, (i+1)/4]
80
205
  else
81
- frame.call_after(:update_gauge, gauge_ix, i+1)
206
+ update_gauge(worker, (i+1)/4)
207
+ Fiber.yield
82
208
  end
83
209
  end
210
+ count
84
211
  end
85
- @gauges << gauge
86
- sizer.add(gauge, 0, Wx::GROW|Wx::ALL, 2)
87
212
  end
88
- panel.sizer = sizer
89
- sizer.fit(panel)
213
+ end
214
+
215
+ def on_run_ractor_threads(_)
216
+ start_run
217
+ # run a Ractor for each worker
218
+ @workers = (0...WORKERS).collect do |worker|
219
+ # for each worker start a Ractor to run the task
220
+ if RUBY_VERSION >= '4.0.0'
221
+ pin = Ractor::Port.new
222
+ pmon = Ractor::Port.new
223
+ r = Ractor.new(worker, self.make_shared, pin) do |worker_id, evt_handler, pout|
224
+ # The long-running task
225
+ count = 0
226
+ STEPS.times do | i |
227
+ count += Simulator.run(0.1) # give each processing cycle a maximum timeslice of 100 msec
228
+ # Update the main GUI asynchronously
229
+ pout.send(i+1)
230
+ evt = Wx::RT::ThreadEvent.new
231
+ evt.set_int(worker_id)
232
+ evt_handler.queue_event(evt)
233
+ end
234
+ pout.send(-1)
235
+ evt = Wx::RT::ThreadEvent.new
236
+ evt.set_int(worker_id)
237
+ evt_handler.queue_event(evt)
238
+ count
239
+ end
240
+ r.monitor(pmon)
241
+ [r, pin, pmon]
242
+ else
243
+ r = Ractor.new(worker, self.make_shared) do |worker_id, evt_handler|
244
+ # The long-running task
245
+ count = 0
246
+ STEPS.times do | i |
247
+ # simulate processing step
248
+ count += Simulator.run(0.1) # give each processing cycle a maximum timeslice of 100 msec
249
+ # Update the main GUI asynchronously
250
+ evt = Wx::RT::ThreadEvent.new
251
+ evt.set_int(worker_id)
252
+ evt_handler.queue_event(evt)
253
+ Ractor.yield(i+1)
254
+ end
255
+ evt = Wx::RT::ThreadEvent.new
256
+ evt.set_int(worker_id)
257
+ evt_handler.queue_event(evt)
258
+ Ractor.yield(-1)
259
+ count
260
+ end
261
+ [r]
262
+ end
263
+ end
264
+ end
265
+
266
+ def on_thread_event(evt)
267
+ w = evt.get_int
268
+ if RUBY_VERSION >= '4.0.0'
269
+ step = @workers[w][1].receive
270
+ if step >= 0
271
+ update_gauge(w, step)
272
+ else
273
+ rc = @workers[w][2].receive
274
+ Wx.message_box("Worker ##{w} aborted with error.", 'Worker Error',
275
+ Wx::OK|Wx::CENTRE|Wx::ICON_ERROR, self) if rc == :aborted
276
+ @workers[w] << :stopped
277
+ end
278
+ else
279
+ step = begin; @workers[w][0].take; rescue Ractor::ClosedError; nil; end
280
+ if step && step >= 0
281
+ update_gauge(w, step)
282
+ else
283
+ @workers[w] << :stopped
284
+ end
285
+ end
286
+ end
287
+
288
+ def reset_gauges
289
+ WORKERS.times { |w| update_gauge(w, 0) }
90
290
  end
91
291
 
92
292
  def update_gauge(gauge_ix, value)
@@ -96,17 +296,77 @@ class ProgressFrame < Wx::Frame
96
296
  def on_progress_update(evt)
97
297
  update_gauge(evt.gauge, evt.value)
98
298
  end
299
+
300
+ def on_idle(evt)
301
+ unless @workers.empty?
302
+ case @workers.first
303
+ when ::Thread
304
+ if @workers.any? { |worker| worker.alive? }
305
+ if @queue
306
+ WORKERS.times do
307
+ data = @queue.shift(true) rescue nil
308
+ update_gauge(*data) if data
309
+ break unless data
310
+ end
311
+ end
312
+ else
313
+ @total = @workers.sum { |w| w.value }
314
+ @workers.clear
315
+ if @queue
316
+ begin
317
+ data = @queue.shift(true) rescue nil
318
+ update_gauge(*data) if data
319
+ end while data
320
+ else
321
+ Wx.get_app.yield
322
+ end
323
+ end_run(@total)
324
+ end
325
+ when ::Fiber
326
+ if @workers.any? { |worker| worker.alive? }
327
+ @workers.each do |fbr|
328
+ if fbr.alive?
329
+ data = fbr.resume rescue nil
330
+ if data
331
+ if ::Array === data
332
+ update_gauge(*data)
333
+ else
334
+ @total += data
335
+ end
336
+ end
337
+ end
338
+ end
339
+ evt.request_more # make sure we get another idle event to provide time slices for the fibers
340
+ else
341
+ end_run(@total)
342
+ end
343
+ else
344
+ if @workers.all? { |worker| worker.last == :stopped }
345
+ @total = @workers.sum { |w| w[0].value }
346
+ @workers.clear
347
+ end_run(@total)
348
+ end
349
+ end
350
+ evt.skip
351
+ end
352
+ end
353
+
354
+ def on_quit(_)
355
+ close(true)
356
+ end
357
+
358
+ def on_about(_)
359
+ msg = sprintf("This is the About dialog of the threaded sample.\n" \
360
+ "Welcome to wxRuby, version %s", Wx::WXRUBY_VERSION)
361
+ Wx::message_box(msg, "About Threaded", Wx::OK|Wx::ICON_INFORMATION, self)
362
+ end
363
+
99
364
  end
100
365
 
101
366
  # This app class creates a frame, and, importantly, a timer to allow
102
367
  # the threads some computing time
103
368
  class GaugeApp < Wx::App
104
369
  def on_init
105
- # Create a global application timer that passes control to other
106
- # ruby threads. The timer will run every 1/40 second (25ms). Higher
107
- # values will make the other threads run more often, but will
108
- # eventually degrade the responsiveness of the GUI.
109
- Wx::Timer.every(25) { Thread.pass }
110
370
  prog = ProgressFrame.new
111
371
  prog.show
112
372
  end
@@ -122,22 +382,15 @@ module ThreadSample
122
382
  { file: __FILE__,
123
383
  summary: 'wxRuby threading example.',
124
384
  description: <<~__TXT
125
- wxRuby example demonstrating how to use ruby threads in wxRuby.
126
- This simple sample demonstrates how to use Ruby (green) threads
127
- to execute non-GUI code in parallel with a wxRuby
385
+ wxRuby example demonstrating how to use concurrency in wxRuby.
386
+ This sample demonstrates how to use Ruby (green) threads, fibers
387
+ and Ractor threads to execute non-GUI code in concurrently with a wxRuby
128
388
  GUI. This strategy is useful in a number of situations:
129
389
 
130
390
  * To keep the GUI responsive whilst computationally intensive
131
391
  operations are carried out in the background
132
392
  * To keep the GUI responsive while waiting for networking operations
133
393
  to complete
134
-
135
- The basic problem is that, as with other Ruby GUI toolkits, non-GUI
136
- threads will not, by default, get allocated time to run while Ruby is
137
- busy in Wx code - the main wxRuby event loop. Strategies to deal with
138
- this include using non-blocking IO, and, more generically, using
139
- wxRuby's Timer class to explicitly allocate time for non-GUI threads
140
- to run. The latter technique is shown here.
141
394
  __TXT
142
395
  }
143
396
  end
Binary file
Binary file
Binary file
@@ -0,0 +1,9 @@
1
+ .topic IDH_PANEL
2
+ This is the topic for the main panel.
3
+
4
+ .topic IDH_TEXT
5
+ This is the topic for the text control.
6
+
7
+ .topic IDH_OK
8
+ This is the topic for the OK button.
9
+
Binary file
@@ -0,0 +1,8 @@
1
+ :Base doc.hlp
2
+ 1 Introduction
3
+ 2 Introduction=intro
4
+ 2 Classes=classes
5
+ 2 Functions=functions
6
+ 2 About=about
7
+ 1 Chapter 2
8
+ 2 Chapter 2=chapter2
@@ -0,0 +1,7 @@
1
+ #define doc1 100
2
+ #define doc2 2
3
+ #define doc3 1
4
+ #define doc4 3
5
+ #define IDH_PANEL 300
6
+ #define IDH_TEXT 301
7
+ #define IDH_OK 302
@@ -0,0 +1,40 @@
1
+ <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
2
+ <HTML>
3
+ <HEAD>
4
+ <meta name="GENERATOR" content="tex2rtf">
5
+ <!-- Sitemap 1.0 -->
6
+ </HEAD><BODY>
7
+ <OBJECT type="text/site properties">
8
+ <param name="ImageType" value="Folder">
9
+ </OBJECT>
10
+ <UL>
11
+ <LI> <OBJECT type="text/sitemap">
12
+ <param name="Local" value="doc.htm">
13
+ <param name="Name" value="Contents">
14
+ <param name="ID" value=0>
15
+ </OBJECT>
16
+ <LI> <OBJECT type="text/sitemap">
17
+ <param name="Local" value="doc1.htm#intro">
18
+ <param name="Name" value="Introduction">
19
+ </OBJECT>
20
+ <UL> <LI> <OBJECT type="text/sitemap">
21
+ <param name="Local" value="doc2.htm#classes">
22
+ <param name="Name" value="Classes">
23
+ <param name="ID" value=2>
24
+ </OBJECT>
25
+ <LI> <OBJECT type="text/sitemap">
26
+ <param name="Local" value="doc3.htm#functions">
27
+ <param name="Name" value="Functions">
28
+ <param name="ID" value=1>
29
+ </OBJECT>
30
+ <LI> <OBJECT type="text/sitemap">
31
+ <param name="Local" value="doc4.htm#about">
32
+ <param name="Name" value="About">
33
+ <param name="ID" value=3>
34
+ </OBJECT>
35
+ </UL> <LI> <OBJECT type="text/sitemap">
36
+ <param name="Local" value="doc5.htm#chapter2">
37
+ <param name="Name" value="Chapter 2">
38
+ <param name="ID" value=4>
39
+ </OBJECT>
40
+ </UL>
@@ -0,0 +1,31 @@
1
+ <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
2
+ <HTML>
3
+ <HEAD>
4
+ <meta name="GENERATOR" content="tex2rtf">
5
+ <!-- Sitemap 1.0 -->
6
+ </HEAD><BODY>
7
+ <OBJECT type="text/site properties">
8
+ <param name="ImageType" value="Folder">
9
+ </OBJECT>
10
+ <UL>
11
+ <LI> <OBJECT type="text/sitemap">
12
+ <param name="Local" value="doc4.htm#about">
13
+ <param name="Name" value="About">
14
+ </OBJECT>
15
+ <LI> <OBJECT type="text/sitemap">
16
+ <param name="Local" value="doc1.htm#intro">
17
+ <param name="Name" value="Introduction">
18
+ </OBJECT>
19
+ <LI> <OBJECT type="text/sitemap">
20
+ <param name="Local" value="doc2.htm#classes">
21
+ <param name="Name" value="Classes">
22
+ </OBJECT>
23
+ <LI> <OBJECT type="text/sitemap">
24
+ <param name="Local" value="doc5.htm#chapter2">
25
+ <param name="Name" value="Chapter 2">
26
+ </OBJECT>
27
+ <LI> <OBJECT type="text/sitemap">
28
+ <param name="Local" value="doc3.htm#functions">
29
+ <param name="Name" value="Functions">
30
+ </OBJECT>
31
+ </UL>