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.
- checksums.yaml +4 -4
- data/.yardopts +1 -0
- data/ext/wxruby3/include/wxRubyApp.h +338 -0
- data/ext/wxruby3/include/wxruby-Config.h +6 -6
- data/ext/wxruby3/include/wxruby-runtime.h +3 -0
- data/ext/wxruby3/swig/common.i +22 -0
- data/ext/wxruby3/swig/custom/director.swg +296 -0
- data/ext/wxruby3/swig/custom/rubyapi.swg +19 -0
- data/ext/wxruby3/swig/custom/rubyerrors.swg +45 -0
- data/ext/wxruby3/swig/custom/rubyhead.swg +192 -0
- data/ext/wxruby3/swig/custom/rubyrun.swg +187 -0
- data/ext/wxruby3/swig/custom/swigrun.swg +363 -0
- data/ext/wxruby3/swig/custom/typemaps/swigtypemaps.swg +173 -0
- data/ext/wxruby3/swig/wx.i +50 -30
- data/lib/wx/aui/aui_tab_ctrl.rb +18 -0
- data/lib/wx/aui/auinotebook.rb +6 -2
- data/lib/wx/aui/require.rb +1 -0
- data/lib/wx/core/app.rb +2 -2
- data/lib/wx/core/collapsible_pane.rb +1 -1
- data/lib/wx/core/const.rb +83 -0
- data/lib/wx/core/controlwithitems.rb +8 -6
- data/lib/wx/core/menu.rb +10 -0
- data/lib/wx/core/notebook.rb +6 -2
- data/lib/wx/core/sizer.rb +11 -0
- data/lib/wx/core/task_bar_button.rb +19 -0
- data/lib/wx/core/textctrl.rb +11 -1
- data/lib/wx/core/{treectrl.rb → tree_ctrl.rb} +31 -12
- data/lib/wx/core/window.rb +10 -0
- data/lib/wx/doc/app.rb +48 -38
- data/lib/wx/doc/art_locator.rb +47 -43
- data/lib/wx/doc/aui/auimanager.rb +16 -8
- data/lib/wx/doc/aui/auinotebook.rb +20 -5
- data/lib/wx/doc/clipboard.rb +11 -7
- data/lib/wx/doc/colour_dialog.rb +14 -10
- data/lib/wx/doc/const.rb +66 -66
- data/lib/wx/doc/controlwithitems.rb +17 -7
- data/lib/wx/doc/data_object.rb +2 -2
- data/lib/wx/doc/event.rb +0 -6
- data/lib/wx/doc/evthandler.rb +113 -108
- data/lib/wx/doc/font.rb +1 -0
- data/lib/wx/doc/functions.rb +9 -9
- data/lib/wx/doc/gc_dc.rb +6 -1
- data/lib/wx/doc/graphics_context.rb +1 -0
- data/lib/wx/doc/grid/grid.rb +22 -1
- data/lib/wx/doc/help_controller.rb +11 -7
- data/lib/wx/doc/html/html_help_controller.rb +12 -4
- data/lib/wx/doc/list_ctrl.rb +33 -29
- data/lib/wx/doc/menu.rb +20 -0
- data/lib/wx/doc/notebook.rb +21 -0
- data/lib/wx/doc/pg/events.rb +13 -9
- data/lib/wx/doc/pg/pg_property.rb +18 -0
- data/lib/wx/doc/progress_dialog.rb +36 -32
- data/lib/wx/doc/prt/page_setup_dialog.rb +20 -12
- data/lib/wx/doc/prt/print_data.rb +13 -5
- data/lib/wx/doc/prt/print_dialog.rb +31 -23
- data/lib/wx/doc/prt/printer.rb +20 -12
- data/lib/wx/doc/radio_box.rb +19 -15
- data/lib/wx/doc/rbn/ribbon_bar.rb +13 -5
- data/lib/wx/doc/rbn/ribbon_button_bar.rb +13 -5
- data/lib/wx/doc/rbn/ribbon_gallery.rb +13 -5
- data/lib/wx/doc/rbn/ribbon_tool_bar.rb +13 -5
- data/lib/wx/doc/region_iterator.rb +32 -28
- data/lib/wx/doc/rtc/rich_text_composite_object.rb +24 -0
- data/lib/wx/doc/rtc/rich_text_ctrl.rb +24 -0
- data/lib/wx/doc/rtc/rich_text_paragraph.rb +24 -0
- data/lib/wx/doc/rtc/richtext_buffer.rb +27 -19
- data/lib/wx/doc/rtc/richtext_printing.rb +17 -9
- data/lib/wx/doc/rtc/richtext_style_sheet.rb +17 -9
- data/lib/wx/doc/sizer.rb +20 -0
- data/lib/wx/doc/stc/styled_text_ctrl.rb +24 -0
- data/lib/wx/doc/stream.rb +39 -35
- data/lib/wx/doc/system_settings.rb +30 -26
- data/lib/wx/doc/text_validator.rb +12 -8
- data/lib/wx/doc/textctrl.rb +16 -0
- data/lib/wx/doc/tree_ctrl.rb +95 -0
- data/lib/wx/doc/treebook.rb +9 -5
- data/lib/wx/doc/v_list_box.rb +9 -5
- data/lib/wx/doc/variant.rb +164 -160
- data/lib/wx/doc/window.rb +57 -42
- data/lib/wx/doc/window_disabler.rb +10 -6
- data/lib/wx/grid/grid.rb +27 -4
- data/lib/wx/keyword_defs.rb +43 -6
- data/lib/wx/pg/pg_property.rb +22 -0
- data/lib/wx/rtc/require.rb +3 -0
- data/lib/wx/rtc/rich_text_composite_object.rb +25 -0
- data/lib/wx/rtc/rich_text_ctrl.rb +25 -0
- data/lib/wx/rtc/rich_text_paragraph.rb +25 -0
- data/lib/wx/stc/require.rb +1 -0
- data/lib/wx/stc/styled_text_ctrl.rb +25 -0
- data/lib/wx/version.rb +1 -1
- data/rakelib/lib/config/linux.rb +0 -3
- data/rakelib/lib/config/macosx.rb +1 -1
- data/rakelib/lib/config/mingw.rb +1 -1
- data/rakelib/lib/config/unixish.rb +1 -1
- data/rakelib/lib/config.rb +14 -4
- data/rakelib/lib/core/include/funcall.inc +33 -14
- data/rakelib/lib/core/include/swigdirector.inc +384 -0
- data/rakelib/lib/core/include/swigrubyerrors.inc +161 -0
- data/{ext/wxruby3/swig/custom/swig4/rubyrun.swg → rakelib/lib/core/include/swigrubyrun.inc} +245 -120
- data/rakelib/lib/core/include/swigrun.inc +700 -0
- data/rakelib/lib/core/package.rb +19 -9
- data/rakelib/lib/core/parameter.rb +3 -0
- data/rakelib/lib/core/spec.rb +6 -1
- data/rakelib/lib/director/accelerator.rb +3 -4
- data/rakelib/lib/director/accessible.rb +47 -0
- data/rakelib/lib/director/animation.rb +1 -1
- data/rakelib/lib/director/animation_ctrl.rb +20 -0
- data/rakelib/lib/director/app.rb +15 -304
- data/rakelib/lib/director/app_traits.rb +10 -12
- data/rakelib/lib/director/art_provider.rb +1 -1
- data/rakelib/lib/director/ctrl_with_items.rb +17 -5
- data/rakelib/lib/director/data_format.rb +1 -1
- data/rakelib/lib/director/data_object_simple_base.rb +1 -2
- data/rakelib/lib/director/derived_dc.rb +1 -1
- data/rakelib/lib/director/dialog.rb +6 -0
- data/rakelib/lib/director/dialup_event.rb +44 -0
- data/rakelib/lib/director/dialup_manager.rb +45 -0
- data/rakelib/lib/director/drag_image.rb +2 -3
- data/rakelib/lib/director/event.rb +22 -4
- data/rakelib/lib/director/file_ctrl.rb +35 -0
- data/rakelib/lib/director/file_ctrl_event.rb +26 -0
- data/rakelib/lib/director/frame.rb +1 -3
- data/rakelib/lib/director/gdicommon.rb +27 -11
- data/rakelib/lib/director/graphics_context.rb +2 -4
- data/rakelib/lib/director/grid_cell_editor.rb +6 -6
- data/rakelib/lib/director/grid_ctrl.rb +34 -3
- data/rakelib/lib/director/help_controller.rb +1 -1
- data/rakelib/lib/director/icon.rb +5 -2
- data/rakelib/lib/director/list_ctrl.rb +5 -6
- data/rakelib/lib/director/locale.rb +1 -3
- data/rakelib/lib/director/log.rb +1 -4
- data/rakelib/lib/director/media_ctrl.rb +54 -0
- data/rakelib/lib/director/menu.rb +16 -1
- data/rakelib/lib/director/menu_item.rb +2 -2
- data/rakelib/lib/director/pgarray_editor_dialog.rb +0 -6
- data/rakelib/lib/director/pgeditor.rb +2 -2
- data/rakelib/lib/director/pgproperties.rb +3 -3
- data/rakelib/lib/director/pgproperty.rb +24 -1
- data/rakelib/lib/director/property_grid_interface.rb +5 -10
- data/rakelib/lib/director/richtext_buffer.rb +1 -1
- data/rakelib/lib/director/richtext_composite_object.rb +25 -0
- data/rakelib/lib/director/richtext_ctrl.rb +15 -5
- data/rakelib/lib/director/richtext_formatting_dialog.rb +7 -5
- data/rakelib/lib/director/richtext_paragraph_layout_box.rb +9 -7
- data/rakelib/lib/director/sash_event.rb +42 -0
- data/rakelib/lib/director/sizer.rb +79 -1
- data/rakelib/lib/director/sizer_item.rb +22 -0
- data/rakelib/lib/director/static_box.rb +4 -5
- data/rakelib/lib/director/styled_text_ctrl.rb +12 -0
- data/rakelib/lib/director/task_bar_button.rb +30 -0
- data/rakelib/lib/director/task_bar_icon.rb +6 -14
- data/rakelib/lib/director/textctrl.rb +12 -1
- data/rakelib/lib/director/tool_tip.rb +1 -1
- data/rakelib/lib/director/top_level_window.rb +4 -5
- data/rakelib/lib/director/tree_ctrl.rb +24 -50
- data/rakelib/lib/director/variant.rb +1 -1
- data/rakelib/lib/director/window.rb +24 -5
- data/rakelib/lib/director.rb +4 -4
- data/rakelib/lib/extractor/function.rb +6 -6
- data/rakelib/lib/extractor.rb +34 -5
- data/rakelib/lib/generate/analyzer.rb +8 -3
- data/rakelib/lib/generate/doc/animation_ctrl.yaml +15 -0
- data/rakelib/lib/generate/doc/busy_info.yaml +0 -2
- data/rakelib/lib/generate/doc/clipboard.yaml +0 -2
- data/rakelib/lib/generate/doc/cursor.yaml +0 -2
- data/rakelib/lib/generate/doc/events.yaml +10 -4
- data/rakelib/lib/generate/doc/panel.yaml +7 -0
- data/rakelib/lib/generate/doc/static_box.yaml +8 -0
- data/rakelib/lib/generate/doc/xml_resource.yaml +3 -0
- data/rakelib/lib/generate/doc.rb +89 -16
- data/rakelib/lib/generate/interface.rb +4 -3
- data/rakelib/lib/specs/interfaces.rb +161 -156
- data/rakelib/lib/swig_runner.rb +4 -50
- data/rakelib/lib/typemap/common.rb +54 -10
- data/rakelib/lib/typemap/data_format.rb +1 -1
- data/rakelib/lib/typemap/data_object_data.rb +2 -2
- data/rakelib/lib/typemap/pgprop_arg.rb +7 -2
- data/rakelib/lib/typemap/points_list.rb +5 -7
- data/rakelib/lib/util/string.rb +10 -8
- data/rakelib/yard/templates/default/fulldoc/html/css/wxruby3.css +74 -2
- data/rakelib/yard/templates/default/fulldoc/html/full_list.erb +38 -0
- data/rakelib/yard/templates/default/fulldoc/html/setup.rb +39 -0
- data/rakelib/yard/templates/default/tags/html/wxrb_require.erb +10 -0
- data/rakelib/yard/templates/default/tags/setup.rb +16 -0
- data/rakelib/yard/yard-custom-templates.rb +3 -0
- data/samples/text/richtext.rb +0 -30
- data/samples/treectrl/treectrl.rb +1 -1
- data/tests/media/beep_lo.wav +0 -0
- data/tests/test_app_exit_exception.rb +36 -0
- data/tests/test_app_init_exception.rb +20 -0
- data/tests/test_book_controls.rb +29 -0
- data/tests/test_exceptions.rb +41 -0
- data/tests/test_list_ctrl.rb +1 -1
- data/tests/test_media_ctrl.rb +38 -0
- data/tests/test_menu.rb +69 -0
- data/tests/test_pg.rb +27 -0
- data/tests/test_richtext.rb +45 -0
- data/tests/test_sizer.rb +59 -0
- data/tests/test_std_controls.rb +78 -1
- data/tests/test_styled_text_ctrl.rb +46 -0
- data/tests/test_tree_ctrl.rb +138 -0
- data/tests/test_window.rb +12 -0
- data/tests/testapp_noframe.rb +1 -1
- metadata +54 -5
- 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
|
data/lib/wx/stc/require.rb
CHANGED
|
@@ -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
data/rakelib/lib/config/linux.rb
CHANGED
|
@@ -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?('
|
|
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
|
data/rakelib/lib/config/mingw.rb
CHANGED
|
@@ -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?('
|
|
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 }
|
data/rakelib/lib/config.rb
CHANGED
|
@@ -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
|
-
|
|
619
|
-
|
|
620
|
-
|
|
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
|
|
37
|
+
WXRuby_RBFuncall (ID fnid, bool throw_on_ex=true)
|
|
18
38
|
: fn_id_ (fnid),
|
|
19
|
-
|
|
39
|
+
throw_on_ex_ (throw_on_ex),
|
|
20
40
|
ex_caught_ (false)
|
|
21
41
|
{
|
|
22
42
|
}
|
|
23
|
-
WXRuby_RBFuncall (const char* fn, bool
|
|
43
|
+
WXRuby_RBFuncall (const char* fn, bool throw_on_ex=true)
|
|
24
44
|
: fn_id_ (rb_intern (fn)),
|
|
25
|
-
|
|
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
|
|
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->
|
|
91
|
+
if (this->throw_on_ex_)
|
|
69
92
|
{
|
|
70
93
|
// handle exception
|
|
71
94
|
VALUE rexc = this->get_exception ();
|
|
72
|
-
|
|
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
|
-
:
|
|
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
|
-
:
|
|
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
|
|
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
|
+
}
|