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.
Files changed (220) hide show
  1. checksums.yaml +4 -4
  2. data/INSTALL.md +27 -2
  3. data/README.md +15 -15
  4. data/ext/wxruby3/include/wxRubyApp.h +145 -46
  5. data/ext/wxruby3/include/wxruby-ComboPopup.h +25 -8
  6. data/ext/wxruby3/include/wxruby-GCTracking.h +262 -0
  7. data/ext/wxruby3/include/wxruby-MBConv.h +190 -0
  8. data/ext/wxruby3/include/wxruby-SharedEventHandler.h +183 -0
  9. data/ext/wxruby3/include/wxruby-SharedPtr.h +104 -0
  10. data/ext/wxruby3/include/wxruby-runtime.h +29 -0
  11. data/ext/wxruby3/swig/custom/rubytracking.swg +8 -22
  12. data/ext/wxruby3/swig/custom/wx_ruby_shared_ptr.i +434 -0
  13. data/ext/wxruby3/swig/custom/wx_shared_ptr.i +431 -0
  14. data/ext/wxruby3/swig/mark_free_impl.i +7 -132
  15. data/ext/wxruby3/swig/memory_management.i +8 -44
  16. data/ext/wxruby3/swig/wx.i +46 -73
  17. data/lib/wx/core/const.rb +0 -1
  18. data/lib/wx/core/context_help.rb +17 -0
  19. data/lib/wx/core/cursor.rb +1 -0
  20. data/lib/wx/core/helpcontrollerhelpprovider.rb +10 -2
  21. data/lib/wx/core/mbconv.rb +11 -0
  22. data/lib/wx/core/media_ctrl.rb +31 -0
  23. data/lib/wx/core/top_level_window.rb +7 -0
  24. data/lib/wx/core.rb +6 -0
  25. data/lib/wx/doc/art_provider.rb +17 -0
  26. data/lib/wx/doc/context_help.rb +42 -0
  27. data/lib/wx/doc/core.rb +0 -5
  28. data/lib/wx/doc/functions.rb +10 -0
  29. data/lib/wx/doc/gen/affine_matrix2d.rb +2 -0
  30. data/lib/wx/doc/gen/art_provider.rb +12 -0
  31. data/lib/wx/doc/gen/aui/aui_notebook_event.rb +15 -15
  32. data/lib/wx/doc/gen/aui/aui_pane_info.rb +8 -8
  33. data/lib/wx/doc/gen/aui/aui_tool_bar_event.rb +5 -5
  34. data/lib/wx/doc/gen/book_ctrl_base.rb +2 -1
  35. data/lib/wx/doc/gen/calendar_event.rb +5 -5
  36. data/lib/wx/doc/gen/choicebook.rb +2 -2
  37. data/lib/wx/doc/gen/collapsible_pane.rb +1 -1
  38. data/lib/wx/doc/gen/colour_dialog.rb +1 -1
  39. data/lib/wx/doc/gen/colour_picker_event.rb +3 -3
  40. data/lib/wx/doc/gen/context_help_button.rb +0 -53
  41. data/lib/wx/doc/gen/core.rb +4 -4
  42. data/lib/wx/doc/gen/credential_entry_dialog.rb +2 -2
  43. data/lib/wx/doc/gen/date_event.rb +2 -2
  44. data/lib/wx/doc/gen/dial_up_event.rb +2 -2
  45. data/lib/wx/doc/gen/dir_filter_list_ctrl.rb +2 -2
  46. data/lib/wx/doc/gen/event.rb +58 -58
  47. data/lib/wx/doc/gen/ext_help_controller.rb +62 -16
  48. data/lib/wx/doc/gen/file_ctrl.rb +4 -4
  49. data/lib/wx/doc/gen/file_dir_picker_event.rb +2 -2
  50. data/lib/wx/doc/gen/file_system.rb +1 -1
  51. data/lib/wx/doc/gen/find_dialog_event.rb +5 -5
  52. data/lib/wx/doc/gen/font_picker_event.rb +1 -1
  53. data/lib/wx/doc/gen/grid/grid_ctrl.rb +67 -32
  54. data/lib/wx/doc/gen/header_ctrl_event.rb +13 -13
  55. data/lib/wx/doc/gen/help_controller.rb +45 -2
  56. data/lib/wx/doc/gen/html/html_help_controller.rb +74 -32
  57. data/lib/wx/doc/gen/html/html_help_window.rb +3 -3
  58. data/lib/wx/doc/gen/html/html_window.rb +4 -4
  59. data/lib/wx/doc/gen/hyperlink_ctrl.rb +1 -1
  60. data/lib/wx/doc/gen/list_ctrl.rb +22 -22
  61. data/lib/wx/doc/gen/listbook.rb +2 -2
  62. data/lib/wx/doc/gen/mb_conv.rb +10 -0
  63. data/lib/wx/doc/gen/media_event.rb +6 -6
  64. data/lib/wx/doc/gen/notebook.rb +2 -2
  65. data/lib/wx/doc/gen/pg/pg_validation_info.rb +14 -14
  66. data/lib/wx/doc/gen/pg/property_grid_interface.rb +2 -2
  67. data/lib/wx/doc/gen/rbn/ribbon_art_provider.rb +19 -9
  68. data/lib/wx/doc/gen/rbn/ribbon_button_bar.rb +2 -2
  69. data/lib/wx/doc/gen/rbn/ribbon_gallery.rb +3 -3
  70. data/lib/wx/doc/gen/rbn/ribbon_panel.rb +2 -2
  71. data/lib/wx/doc/gen/rbn/ribbon_tool_bar.rb +2 -2
  72. data/lib/wx/doc/gen/rt/event_list.rb +17 -0
  73. data/lib/wx/doc/gen/rt/shared_evt_handler.rb +14 -0
  74. data/lib/wx/doc/gen/rt/thread_event.rb +71 -0
  75. data/lib/wx/doc/gen/rtc/rich_text_ctrl.rb +19 -19
  76. data/lib/wx/doc/gen/sash_event.rb +2 -2
  77. data/lib/wx/doc/gen/sash_layout_window.rb +2 -2
  78. data/lib/wx/doc/gen/search_ctrl.rb +2 -2
  79. data/lib/wx/doc/gen/spin_ctrl.rb +2 -2
  80. data/lib/wx/doc/gen/splitter_window.rb +6 -6
  81. data/lib/wx/doc/gen/stc/styled_text_event.rb +34 -34
  82. data/lib/wx/doc/gen/task_bar_icon_event.rb +10 -10
  83. data/lib/wx/doc/gen/text_ctrl.rb +4 -4
  84. data/lib/wx/doc/gen/toggle_button.rb +1 -1
  85. data/lib/wx/doc/gen/toolbook.rb +2 -2
  86. data/lib/wx/doc/gen/top_level_window.rb +19 -0
  87. data/lib/wx/doc/gen/tree_ctrl.rb +21 -21
  88. data/lib/wx/doc/gen/treebook.rb +4 -4
  89. data/lib/wx/doc/gen/utils.rb +2 -2
  90. data/lib/wx/doc/gen/web/event_list.rb +95 -0
  91. data/lib/wx/doc/gen/web/web_view.rb +1136 -0
  92. data/lib/wx/doc/gen/web/web_view_event.rb +210 -0
  93. data/lib/wx/doc/gen/web/web_view_handler.rb +318 -0
  94. data/lib/wx/doc/gen/window.rb +1 -1
  95. data/lib/wx/doc/gen/wizard_event.rb +7 -7
  96. data/lib/wx/doc/html/html_help_controller.rb +23 -1
  97. data/lib/wx/doc/mbconv.rb +108 -0
  98. data/lib/wx/doc/rt/shared_event_handler.rb +49 -0
  99. data/lib/wx/doc/rt/thread_event.rb +28 -0
  100. data/lib/wx/doc/webview.rb +40 -0
  101. data/lib/wx/helpers.rb +1 -1
  102. data/lib/wx/html/htmlhelpcontroller.rb +10 -0
  103. data/lib/wx/keyword_defs.rb +11 -0
  104. data/lib/wx/rt/events/evt_list.rb +8 -0
  105. data/lib/wx/rt/require.rb +8 -0
  106. data/lib/wx/rt/thread_event.rb +14 -0
  107. data/lib/wx/rt.rb +16 -0
  108. data/lib/wx/version.rb +1 -1
  109. data/lib/wx/web/events/evt_list.rb +74 -0
  110. data/lib/wx/web/require.rb +8 -0
  111. data/lib/wx/web/webview.rb +106 -0
  112. data/lib/wx/web.rb +17 -0
  113. data/lib/wx/wxruby/cmd/setup.rb +15 -0
  114. data/lib/wx.rb +2 -0
  115. data/rakelib/configure.rb +24 -0
  116. data/rakelib/gem.rb +3 -2
  117. data/rakelib/install.rb +54 -27
  118. data/rakelib/lib/config/macosx.rb +7 -5
  119. data/rakelib/lib/config/mingw.rb +66 -5
  120. data/rakelib/lib/config/pkgman/mingw.rb +1 -1
  121. data/rakelib/lib/config/unixish.rb +4 -2
  122. data/rakelib/lib/config.rb +37 -3
  123. data/rakelib/lib/core/include/client_data.inc +38 -17
  124. data/rakelib/lib/core/include/funcall.inc +1 -1
  125. data/rakelib/lib/core/include/swigdirector.inc +3 -3
  126. data/rakelib/lib/core/include/swigrubyrun.inc +14 -26
  127. data/rakelib/lib/core/package.rb +0 -2
  128. data/rakelib/lib/director/app.rb +1 -8
  129. data/rakelib/lib/director/art_provider.rb +7 -3
  130. data/rakelib/lib/director/comboctrl.rb +0 -7
  131. data/rakelib/lib/director/context_help_button.rb +35 -2
  132. data/rakelib/lib/director/event_handler.rb +32 -28
  133. data/rakelib/lib/director/fs_file.rb +15 -10
  134. data/rakelib/lib/director/functions.rb +8 -0
  135. data/rakelib/lib/director/grid_cell_attr.rb +1 -3
  136. data/rakelib/lib/director/grid_cell_editor.rb +14 -12
  137. data/rakelib/lib/director/grid_cell_renderer.rb +11 -8
  138. data/rakelib/lib/director/grid_ctrl.rb +140 -121
  139. data/rakelib/lib/director/help_controller.rb +70 -2
  140. data/rakelib/lib/director/mb_conv.rb +30 -0
  141. data/rakelib/lib/director/menu.rb +92 -42
  142. data/rakelib/lib/director/menu_bar.rb +84 -45
  143. data/rakelib/lib/director/menu_item.rb +2 -2
  144. data/rakelib/lib/director/persistence_manager.rb +3 -2
  145. data/rakelib/lib/director/preview_frame.rb +2 -2
  146. data/rakelib/lib/director/richtext_buffer.rb +5 -2
  147. data/rakelib/lib/director/shared_evt_handler.rb +30 -0
  148. data/rakelib/lib/director/sizer.rb +8 -17
  149. data/rakelib/lib/director/sizer_item.rb +3 -4
  150. data/rakelib/lib/director/task_bar_icon.rb +7 -7
  151. data/rakelib/lib/director/thread_event.rb +33 -0
  152. data/rakelib/lib/director/validator.rb +3 -1
  153. data/rakelib/lib/director/variant.rb +16 -12
  154. data/rakelib/lib/director/webview.rb +166 -0
  155. data/rakelib/lib/director/webview_event.rb +37 -0
  156. data/rakelib/lib/director/webview_handler.rb +63 -0
  157. data/rakelib/lib/generate/doc/thread_event.yaml +20 -0
  158. data/rakelib/lib/generate/doc/web_view.yaml +135 -0
  159. data/rakelib/lib/generate/doc/web_view_event.yaml +38 -0
  160. data/rakelib/lib/generate/doc/web_view_handler.yaml +58 -0
  161. data/rakelib/lib/specs/interfaces.rb +12 -0
  162. data/rakelib/lib/typemap/common.rb +34 -1
  163. data/rakelib/lib/typemap/mb_conv.rb +58 -0
  164. data/rakelib/prepost.rake +23 -31
  165. data/rakelib/prepost.rb +20 -0
  166. data/samples/event/threaded.rb +295 -42
  167. data/samples/event/tn_threaded.png +0 -0
  168. data/samples/help/doc/back.gif +0 -0
  169. data/samples/help/doc/contents.gif +0 -0
  170. data/samples/help/doc/cshelp.txt +9 -0
  171. data/samples/help/doc/doc.chm +0 -0
  172. data/samples/help/doc/doc.cnt +8 -0
  173. data/samples/help/doc/doc.h +7 -0
  174. data/samples/help/doc/doc.hhc +40 -0
  175. data/samples/help/doc/doc.hhk +31 -0
  176. data/samples/help/doc/doc.hhp +33 -0
  177. data/samples/help/doc/doc.hpj +21 -0
  178. data/samples/help/doc/doc.htm +27 -0
  179. data/samples/help/doc/doc1.htm +24 -0
  180. data/samples/help/doc/doc2.htm +12 -0
  181. data/samples/help/doc/doc3.htm +12 -0
  182. data/samples/help/doc/doc4.htm +12 -0
  183. data/samples/help/doc/doc5.htm +14 -0
  184. data/samples/help/doc/forward.gif +0 -0
  185. data/samples/help/doc/up.gif +0 -0
  186. data/samples/help/doc.chm +0 -0
  187. data/samples/help/doc.chw +0 -0
  188. data/samples/help/doc.zip +0 -0
  189. data/samples/help/help.rb +352 -0
  190. data/samples/help/tn_help.png +0 -0
  191. data/samples/webview/handler_advanced.html +55 -0
  192. data/samples/webview/tn_webview.png +0 -0
  193. data/samples/webview/webview.rb +1264 -0
  194. data/tests/assets/handler_advanced.html +55 -0
  195. data/tests/assets/test.css +1 -0
  196. data/tests/assets/test.html +9 -0
  197. data/tests/assets/test.zip +0 -0
  198. data/tests/lib/text_entry_tests.rb +2 -2
  199. data/tests/lib/wxapp_runner.rb +40 -0
  200. data/tests/lib/wxframe_runner.rb +17 -2
  201. data/tests/test_art.rb +8 -8
  202. data/tests/test_clipboard.rb +4 -4
  203. data/tests/test_config.rb +6 -6
  204. data/tests/test_exceptions.rb +8 -6
  205. data/tests/test_ext_controls.rb +3 -3
  206. data/tests/test_file_dialog.rb +5 -5
  207. data/tests/test_font.rb +7 -7
  208. data/tests/test_grid_ctrl.rb +133 -0
  209. data/tests/test_help.rb +88 -0
  210. data/tests/test_intl.rb +1 -1
  211. data/tests/test_media_ctrl.rb +14 -6
  212. data/tests/test_menu.rb +94 -86
  213. data/tests/test_persistence.rb +1 -1
  214. data/tests/test_proof_check.rb +5 -5
  215. data/tests/test_propgrid.rb +1 -1
  216. data/tests/test_shared_event_handler.rb +141 -0
  217. data/tests/test_std_controls.rb +5 -5
  218. data/tests/test_webview.rb +492 -0
  219. data/tests/test_window.rb +3 -3
  220. metadata +78 -2
