wxruby3 0.9.0 → 0.9.2

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 (205) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/ext/wxruby3/include/wxRubyApp.h +338 -0
  4. data/ext/wxruby3/include/wxruby-Config.h +6 -6
  5. data/ext/wxruby3/include/wxruby-runtime.h +3 -0
  6. data/ext/wxruby3/swig/common.i +22 -0
  7. data/ext/wxruby3/swig/custom/director.swg +296 -0
  8. data/ext/wxruby3/swig/custom/rubyapi.swg +19 -0
  9. data/ext/wxruby3/swig/custom/rubyerrors.swg +45 -0
  10. data/ext/wxruby3/swig/custom/rubyhead.swg +192 -0
  11. data/ext/wxruby3/swig/custom/rubyrun.swg +187 -0
  12. data/ext/wxruby3/swig/custom/swigrun.swg +363 -0
  13. data/ext/wxruby3/swig/custom/typemaps/swigtypemaps.swg +173 -0
  14. data/ext/wxruby3/swig/wx.i +50 -30
  15. data/lib/wx/aui/aui_tab_ctrl.rb +18 -0
  16. data/lib/wx/aui/auinotebook.rb +6 -2
  17. data/lib/wx/aui/require.rb +1 -0
  18. data/lib/wx/core/app.rb +2 -2
  19. data/lib/wx/core/collapsible_pane.rb +1 -1
  20. data/lib/wx/core/const.rb +83 -0
  21. data/lib/wx/core/controlwithitems.rb +8 -6
  22. data/lib/wx/core/menu.rb +10 -0
  23. data/lib/wx/core/notebook.rb +6 -2
  24. data/lib/wx/core/sizer.rb +11 -0
  25. data/lib/wx/core/task_bar_button.rb +19 -0
  26. data/lib/wx/core/textctrl.rb +11 -1
  27. data/lib/wx/core/{treectrl.rb → tree_ctrl.rb} +31 -12
  28. data/lib/wx/core/window.rb +10 -0
  29. data/lib/wx/doc/app.rb +48 -38
  30. data/lib/wx/doc/art_locator.rb +47 -43
  31. data/lib/wx/doc/aui/auimanager.rb +16 -8
  32. data/lib/wx/doc/aui/auinotebook.rb +20 -5
  33. data/lib/wx/doc/clipboard.rb +11 -7
  34. data/lib/wx/doc/colour_dialog.rb +14 -10
  35. data/lib/wx/doc/const.rb +66 -66
  36. data/lib/wx/doc/controlwithitems.rb +17 -7
  37. data/lib/wx/doc/data_object.rb +2 -2
  38. data/lib/wx/doc/event.rb +0 -6
  39. data/lib/wx/doc/evthandler.rb +113 -108
  40. data/lib/wx/doc/font.rb +1 -0
  41. data/lib/wx/doc/functions.rb +9 -9
  42. data/lib/wx/doc/gc_dc.rb +6 -1
  43. data/lib/wx/doc/graphics_context.rb +1 -0
  44. data/lib/wx/doc/grid/grid.rb +22 -1
  45. data/lib/wx/doc/help_controller.rb +11 -7
  46. data/lib/wx/doc/html/html_help_controller.rb +12 -4
  47. data/lib/wx/doc/list_ctrl.rb +33 -29
  48. data/lib/wx/doc/menu.rb +20 -0
  49. data/lib/wx/doc/notebook.rb +21 -0
  50. data/lib/wx/doc/pg/events.rb +13 -9
  51. data/lib/wx/doc/pg/pg_property.rb +18 -0
  52. data/lib/wx/doc/progress_dialog.rb +36 -32
  53. data/lib/wx/doc/prt/page_setup_dialog.rb +20 -12
  54. data/lib/wx/doc/prt/print_data.rb +13 -5
  55. data/lib/wx/doc/prt/print_dialog.rb +31 -23
  56. data/lib/wx/doc/prt/printer.rb +20 -12
  57. data/lib/wx/doc/radio_box.rb +19 -15
  58. data/lib/wx/doc/rbn/ribbon_bar.rb +13 -5
  59. data/lib/wx/doc/rbn/ribbon_button_bar.rb +13 -5
  60. data/lib/wx/doc/rbn/ribbon_gallery.rb +13 -5
  61. data/lib/wx/doc/rbn/ribbon_tool_bar.rb +13 -5
  62. data/lib/wx/doc/region_iterator.rb +32 -28
  63. data/lib/wx/doc/rtc/rich_text_composite_object.rb +24 -0
  64. data/lib/wx/doc/rtc/rich_text_ctrl.rb +24 -0
  65. data/lib/wx/doc/rtc/rich_text_paragraph.rb +24 -0
  66. data/lib/wx/doc/rtc/richtext_buffer.rb +27 -19
  67. data/lib/wx/doc/rtc/richtext_printing.rb +17 -9
  68. data/lib/wx/doc/rtc/richtext_style_sheet.rb +17 -9
  69. data/lib/wx/doc/sizer.rb +20 -0
  70. data/lib/wx/doc/stc/styled_text_ctrl.rb +24 -0
  71. data/lib/wx/doc/stream.rb +39 -35
  72. data/lib/wx/doc/system_settings.rb +30 -26
  73. data/lib/wx/doc/text_validator.rb +12 -8
  74. data/lib/wx/doc/textctrl.rb +16 -0
  75. data/lib/wx/doc/tree_ctrl.rb +95 -0
  76. data/lib/wx/doc/treebook.rb +9 -5
  77. data/lib/wx/doc/v_list_box.rb +9 -5
  78. data/lib/wx/doc/variant.rb +164 -160
  79. data/lib/wx/doc/window.rb +57 -42
  80. data/lib/wx/doc/window_disabler.rb +10 -6
  81. data/lib/wx/grid/grid.rb +27 -4
  82. data/lib/wx/keyword_defs.rb +43 -6
  83. data/lib/wx/pg/pg_property.rb +22 -0
  84. data/lib/wx/rtc/require.rb +3 -0
  85. data/lib/wx/rtc/rich_text_composite_object.rb +25 -0
  86. data/lib/wx/rtc/rich_text_ctrl.rb +25 -0
  87. data/lib/wx/rtc/rich_text_paragraph.rb +25 -0
  88. data/lib/wx/stc/require.rb +1 -0
  89. data/lib/wx/stc/styled_text_ctrl.rb +25 -0
  90. data/lib/wx/version.rb +1 -1
  91. data/rakelib/lib/config/linux.rb +0 -3
  92. data/rakelib/lib/config/macosx.rb +1 -1
  93. data/rakelib/lib/config/mingw.rb +1 -1
  94. data/rakelib/lib/config/unixish.rb +1 -1
  95. data/rakelib/lib/config.rb +14 -4
  96. data/rakelib/lib/core/include/funcall.inc +33 -14
  97. data/rakelib/lib/core/include/swigdirector.inc +384 -0
  98. data/rakelib/lib/core/include/swigrubyerrors.inc +161 -0
  99. data/{ext/wxruby3/swig/custom/swig4/rubyrun.swg → rakelib/lib/core/include/swigrubyrun.inc} +245 -120
  100. data/rakelib/lib/core/include/swigrun.inc +700 -0
  101. data/rakelib/lib/core/package.rb +19 -9
  102. data/rakelib/lib/core/parameter.rb +3 -0
  103. data/rakelib/lib/core/spec.rb +6 -1
  104. data/rakelib/lib/director/accelerator.rb +3 -4
  105. data/rakelib/lib/director/accessible.rb +47 -0
  106. data/rakelib/lib/director/animation.rb +1 -1
  107. data/rakelib/lib/director/animation_ctrl.rb +20 -0
  108. data/rakelib/lib/director/app.rb +15 -304
  109. data/rakelib/lib/director/app_traits.rb +10 -12
  110. data/rakelib/lib/director/art_provider.rb +1 -1
  111. data/rakelib/lib/director/ctrl_with_items.rb +17 -5
  112. data/rakelib/lib/director/data_format.rb +1 -1
  113. data/rakelib/lib/director/data_object_simple_base.rb +1 -2
  114. data/rakelib/lib/director/derived_dc.rb +1 -1
  115. data/rakelib/lib/director/dialog.rb +6 -0
  116. data/rakelib/lib/director/dialup_event.rb +44 -0
  117. data/rakelib/lib/director/dialup_manager.rb +45 -0
  118. data/rakelib/lib/director/drag_image.rb +2 -3
  119. data/rakelib/lib/director/event.rb +22 -4
  120. data/rakelib/lib/director/file_ctrl.rb +35 -0
  121. data/rakelib/lib/director/file_ctrl_event.rb +26 -0
  122. data/rakelib/lib/director/frame.rb +1 -3
  123. data/rakelib/lib/director/gdicommon.rb +27 -11
  124. data/rakelib/lib/director/graphics_context.rb +2 -4
  125. data/rakelib/lib/director/grid_cell_editor.rb +6 -6
  126. data/rakelib/lib/director/grid_ctrl.rb +34 -3
  127. data/rakelib/lib/director/help_controller.rb +1 -1
  128. data/rakelib/lib/director/icon.rb +5 -2
  129. data/rakelib/lib/director/list_ctrl.rb +5 -6
  130. data/rakelib/lib/director/locale.rb +1 -3
  131. data/rakelib/lib/director/log.rb +1 -4
  132. data/rakelib/lib/director/media_ctrl.rb +54 -0
  133. data/rakelib/lib/director/menu.rb +16 -1
  134. data/rakelib/lib/director/menu_item.rb +2 -2
  135. data/rakelib/lib/director/pgarray_editor_dialog.rb +0 -6
  136. data/rakelib/lib/director/pgeditor.rb +2 -2
  137. data/rakelib/lib/director/pgproperties.rb +3 -3
  138. data/rakelib/lib/director/pgproperty.rb +24 -1
  139. data/rakelib/lib/director/property_grid_interface.rb +5 -10
  140. data/rakelib/lib/director/richtext_buffer.rb +1 -1
  141. data/rakelib/lib/director/richtext_composite_object.rb +25 -0
  142. data/rakelib/lib/director/richtext_ctrl.rb +15 -5
  143. data/rakelib/lib/director/richtext_formatting_dialog.rb +7 -5
  144. data/rakelib/lib/director/richtext_paragraph_layout_box.rb +9 -7
  145. data/rakelib/lib/director/sash_event.rb +42 -0
  146. data/rakelib/lib/director/sizer.rb +79 -1
  147. data/rakelib/lib/director/sizer_item.rb +22 -0
  148. data/rakelib/lib/director/static_box.rb +4 -5
  149. data/rakelib/lib/director/styled_text_ctrl.rb +12 -0
  150. data/rakelib/lib/director/task_bar_button.rb +30 -0
  151. data/rakelib/lib/director/task_bar_icon.rb +6 -14
  152. data/rakelib/lib/director/textctrl.rb +12 -1
  153. data/rakelib/lib/director/tool_tip.rb +1 -1
  154. data/rakelib/lib/director/top_level_window.rb +4 -5
  155. data/rakelib/lib/director/tree_ctrl.rb +24 -50
  156. data/rakelib/lib/director/variant.rb +1 -1
  157. data/rakelib/lib/director/window.rb +24 -5
  158. data/rakelib/lib/director.rb +4 -4
  159. data/rakelib/lib/extractor/function.rb +6 -6
  160. data/rakelib/lib/extractor.rb +34 -5
  161. data/rakelib/lib/generate/analyzer.rb +8 -3
  162. data/rakelib/lib/generate/doc/animation_ctrl.yaml +15 -0
  163. data/rakelib/lib/generate/doc/busy_info.yaml +0 -2
  164. data/rakelib/lib/generate/doc/clipboard.yaml +0 -2
  165. data/rakelib/lib/generate/doc/cursor.yaml +0 -2
  166. data/rakelib/lib/generate/doc/events.yaml +10 -4
  167. data/rakelib/lib/generate/doc/panel.yaml +7 -0
  168. data/rakelib/lib/generate/doc/static_box.yaml +8 -0
  169. data/rakelib/lib/generate/doc/xml_resource.yaml +3 -0
  170. data/rakelib/lib/generate/doc.rb +89 -16
  171. data/rakelib/lib/generate/interface.rb +4 -3
  172. data/rakelib/lib/specs/interfaces.rb +161 -156
  173. data/rakelib/lib/swig_runner.rb +4 -50
  174. data/rakelib/lib/typemap/common.rb +54 -10
  175. data/rakelib/lib/typemap/data_format.rb +1 -1
  176. data/rakelib/lib/typemap/data_object_data.rb +2 -2
  177. data/rakelib/lib/typemap/pgprop_arg.rb +7 -2
  178. data/rakelib/lib/typemap/points_list.rb +5 -7
  179. data/rakelib/lib/util/string.rb +10 -8
  180. data/rakelib/yard/templates/default/fulldoc/html/css/wxruby3.css +74 -2
  181. data/rakelib/yard/templates/default/fulldoc/html/full_list.erb +38 -0
  182. data/rakelib/yard/templates/default/fulldoc/html/setup.rb +39 -0
  183. data/rakelib/yard/templates/default/tags/html/wxrb_require.erb +10 -0
  184. data/rakelib/yard/templates/default/tags/setup.rb +16 -0
  185. data/rakelib/yard/yard-custom-templates.rb +3 -0
  186. data/samples/text/richtext.rb +0 -30
  187. data/samples/treectrl/treectrl.rb +1 -1
  188. data/tests/media/beep_lo.wav +0 -0
  189. data/tests/test_app_exit_exception.rb +36 -0
  190. data/tests/test_app_init_exception.rb +20 -0
  191. data/tests/test_book_controls.rb +29 -0
  192. data/tests/test_exceptions.rb +41 -0
  193. data/tests/test_list_ctrl.rb +1 -1
  194. data/tests/test_media_ctrl.rb +38 -0
  195. data/tests/test_menu.rb +69 -0
  196. data/tests/test_pg.rb +27 -0
  197. data/tests/test_richtext.rb +45 -0
  198. data/tests/test_sizer.rb +59 -0
  199. data/tests/test_std_controls.rb +78 -1
  200. data/tests/test_styled_text_ctrl.rb +46 -0
  201. data/tests/test_tree_ctrl.rb +138 -0
  202. data/tests/test_window.rb +12 -0
  203. data/tests/testapp_noframe.rb +1 -1
  204. metadata +54 -5
  205. data/ext/wxruby3/swig/custom/swig3/rubyrun.swg +0 -456
