wxruby3 1.3.0 → 1.4.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/INSTALL.md +16 -12
- data/README.md +4 -3
- data/ext/wxruby3/include/wxRubyApp.h +9 -9
- data/ext/wxruby3/swig/custom/director.swg +11 -3
- data/ext/wxruby3/swig/custom/rubyapi.swg +15 -1
- data/ext/wxruby3/swig/mark_free_impl.i +47 -11
- data/ext/wxruby3/swig/wx.i +30 -12
- data/lib/wx/aui/auifloatframe.rb +1 -1
- data/lib/wx/aui/auimanager.rb +50 -14
- data/lib/wx/aui/auinotebook.rb +1 -1
- data/lib/wx/aui/require.rb +0 -2
- data/lib/wx/core/acceleratortable.rb +1 -1
- data/lib/wx/core/animation.rb +2 -2
- data/lib/wx/core/app.rb +1 -1
- data/lib/wx/core/array_ext.rb +1 -0
- data/lib/wx/core/artprovider.rb +4 -4
- data/lib/wx/core/bitmap.rb +1 -1
- data/lib/wx/core/bitmap_combobox.rb +2 -2
- data/lib/wx/core/brush.rb +8 -0
- data/lib/wx/core/clientdc.rb +1 -1
- data/lib/wx/core/clipboard.rb +4 -4
- data/lib/wx/core/colour.rb +1 -1
- data/lib/wx/core/combobox.rb +1 -1
- data/lib/wx/core/config.rb +7 -7
- data/lib/wx/core/controlwithitems.rb +3 -3
- data/lib/wx/core/data_object.rb +4 -4
- data/lib/wx/core/dataformat.rb +9 -3
- data/lib/wx/core/defs.rb +49 -0
- data/lib/wx/core/dialog.rb +3 -2
- data/lib/wx/core/enum.rb +16 -3
- data/lib/wx/core/event.rb +3 -3
- data/lib/wx/core/evthandler.rb +317 -289
- data/lib/wx/core/file_dialog.rb +1 -1
- data/lib/wx/core/find_replace_dialog.rb +2 -2
- data/lib/wx/core/font.rb +14 -0
- data/lib/wx/core/functions.rb +1 -1
- data/lib/wx/core/genericdirctrl.rb +1 -1
- data/lib/wx/core/geometry.rb +2 -2
- data/lib/wx/core/graphics_pen_info.rb +1 -1
- data/lib/wx/core/hboxsizer.rb +24 -4
- data/lib/wx/core/helpprovider.rb +1 -1
- data/lib/wx/core/icon.rb +1 -1
- data/lib/wx/core/image.rb +2 -2
- data/lib/wx/core/imagelist.rb +1 -1
- data/lib/wx/core/locale.rb +5 -5
- data/lib/wx/core/log.rb +8 -8
- data/lib/wx/core/menu.rb +3 -3
- data/lib/wx/core/module_ext.rb +16 -0
- data/lib/wx/core/owner_drawn_combobox.rb +3 -3
- data/lib/wx/core/pen.rb +20 -0
- data/lib/wx/core/pen_info.rb +1 -1
- data/lib/wx/core/persistence_manager.rb +2 -2
- data/lib/wx/core/real_point.rb +1 -0
- data/lib/wx/core/rect.rb +1 -1
- data/lib/wx/core/secret_store.rb +1 -1
- data/lib/wx/core/simplehelpprovider.rb +1 -1
- data/lib/wx/core/sizer.rb +166 -39
- data/lib/wx/core/splash_screen.rb +1 -1
- data/lib/wx/core/standard_paths.rb +1 -1
- data/lib/wx/core/task_bar_button.rb +1 -1
- data/lib/wx/core/text_entry.rb +1 -1
- data/lib/wx/core/textctrl.rb +2 -2
- data/lib/wx/core/timer.rb +2 -2
- data/lib/wx/core/tree_ctrl.rb +1 -1
- data/lib/wx/core/v_list_box.rb +1 -1
- data/lib/wx/core/validator.rb +2 -2
- data/lib/wx/core/variant.rb +2 -2
- data/lib/wx/core/vboxsizer.rb +24 -4
- data/lib/wx/core/window.rb +48 -2
- data/lib/wx/core/xmlresource.rb +4 -4
- data/lib/wx/core.rb +2 -0
- data/lib/wx/doc/array_ext.rb +1 -0
- data/lib/wx/doc/aui/auimanager.rb +2 -0
- data/lib/wx/doc/enum.rb +26 -0
- data/lib/wx/doc/evthandler.rb +1 -0
- data/lib/wx/doc/gdi_common.rb +1 -0
- data/lib/wx/doc/tip_window.rb +22 -0
- data/lib/wx/grid/grid.rb +3 -3
- data/lib/wx/grid/require.rb +0 -2
- data/lib/wx/html/htmlhelpcontroller.rb +1 -1
- data/lib/wx/html/htmlwindow.rb +1 -1
- data/lib/wx/html/require.rb +0 -2
- data/lib/wx/html/simple_html_listbox.rb +3 -3
- data/lib/wx/keyword_ctors.rb +14 -7
- data/lib/wx/keyword_defs.rb +7 -7
- data/lib/wx/pg/pg_properties.rb +1 -1
- data/lib/wx/pg/pg_property.rb +3 -3
- data/lib/wx/pg/property_grid.rb +2 -2
- data/lib/wx/pg/property_grid_interface.rb +2 -2
- data/lib/wx/pg/require.rb +0 -2
- data/lib/wx/prt/previewframe.rb +1 -1
- data/lib/wx/prt/require.rb +0 -2
- data/lib/wx/rbn/ribbon_control.rb +1 -1
- data/lib/wx/rbn/ribbon_page.rb +1 -1
- data/lib/wx/rbn/ribbon_panel.rb +1 -1
- data/lib/wx/rtc/require.rb +0 -2
- data/lib/wx/rtc/rich_text_composite_object.rb +1 -1
- data/lib/wx/rtc/rich_text_ctrl.rb +1 -1
- data/lib/wx/rtc/rich_text_paragraph.rb +1 -1
- data/lib/wx/rtc/richtext_buffer.rb +3 -3
- data/lib/wx/rtc/richtext_formatting_dialog.rb +2 -2
- data/lib/wx/rtc/richtext_style_organiser_dialog.rb +1 -1
- data/lib/wx/rtc/symbol_picker_dialog.rb +1 -1
- data/lib/wx/stc/require.rb +0 -2
- data/lib/wx/stc/styled_text_ctrl.rb +1 -1
- data/lib/wx/version.rb +1 -1
- data/lib/wx/wxruby/base.rb +8 -2
- data/lib/wx/wxruby/cmd/setup.rb +61 -37
- data/rakelib/gem.rb +8 -4
- data/rakelib/lib/config/mingw.rb +1 -1
- data/rakelib/lib/core/include/swigrubyrun.inc +2 -2
- data/rakelib/lib/director/about_dialog_info.rb +1 -0
- data/rakelib/lib/director/aui_manager.rb +124 -3
- data/rakelib/lib/director/aui_notebook.rb +7 -0
- data/rakelib/lib/director/colour.rb +1 -1
- data/rakelib/lib/director/data_format.rb +1 -1
- data/rakelib/lib/director/dialog.rb +4 -2
- data/rakelib/lib/director/event.rb +1 -0
- data/rakelib/lib/director/event_handler.rb +82 -46
- data/rakelib/lib/director/functions.rb +0 -3
- data/rakelib/lib/director/list_ctrl.rb +14 -10
- data/rakelib/lib/director/locale.rb +2 -0
- data/rakelib/lib/director/num_validator.rb +7 -0
- data/rakelib/lib/director/pgproperties.rb +2 -2
- data/rakelib/lib/director/property_grid_interface.rb +4 -3
- data/rakelib/lib/director/textctrl.rb +7 -0
- data/rakelib/lib/director/tip_window.rb +34 -0
- data/rakelib/lib/director/variant.rb +2 -2
- data/rakelib/lib/director/window.rb +9 -1
- data/rakelib/lib/director.rb +0 -1
- data/rakelib/lib/extractor/function.rb +5 -0
- data/rakelib/lib/generate/doc/evt_handler.yaml +31 -12
- data/rakelib/lib/specs/interfaces.rb +1 -0
- data/rakelib/lib/typemap/common.rb +2 -2
- data/samples/dialogs/dialogs.rb +1 -1
- data/tests/test_combo_ctrl.rb +1 -0
- data/tests/test_event_handling.rb +158 -31
- metadata +7 -5
|
@@ -29,45 +29,21 @@ module WXRuby3
|
|
|
29
29
|
# have TryBefore and TryAfter to handle this much cleaner
|
|
30
30
|
spec.no_proxy 'wxEvtHandler::ProcessEvent'
|
|
31
31
|
spec.regard('wxEvtHandler::ProcessEvent', regard_doc: false) # we provide customized docs
|
|
32
|
+
# Do not see much use for allowing overrides for these either as wxWidgets do not either
|
|
33
|
+
spec.no_proxy 'wxEvtHandler::QueueEvent',
|
|
34
|
+
'wxEvtHandler::AddPendingEvent'
|
|
35
|
+
# Do not see much point in allowing/supporting these to be overridden
|
|
36
|
+
spec.no_proxy 'wxEvtHandler::SetNextHandler',
|
|
37
|
+
'wxEvtHandler::SetPreviousHandler'
|
|
38
|
+
# no doc for set_previous_handler
|
|
39
|
+
spec.regard('wxEvtHandler::SetPreviousHandler', regard_doc: false)
|
|
32
40
|
# make SWIG aware of these
|
|
33
41
|
spec.regard 'wxEvtHandler::TryBefore', 'wxEvtHandler::TryAfter'
|
|
34
42
|
# Special type mapping for wxEvtHandler::QueueEvent which assumes ownership of the C++ event.
|
|
35
|
-
# We need to
|
|
36
|
-
#
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
# Queued (pending) events are cleaned up (deleted) by wxWidgets after (failing) handling
|
|
40
|
-
# which will automatically unlink and un-track them releasing the Ruby instance to be GC-ed.
|
|
41
|
-
spec.map 'wxEvent *event' => 'Wx::Event' do
|
|
42
|
-
map_in code: <<~__CODE
|
|
43
|
-
// get the wrapped wxEvent*
|
|
44
|
-
wxEvent *wx_ev = (wxEvent*)DATA_PTR($input);
|
|
45
|
-
// check if this a user defined event
|
|
46
|
-
if ( wx_ev->GetEventType() > wxEVT_USER_FIRST )
|
|
47
|
-
{
|
|
48
|
-
// we need to preserve the Ruby state
|
|
49
|
-
// create a shallow copy of the Ruby object
|
|
50
|
-
VALUE r_evt_copy = rb_obj_clone($input);
|
|
51
|
-
// pass the wxEvent* over to the copy
|
|
52
|
-
DATA_PTR(r_evt_copy) = wx_ev;
|
|
53
|
-
// unlink the input
|
|
54
|
-
DATA_PTR($input) = 0;
|
|
55
|
-
// track the copy (this overwrites the record for the
|
|
56
|
-
// original, effectively untracking it)
|
|
57
|
-
wxRuby_AddTracking( (void*)wx_ev, r_evt_copy);
|
|
58
|
-
}
|
|
59
|
-
else
|
|
60
|
-
{
|
|
61
|
-
// std wx event; no need to preserve the Ruby state
|
|
62
|
-
// simply untrack and unlink the input
|
|
63
|
-
wxRuby_RemoveTracking( (void*)wx_ev);
|
|
64
|
-
DATA_PTR($input) = 0;
|
|
65
|
-
// and just pass on the C++ event
|
|
66
|
-
}
|
|
67
|
-
// Queue the C++ event
|
|
68
|
-
$1 = wx_ev;
|
|
69
|
-
__CODE
|
|
70
|
-
end
|
|
43
|
+
# We need to disown Ruby with respect to the C++ event object but remain tracking the pair to keep
|
|
44
|
+
# the Ruby event object alive.
|
|
45
|
+
spec.disown 'wxEvent *event'
|
|
46
|
+
|
|
71
47
|
# add special mapping for event filters so we can accept the app instance as well
|
|
72
48
|
# although Wx::App is not derived from Wx::EventFilter in wxRuby (no multiple inheritance)
|
|
73
49
|
spec.map 'wxEventFilter*' => 'Wx::EventFilter,Wx::App' do
|
|
@@ -225,6 +201,10 @@ module WXRuby3
|
|
|
225
201
|
}
|
|
226
202
|
__HEREDOC
|
|
227
203
|
spec.add_header_code <<~__HEREDOC
|
|
204
|
+
static VALUE WxRuby_GetAsyncProcCallEvent_Class();
|
|
205
|
+
static void GC_mark_AsyncMethodCallEvent(void *ptr);
|
|
206
|
+
static void free_AsyncMethodCallEvent(void *ptr);
|
|
207
|
+
|
|
228
208
|
class RbAsyncProcCallEvent : public wxAsyncMethodCallEvent
|
|
229
209
|
{
|
|
230
210
|
public:
|
|
@@ -245,7 +225,14 @@ module WXRuby3
|
|
|
245
225
|
|
|
246
226
|
virtual wxEvent *Clone() const wxOVERRIDE
|
|
247
227
|
{
|
|
248
|
-
|
|
228
|
+
RbAsyncProcCallEvent* wx_ev = new RbAsyncProcCallEvent(*this);
|
|
229
|
+
// Create a new Ruby event object (owned)
|
|
230
|
+
VALUE rb_evt = Data_Wrap_Struct(WxRuby_GetAsyncProcCallEvent_Class(),
|
|
231
|
+
VOIDFUNC(GC_mark_AsyncMethodCallEvent),
|
|
232
|
+
VOIDFUNC(free_AsyncMethodCallEvent),
|
|
233
|
+
wx_ev);
|
|
234
|
+
wxRuby_AddTracking( (void*)wx_ev, rb_evt);
|
|
235
|
+
return wx_ev;
|
|
249
236
|
}
|
|
250
237
|
|
|
251
238
|
virtual void Execute() wxOVERRIDE
|
|
@@ -257,12 +244,22 @@ module WXRuby3
|
|
|
257
244
|
if (TYPE(m_rb_call) == T_ARRAY)
|
|
258
245
|
{
|
|
259
246
|
VALUE proc = rb_ary_entry(m_rb_call, 0);
|
|
260
|
-
|
|
261
|
-
|
|
247
|
+
if (RARRAY_LEN(m_rb_call) > 1)
|
|
248
|
+
{
|
|
249
|
+
VALUE args = rb_ary_subseq(m_rb_call, 1, RARRAY_LEN(m_rb_call)-1);
|
|
250
|
+
rc = wxRuby_Funcall(ex_caught, proc, call_id(), args);
|
|
251
|
+
}
|
|
252
|
+
else
|
|
253
|
+
{
|
|
254
|
+
rc = wxRuby_Funcall(ex_caught, proc, call_id(), (int)0);
|
|
255
|
+
}
|
|
262
256
|
}
|
|
263
257
|
else
|
|
264
258
|
{
|
|
265
|
-
|
|
259
|
+
// should never happen
|
|
260
|
+
VALUE ex = rb_eval_string("x = RuntimeError.new('UNEXPECTED ERROR: Asynchronous Proc Event has invalid call spec!'); x.set_backtrace(caller); x");
|
|
261
|
+
wxRuby_PrintException(ex);
|
|
262
|
+
exit(1);
|
|
266
263
|
}
|
|
267
264
|
if (ex_caught)
|
|
268
265
|
{
|
|
@@ -276,9 +273,39 @@ module WXRuby3
|
|
|
276
273
|
}
|
|
277
274
|
}
|
|
278
275
|
|
|
276
|
+
void GC_Mark()
|
|
277
|
+
{
|
|
278
|
+
rb_gc_mark(m_rb_call);
|
|
279
|
+
}
|
|
280
|
+
|
|
279
281
|
private:
|
|
280
282
|
VALUE m_rb_call;
|
|
281
283
|
};
|
|
284
|
+
|
|
285
|
+
static void GC_mark_AsyncMethodCallEvent(void *ptr)
|
|
286
|
+
{
|
|
287
|
+
if (ptr)
|
|
288
|
+
{
|
|
289
|
+
RbAsyncProcCallEvent* evt = (RbAsyncProcCallEvent*)ptr;
|
|
290
|
+
evt->GC_Mark();
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
static void free_AsyncMethodCallEvent(void *ptr)
|
|
295
|
+
{
|
|
296
|
+
RbAsyncProcCallEvent *wx_evt = (RbAsyncProcCallEvent *)ptr;
|
|
297
|
+
delete wx_evt;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
static VALUE WxRuby_GetAsyncProcCallEvent_Class()
|
|
301
|
+
{
|
|
302
|
+
static VALUE WxRuby_cAsyncProcCallEvent = Qnil;
|
|
303
|
+
if (WxRuby_cAsyncProcCallEvent == Qnil)
|
|
304
|
+
{
|
|
305
|
+
WxRuby_cAsyncProcCallEvent = rb_eval_string("Wx::AsyncProcCallEvent");
|
|
306
|
+
}
|
|
307
|
+
return WxRuby_cAsyncProcCallEvent;
|
|
308
|
+
}
|
|
282
309
|
__HEREDOC
|
|
283
310
|
spec.add_extend_code 'wxEvtHandler', <<~__HEREDOC
|
|
284
311
|
// This provides the public Ruby 'connect' method
|
|
@@ -333,18 +360,23 @@ module WXRuby3
|
|
|
333
360
|
void call_after(VALUE call)
|
|
334
361
|
{
|
|
335
362
|
// valid call object?
|
|
336
|
-
VALUE proc;
|
|
337
|
-
if (
|
|
338
|
-
(rb_obj_is_kind_of(proc
|
|
363
|
+
VALUE proc = TYPE(call) == T_ARRAY ? rb_ary_entry(call, 0) : Qnil;
|
|
364
|
+
if (!NIL_P(proc) &&
|
|
365
|
+
(rb_obj_is_kind_of(proc, rb_cProc)
|
|
339
366
|
||
|
|
340
367
|
rb_obj_is_kind_of(proc, rb_cMethod)))
|
|
341
368
|
{
|
|
342
369
|
// create C++ event
|
|
343
370
|
RbAsyncProcCallEvent * evt = new RbAsyncProcCallEvent(self, call);
|
|
371
|
+
// Create a new Ruby event object (leave ownership to wxWidgets C++)
|
|
372
|
+
VALUE rb_evt = Data_Wrap_Struct(WxRuby_GetAsyncProcCallEvent_Class(),
|
|
373
|
+
VOIDFUNC(GC_mark_AsyncMethodCallEvent),
|
|
374
|
+
0,
|
|
375
|
+
evt);
|
|
344
376
|
// track it and the call object
|
|
345
|
-
wxRuby_AddTracking( (void*)evt,
|
|
346
|
-
// queue it
|
|
347
|
-
self->QueueEvent(evt);
|
|
377
|
+
wxRuby_AddTracking( (void*)evt, rb_evt);
|
|
378
|
+
// queue it (wxWidgets takes ownership of C++ event object)
|
|
379
|
+
self->wxEvtHandler::QueueEvent(evt);
|
|
348
380
|
}
|
|
349
381
|
}
|
|
350
382
|
__HEREDOC
|
|
@@ -371,6 +403,10 @@ module WXRuby3
|
|
|
371
403
|
def_item = defmod.find_item(citem)
|
|
372
404
|
if Extractor::ClassDef === def_item && spec.is_derived_from?(def_item, 'wxEvtHandler')
|
|
373
405
|
spec.no_proxy "#{spec.class_name(citem)}::ProcessEvent"
|
|
406
|
+
spec.no_proxy "#{spec.class_name(citem)}::QueueEvent"
|
|
407
|
+
spec.no_proxy "#{spec.class_name(citem)}::AddPendingEvent"
|
|
408
|
+
spec.no_proxy "#{spec.class_name(citem)}::SetNextHandler"
|
|
409
|
+
spec.no_proxy "#{spec.class_name(citem)}::SetPreviousHandler"
|
|
374
410
|
is_evt_handler = true
|
|
375
411
|
end
|
|
376
412
|
end
|
|
@@ -204,9 +204,6 @@ module WXRuby3
|
|
|
204
204
|
spec.add_interface_code <<~__HEREDOC
|
|
205
205
|
bool wxSafeYield(wxWindow* win = NULL, bool onlyIfNeeded = false);
|
|
206
206
|
|
|
207
|
-
// Mouse / keyboard information
|
|
208
|
-
wxWindow * wxGetActiveWindow();
|
|
209
|
-
|
|
210
207
|
// Dialog shortcuts
|
|
211
208
|
wxString wxFileSelector (const wxString &message,
|
|
212
209
|
const wxString &default_path=wxEmptyString,
|
|
@@ -148,7 +148,7 @@ module WXRuby3
|
|
|
148
148
|
|
|
149
149
|
wxListCtrl* wx_lc = (wxListCtrl*) ptr;
|
|
150
150
|
|
|
151
|
-
// First check if there
|
|
151
|
+
// First check if there are ImageLists and mark if found
|
|
152
152
|
wxImageList* img_list;
|
|
153
153
|
img_list= wx_lc->GetImageList(wxIMAGE_LIST_NORMAL);
|
|
154
154
|
if ( img_list ) rb_gc_mark(SWIG_RubyInstanceFor(img_list));
|
|
@@ -161,18 +161,22 @@ module WXRuby3
|
|
|
161
161
|
if ( wx_lc->GetWindowStyle() & wxLC_VIRTUAL )
|
|
162
162
|
return;
|
|
163
163
|
|
|
164
|
-
|
|
165
|
-
if (
|
|
166
|
-
|
|
167
|
-
for (int i = 0; i < count; ++i)
|
|
164
|
+
// only mark items if window fully created
|
|
165
|
+
if (wx_lc->GetId() != wxID_ANY)
|
|
168
166
|
{
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
167
|
+
int count = wx_lc->GetItemCount();
|
|
168
|
+
if ( count == 0 ) return;
|
|
169
|
+
|
|
170
|
+
for (int i = 0; i < count; ++i)
|
|
172
171
|
{
|
|
173
|
-
|
|
172
|
+
wxUIntPtr data = wx_lc->GetItemData(i);
|
|
173
|
+
VALUE object = reinterpret_cast<VALUE> (data);
|
|
174
|
+
if ( object && object != Qnil )
|
|
175
|
+
{
|
|
176
|
+
rb_gc_mark(object);
|
|
177
|
+
}
|
|
174
178
|
}
|
|
175
|
-
}
|
|
179
|
+
}
|
|
176
180
|
}
|
|
177
181
|
__HEREDOC
|
|
178
182
|
spec.add_extend_code 'wxListCtrl', <<~__HEREDOC
|
|
@@ -370,6 +370,13 @@ module WXRuby3
|
|
|
370
370
|
spec.new_object 'WXIntegerValidator::Clone',
|
|
371
371
|
'WXUnsignedValidator::Clone',
|
|
372
372
|
'WXFloatValidator::Clone'
|
|
373
|
+
%w[WXIntegerValidator WXUnsignedValidator WXFloatValidator].each do |klass|
|
|
374
|
+
spec.no_proxy "#{klass}::ProcessEvent"
|
|
375
|
+
spec.no_proxy "#{klass}::QueueEvent"
|
|
376
|
+
spec.no_proxy "#{klass}::AddPendingEvent"
|
|
377
|
+
spec.no_proxy "#{klass}::SetNextHandler"
|
|
378
|
+
spec.no_proxy "#{klass}::SetPreviousHandler"
|
|
379
|
+
end
|
|
373
380
|
spec.suppress_warning(473,
|
|
374
381
|
'WXIntegerValidator::Clone',
|
|
375
382
|
'WXUnsignedValidator::Clone',
|
|
@@ -141,7 +141,7 @@ module WXRuby3
|
|
|
141
141
|
spec.map_apply 'int * OUTPUT' => 'int* pIndex'
|
|
142
142
|
end
|
|
143
143
|
# for UIntProperty and IntProperty
|
|
144
|
-
if Config.instance.features_set?('USE_LONGLONG')
|
|
144
|
+
if Config.instance.features_set?('USE_LONGLONG') || Config.instance.wx_version >= '3.3.0'
|
|
145
145
|
# wxLongLong mapping to be considered before considering 'long' (see typecheck precedence)
|
|
146
146
|
spec.map 'const wxLongLong&' => 'Integer' do
|
|
147
147
|
map_in temp: 'wxLongLong tmp', code: <<~__CODE
|
|
@@ -162,7 +162,7 @@ module WXRuby3
|
|
|
162
162
|
end
|
|
163
163
|
else
|
|
164
164
|
spec.ignore 'wxUIntProperty::wxUIntProperty(const wxString &, const wxString &, const wxULongLong &)',
|
|
165
|
-
'wxIntProperty::
|
|
165
|
+
'wxIntProperty::wxIntProperty(const wxString &, const wxString &, const wxLongLong &)'
|
|
166
166
|
end
|
|
167
167
|
spec.new_object 'wxArrayStringProperty::CreateEditorDialog'
|
|
168
168
|
spec.suppress_warning(473, 'wxArrayStringProperty::CreateEditorDialog')
|
|
@@ -39,9 +39,10 @@ module WXRuby3
|
|
|
39
39
|
spec.extend_interface 'wxPropertyGridInterface',
|
|
40
40
|
'void SetPropertyValues(const wxVariant &list, const wxPGPropArgCls& defaultCategory = 0)'
|
|
41
41
|
# optionals
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
unless Config.instance.features_set?('USE_LONGLONG') || Config.instance.wx_version >= '3.3.0'
|
|
43
|
+
spec.ignore_unless 'wxPropertyGridInterface::GetPropertyValueAsLongLong',
|
|
44
|
+
'wxPropertyGridInterface::GetPropertyValueAsULongLong'
|
|
45
|
+
end
|
|
45
46
|
spec.ignore_unless 'USE_DATETIME', 'wxPropertyGridInterface::GetPropertyValueAsDateTime'
|
|
46
47
|
spec.ignore_unless 'USE_VALIDATORS', 'wxPropertyGridInterface::GetPropertyValidator'
|
|
47
48
|
# fix incorrect XML documentation
|
|
@@ -24,6 +24,13 @@ module WXRuby3
|
|
|
24
24
|
spec.ignore 'wxTextCtrl::GTKGetTextBuffer',
|
|
25
25
|
'wxTextCtrl::GTKGetEditable'
|
|
26
26
|
end
|
|
27
|
+
if Config.instance.wx_version >= '3.3.0' && Config.instance.wx_port == :wxmsw
|
|
28
|
+
spec.items << 'wxTextSearch' << 'wxTextSearchResult'
|
|
29
|
+
spec.regard 'wxTextSearchResult::m_start', 'wxTextSearchResult::m_end'
|
|
30
|
+
spec.make_readonly 'wxTextSearchResult::m_start', 'wxTextSearchResult::m_end'
|
|
31
|
+
spec.rename_for_ruby 'start' => 'wxTextSearchResult::m_start',
|
|
32
|
+
'end' => 'wxTextSearchResult::m_end'
|
|
33
|
+
end
|
|
27
34
|
if Config.instance.wx_port == :wxqt
|
|
28
35
|
# not implemented
|
|
29
36
|
spec.ignore 'wxTextCtrl::OnDropFiles'
|
|
@@ -0,0 +1,34 @@
|
|
|
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 './window'
|
|
10
|
+
|
|
11
|
+
module WXRuby3
|
|
12
|
+
|
|
13
|
+
class Director
|
|
14
|
+
|
|
15
|
+
class TipWindow < Window
|
|
16
|
+
|
|
17
|
+
def setup
|
|
18
|
+
super
|
|
19
|
+
spec.disable_proxies
|
|
20
|
+
spec.ignore 'wxTipWindow::SetTipWindowPtr'
|
|
21
|
+
spec.ignore 'wxTipWindow::wxTipWindow'
|
|
22
|
+
spec.add_extend_code 'wxTipWindow', <<~__HEREDOC
|
|
23
|
+
wxTipWindow(wxWindow* parent, const wxString& text, wxCoord maxLength = 100)
|
|
24
|
+
{
|
|
25
|
+
return new wxTipWindow(parent, text, maxLength);
|
|
26
|
+
}
|
|
27
|
+
__HEREDOC
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
@@ -142,7 +142,7 @@ module WXRuby3
|
|
|
142
142
|
{
|
|
143
143
|
return wxVariant(TYPE(rbval) == T_TRUE);
|
|
144
144
|
}
|
|
145
|
-
#
|
|
145
|
+
#if !defined(wxUSE_LONGLONG) || (wxUSE_LONGLONG == 1)
|
|
146
146
|
if ((sizeof(long) < 8) && (TYPE(rbval) == T_BIGNUM) && (rb_big_sign(rbval) == 0))
|
|
147
147
|
{
|
|
148
148
|
wxLongLong_t ll = rb_big2ll(rbval);
|
|
@@ -227,7 +227,7 @@ module WXRuby3
|
|
|
227
227
|
$1 = rb_obj_is_kind_of($input, rb_const_get(mWxPG, var_ColourPropertyValue_id()));
|
|
228
228
|
__CODE
|
|
229
229
|
end
|
|
230
|
-
if Config.instance.features_set?('USE_LONGLONG')
|
|
230
|
+
if Config.instance.features_set?('USE_LONGLONG') || Config.instance.wx_version >= '3.3.0'
|
|
231
231
|
# wxLongLong mapping to be considered before considering 'long' (see typecheck precedence)
|
|
232
232
|
spec.map 'wxLongLong' => 'Integer' do
|
|
233
233
|
map_in code: <<~__CODE
|
|
@@ -66,7 +66,6 @@ module WXRuby3
|
|
|
66
66
|
__CODE
|
|
67
67
|
end
|
|
68
68
|
spec.ignore [
|
|
69
|
-
'wxWindow::PopEventHandler',
|
|
70
69
|
'wxWindow::SetConstraints',
|
|
71
70
|
'wxWindow::GetHandle',
|
|
72
71
|
'wxWindow::GetSize(int *,int *) const', # no need; prefer the wxSize version
|
|
@@ -83,6 +82,15 @@ module WXRuby3
|
|
|
83
82
|
'wxWindow::Raise',
|
|
84
83
|
'wxWindow::Lower'
|
|
85
84
|
]
|
|
85
|
+
|
|
86
|
+
# Event handler chaining methods; pushed handlers always remain owned by Ruby
|
|
87
|
+
# wxRuby3 will automatically pop any remaining handlers when windows get deleted
|
|
88
|
+
# also ignore this
|
|
89
|
+
spec.ignore 'wxWindow::PopEventHandler', ignore_doc: false
|
|
90
|
+
# and instead add an argument-less version (will use default argument of C++ impl)
|
|
91
|
+
# as we do want C++ side to delete any popped handler
|
|
92
|
+
spec.extend_interface 'wxWindow', 'wxEvtHandler *PopEventHandler()'
|
|
93
|
+
|
|
86
94
|
# no real docs and can't find actual examples of usage; ignore
|
|
87
95
|
spec.ignore 'wxWindow::GetConstraints', 'wxWindow::SetConstraints'
|
|
88
96
|
# redefine these so a nil parent is accepted
|
data/rakelib/lib/director.rb
CHANGED
|
@@ -49,6 +49,9 @@ module WXRuby3
|
|
|
49
49
|
@template_params << txt
|
|
50
50
|
end
|
|
51
51
|
@args_string = element.at_xpath('argsstring').text
|
|
52
|
+
# transform unified initializers to ctor form (SWIG does not like unified initializers)
|
|
53
|
+
# (also see ParamDef#extract)
|
|
54
|
+
@args_string.gsub!(/(\w+(::\w+)*)\s*{([^}]*)}/) { |_| "#{$1}(#{$3})"}
|
|
52
55
|
check_deprecated
|
|
53
56
|
element.xpath('param').each do |node|
|
|
54
57
|
p = ParamDef.new(node)
|
|
@@ -370,6 +373,8 @@ module WXRuby3
|
|
|
370
373
|
end
|
|
371
374
|
if element.at_xpath('defval')
|
|
372
375
|
@default = BaseDef.flatten_node(element.at_xpath('defval'))
|
|
376
|
+
# transform unified initializers to ctor form (SWIG does not like unified initializers)
|
|
377
|
+
@default.sub!(/(\w+(::\w+)*)\s*{([^}]*)}/) { |_| "#{$1}(#{$3})"}
|
|
373
378
|
end
|
|
374
379
|
end
|
|
375
380
|
rescue Exception
|
|
@@ -6,23 +6,42 @@
|
|
|
6
6
|
- :pattern: !ruby/regexp /.*/
|
|
7
7
|
:replace: ''
|
|
8
8
|
:post:
|
|
9
|
-
- :pattern: !ruby/regexp
|
|
10
|
-
:subst: 'This implies'
|
|
11
|
-
- :pattern: !ruby/regexp /\{Wx::EvtHandler#queue_event\}.*For\s+example:/
|
|
9
|
+
- :pattern: !ruby/regexp /\,\s+i\.e\.\s+it\s+will\s+delete\s+it\s+itself/
|
|
12
10
|
:subst: ''
|
|
13
|
-
- :pattern: !ruby/regexp /
|
|
11
|
+
- :pattern: !ruby/regexp /This\s+implies\s+that\s+the\s+event\s+should\s+be\s+allocated.*deleted\s+at\s+any\s+moment\)/
|
|
12
|
+
:subst: "This implies that the event (or any of it's member objects) should not be used/changed after the function returns (as it can be handled and subsequently discarded at any moment)"
|
|
13
|
+
- :pattern: !ruby/regexp /\{Wx::EvtHandler#queue_event\}.*not\s+used\s+by\s+the\s+calling\s+thread\s+any\s+more\./
|
|
14
|
+
:subst: ''
|
|
15
|
+
- :pattern: !ruby/regexp /Care\s+should\s+still\s+be\s+taken\s+to\s+avoid\s+that\s+some\s+fields.*/
|
|
16
|
+
:subst: ''
|
|
17
|
+
- :pattern: !ruby/regexp /Example:/
|
|
18
|
+
:subst: ''
|
|
19
|
+
- :pattern: !ruby/regexp /Note\s+that\s+if\s+you\s+want\s+to\s+pass\s+more\s+data.*/
|
|
20
|
+
:subst: ''
|
|
21
|
+
- :pattern: !ruby/regexp /Reimplemented\s+in.*/
|
|
22
|
+
:subst: ''
|
|
23
|
+
:wxEvtHandler.AddPendingEvent:
|
|
24
|
+
:detail:
|
|
25
|
+
:post:
|
|
26
|
+
- :pattern: !ruby/regexp /This\s+function\s+is\s+similar\s+to\s+\{Wx::EvtHandler#queue_event\}.*/
|
|
27
|
+
:subst: 'This function is similar to {Wx::EvtHandler#queue_event}.'
|
|
28
|
+
- :pattern: !ruby/regexp /A\s+copy\s+of\s+event\s+is\s+made\s+by\s+the\s+function,.*/
|
|
29
|
+
:subst: 'Other than {Wx::EvtHandler#queue_event} this method creates a (shallow) copy of event before queueing the copied event. In case (user defined) event classes require deep copying of Ruby member object these classes should override the #initialize_clone method (**NOT** #clone as wxRuby3 does not currently support overriding event class #clone methods).'
|
|
30
|
+
- :pattern: !ruby/regexp /Reimplemented\s+in.*/
|
|
14
31
|
:subst: ''
|
|
15
32
|
:wxEvtHandler.SetNextHandler:
|
|
33
|
+
:brief:
|
|
34
|
+
:post:
|
|
35
|
+
- :pattern: !ruby/regexp /Sets\s+the\s+pointer\s+to\s+the\s+next\s+handler\./
|
|
36
|
+
:subst: 'Inserts the given handler as the next handler in the chain.'
|
|
16
37
|
:detail:
|
|
17
38
|
:pre:
|
|
18
|
-
:
|
|
19
|
-
- :pattern: !ruby/regexp
|
|
20
|
-
:replace:
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
handlerB.set_previous_handler(handlerA)
|
|
25
|
-
```
|
|
39
|
+
:para:
|
|
40
|
+
- :pattern: !ruby/regexp /See.*ProcessEvent\(\)/
|
|
41
|
+
:replace: |
|
|
42
|
+
In wxRuby this fully handles double linking, i.e. wxRuby will take care of pointing the handler given
|
|
43
|
+
back to this handler as well. There is no need to call set_previous_handler so this method is not supported
|
|
44
|
+
in wxRuby3.
|
|
26
45
|
:wxEvtHandler.TryBefore:
|
|
27
46
|
:detail:
|
|
28
47
|
:pre:
|
|
@@ -201,6 +201,7 @@ module WXRuby3
|
|
|
201
201
|
Director.Spec(pkg, 'wxDragDrop', requirements: %w[USE_DRAG_AND_DROP])
|
|
202
202
|
Director.Spec(pkg, 'wxContextHelpButton', requirements: %w[USE_HELP])
|
|
203
203
|
Director.Spec(pkg, 'wxHelpProvider', requirements: %w[USE_HELP])
|
|
204
|
+
Director.Spec(pkg, 'wxTipWindow', requirements: %w[USE_HELP])
|
|
204
205
|
Director.Spec(pkg, 'wxHelpController', requirements: %w[USE_HELP])
|
|
205
206
|
Director.Spec(pkg, 'wxExtHelpController', director: Director::HelpController, requirements: %w[USE_HELP])
|
|
206
207
|
Director.Spec(pkg, 'wxTaskBarIconEvent', director: Director::Event, requirements: %w[USE_TASKBARICON])
|
|
@@ -364,7 +364,7 @@ module WXRuby3
|
|
|
364
364
|
}
|
|
365
365
|
__CODE
|
|
366
366
|
map_directorout code: <<~__CODE
|
|
367
|
-
if (TYPE($input)
|
|
367
|
+
if (TYPE($input) == T_ARRAY)
|
|
368
368
|
{
|
|
369
369
|
for (int i = 0; i < RARRAY_LEN($input); i++)
|
|
370
370
|
{
|
|
@@ -398,7 +398,7 @@ module WXRuby3
|
|
|
398
398
|
}
|
|
399
399
|
__CODE
|
|
400
400
|
map_directorout code: <<~__CODE
|
|
401
|
-
if (TYPE($input)
|
|
401
|
+
if (TYPE($input) == T_ARRAY)
|
|
402
402
|
{
|
|
403
403
|
for (int i = 0; i < RARRAY_LEN($input); i++)
|
|
404
404
|
{
|
data/samples/dialogs/dialogs.rb
CHANGED
|
@@ -167,7 +167,7 @@ module Dialogs
|
|
|
167
167
|
end
|
|
168
168
|
|
|
169
169
|
create(parent, -1, "Preferences")
|
|
170
|
-
create_buttons(Wx::
|
|
170
|
+
create_buttons(Wx::OK|Wx::CANCEL)
|
|
171
171
|
book_ctrl.set_images(imgs)
|
|
172
172
|
book_ctrl.add_page(file_panel(book_ctrl), "File", false, img_id1)
|
|
173
173
|
book_ctrl.add_page(cdrom_panel(book_ctrl), "CD ROM", false, img_id2)
|
data/tests/test_combo_ctrl.rb
CHANGED
|
@@ -23,6 +23,7 @@ class ComboCtrlCtrlTests < WxRuby::Test::GUITests
|
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
def create(parent)
|
|
26
|
+
GC.start
|
|
26
27
|
# need to finish creating the list view here
|
|
27
28
|
# as calling super here would just call Wx::ComboPopup#create and not Wx::ListView#create
|
|
28
29
|
# we need to use Ruby magic
|