@@ -93,6 +93,21 @@ module WXRuby3
93
93
  }
94
94
  __CODE
95
95
  end
96
+ spec.add_header_code <<~__HEREDOC
97
+ // custom subclass for Ruby (derived) instances to cleanup event handler procs on destruction
98
+ class wxRubyEvtHandler : public wxEvtHandler
99
+ {
100
+ public:
101
+ wxRubyEvtHandler() : wxEvtHandler() {}
102
+ virtual ~wxRubyEvtHandler()
103
+ {
104
+ wxRuby_ReleaseEvtHandlerProcs(this);
105
+ }
106
+ };
107
+
108
+ __HEREDOC
109
+ # make Ruby director and wrappers use custom implementation
110
+ spec.use_class_implementation('wxEvtHandler', 'wxRubyEvtHandler')
96
111
  spec.add_runtime_code <<~__HEREDOC
97
112
  WXRUBY_TRACE_GUARD(WxRubyTraceEventHandlers, "EVENTS_HANDLER");
98
113
 
@@ -153,33 +168,27 @@ module WXRuby3
153
168
  // GC until the EvtHandler object itself is destroyed. So we keep a hash
154
169
  // which maps C++ pointer addresses of EvtHandlers to lists of
155
170
  // the callback objects created to handle their events.