@@ -0,0 +1,25 @@
1
+ # Copyright (c) 2023 M.J.N. Corino, The Netherlands
2
+ #
3
+ # This software is released under the MIT license.
4
+
5
+ module Wx
6
+
7
+ module RTC
8
+
9
+ class RichTextCtrl
10
+
11
+ # Overload to provide Enumerator without block
12
+ wx_each_line = instance_method :each_line
13
+ define_method :each_line do |&block|
14
+ if block
15
+ wx_each_line.bind(self).call(&block)
16
+ else
17
+ ::Enumerator.new { |y| wx_each_line.bind(self).call { |ln| y << ln } }
18
+ end
19
+ end
20
+
21
+ end
22
+
23
+ end
24
+
25
+ end
@@ -0,0 +1,25 @@
1
+ # Copyright (c) 2023 M.J.N. Corino, The Netherlands
2
+ #
3
+ # This software is released under the MIT license.
4
+
5
+ module Wx
6
+
7
+ module RTC
8
+
9
+ class RichTextParagraph
10
+
11
+ # Overload to provide Enumerator without block
12
+ wx_each_line = instance_method :each_line
13
+ define_method :each_line do |&block|
14
+ if block
15
+ wx_each_line.bind(self).call(&block)
16
+ else
17
+ ::Enumerator.new { |y| wx_each_line.bind(self).call { |ln| y << ln } }
18
+ end
19
+ end
20
+
21
+ end
22
+
23
+ end
24
+
25
+ end
@@ -6,5 +6,6 @@
6
6
 
