wxruby3 1.7.0 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/INSTALL.md +27 -2
- data/README.md +15 -15
- data/ext/wxruby3/include/wxRubyApp.h +145 -46
- data/ext/wxruby3/include/wxruby-ComboPopup.h +25 -8
- data/ext/wxruby3/include/wxruby-GCTracking.h +262 -0
- data/ext/wxruby3/include/wxruby-MBConv.h +190 -0
- data/ext/wxruby3/include/wxruby-SharedEventHandler.h +183 -0
- data/ext/wxruby3/include/wxruby-SharedPtr.h +104 -0
- data/ext/wxruby3/include/wxruby-runtime.h +29 -0
- data/ext/wxruby3/swig/custom/rubytracking.swg +8 -22
- data/ext/wxruby3/swig/custom/wx_ruby_shared_ptr.i +434 -0
- data/ext/wxruby3/swig/custom/wx_shared_ptr.i +431 -0
- data/ext/wxruby3/swig/mark_free_impl.i +7 -132
- data/ext/wxruby3/swig/memory_management.i +8 -44
- data/ext/wxruby3/swig/wx.i +46 -73
- data/lib/wx/core/const.rb +0 -1
- data/lib/wx/core/context_help.rb +17 -0
- data/lib/wx/core/cursor.rb +1 -0
- data/lib/wx/core/helpcontrollerhelpprovider.rb +10 -2
- data/lib/wx/core/mbconv.rb +11 -0
- data/lib/wx/core/media_ctrl.rb +31 -0
- data/lib/wx/core/top_level_window.rb +7 -0
- data/lib/wx/core.rb +6 -0
- data/lib/wx/doc/art_provider.rb +17 -0
- data/lib/wx/doc/context_help.rb +42 -0
- data/lib/wx/doc/core.rb +0 -5
- data/lib/wx/doc/functions.rb +10 -0
- data/lib/wx/doc/gen/affine_matrix2d.rb +2 -0
- data/lib/wx/doc/gen/art_provider.rb +12 -0
- data/lib/wx/doc/gen/aui/aui_notebook_event.rb +15 -15
- data/lib/wx/doc/gen/aui/aui_pane_info.rb +8 -8
- data/lib/wx/doc/gen/aui/aui_tool_bar_event.rb +5 -5
- data/lib/wx/doc/gen/book_ctrl_base.rb +2 -1
- data/lib/wx/doc/gen/calendar_event.rb +5 -5
- data/lib/wx/doc/gen/choicebook.rb +2 -2
- data/lib/wx/doc/gen/collapsible_pane.rb +1 -1
- data/lib/wx/doc/gen/colour_dialog.rb +1 -1
- data/lib/wx/doc/gen/colour_picker_event.rb +3 -3
- data/lib/wx/doc/gen/context_help_button.rb +0 -53
- data/lib/wx/doc/gen/core.rb +4 -4
- data/lib/wx/doc/gen/credential_entry_dialog.rb +2 -2
- data/lib/wx/doc/gen/date_event.rb +2 -2
- data/lib/wx/doc/gen/dial_up_event.rb +2 -2
- data/lib/wx/doc/gen/dir_filter_list_ctrl.rb +2 -2
- data/lib/wx/doc/gen/event.rb +58 -58
- data/lib/wx/doc/gen/ext_help_controller.rb +62 -16
- data/lib/wx/doc/gen/file_ctrl.rb +4 -4
- data/lib/wx/doc/gen/file_dir_picker_event.rb +2 -2
- data/lib/wx/doc/gen/file_system.rb +1 -1
- data/lib/wx/doc/gen/find_dialog_event.rb +5 -5
- data/lib/wx/doc/gen/font_picker_event.rb +1 -1
- data/lib/wx/doc/gen/grid/grid_ctrl.rb +67 -32
- data/lib/wx/doc/gen/header_ctrl_event.rb +13 -13
- data/lib/wx/doc/gen/help_controller.rb +45 -2
- data/lib/wx/doc/gen/html/html_help_controller.rb +74 -32
- data/lib/wx/doc/gen/html/html_help_window.rb +3 -3
- data/lib/wx/doc/gen/html/html_window.rb +4 -4
- data/lib/wx/doc/gen/hyperlink_ctrl.rb +1 -1
- data/lib/wx/doc/gen/list_ctrl.rb +22 -22
- data/lib/wx/doc/gen/listbook.rb +2 -2
- data/lib/wx/doc/gen/mb_conv.rb +10 -0
- data/lib/wx/doc/gen/media_event.rb +6 -6
- data/lib/wx/doc/gen/notebook.rb +2 -2
- data/lib/wx/doc/gen/pg/pg_validation_info.rb +14 -14
- data/lib/wx/doc/gen/pg/property_grid_interface.rb +2 -2
- data/lib/wx/doc/gen/rbn/ribbon_art_provider.rb +19 -9
- data/lib/wx/doc/gen/rbn/ribbon_button_bar.rb +2 -2
- data/lib/wx/doc/gen/rbn/ribbon_gallery.rb +3 -3
- data/lib/wx/doc/gen/rbn/ribbon_panel.rb +2 -2
- data/lib/wx/doc/gen/rbn/ribbon_tool_bar.rb +2 -2
- data/lib/wx/doc/gen/rt/event_list.rb +17 -0
- data/lib/wx/doc/gen/rt/shared_evt_handler.rb +14 -0
- data/lib/wx/doc/gen/rt/thread_event.rb +71 -0
- data/lib/wx/doc/gen/rtc/rich_text_ctrl.rb +19 -19
- data/lib/wx/doc/gen/sash_event.rb +2 -2
- data/lib/wx/doc/gen/sash_layout_window.rb +2 -2
- data/lib/wx/doc/gen/search_ctrl.rb +2 -2
- data/lib/wx/doc/gen/spin_ctrl.rb +2 -2
- data/lib/wx/doc/gen/splitter_window.rb +6 -6
- data/lib/wx/doc/gen/stc/styled_text_event.rb +34 -34
- data/lib/wx/doc/gen/task_bar_icon_event.rb +10 -10
- data/lib/wx/doc/gen/text_ctrl.rb +4 -4
- data/lib/wx/doc/gen/toggle_button.rb +1 -1
- data/lib/wx/doc/gen/toolbook.rb +2 -2
- data/lib/wx/doc/gen/top_level_window.rb +19 -0
- data/lib/wx/doc/gen/tree_ctrl.rb +21 -21
- data/lib/wx/doc/gen/treebook.rb +4 -4
- data/lib/wx/doc/gen/utils.rb +2 -2
- data/lib/wx/doc/gen/web/event_list.rb +95 -0
- data/lib/wx/doc/gen/web/web_view.rb +1136 -0
- data/lib/wx/doc/gen/web/web_view_event.rb +210 -0
- data/lib/wx/doc/gen/web/web_view_handler.rb +318 -0
- data/lib/wx/doc/gen/window.rb +1 -1
- data/lib/wx/doc/gen/wizard_event.rb +7 -7
- data/lib/wx/doc/html/html_help_controller.rb +23 -1
- data/lib/wx/doc/mbconv.rb +108 -0
- data/lib/wx/doc/rt/shared_event_handler.rb +49 -0
- data/lib/wx/doc/rt/thread_event.rb +28 -0
- data/lib/wx/doc/webview.rb +40 -0
- data/lib/wx/helpers.rb +1 -1
- data/lib/wx/html/htmlhelpcontroller.rb +10 -0
- data/lib/wx/keyword_defs.rb +11 -0
- data/lib/wx/rt/events/evt_list.rb +8 -0
- data/lib/wx/rt/require.rb +8 -0
- data/lib/wx/rt/thread_event.rb +14 -0
- data/lib/wx/rt.rb +16 -0
- data/lib/wx/version.rb +1 -1
- data/lib/wx/web/events/evt_list.rb +74 -0
- data/lib/wx/web/require.rb +8 -0
- data/lib/wx/web/webview.rb +106 -0
- data/lib/wx/web.rb +17 -0
- data/lib/wx/wxruby/cmd/setup.rb +15 -0
- data/lib/wx.rb +2 -0
- data/rakelib/configure.rb +24 -0
- data/rakelib/gem.rb +3 -2
- data/rakelib/install.rb +54 -27
- data/rakelib/lib/config/macosx.rb +7 -5
- data/rakelib/lib/config/mingw.rb +66 -5
- data/rakelib/lib/config/pkgman/mingw.rb +1 -1
- data/rakelib/lib/config/unixish.rb +4 -2
- data/rakelib/lib/config.rb +37 -3
- data/rakelib/lib/core/include/client_data.inc +38 -17
- data/rakelib/lib/core/include/funcall.inc +1 -1
- data/rakelib/lib/core/include/swigdirector.inc +3 -3
- data/rakelib/lib/core/include/swigrubyrun.inc +14 -26
- data/rakelib/lib/core/package.rb +0 -2
- data/rakelib/lib/director/app.rb +1 -8
- data/rakelib/lib/director/art_provider.rb +7 -3
- data/rakelib/lib/director/comboctrl.rb +0 -7
- data/rakelib/lib/director/context_help_button.rb +35 -2
- data/rakelib/lib/director/event_handler.rb +32 -28
- data/rakelib/lib/director/fs_file.rb +15 -10
- data/rakelib/lib/director/functions.rb +8 -0
- data/rakelib/lib/director/grid_cell_attr.rb +1 -3
- data/rakelib/lib/director/grid_cell_editor.rb +14 -12
- data/rakelib/lib/director/grid_cell_renderer.rb +11 -8
- data/rakelib/lib/director/grid_ctrl.rb +140 -121
- data/rakelib/lib/director/help_controller.rb +70 -2
- data/rakelib/lib/director/mb_conv.rb +30 -0
- data/rakelib/lib/director/menu.rb +92 -42
- data/rakelib/lib/director/menu_bar.rb +84 -45
- data/rakelib/lib/director/menu_item.rb +2 -2
- data/rakelib/lib/director/persistence_manager.rb +3 -2
- data/rakelib/lib/director/preview_frame.rb +2 -2
- data/rakelib/lib/director/richtext_buffer.rb +5 -2
- data/rakelib/lib/director/shared_evt_handler.rb +30 -0
- data/rakelib/lib/director/sizer.rb +8 -17
- data/rakelib/lib/director/sizer_item.rb +3 -4
- data/rakelib/lib/director/task_bar_icon.rb +7 -7
- data/rakelib/lib/director/thread_event.rb +33 -0
- data/rakelib/lib/director/validator.rb +3 -1
- data/rakelib/lib/director/variant.rb +16 -12
- data/rakelib/lib/director/webview.rb +166 -0
- data/rakelib/lib/director/webview_event.rb +37 -0
- data/rakelib/lib/director/webview_handler.rb +63 -0
- data/rakelib/lib/generate/doc/thread_event.yaml +20 -0
- data/rakelib/lib/generate/doc/web_view.yaml +135 -0
- data/rakelib/lib/generate/doc/web_view_event.yaml +38 -0
- data/rakelib/lib/generate/doc/web_view_handler.yaml +58 -0
- data/rakelib/lib/specs/interfaces.rb +12 -0
- data/rakelib/lib/typemap/common.rb +34 -1
- data/rakelib/lib/typemap/mb_conv.rb +58 -0
- data/rakelib/prepost.rake +23 -31
- data/rakelib/prepost.rb +20 -0
- data/samples/event/threaded.rb +295 -42
- data/samples/event/tn_threaded.png +0 -0
- data/samples/help/doc/back.gif +0 -0
- data/samples/help/doc/contents.gif +0 -0
- data/samples/help/doc/cshelp.txt +9 -0
- data/samples/help/doc/doc.chm +0 -0
- data/samples/help/doc/doc.cnt +8 -0
- data/samples/help/doc/doc.h +7 -0
- data/samples/help/doc/doc.hhc +40 -0
- data/samples/help/doc/doc.hhk +31 -0
- data/samples/help/doc/doc.hhp +33 -0
- data/samples/help/doc/doc.hpj +21 -0
- data/samples/help/doc/doc.htm +27 -0
- data/samples/help/doc/doc1.htm +24 -0
- data/samples/help/doc/doc2.htm +12 -0
- data/samples/help/doc/doc3.htm +12 -0
- data/samples/help/doc/doc4.htm +12 -0
- data/samples/help/doc/doc5.htm +14 -0
- data/samples/help/doc/forward.gif +0 -0
- data/samples/help/doc/up.gif +0 -0
- data/samples/help/doc.chm +0 -0
- data/samples/help/doc.chw +0 -0
- data/samples/help/doc.zip +0 -0
- data/samples/help/help.rb +352 -0
- data/samples/help/tn_help.png +0 -0
- data/samples/webview/handler_advanced.html +55 -0
- data/samples/webview/tn_webview.png +0 -0
- data/samples/webview/webview.rb +1264 -0
- data/tests/assets/handler_advanced.html +55 -0
- data/tests/assets/test.css +1 -0
- data/tests/assets/test.html +9 -0
- data/tests/assets/test.zip +0 -0
- data/tests/lib/text_entry_tests.rb +2 -2
- data/tests/lib/wxapp_runner.rb +40 -0
- data/tests/lib/wxframe_runner.rb +17 -2
- data/tests/test_art.rb +8 -8
- data/tests/test_clipboard.rb +4 -4
- data/tests/test_config.rb +6 -6
- data/tests/test_exceptions.rb +8 -6
- data/tests/test_ext_controls.rb +3 -3
- data/tests/test_file_dialog.rb +5 -5
- data/tests/test_font.rb +7 -7
- data/tests/test_grid_ctrl.rb +133 -0
- data/tests/test_help.rb +88 -0
- data/tests/test_intl.rb +1 -1
- data/tests/test_media_ctrl.rb +14 -6
- data/tests/test_menu.rb +94 -86
- data/tests/test_persistence.rb +1 -1
- data/tests/test_proof_check.rb +5 -5
- data/tests/test_propgrid.rb +1 -1
- data/tests/test_shared_event_handler.rb +141 -0
- data/tests/test_std_controls.rb +5 -5
- data/tests/test_webview.rb +492 -0
- data/tests/test_window.rb +3 -3
- metadata +78 -2
|
@@ -13,23 +13,47 @@ module WXRuby3
|
|
|
13
13
|
class Menu < Director
|
|
14
14
|
|
|
15
15
|
def setup
|
|
16
|
-
spec.
|
|
16
|
+
spec.gc_as_marked
|
|
17
17
|
spec.ignore 'wxMenu::wxMenu(long)'
|
|
18
18
|
spec.no_proxy 'wxMenu' # do not support derived wxMenu classes
|
|
19
19
|
spec.add_header_code <<~__HEREDOC
|
|
20
|
+
static void GC_mark_wxMenu(const TGCTrackingValueMap& values);
|
|
21
|
+
|
|
20
22
|
// Custom subclass implementation.
|
|
21
23
|
// Provides proper support for Ruby GC in destructor.
|
|
22
24
|
class wxRubyMenu : public wxMenu
|
|
23
25
|
{
|
|
24
26
|
public:
|
|
27
|
+
static const std::string TRACKING_CAT;
|
|
28
|
+
|
|
25
29
|
wxRubyMenu() : wxMenu() {}
|
|
26
30
|
wxRubyMenu(const wxString &title, long style=0) : wxMenu(title, style) {}
|
|
27
31
|
virtual ~wxRubyMenu()
|
|
28
32
|
{
|
|
29
|
-
|
|
30
|
-
|
|
33
|
+
wxRuby_ReleaseEvtHandlerProcs(this);
|
|
34
|
+
wxruby_unregister();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
void wxruby_register(VALUE rb_menu)
|
|
38
|
+
{
|
|
39
|
+
if (!is_registered_)
|
|
40
|
+
{
|
|
41
|
+
wxRuby_RegisterTrackingCategory(TRACKING_CAT, GC_mark_wxMenu, true);
|
|
42
|
+
is_registered_ = true;
|
|
43
|
+
}
|
|
44
|
+
if (RB_NIL_P(wxRuby_FindCategoryValue(TRACKING_CAT, this)))
|
|
45
|
+
wxRuby_RegisterCategoryValue(TRACKING_CAT, this, rb_menu);
|
|
46
|
+
}
|
|
47
|
+
private:
|
|
48
|
+
static bool is_registered_;
|
|
49
|
+
void wxruby_unregister()
|
|
50
|
+
{
|
|
51
|
+
wxRuby_UnregisterCategoryValue(TRACKING_CAT, this);
|
|
31
52
|
}
|
|
32
53
|
};
|
|
54
|
+
|
|
55
|
+
const std::string wxRubyMenu::TRACKING_CAT = { "WXRUBY_MENU" };
|
|
56
|
+
bool wxRubyMenu::is_registered_ {};
|
|
33
57
|
__HEREDOC
|
|
34
58
|
# make Ruby director and wrappers use custom implementation
|
|
35
59
|
spec.use_class_implementation('wxMenu', 'wxRubyMenu')
|
|
@@ -63,8 +87,7 @@ module WXRuby3
|
|
|
63
87
|
spec.map 'wxMenu **' => 'Wx::Menu' do
|
|
64
88
|
map_in ignore: true, temp: 'wxMenu *tmp', code: '$1 = &tmp;'
|
|
65
89
|
map_argout code: <<~__CODE
|
|
66
|
-
|
|
67
|
-
$result = SWIG_Ruby_AppendOutput($result, SWIG_NewPointerObj(ptr, SWIGTYPE_p_wxMenu, 0));
|
|
90
|
+
$result = SWIG_Ruby_AppendOutput($result, wxRuby_WrapWxMenuInRuby(tmp$argnum));
|
|
68
91
|
__CODE
|
|
69
92
|
end
|
|
70
93
|
# for FindChildItem
|
|
@@ -75,56 +98,83 @@ module WXRuby3
|
|
|
75
98
|
// forward decl
|
|
76
99
|
SWIGINTERN void free_wxMenu(void *self);
|
|
77
100
|
|
|
101
|
+
static void _gc_mark_single_wxMenu(wxMenu *wx_menu, VALUE rb_menu)
|
|
102
|
+
{
|
|
103
|
+
WXRUBY_TRACE_IF(WxRubyTraceMarkMenu, 2)
|
|
104
|
+
WXRUBY_TRACE("> GC_mark_attached_wxMenu : " << wx_menu)
|
|
105
|
+
WXRUBY_TRACE_END
|
|
106
|
+
|
|
107
|
+
rb_gc_mark(rb_menu);
|
|
108
|
+
|
|
109
|
+
wxMenuItemList wx_menu_items = wx_menu->GetMenuItems();
|
|
110
|
+
wxMenuItemList::iterator iter;
|
|
111
|
+
for (iter = wx_menu_items.begin(); iter != wx_menu_items.end(); ++iter)
|
|
112
|
+
{
|
|
113
|
+
wxMenuItem *wx_item = *iter;
|
|
114
|
+
rb_gc_mark(SWIG_RubyInstanceFor(wx_item) );
|
|
115
|
+
wxMenu* wx_sub_menu = wx_item->GetSubMenu();
|
|
116
|
+
if (wx_sub_menu)
|
|
117
|
+
{
|
|
118
|
+
VALUE rb_sub_menu = wxRuby_FindCategoryValue(wxRubyMenu::TRACKING_CAT, wx_sub_menu);
|
|
119
|
+
_gc_mark_single_wxMenu(wx_sub_menu, rb_sub_menu);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
WXRUBY_TRACE_IF(WxRubyTraceMarkMenu, 2)
|
|
124
|
+
WXRUBY_TRACE("< GC_mark_attached_wxMenu : " << wx_menu)
|
|
125
|
+
WXRUBY_TRACE_END
|
|
126
|
+
}
|
|
127
|
+
|
|
78
128
|
// Mark Function
|
|
79
129
|
// Need to protect MenuItems which are included in the Menu, including
|
|
80
130
|
// their associated sub-menus, recursively.
|
|
81
|
-
static void GC_mark_wxMenu(
|
|
131
|
+
static void GC_mark_wxMenu(const TGCTrackingValueMap& values)
|
|
82
132
|
{
|
|
83
133
|
WXRUBY_TRACE_IF(WxRubyTraceMarkMenu, 2)
|
|
84
|
-
WXRUBY_TRACE("> GC_mark_wxMenu
|
|
134
|
+
WXRUBY_TRACE("> GC_mark_wxMenu")
|
|
85
135
|
WXRUBY_TRACE_END
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
if (!RB_NIL_P(rb_menu))
|
|
136
|
+
|
|
137
|
+
for (const auto& ti : values)
|
|
89
138
|
{
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
if (RDATA(rb_menu)->dfree == free_wxMenu)
|
|
93
|
-
{
|
|
94
|
-
wxMenu* wx_menu = static_cast<wxMenu*> (ptr);
|
|
139
|
+
_gc_mark_single_wxMenu(static_cast<wxMenu*> (ti.first), ti.second);
|
|
140
|
+
}
|
|
95
141
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
142
|
+
WXRUBY_TRACE_IF(WxRubyTraceMarkMenu, 2)
|
|
143
|
+
WXRUBY_TRACE("< GC_mark_wxMenu")
|
|
144
|
+
WXRUBY_TRACE_END
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
WXRUBY_EXPORT VALUE wxRuby_WrapWxMenuInRuby(wxMenu* wx_menu)
|
|
148
|
+
{
|
|
149
|
+
VALUE rb_menu = Qnil;
|
|
150
|
+
if (wx_menu)
|
|
151
|
+
{
|
|
152
|
+
rb_menu = wxRuby_FindCategoryValue(wxRubyMenu::TRACKING_CAT, wx_menu); // check for already registered instance
|
|
153
|
+
if (NIL_P(rb_menu))
|
|
154
|
+
{
|
|
155
|
+
// newly created
|
|
156
|
+
wxRubyMenu* wxrb_menu = dynamic_cast<wxRubyMenu*> (wx_menu);
|
|
157
|
+
if (wxrb_menu)
|
|
99
158
|
{
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
159
|
+
// convert and own
|
|
160
|
+
rb_menu = SWIG_NewPointerObj(SWIG_as_voidptr(wxrb_menu), SWIGTYPE_p_wxMenu, SWIG_POINTER_OWN);
|
|
161
|
+
wxrb_menu->wxruby_register(rb_menu);
|
|
162
|
+
}
|
|
163
|
+
else
|
|
164
|
+
{
|
|
165
|
+
// created internally by wxWidgets; no tracking and no ownership
|
|
166
|
+
rb_menu = SWIG_NewPointerObj(SWIG_as_voidptr(wx_menu), SWIGTYPE_p_wxMenu, 0);
|
|
105
167
|
}
|
|
106
|
-
}
|
|
107
|
-
else // otherwise the menu has been attached to a menu bar and may already have been deleted (or not)
|
|
108
|
-
{ // marking in this case will be left to the menu bar
|
|
109
|
-
WXRUBY_TRACE_IF(WxRubyTraceMarkMenu, 3)
|
|
110
|
-
WXRUBY_TRACE("< GC_mark_wxMenu : skipping attached menu")
|
|
111
|
-
WXRUBY_TRACE_END
|
|
112
168
|
}
|
|
113
169
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
WXRUBY_TRACE_IF(WxRubyTraceMarkMenu, 2)
|
|
122
|
-
WXRUBY_TRACE("< GC_mark_wxMenu : " << ptr)
|
|
123
|
-
WXRUBY_TRACE_END
|
|
170
|
+
return rb_menu;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
WXRUBY_EXPORT void wxRuby_RegisterWxMenu(wxMenu* wx_menu, VALUE rb_menu)
|
|
174
|
+
{
|
|
175
|
+
wxRubyMenu* wxrb_menu = dynamic_cast<wxRubyMenu*> (wx_menu);
|
|
176
|
+
if (wxrb_menu) wxrb_menu->wxruby_register(rb_menu);
|
|
124
177
|
}
|
|
125
|
-
__HEREDOC
|
|
126
|
-
spec.add_swig_code <<~__HEREDOC
|
|
127
|
-
%markfunc wxMenu "GC_mark_wxMenu";
|
|
128
178
|
__HEREDOC
|
|
129
179
|
# ignore MSW specific method
|
|
130
180
|
spec.ignore 'wxMenu::MSWCommand'
|
|
@@ -16,7 +16,7 @@ module WXRuby3
|
|
|
16
16
|
|
|
17
17
|
def setup
|
|
18
18
|
super
|
|
19
|
-
spec.
|
|
19
|
+
spec.gc_as_marked # not a typical window
|
|
20
20
|
spec.no_proxy('wxMenuBar::FindItem',
|
|
21
21
|
'wxMenuBar::Remove',
|
|
22
22
|
'wxMenuBar::Replace')
|
|
@@ -28,71 +28,110 @@ module WXRuby3
|
|
|
28
28
|
spec.new_object 'wxMenuBar::Remove', 'wxMenuBar::Replace'
|
|
29
29
|
# for FindItem
|
|
30
30
|
spec.map 'wxMenu **' => 'Wx::Menu' do
|
|
31
|
+
add_header_code 'WXRUBY_EXPORT VALUE wxRuby_WrapWxMenuInRuby(wxMenu* wx_menu);'
|
|
31
32
|
map_in ignore: true, temp: 'wxMenu *tmp', code: '$1 = &tmp;'
|
|
32
33
|
map_argout code: <<~__CODE
|
|
33
|
-
|
|
34
|
-
$result = SWIG_Ruby_AppendOutput($result, SWIG_NewPointerObj(ptr, SWIGTYPE_p_wxMenu, 0));
|
|
34
|
+
$result = SWIG_Ruby_AppendOutput($result, wxRuby_WrapWxMenuInRuby(tmp$argnum));
|
|
35
35
|
__CODE
|
|
36
36
|
end
|
|
37
37
|
spec.add_header_code <<~__HEREDOC
|
|
38
|
-
|
|
38
|
+
static void GC_mark_wxMenuBar(const TGCTrackingValueMap& values);
|
|
39
|
+
|
|
40
|
+
// Custom subclass implementation.
|
|
41
|
+
// Provides support for monitored tracking and GC handling.
|
|
42
|
+
class wxRubyMenuBar : public wxMenuBar
|
|
43
|
+
{
|
|
44
|
+
public:
|
|
45
|
+
static const std::string TRACKING_CAT;
|
|
39
46
|
|
|
40
|
-
|
|
41
|
-
|
|
47
|
+
wxRubyMenuBar(long style=0) : wxMenuBar(style) {}
|
|
48
|
+
virtual ~wxRubyMenuBar()
|
|
49
|
+
{
|
|
50
|
+
wxRuby_ReleaseEvtHandlerProcs(this);
|
|
51
|
+
wxruby_unregister();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
void wxruby_register(VALUE rb_menubar)
|
|
55
|
+
{
|
|
56
|
+
if (!is_registered_)
|
|
57
|
+
{
|
|
58
|
+
wxRuby_RegisterTrackingCategory(TRACKING_CAT, GC_mark_wxMenuBar, true);
|
|
59
|
+
is_registered_ = true;
|
|
60
|
+
}
|
|
61
|
+
if (RB_NIL_P(wxRuby_FindCategoryValue(TRACKING_CAT, this)))
|
|
62
|
+
wxRuby_RegisterCategoryValue(TRACKING_CAT, this, rb_menubar);
|
|
63
|
+
}
|
|
64
|
+
private:
|
|
65
|
+
static bool is_registered_;
|
|
66
|
+
void wxruby_unregister()
|
|
67
|
+
{
|
|
68
|
+
wxRuby_UnregisterCategoryValue(TRACKING_CAT, this);
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const std::string wxRubyMenuBar::TRACKING_CAT = { "WXRUBY_MENU_BAR" };
|
|
73
|
+
bool wxRubyMenuBar::is_registered_ {};
|
|
74
|
+
|
|
75
|
+
WXRUBY_TRACE_GUARD(WxRubyTraceMarkMenubar, "GC_MARK_MENUBAR")
|
|
42
76
|
|
|
43
77
|
// Mark Function for unattached menu bars
|
|
44
78
|
// Need to protect Menu and MenuItems which are included in the MenuBar
|
|
45
|
-
static void GC_mark_wxMenuBar(
|
|
79
|
+
static void GC_mark_wxMenuBar(const TGCTrackingValueMap& values)
|
|
46
80
|
{
|
|
47
81
|
WXRUBY_TRACE_IF(WxRubyTraceMarkMenubar, 2)
|
|
48
|
-
WXRUBY_TRACE("> GC_mark_wxMenuBar
|
|
82
|
+
WXRUBY_TRACE("> GC_mark_wxMenuBar")
|
|
49
83
|
WXRUBY_TRACE_END
|
|
50
84
|
|
|
51
|
-
|
|
52
|
-
if (!RB_NIL_P(rb_menu_bar))
|
|
85
|
+
for (const auto& ti : values)
|
|
53
86
|
{
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
// of sizers and carets associated with that class
|
|
60
|
-
GC_mark_wxWindow(ptr);
|
|
87
|
+
rb_gc_mark(ti.second);
|
|
88
|
+
|
|
89
|
+
// Menu bars are also a subclass of wxWindow, so must do all the marking
|
|
90
|
+
// of sizers and carets associated with that class
|
|
91
|
+
GC_mark_wxWindow(ti.first);
|
|
61
92
|
|
|
62
|
-
|
|
93
|
+
// no need to mark anything else as menus are tracked themselves separately
|
|
94
|
+
}
|
|
63
95
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
96
|
+
WXRUBY_TRACE_IF(WxRubyTraceMarkMenubar, 2)
|
|
97
|
+
WXRUBY_TRACE("< GC_mark_wxMenuBar")
|
|
98
|
+
WXRUBY_TRACE_END
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
WXRUBY_EXPORT VALUE wxRuby_WrapWxMenuBarInRuby(wxMenuBar* wx_menubar)
|
|
102
|
+
{
|
|
103
|
+
VALUE rb_menubar = Qnil;
|
|
104
|
+
if (wx_menubar)
|
|
105
|
+
{
|
|
106
|
+
rb_menubar = wxRuby_FindCategoryValue(wxRubyMenuBar::TRACKING_CAT, wx_menubar); // check for already registered instance
|
|
107
|
+
if (NIL_P(rb_menubar))
|
|
108
|
+
{
|
|
109
|
+
// newly created
|
|
110
|
+
wxRubyMenuBar* wxrb_mb = dynamic_cast<wxRubyMenuBar*> (wx_menubar);
|
|
111
|
+
if (wxrb_mb)
|
|
70
112
|
{
|
|
71
|
-
|
|
113
|
+
// convert and own
|
|
114
|
+
rb_menubar = SWIG_NewPointerObj(SWIG_as_voidptr(wxrb_mb), SWIGTYPE_p_wxMenuBar, SWIG_POINTER_OWN);
|
|
115
|
+
wxrb_mb->wxruby_register(rb_menubar);
|
|
116
|
+
}
|
|
117
|
+
else
|
|
118
|
+
{
|
|
119
|
+
// created internally by wxWidgets; no tracking and no ownership
|
|
120
|
+
rb_menubar = SWIG_NewPointerObj(SWIG_as_voidptr(wx_menubar), SWIGTYPE_p_wxMenuBar, 0);
|
|
72
121
|
}
|
|
73
|
-
}
|
|
74
|
-
else // otherwise the menu bar has been attached to a frame and may already have been deleted (or not)
|
|
75
|
-
{ // marking in this case will be left to the frame
|
|
76
|
-
WXRUBY_TRACE_IF(WxRubyTraceMarkMenubar, 3)
|
|
77
|
-
WXRUBY_TRACE("< GC_mark_wxMenuBar : skipping attached menu bar")
|
|
78
|
-
WXRUBY_TRACE_END
|
|
79
122
|
}
|
|
80
123
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
WXRUBY_TRACE_IF(WxRubyTraceMarkMenubar, 2)
|
|
89
|
-
WXRUBY_TRACE("< GC_mark_wxMenuBar : " << ptr)
|
|
90
|
-
WXRUBY_TRACE_END
|
|
124
|
+
return rb_menubar;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
WXRUBY_EXPORT void wxRuby_RegisterWxMenuBar(wxMenuBar* wx_menubar, VALUE rb_menubar)
|
|
128
|
+
{
|
|
129
|
+
wxRubyMenuBar* wxrb_mb = dynamic_cast<wxRubyMenuBar*> (wx_menubar);
|
|
130
|
+
if (wxrb_mb) wxrb_mb->wxruby_register(rb_menubar);
|
|
91
131
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
__HEREDOC
|
|
132
|
+
__HEREDOC
|
|
133
|
+
# make Ruby director and wrappers use custom implementation
|
|
134
|
+
spec.use_class_implementation('wxMenuBar', 'wxRubyMenuBar')
|
|
96
135
|
end
|
|
97
136
|
end # class MenuBar
|
|
98
137
|
|
|
@@ -24,8 +24,8 @@ module WXRuby3
|
|
|
24
24
|
spec.ignore(%w[wxMenuItem::GetLabel wxMenuItem::GetName wxMenuItem::GetText wxMenuItem::SetText wxMenuItem::GetLabelFromText])
|
|
25
25
|
# Replace for more specific param naming
|
|
26
26
|
spec.ignore 'wxMenuItem::SetSubMenu(wxMenu *)', ignore_doc: false
|
|
27
|
-
spec.extend_interface 'wxMenuItem', 'void SetSubMenu(wxMenu *
|
|
28
|
-
spec.disown 'wxMenu *
|
|
27
|
+
spec.extend_interface 'wxMenuItem', 'void SetSubMenu(wxMenu *subMenu)'
|
|
28
|
+
spec.disown 'wxMenu *subMenu'
|
|
29
29
|
# ignore this as there is no implementation anymore
|
|
30
30
|
spec.ignore 'wxMenuItem::GetAccelFromString'
|
|
31
31
|
spec.ignore_unless('USE_ACCEL', 'wxMenuItem::GetAccel')
|
|
@@ -200,7 +200,7 @@ module WXRuby3
|
|
|
200
200
|
}
|
|
201
201
|
}
|
|
202
202
|
|
|
203
|
-
static void wxRuby_markPersistentObjects()
|
|
203
|
+
static void wxRuby_markPersistentObjects(const TGCTrackingValueMap& /*unused*/)
|
|
204
204
|
{
|
|
205
205
|
WxRubyPersistenceManager* wxrb_pm =
|
|
206
206
|
dynamic_cast<WxRubyPersistenceManager*> (&wxPersistenceManager::Get());
|
|
@@ -399,7 +399,8 @@ module WXRuby3
|
|
|
399
399
|
// install the default global wxRuby persistence manager
|
|
400
400
|
wxPersistenceManager::Set(s_wxruby_persistence_manager);
|
|
401
401
|
// and the persistent object marker
|
|
402
|
-
|
|
402
|
+
static const std::string WXRUBY_PERSISTENT_OBJECTS = {"WXRUBY_PERSISTENT_OBJECTS"};
|
|
403
|
+
wxRuby_RegisterTrackingCategory(WXRUBY_PERSISTENT_OBJECTS, wxRuby_markPersistentObjects);
|
|
403
404
|
__HEREDOC
|
|
404
405
|
end
|
|
405
406
|
|
|
@@ -53,8 +53,8 @@ module WXRuby3
|
|
|
53
53
|
if ( GC_IsWindowDeleted(ptr) )
|
|
54
54
|
return;
|
|
55
55
|
|
|
56
|
-
// Do standard marking routines as for all
|
|
57
|
-
|
|
56
|
+
// Do standard marking routines as for all windows
|
|
57
|
+
GC_mark_wxWindow(ptr);
|
|
58
58
|
|
|
59
59
|
WxRubyPreviewFrame* preview_frame = dynamic_cast<WxRubyPreviewFrame*>((wxPreviewFrame*)ptr);
|
|
60
60
|
if (preview_frame)
|
|
@@ -102,7 +102,7 @@ module WXRuby3
|
|
|
102
102
|
__HEREDOC
|
|
103
103
|
spec.add_header_code <<~__HEREDOC
|
|
104
104
|
// define the richtext buffer marker
|
|
105
|
-
static void wxRuby_markRichTextBuffer()
|
|
105
|
+
static void wxRuby_markRichTextBuffer(const TGCTrackingValueMap& /*unused*/)
|
|
106
106
|
{
|
|
107
107
|
// mark any user installed drawing handlers
|
|
108
108
|
wxList& handlers = wxRichTextBuffer::GetDrawingHandlers();
|
|
@@ -125,7 +125,10 @@ module WXRuby3
|
|
|
125
125
|
}
|
|
126
126
|
__HEREDOC
|
|
127
127
|
# register the marker at module initialization
|
|
128
|
-
spec.add_init_code
|
|
128
|
+
spec.add_init_code <<~__HEREDOC
|
|
129
|
+
const std::string WXRUBY_RICHTEXT_BUFFER = {"WXRUBY_RICHTEXT_BUFFER"};
|
|
130
|
+
wxRuby_RegisterTrackingCategory(WXRUBY_RICHTEXT_BUFFER, wxRuby_markRichTextBuffer);
|
|
131
|
+
__HEREDOC
|
|
129
132
|
# for GetExtWildcard
|
|
130
133
|
spec.map 'wxArrayInt* types' => 'Array,nil' do
|
|
131
134
|
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Copyright (c) 2023 M.J.N. Corino, The Netherlands
|
|
2
|
+
#
|
|
3
|
+
# This software is released under the MIT license.
|
|
4
|
+
|
|
5
|
+
###
|
|
6
|
+
# wxRuby3 wxWidgets interface director
|
|
7
|
+
###
|
|
8
|
+
|
|
9
|
+
module WXRuby3
|
|
10
|
+
|
|
11
|
+
class Director
|
|
12
|
+
|
|
13
|
+
class SharedEvtHandler < Director
|
|
14
|
+
|
|
15
|
+
def setup
|
|
16
|
+
super
|
|
17
|
+
spec.items.clear
|
|
18
|
+
spec.add_header_code <<~__HEREDOC
|
|
19
|
+
#include "wxruby-SharedEventHandler.h"
|
|
20
|
+
__HEREDOC
|
|
21
|
+
spec.add_init_code <<~__HEREDOC
|
|
22
|
+
wx_setup_WxRubySharedEvtHandler(mWxRT);
|
|
23
|
+
__HEREDOC
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
@@ -56,11 +56,10 @@ module WXRuby3
|
|
|
56
56
|
{
|
|
57
57
|
if ($self->Detach(szr))
|
|
58
58
|
{
|
|
59
|
-
|
|
60
|
-
if (rb_szr && !NIL_P(rb_szr))
|
|
59
|
+
if (!RB_NIL_P(SWIG_RubyInstanceFor(szr)))
|
|
61
60
|
{
|
|
62
|
-
// transfer ownership
|
|
63
|
-
|
|
61
|
+
// have SWIG transfer ownership of Ruby value
|
|
62
|
+
SWIG_NewPointerObj(szr, SWIGTYPE_p_wxSizer, SWIG_POINTER_OWN);
|
|
64
63
|
}
|
|
65
64
|
return true;
|
|
66
65
|
}
|
|
@@ -72,20 +71,12 @@ module WXRuby3
|
|
|
72
71
|
wxSizerItem* itm = $self->GetItem(itm_nr);
|
|
73
72
|
if (itm)
|
|
74
73
|
{
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
if ($self->Detach(itm_nr))
|
|
81
|
-
{
|
|
82
|
-
if (rb_szr && !NIL_P(rb_szr))
|
|
83
|
-
{
|
|
84
|
-
// transfer ownership to Ruby
|
|
85
|
-
RDATA(rb_szr)->dfree = GcSizerFreeFunc;
|
|
86
|
-
}
|
|
87
|
-
return true;
|
|
74
|
+
if (itm->IsSizer() && !RB_NIL_P(SWIG_RubyInstanceFor(itm->GetSizer())))
|
|
75
|
+
{
|
|
76
|
+
// have SWIG transfer ownership of Ruby value
|
|
77
|
+
SWIG_NewPointerObj(itm->GetSizer(), SWIGTYPE_p_wxSizer, SWIG_POINTER_OWN);
|
|
88
78
|
}
|
|
79
|
+
return $self->Detach(itm_nr);
|
|
89
80
|
}
|
|
90
81
|
return false;
|
|
91
82
|
}
|
|
@@ -46,11 +46,10 @@ module WXRuby3
|
|
|
46
46
|
{
|
|
47
47
|
if ($self->IsSizer())
|
|
48
48
|
{
|
|
49
|
-
|
|
50
|
-
if (rb_szr && !NIL_P(rb_szr))
|
|
49
|
+
if (!RB_NIL_P(SWIG_RubyInstanceFor($self->GetSizer())))
|
|
51
50
|
{
|
|
52
|
-
// transfer ownership
|
|
53
|
-
|
|
51
|
+
// have SWIG transfer ownership of Ruby value
|
|
52
|
+
SWIG_NewPointerObj($self->GetSizer(), SWIGTYPE_p_wxSizer, SWIG_POINTER_OWN);
|
|
54
53
|
}
|
|
55
54
|
$self->DetachSizer();
|
|
56
55
|
}
|
|
@@ -42,16 +42,16 @@ module WXRuby3
|
|
|
42
42
|
# overridden in user subclasses of TaskBarIcon to provide the menu over the icon.
|
|
43
43
|
# In the case of GetPopupMenu the menu will be used but not deleted so it can be stored in
|
|
44
44
|
# a member variable and reused.
|
|
45
|
-
# In the case of CreatePopupMenu the menu is disowned and deleted
|
|
46
|
-
# instance than needs to be protected from GC so the typemap stores the
|
|
47
|
-
#
|
|
48
|
-
#
|
|
49
|
-
#
|
|
45
|
+
# In the case of CreatePopupMenu the menu is disowned and deleted after use. The Wx::Menu Ruby
|
|
46
|
+
# instance than needs to be protected from GC so the typemap stores the object returned by the
|
|
47
|
+
# ruby method in an instance variable so it's marked as long as the TaskBarIcon exists.
|
|
48
|
+
# It also handles the special case where +nil+ is returned, to signal to Wx that no menu is to
|
|
49
|
+
# be shown.
|
|
50
50
|
spec.map 'wxMenu *' do
|
|
51
51
|
map_directorout code: <<~__CODE
|
|
52
52
|
static const std::string create_popup_menu("CreatePopupMenu");
|
|
53
53
|
bool disown = (std::string("$symname") == create_popup_menu);
|
|
54
|
-
if (disown) rb_iv_set(swig_get_self(), "@
|
|
54
|
+
if (disown) rb_iv_set(swig_get_self(), "@__popupmenu__", $1);
|
|
55
55
|
if (NIL_P($1))
|
|
56
56
|
{
|
|
57
57
|
$result = nullptr;
|
|
@@ -65,7 +65,7 @@ module WXRuby3
|
|
|
65
65
|
Swig::DirectorTypeMismatchException::raise(swig_get_self(), "$symname", rb_eTypeError,
|
|
66
66
|
"create_popup_menu must return a Wx::Menu, or nil");
|
|
67
67
|
}
|
|
68
|
-
$result =
|
|
68
|
+
$result = static_cast <wxMenu *> (ptr);
|
|
69
69
|
}
|
|
70
70
|
__CODE
|
|
71
71
|
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Copyright (c) 2023 M.J.N. Corino, The Netherlands
|
|
2
|
+
#
|
|
3
|
+
# This software is released under the MIT license.
|
|
4
|
+
|
|
5
|
+
###
|
|
6
|
+
# wxRuby3 wxWidgets interface director
|
|
7
|
+
###
|
|
8
|
+
|
|
9
|
+
require_relative './event'
|
|
10
|
+
|
|
11
|
+
module WXRuby3
|
|
12
|
+
|
|
13
|
+
class Director
|
|
14
|
+
|
|
15
|
+
class ThreadEvent < Event
|
|
16
|
+
|
|
17
|
+
def setup
|
|
18
|
+
super
|
|
19
|
+
spec.gc_as_marked # use marked so doc gen does not mark it as untracked (what it actually is)
|
|
20
|
+
spec.ignore 'wxThreadEvent::GetPayload',
|
|
21
|
+
'wxThreadEvent::SetPayload',
|
|
22
|
+
'wxThreadEvent::GetEventCategory'
|
|
23
|
+
spec.ignore 'wxThreadEvent::wxThreadEvent'
|
|
24
|
+
spec.regard 'wxThreadEvent::wxThreadEvent', regard_doc: false
|
|
25
|
+
spec.add_swig_code %Q{%constant wxEventType wxEVT_THREAD = wxEVT_THREAD;}
|
|
26
|
+
spec.do_not_generate(:variables, :defines, :enums, :functions)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end # class ThreadEvent
|
|
30
|
+
|
|
31
|
+
end # class Director
|
|
32
|
+
|
|
33
|
+
end # module WXRuby3
|
|
@@ -54,7 +54,9 @@ module WXRuby3
|
|
|
54
54
|
VALUE self = const_cast<wxRubyValidator*> (this)->get_self();
|
|
55
55
|
VALUE rc = wxRuby_Funcall(self, clone_id(), 0);
|
|
56
56
|
void *ptr;
|
|
57
|
-
|
|
57
|
+
// disown the validator for this is a C++ return and when this is called by a window
|
|
58
|
+
// to set it's validator that window will manage the validator
|
|
59
|
+
int res = SWIG_ConvertPtr(rc, &ptr, SWIGTYPE_p_wxValidator, SWIG_POINTER_DISOWN);
|
|
58
60
|
if (!SWIG_IsOK(res))
|
|
59
61
|
{
|
|
60
62
|
Swig::DirectorTypeMismatchException::raise(self, "clone", SWIG_ErrorType(SWIG_ArgError(res)), "in output value of type '""Wx::Validator *""'");
|
|
@@ -388,25 +388,22 @@ module WXRuby3
|
|
|
388
388
|
WXRUBY_TRACE_GUARD(WxRubyTraceGCTrackVariant, "GC_TRACK_VARIANT")
|
|
389
389
|
|
|
390
390
|
class WXRBValueVariantData;
|
|
391
|
-
// Mapping of WXRBValueVariantData* to Ruby VALUE
|
|
392
|
-
WX_DECLARE_VOIDPTR_HASH_MAP(VALUE,
|
|
393
|
-
WXRBVariantDataToRbValueHash);
|
|
394
|
-
static WXRBVariantDataToRbValueHash Variant_Value_Map;
|
|
395
391
|
|
|
396
|
-
static
|
|
392
|
+
static const std::string WXRUBY_VARIANT_DATA = { "WXRUBY_VARIANT_DATA" };
|
|
393
|
+
|
|
394
|
+
static void GC_mark_RbValueVariants(const TGCTrackingValueMap& values)
|
|
397
395
|
{
|
|
398
396
|
WXRUBY_TRACE_IF(WxRubyTraceGCMarkVariant, 2)
|
|
399
397
|
WXRUBY_TRACE("> GC_mark_RbValueVariants")
|
|
400
398
|
WXRUBY_TRACE_END
|
|
401
399
|
|
|
402
|
-
|
|
403
|
-
for( it = Variant_Value_Map.begin(); it != Variant_Value_Map.end(); ++it )
|
|
400
|
+
for(const auto& ti : values)
|
|
404
401
|
{
|
|
405
|
-
VALUE obj =
|
|
402
|
+
VALUE obj = ti.second;
|
|
406
403
|
|
|
407
404
|
WXRUBY_TRACE_IF(WxRubyTraceGCMarkVariant, 2)
|
|
408
405
|
WXRUBY_TRACE_WITH(void *c_ptr = (TYPE(obj) == T_DATA ? DATA_PTR(obj) : 0))
|
|
409
|
-
WXRUBY_TRACE("| GC_mark_RbValueVariants : " <<
|
|
406
|
+
WXRUBY_TRACE("| GC_mark_RbValueVariants : " << ti.first << "|" << (void*)c_ptr)
|
|
410
407
|
WXRUBY_TRACE_END
|
|
411
408
|
|
|
412
409
|
rb_gc_mark(obj);
|
|
@@ -419,12 +416,20 @@ module WXRuby3
|
|
|
419
416
|
|
|
420
417
|
static void wxRuby_RegisterValueVariantData(void* ptr, VALUE rbval)
|
|
421
418
|
{
|
|
419
|
+
static bool is_marker_registered = false;
|
|
420
|
+
|
|
422
421
|
WXRUBY_TRACE_IF(WxRubyTraceGCTrackVariant, 2)
|
|
423
422
|
WXRUBY_TRACE_WITH(void *c_ptr = (TYPE(rbval) == T_DATA ? DATA_PTR(rbval) : 0))
|
|
424
423
|
WXRUBY_TRACE("> wxRuby_RegisterValueVariantData : " << ptr << "|" << (void*)c_ptr)
|
|
425
424
|
WXRUBY_TRACE_END
|
|
426
425
|
|
|
427
|
-
|
|
426
|
+
if (!is_marker_registered)
|
|
427
|
+
{
|
|
428
|
+
wxRuby_RegisterTrackingCategory(WXRUBY_VARIANT_DATA, GC_mark_RbValueVariants, true);
|
|
429
|
+
is_marker_registered = true;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
wxRuby_RegisterCategoryValue(WXRUBY_VARIANT_DATA, ptr, rbval);
|
|
428
433
|
|
|
429
434
|
WXRUBY_TRACE_IF(WxRubyTraceGCMarkVariant, 2)
|
|
430
435
|
WXRUBY_TRACE("< wxRuby_RegisterValueVariantData")
|
|
@@ -437,7 +442,7 @@ module WXRuby3
|
|
|
437
442
|
WXRUBY_TRACE("> wxRuby_UnregisterValueVariantData : " << ptr)
|
|
438
443
|
WXRUBY_TRACE_END
|
|
439
444
|
|
|
440
|
-
|
|
445
|
+
wxRuby_UnregisterCategoryValue(WXRUBY_VARIANT_DATA, ptr);
|
|
441
446
|
|
|
442
447
|
WXRUBY_TRACE_IF(WxRubyTraceGCMarkVariant, 2)
|
|
443
448
|
WXRUBY_TRACE("< wxRuby_UnregisterValueVariantData")
|
|
@@ -502,7 +507,6 @@ module WXRuby3
|
|
|
502
507
|
return variant;
|
|
503
508
|
}
|
|
504
509
|
__HEREDOC
|
|
505
|
-
spec.add_init_code 'wxRuby_AppendMarker(GC_mark_RbValueVariants);'
|
|
506
510
|
# ignore GetType (not doc)
|
|
507
511
|
spec.ignore 'wxVariant::GetType', ignore_doc: false
|
|
508
512
|
# replace with custom implementation
|