156
- typedef wxVector<wxRbCallback*> EvtHandlerProcList;
157
- typedef EvtHandlerProcList* EvtHandlerProcListPtr;
158
- WX_DECLARE_VOIDPTR_HASH_MAP(EvtHandlerProcListPtr, PtrToEvtHandlerProcs);
159
- PtrToEvtHandlerProcs Evt_Handler_Handlers;
171
+ #include <set>
172
+ typedef std::set<wxRbCallback*> TEvtHandlerProcs;
173
+ typedef std::unordered_map<void*, TEvtHandlerProcs> TPtrToEvtHandlerProcs;
174
+ static TPtrToEvtHandlerProcs _s__Evt_Handler_Handlers {};
160
175
 
161
176
  // Add a proc to the list of protected handler for an EvtHandler object
162
177
  void wxRuby_ProtectEvtHandlerProc(void* evt_handler, wxRbCallback* proc_cb)
163
178
  {
164
- if (Evt_Handler_Handlers.count(evt_handler) == 0)
165
- Evt_Handler_Handlers[evt_handler] = new EvtHandlerProcList();
166
- Evt_Handler_Handlers[evt_handler]->push_back(proc_cb);
179
+ _s__Evt_Handler_Handlers[evt_handler].emplace(proc_cb);
167
180
  }