7
7
  require_relative './events/evt_list'
8
8
  require_relative './keyword_defs'
9
+ require_relative './styled_text_ctrl'
9
10
 
10
11
  Wx::Dialog.setup_dialog_functors(Wx::STC)
@@ -0,0 +1,25 @@
1
+ # Copyright (c) 2023 M.J.N. Corino, The Netherlands
2
+ #
3
+ # This software is released under the MIT license.
4
+
5
+ module Wx
6
+
7
+ module STC
8
+
9
+ class StyledTextCtrl
10
+
11
+ # Overload to provide Enumerator without block
12
+ wx_each_line = instance_method :each_line
13
+ define_method :each_line do |&block|
14
+ if block
15
+ wx_each_line.bind(self).call(&block)
16
+ else
17
+ ::Enumerator.new { |y| wx_each_line.bind(self).call { |ln| y << ln } }
18
+ end
19
+ end
20
+
21
+ end
22
+
23
+ end
24
+
25
+ end
data/lib/wx/version.rb CHANGED
@@ -3,5 +3,5 @@
3
3
  # This software is released under the MIT license.
4
4
 
5
5
  module Wx
6
- WXRUBY_VERSION = '0.9.0'
6
+ WXRUBY_VERSION = '0.9.2'
7
7
  end
@@ -65,9 +65,6 @@ module WXRuby3
65
65
  # create a .so binary