168
181
 
169
182
  static void wxRuby_ReleaseEvtHandlerProc(void* evt_handler, wxRbCallback* proc_cb)
170
183
  {
171
- if (Evt_Handler_Handlers.count(evt_handler) != 0)
184
+ auto itevh = _s__Evt_Handler_Handlers.find(evt_handler);
185
+ if (itevh != _s__Evt_Handler_Handlers.end())
172
186
  {
173
- EvtHandlerProcList *ehpl = Evt_Handler_Handlers[evt_handler];
174
- for (EvtHandlerProcList::iterator itproc = ehpl->begin();
175
- itproc != ehpl->end();
176
- itproc++)
187
+ auto itproc = itevh->second.find(proc_cb);
188
+ if (itproc != itevh->second.end())
177
189
  {
178
- if (proc_cb == (*itproc))
179
- {
180
- ehpl->erase(itproc);
181
- return;
182
- }
190
+ itevh->second.erase(itproc);
191
+ return;
183
192
  }
184
193
  }
185
194
  }
@@ -187,16 +196,11 @@ module WXRuby3
187
196
  // Called by App's mark function; protect all currently needed procs
188
197
  void wxRuby_MarkProtectedEvtHandlerProcs()
189
198
  {
190
- PtrToEvtHandlerProcs::iterator it;
191
- for( it = Evt_Handler_Handlers.begin();
192
- it != Evt_Handler_Handlers.end();
193
- ++it )
199
+ for(const auto& ehp :_s__Evt_Handler_Handlers )
194
200
  {
195
- for (EvtHandlerProcList::iterator itproc = it->second->begin();
196
- itproc != it->second->end();
197
- itproc++)
201
+ for (const wxRbCallback* rb_cp : ehp.second)
198
202
  {
199
- rb_gc_mark((*itproc)->m_func);
203
+ rb_gc_mark(rb_cp->m_func);
200
204
  }
201
205
  }
202
206
  }
@@ -206,10 +210,10 @@ module WXRuby3
206
210
  // swig/mark_free_impl.i
207
211
  WXRUBY_EXPORT void wxRuby_ReleaseEvtHandlerProcs(void* evt_handler)
208
212
  {
209
- if (Evt_Handler_Handlers.count(evt_handler) != 0)
213
+ auto itevh = _s__Evt_Handler_Handlers.find(evt_handler);
214
+ if (itevh != _s__Evt_Handler_Handlers.end())
210
215
  {
211
- delete Evt_Handler_Handlers[evt_handler];
212
- Evt_Handler_Handlers.erase(evt_handler);
216
+ _s__Evt_Handler_Handlers.erase(itevh);
213
217
  }
214
218
  }
215
219
 
@@ -147,28 +147,34 @@ module WXRuby3
147
147
  static WxRuby_ID ios_close_id("close");
148
148
 
149
149
  // Mapping of wxStreamBase* to Ruby IO VALUE
150
- WX_DECLARE_VOIDPTR_HASH_MAP(VALUE,
151
- WXRBStreamBaseToRbValueHash);
152
- static WXRBStreamBaseToRbValueHash Stream_Value_Map;
153
150
 
154
- static void wxRuby_markRbStreams()
151
+ // tracking category
152
+ static const std::string WXRUBY_RUBY_IO_STREAMS = {"WXRUBY_RUBY_IO_STREAMS"};
153
+
154
+ static void wxRuby_markRbStreams(const TGCTrackingValueMap& values)
155
155
  {
156
- WXRBStreamBaseToRbValueHash::iterator it;
157
- for( it = Stream_Value_Map.begin(); it != Stream_Value_Map.end(); ++it )
156
+ for(const auto& ti : values)
158
157
  {
159
- VALUE obj = it->second;
158
+ VALUE obj = ti.second;
160
159
  rb_gc_mark(obj);
161
160
  }
162
161
  }