66
66
  @extra_ldflags << '-shared'
67
67
 
68
- # This class is not available on linux ports (wxGTK/wxQT/wxX11/wxMotif)
69
- exclude_module('wxPrinterDC')
70
-
71
68
  unless @wx_path.empty?
72
69
  libdirs = @wx_libs.select {|s| s.start_with?('-L')}.collect {|s| s.sub(/^-L/,'')}
73
70
  @exec_env['LD_LIBRARY_PATH'] = "#{ENV['LD_LIBRARY_PATH']}:#{dest_dir}:#{libdirs.join(':')}"
@@ -65,7 +65,7 @@ module WXRuby3
65
65
  end
66
66
  end
67
67
  # some weird thing with this; at least sometimes '--libs all' will not output media library even if feature active
68
- if features_set?('wxUSE_MEDIACTRL')
68
+ if features_set?('USE_MEDIACTRL')
69
69
  lib_list = wx_config("--libs media").split(' ')
70
70
  until lib_list.empty?
71
71
  s = lib_list.shift
@@ -35,7 +35,7 @@ module WXRuby3
35
35
  end
36
36
 
37
37
  def debug_command(*args)
38
- args.unshift(FileUtils::RUBY)
38
+ args.unshift(nix_path(FileUtils::RUBY))
39
39
  args.unshift('--args')
40
40
  args.unshift('gdb')
41
41
  args.join(' ')
@@ -136,7 +136,7 @@ module WXRuby3
136
136
  wx_libset = ::Set.new
137
137
  wx_libset.merge wx_config("--libs all").split(' ')
138
138
  # some weird thing with this; at least sometimes '--libs all' will not output media library even if feature active
139
- if features_set?('wxUSE_MEDIACTRL')
139
+ if features_set?('USE_MEDIACTRL')
140
140
  wx_libset.merge wx_config("--libs media").split(' ')
141
141
  end
142
142
  wx_libset.collect { |s| s.dup }