163
162
 
164
163
  static void wxRuby_RegisterStream(void* ptr, VALUE rbval)
165
164
  {
166
- Stream_Value_Map[ptr] = rbval;
165
+ static bool is_marker_registered = false;
166
+
167
+ if (!is_marker_registered)
168
+ {
169
+ wxRuby_RegisterTrackingCategory(WXRUBY_RUBY_IO_STREAMS, wxRuby_markRbStreams);
170
+ is_marker_registered = true;
171
+ }
172
+ wxRuby_RegisterCategoryValue(WXRUBY_RUBY_IO_STREAMS, ptr, rbval);
167
173
  }
168
174
 
169
175
  static void wxRuby_UnregisterStream(void* ptr)
170
176
  {
171
- Stream_Value_Map.erase(ptr);
177
+ wxRuby_UnregisterCategoryValue(WXRUBY_RUBY_IO_STREAMS, ptr);
172
178
  }
173
179
 
174
180
  // Implementation for wxRubyInputStream
@@ -373,7 +379,6 @@ module WXRuby3
373
379
  }
374
380
  }
375
381
  __CODE
376
- spec.add_init_code 'wxRuby_AppendMarker(wxRuby_markRbStreams);'
377
382
  end
378
383
 
379
384
  def process(gendoc: false)
@@ -83,6 +83,13 @@ module WXRuby3
83
83
  return Qnil;
84
84
  }
85
85
 
86
+ // Log a Wx error Message to the current Wx log output and abort
87
+ static VALUE log_fatal_error(int argc, VALUE *argv, VALUE self)
88
+ {
89
+ do_log(wxLOG_FatalError, argc, argv);
90
+ return Qnil;
91
+ }
92
+
86
93
  // Log a Wx low prio Message to the current Wx log output
87
94
  static VALUE log_info(int argc, VALUE *argv, VALUE self)