@@ -589,7 +589,7 @@ module WXRuby3
589
589
  private :any_feature_set?
590
590
 
591
591
  def features_set?(*featureset)
592
- featureset.all? do |feature|
592
+ featureset.flatten.all? do |feature|
593
593
  if AnyOf === feature
594
594
  any_feature_set?(*feature.features)
595
595
  else
@@ -615,9 +615,19 @@ module WXRuby3
615
615
  def _retrieve_features(wxwidgets_setup_h)
616
616
  features = {}
617
617
 
618
- File.read(wxwidgets_setup_h).scan(/^\s*#define\s+(wx\w+|__\w+__)\s+([01])/) do | define |
619
- features[$1] = $2.to_i.zero? ? false : true
620
- end if is_configured? && wxwidgets_setup_h
618
+ if is_configured? && wxwidgets_setup_h
619
+ File.read(wxwidgets_setup_h).scan(/^\s*#define\s+(wx\w+|__\w+__)\s+([01])/) do | define |
620
+ feat_val = $2.to_i.zero? ? false : true
621
+ feat_id = $1.sub(/\Awx/i, '').gsub(/\A__|__\Z/, '')
622
+ features[feat_id] = feat_val
623
+ end
624
+ # make sure correct platform defines are included as well which will not be the case always
625
+ # (for example __WXMSW__ and __WXOSX__ are not in setup.h)
626
+ features['WXMSW'] = true if features['GNUWIN32']
627
+ features['WXOSX'] = true if features['DARWIN']
628
+ # prior to wxWidgets 3.3 this feature was not set for wxGTK builds
629
+ features['WXGTK'] = true if features['LINUX'] && !features['WXGTK'] && wx_port == :wxgtk
630
+ end
621
631
 
622
632
  features
623
633
  end
@@ -11,18 +11,38 @@
11
11
 
12
12
  typedef VALUE (*RUBY_INVOKE_FUNC) (VALUE);
13
13
 
14
+ VALUE rb_exc_set_backtrace(VALUE, VALUE);
15
+ VALUE rb_get_backtrace(VALUE);
16
+
17
+ namespace Swig
18
+ {
19
+ class DirectorRubyException : public DirectorException
20
+ {
21
+ public:
22
+ DirectorRubyException(VALUE error, VALUE rcvr, ID fn_id)
23
+ : DirectorException(Qnil)
24
+ {
25
+ VALUE msg = rb_sprintf("Caught exception in SWIG director method for %s#%s", rb_class2name(CLASS_OF(rcvr)), rb_id2name(fn_id));
26
+ this->swig_msg = StringValuePtr(msg);
27
+ swig_error = rb_exc_new_str(rb_eRuntimeError, msg);
28
+ VALUE bt = rb_funcall(error, rb_intern("backtrace"), 0);
29
+ rb_funcall(swig_error, rb_intern("set_backtrace"), 1, bt);
30
+ }
31
+ };
32
+ }
33
+
14
34
  class WXRuby_RBFuncall
15
35
  {
16
36
  public:
17
- WXRuby_RBFuncall (ID fnid, bool abort_on_ex=true)
37
+ WXRuby_RBFuncall (ID fnid, bool throw_on_ex=true)
18
38
  : fn_id_ (fnid),
19
- abort_on_ex_ (abort_on_ex),
39
+ throw_on_ex_ (throw_on_ex),
20
40
  ex_caught_ (false)
21
41
  {
22
42
  }
23
- WXRuby_RBFuncall (const char* fn, bool abort_on_ex=true)
43
+ WXRuby_RBFuncall (const char* fn, bool throw_on_ex=true)
24
44
  : fn_id_ (rb_intern (fn)),
25
- abort_on_ex_ (abort_on_ex),
45
+ throw_on_ex_ (throw_on_ex),
26
46
  ex_caught_ (false)
27
47
  {
28
48
  }
@@ -43,15 +63,18 @@ public:
43
63
 
44
64
  bool has_caught_exception () { return this->ex_caught_; }
45
65
 
46
- VALUE get_exception () { return rb_gv_get ("$!"); }
66
+ VALUE get_exception () { return rb_errinfo(); }
47
67
 
48
68
  ID id () { return this->fn_id_; }
49
69
 
50
70
  protected:
51
71
  struct FuncArgs
52
72
  {
73
+ FuncArgs(VALUE rcvr) : receiver_(rcvr) {}
53
74
  virtual ~FuncArgs () {}
54
75
  virtual VALUE rb_invoke (ID fnid) const = 0;
76
+
77
+ VALUE receiver_;
55
78
  };
56
79
 
57
80
  VALUE _invoke (const FuncArgs& fa)
@@ -65,13 +88,11 @@ protected:
65
88
  &invoke_state);
66
89
  if (invoke_state)
67
90
  {
68
- if (this->abort_on_ex_)
91
+ if (this->throw_on_ex_)
69
92
  {
70
93
  // handle exception
71
94
  VALUE rexc = this->get_exception ();
72
- VALUE msg = rb_eval_string ("$!.message+\"\\n\"+$!.backtrace.join(\"\\n\")");
73
- const char *exc_name = rb_obj_classname(rexc);
74
- wxLogFatalError("%s : %s", exc_name, StringValuePtr(msg));
95
+ throw Swig::DirectorRubyException(rexc, fa.receiver_, this->fn_id_);
75
96
  }
76
97
  else
77
98
  {
@@ -88,7 +109,7 @@ protected:
88
109
  struct FuncArgArray : public FuncArgs
89
110
  {
90
111
  FuncArgArray (VALUE rcvr, VALUE args)
91
- : receiver_ (rcvr), args_ (args) {}
112
+ : FuncArgs (rcvr), args_ (args) {}
92
113
  virtual ~FuncArgArray () {}
93
114
 
94
115
  virtual VALUE rb_invoke (ID fnid) const
@@ -96,14 +117,13 @@ protected:
96
117
  return rb_apply (this->receiver_, fnid, this->args_);
97
118
  }
98
119
 
99
- VALUE receiver_;
100
120
  VALUE args_;
101
121
  };
102
122
 
103
123
  struct FuncArgList : public FuncArgs
104
124
  {
105
125
  FuncArgList (VALUE rcvr, int argc, VALUE* args)
106
- : receiver_ (rcvr), argc_ (argc), args_ (args) {}
126
+ : FuncArgs (rcvr), argc_ (argc), args_ (args) {}
107
127
  virtual ~FuncArgList () {}
108
128
 
109
129
  virtual VALUE rb_invoke (ID fnid) const
@@ -111,7 +131,6 @@ protected:
111
131
  return rb_funcall2 (this->receiver_, fnid, this->argc_, this->args_);
112
132
  }
113
133
 
114
- VALUE receiver_;
115
134
  int argc_;
116
135
  VALUE* args_;
117
136
  };
@@ -138,7 +157,7 @@ protected:
138
157
 
139
158
  private:
140
159
  ID fn_id_;
141
- bool abort_on_ex_;
160
+ bool throw_on_ex_;
142
161
  bool ex_caught_;
143
162
  };
144
163
 
@@ -0,0 +1,384 @@
1
+ // Copyright (c) 2023 M.J.N. Corino, The Netherlands
2
+ //
3
+ // This software is released under the MIT license.
4
+
5
+ // SWIG director classes
6
+
7
+ #include <string>
8
+ #include <iostream>
9
+ #include <exception>
10
+ #include <map>
11
+
12
+ namespace Swig
13
+ {
14
+
15
+ /* memory handler */
16
+ struct WXRB_EXPORT_FLAG GCItem
17
+ {
18
+ virtual ~GCItem();
19
+
20
+ virtual swig_ruby_owntype get_own() const;
21
+ };
22
+
23
+ GCItem::~GCItem() {}
24
+
25
+ swig_ruby_owntype GCItem::get_own() const
26
+ {
27
+ swig_ruby_owntype own = {0, 0};
28
+ return own;
29
+ }
30
+
31
+ struct WXRB_EXPORT_FLAG GCItem_var
32
+ {
33
+ GCItem_var(GCItem *item = 0) : _item(item) {}
34
+
35
+ GCItem_var& operator=(GCItem *item);
36
+
37
+ ~GCItem_var()
38
+ {
39
+ delete _item;
40
+ }
41
+
42
+ GCItem *operator->() const
43
+ {
44
+ return _item;
45
+ }
46
+
47
+ private:
48
+ GCItem *_item;
49
+ };
50
+
51
+ GCItem_var& GCItem_var::operator=(GCItem *item)
52
+ {
53
+ GCItem *tmp = _item;
54
+ _item = item;
55
+ delete tmp;
56
+ return *this;
57
+ }
58
+
59
+ template <typename Type>
60
+ struct GCItem_T : GCItem
61
+ {
62
+ GCItem_T(Type *ptr) : _ptr(ptr) {}
63
+
64
+ virtual ~GCItem_T()
65
+ {
66
+ delete _ptr;
67
+ }
68
+
69
+ private:
70
+ Type *_ptr;
71
+ };
72
+
73
+ struct WXRB_EXPORT_FLAG GCItem_Object : GCItem
74
+ {
75
+ GCItem_Object(swig_ruby_owntype own) : _own(own) {}
76
+
77
+ virtual ~GCItem_Object() {}
78
+
79
+ swig_ruby_owntype get_own() const
80
+ {
81
+ return _own;
82
+ }
83
+
84
+ private:
85
+ swig_ruby_owntype _own;
86
+ };
87
+
88
+ template <typename Type>
89
+ struct GCArray_T : GCItem
90
+ {
91
+ GCArray_T(Type *ptr) : _ptr(ptr) {}
92
+
93
+ virtual ~GCArray_T()
94
+ {
95
+ delete[] _ptr;
96
+ }
97
+
98
+ private:
99
+ Type *_ptr;
100
+ };
101
+
102
+ /* body args */
103
+ struct body_args
104
+ {
105
+ VALUE recv;
106
+ ID id;
107
+ int argc;
108
+ VALUE *argv;
109
+ };
110
+
111
+ /* Base class for director exceptions */
112
+ class WXRB_EXPORT_FLAG DirectorException : public std::exception
113
+ {
114
+ protected:
115
+ VALUE swig_error;
116
+ std::string swig_msg;
117
+ protected:
118
+ DirectorException(VALUE error) : swig_error(error) {}
119
+
120
+ DirectorException(VALUE error, const char *hdr, const char *msg ="");
121
+
122
+ void setup_error(VALUE error);
123
+
124
+ public:
125
+ virtual ~DirectorException() throw();
126
+
127
+ VALUE getType() const
128
+ {
129
+ return CLASS_OF(swig_error);
130
+ }
131
+
132
+ VALUE getError() const
133
+ {
134
+ return swig_error;
135
+ }
136
+
137
+ /* Deprecated, use what() instead */
138
+ const std::string& getMessage() const
139
+ {
140
+ return swig_msg;
141
+ }
142
+
143
+ const char *what() const throw()
144
+ {
145
+ return swig_msg.c_str();
146
+ }
147
+ };
148
+
149
+ DirectorException::DirectorException(VALUE error, const char *hdr, const char *msg)
150
+ : swig_msg(hdr)
151
+ {
152
+ if (msg[0])
153
+ {
154
+ swig_msg += " ";
155
+ swig_msg += msg;
156
+ }
157
+ this->setup_error(error);
158
+ }
159
+
160
+ DirectorException::~DirectorException() throw()
161
+ {}
162
+
163
+
164
+ void DirectorException::setup_error(VALUE error)
165
+ {
166
+ if (swig_msg.size())
167
+ {
168
+ VALUE str = rb_str_new(swig_msg.data(), swig_msg.size());
169
+ swig_error = rb_exc_new3(error, str);
170
+ }
171
+ else
172
+ {
173
+ swig_error = error;
174
+ }
175
+ }
176
+
177
+ /* Type mismatch in the return value from a Ruby method call */
178
+ class WXRB_EXPORT_FLAG DirectorTypeMismatchException : public DirectorException
179
+ {
180
+ public:
181
+ DirectorTypeMismatchException(VALUE error, const char *msg="")
182
+ : DirectorException(error, "SWIG director type mismatch", msg)
183
+ {}
184
+
185
+ DirectorTypeMismatchException(const char *msg="")
186
+ : DirectorException(rb_eTypeError, "SWIG director type mismatch", msg)
187
+ {}
188
+
189
+ DirectorTypeMismatchException(VALUE self, const char *method, VALUE error, const char *msg="");
190
+
191
+ static inline void raise(VALUE error, const char *msg)
192
+ {
193
+ throw DirectorTypeMismatchException(error, msg);
194
+ }
195
+
196
+ static inline void raise(const char *msg)
197
+ {
198
+ throw DirectorTypeMismatchException(msg);
199
+ }
200
+
201
+ static inline void raise(VALUE self, const char* method, VALUE error, const char *msg)
202
+ {
203
+ throw DirectorTypeMismatchException(self, method, error, msg);
204
+ }
205
+ };
206
+
207
+
208
+ DirectorTypeMismatchException::DirectorTypeMismatchException(VALUE self, const char *method, VALUE error, const char *msg)
209
+ : DirectorException(Qnil)
210
+ {
211
+ this->swig_msg = "SWIG director type mismatch ";
212
+ this->swig_msg += msg;
213
+ this->swig_msg += " returned from ";
214
+ this->swig_msg += rb_class2name(CLASS_OF(self));
215
+ this->swig_msg += "#";
216
+ this->swig_msg += method;
217
+ this->setup_error(rb_eTypeError);
218
+ }
219
+
220
+ /* Any Ruby exception that occurs during a director method call */
221
+ class WXRB_EXPORT_FLAG DirectorMethodException : public DirectorException
222
+ {
223
+ public:
224
+ DirectorMethodException(VALUE error)
225
+ : DirectorException(error)
226
+ {}
227
+
228
+ DirectorMethodException(const char *msg = "")
229
+ : DirectorException(rb_eRuntimeError, "SWIG director method error.", msg)
230
+ {}
231
+
232
+ static void raise(VALUE error)
233
+ {
234
+ throw DirectorMethodException(error);
235
+ }
236
+ };
237
+
238
+ /* Attempted to call a pure virtual method via a director method */
239
+ class WXRB_EXPORT_FLAG DirectorPureVirtualException : public DirectorException
240
+ {
241
+ public:
242
+ DirectorPureVirtualException(const char *msg = "")
243
+ : DirectorException(rb_eRuntimeError, "SWIG director pure virtual method called", msg)
244
+ {}
245
+
246
+ static void raise(const char *msg)
247
+ {
248
+ throw DirectorPureVirtualException(msg);
249
+ }
250
+ };
251
+
252
+ /* Simple thread abstraction for pthreads on win32 */
253
+ #ifdef __THREAD__
254
+ # define __PTHREAD__
255
+ # if defined(_WIN32) || defined(__WIN32__)
256
+ # define pthread_mutex_lock EnterCriticalSection
257
+ # define pthread_mutex_unlock LeaveCriticalSection
258
+ # define pthread_mutex_t CRITICAL_SECTION
259
+ # define SWIG_MUTEX_INIT(var) var
260
+ # else
261
+ # include <pthread.h>
262
+ # define SWIG_MUTEX_INIT(var) var = PTHREAD_MUTEX_INITIALIZER
263
+ # endif
264
+ #endif
265
+
266
+ #ifdef __PTHREAD__
267
+ struct Guard
268
+ {
269
+ pthread_mutex_t *_mutex;
270
+
271
+ Guard(pthread_mutex_t &mutex) : _mutex(&mutex)
272
+ {
273
+ pthread_mutex_lock(_mutex);
274
+ }
275
+
276
+ ~Guard()
277
+ {
278
+ pthread_mutex_unlock(_mutex);
279
+ }
280
+ };
281
+ # define SWIG_GUARD(mutex) Guard _guard(mutex)
282
+ #else
283
+ # define SWIG_GUARD(mutex)
284
+ #endif
285
+
286
+ /* director base class */
287
+ class WXRB_EXPORT_FLAG Director
288
+ {
289
+ private:
290
+ /* pointer to the wrapped Ruby object */
291
+ VALUE swig_self;
292
+ /* flag indicating whether the object is owned by Ruby or c++ */
293
+ mutable bool swig_disown_flag;
294
+
295
+ public:
296
+ /* wrap a Ruby object. */
297
+ Director(VALUE self);
298
+
299
+ /* discard our reference at destruction */
300
+ virtual ~Director();
301
+
302
+ /* return a pointer to the wrapped Ruby object */
303
+ VALUE swig_get_self() const
304
+ {
305
+ return swig_self;
306
+ }
307
+
308
+ /* acquire ownership of the wrapped Ruby object (the sense of "disown" is from Ruby) */
309
+ void swig_disown() const
310
+ {
311
+ if (!swig_disown_flag)
312
+ {
313
+ swig_disown_flag = true;
314
+ }
315
+ }
316
+
317
+ /* ownership management */
318
+ private:
319
+ typedef std::map<void *, GCItem_var> swig_ownership_map;
320
+ mutable swig_ownership_map swig_owner;
321
+ #ifdef __PTHREAD__
322
+ static pthread_mutex_t swig_mutex_own;
323
+ #endif
324
+
325
+ public:
326
+ template <typename Type>
327
+ void swig_acquire_ownership_array(Type *vptr) const
328
+ {
329
+ if (vptr)
330
+ {
331
+ SWIG_GUARD(swig_mutex_own);
332
+ swig_owner[vptr] = new GCArray_T<Type>(vptr);
333
+ }
334
+ }
335
+
336
+ template <typename Type>
337
+ void swig_acquire_ownership(Type *vptr) const
338
+ {
339
+ if (vptr)
340
+ {
341
+ SWIG_GUARD(swig_mutex_own);
342
+ swig_owner[vptr] = new GCItem_T<Type>(vptr);
343
+ }
344
+ }
345
+
346
+ void swig_acquire_ownership_obj(void *vptr, swig_ruby_owntype own) const;
347
+
348
+ swig_ruby_owntype swig_release_ownership(void *vptr) const;
349
+ };
350
+
351
+ Director::Director(VALUE self)
352
+ : swig_self(self), swig_disown_flag(false)
353
+ {}
354
+
355
+ /* discard our reference at destruction */
356
+ Director::~Director()
357
+ {}
358
+
359
+ void Director::swig_acquire_ownership_obj(void *vptr, swig_ruby_owntype own) const
360
+ {
361
+ if (vptr && own.datafree)
362
+ {
363
+ SWIG_GUARD(swig_mutex_own);
364
+ swig_owner[vptr] = new GCItem_Object(own);
365
+ }
366
+ }
367
+
368
+ swig_ruby_owntype Director::swig_release_ownership(void *vptr) const
369
+ {
370
+ swig_ruby_owntype own = {0, 0};
371
+ if (vptr)
372
+ {
373
+ SWIG_GUARD(swig_mutex_own);
374
+ swig_ownership_map::iterator iter = swig_owner.find(vptr);
375
+ if (iter != swig_owner.end())
376
+ {
377
+ own.datafree = iter->second->get_own().datafree;
378
+ swig_owner.erase(iter);
379
+ }
380
+ }
381
+ return own;
382
+ }
383
+
384
+ }