88
95
  {
@@ -264,6 +271,7 @@ module WXRuby3
264
271
  spec.add_init_code <<~__HEREDOC
265
272
  rb_define_module_function(mWxFunctions, "log_generic", VALUEFUNC(log_generic), -1);
266
273
  rb_define_module_function(mWxFunctions, "log_info", VALUEFUNC(log_info), -1);
274
+ rb_define_module_function(mWxFunctions, "log_fatal_error", VALUEFUNC(log_info), -1);
267
275
  rb_define_module_function(mWxFunctions, "log_verbose", VALUEFUNC(log_verbose), -1);
268
276
  rb_define_module_function(mWxFunctions, "log_message", VALUEFUNC(log_message), -1);
269
277
  rb_define_module_function(mWxFunctions, "log_warning", VALUEFUNC(log_warning), -1);
@@ -39,9 +39,7 @@ module WXRuby3
39
39
  spec.ignore('wxGridCellAttr::GetEditorPtr',
40
40
  'wxGridCellAttr::GetRendererPtr')
41
41
  # these require wxRuby to take ownership (ref counted)
42
- spec.new_object('wxGridCellAttr::Clone',
43
- 'wxGridCellAttr::GetEditor',
44
- 'wxGridCellAttr::GetRenderer')
42
+ spec.new_object('wxGridCellAttr::Clone')
45
43
  # type mapping for wxGridCellEditor* return ref
46
44
  spec.map 'wxGridCellEditor*' => 'Wx::GRID::GridCellEditor' do
47
45
  add_header_code 'extern VALUE wxRuby_WrapWxGridCellEditorInRuby(const wxGridCellEditor *wx_gce);',
@@ -39,6 +39,9 @@ module WXRuby3
39
39
  VALUE rb_gce = wxRuby_GridCellEditorInstance(const_cast<wxGridCellEditor*> (wx_gce));
40
40
  if (rb_gce && !NIL_P(rb_gce))
41
41
  {
42
+ // as this editor got passed from C++ it wll have incremented it's reference counter
43
+ // decrease that here; if we pass it back to C++ we will increase there
44
+ const_cast<wxGridCellEditor*> (wx_gce)->DecRef();
42
45
  return rb_gce;
43
46
  }
44
47
 
@@ -98,19 +101,24 @@ module WXRuby3
98
101
  }
99
102
 
100
103
  // Otherwise, retrieve the swig type info for this class and wrap it
101
- // in Ruby. Make it owned to manage the ref count if GC claims the object.
104
+ // in Ruby.
105
+ // As this editor was created in C++ it seems we have no registration yet
106
+ // but the reference counter will be at least 2 now (1 for C++ owner and 1
107
+ // increment for returning to us).
108
+ // We will now register a new Ruby object, keep it disowned and decrement
109
+ // for now. If passing to C++ again we will increment there.
102
110
  // wxRuby_GetSwigTypeForClass is defined in wx.i
103
111
  swig_type_info* swig_type = wxRuby_GetSwigTypeForClass(r_class);
104
112
  rb_gce = SWIG_NewPointerObj(const_cast<void*> (ptr), swig_type, 0);
105
113
  wxRuby_RegisterGridCellEditor(const_cast<wxGridCellEditor*> (wx_gce), rb_gce);
114
+ const_cast<wxGridCellEditor*> (wx_gce)->DecRef();
106
115
  return rb_gce;
107
116
  }
108
117
 
109
118
  extern void GC_free_GridCellEditor(void *ptr)
110
119
  {
111
- wxGridCellEditor* gc_edt = (wxGridCellEditor*)ptr;
112
- if (ptr)
113
- gc_edt->DecRef();
120
+ wxGridCellEditor* gc_edt = (wxGridCellEditor*)ptr;
121
+ wxSafeDecRef(gc_edt);
114
122
  }
115
123
  __CODE
116
124
  elsif spec.module_name == 'wxGridCellActivatableEditor'
@@ -147,7 +155,7 @@ module WXRuby3
147
155
  spec.override_inheritance_chain(spec.module_name, %w[wxGridCellEditor])
148
156
  end
149
157
  # due to the flawed wxWidgets XML docs we need to explicitly add these here
150
- # otherwise the derived editors won't be allocable due to pure virtuals
158
+ # otherwise the derived editors won't be allocatable due to pure virtuals
151
159
  spec.extend_interface spec.module_name,
152
160
  'void BeginEdit(int row, int col, wxGrid *grid)',
153
161
  'wxGridCellEditor * Clone() const',
@@ -157,13 +165,7 @@ module WXRuby3
157
165
  'void Reset()',
158
166
  'wxString GetValue() const'
159
167
  end
160
- unless spec.module_name == 'wxGridCellEditor'
161
- # type mapping for Clone return ref
162
- spec.map 'wxGridCellEditor*' => 'Wx::GRID::GridCellEditor' do
163
- add_header_code 'extern VALUE wxRuby_WrapWxGridCellEditorInRuby(const wxGridCellEditor *wx_gce);'
164
- map_out code: '$result = wxRuby_WrapWxGridCellEditorInRuby($1);'
165
- end
166
- end
168
+ spec.new_object "#{spec.module_name}::Clone"
167
169
  # handled; can be suppressed
168
170
  spec.suppress_warning(473, "#{spec.module_name}::Clone")
169
171
  end
@@ -38,6 +38,9 @@ module WXRuby3
38
38
  VALUE rb_gcr = wxRuby_GridCellRendererInstance(const_cast<wxGridCellRenderer*> (wx_gcr));
39
39
  if (rb_gcr && !NIL_P(rb_gcr))
40
40
  {
41
+ // as this renderer got passed from C++ it wll have incremented it's reference counter
42
+ // decrease that here; if we pass it back to C++ we will increase there
43
+ const_cast<wxGridCellRenderer*> (wx_gcr)->DecRef();
41
44
  return rb_gcr;
42
45
  }
43
46
 
@@ -94,11 +97,17 @@ module WXRuby3
94
97
  }
95
98
 
96
99
  // Otherwise, retrieve the swig type info for this class and wrap it
97
- // in Ruby. Make it owned to manage the ref count if GC claims the object.
100
+ // in Ruby.
101
+ // As this renderer was created in C++ it seems we have no registration yet
102
+ // but the reference counter will be at least 2 now (1 for C++ owner and 1
103
+ // increment for returning to us).
104
+ // We will now register a new Ruby object, keep it disowned and decrement
105
+ // for now. If passing to C++ again we will increment there.
98
106
  // wxRuby_GetSwigTypeForClass is defined in wx.i
99
107
  swig_type_info* swig_type = wxRuby_GetSwigTypeForClass(r_class);
100
108
  rb_gcr = SWIG_NewPointerObj(const_cast<void*> (ptr), swig_type, 0);
101
109
  wxRuby_RegisterGridCellRenderer(const_cast<wxGridCellRenderer*> (wx_gcr), rb_gcr);
110
+ const_cast<wxGridCellRenderer*> (wx_gcr)->DecRef();
102
111
  return rb_gcr;
103
112
  }
104
113
 
@@ -126,13 +135,7 @@ module WXRuby3
126
135
  'virtual wxSize GetBestSize(wxGrid &grid, wxGridCellAttr &attr, wxDC &dc, int row, int col)'
127
136
  spec.force_proxy spec.module_name
128
137
  end
129
- unless spec.module_name == 'wxGridCellRenderer'
130
- # type mapping for Clone return ref
131
- spec.map 'wxGridCellRenderer*' => 'Wx::GRID::GridCellRenderer' do
132
- add_header_code 'extern VALUE wxRuby_WrapWxGridCellRendererInRuby(const wxGridCellRenderer *wx_gcr);'
133
- map_out code: '$result = wxRuby_WrapWxGridCellRendererInRuby($1);'
134
- end
135
- end
138
+ spec.new_object "#{spec.module_name}::Clone"
136
139
  # handled; can be suppressed
137
140
  spec.suppress_warning(473, "#{spec.module_name}::Clone")
138
141
  end