wxruby3 0.9.0 → 0.9.1
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/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/core/const.rb +83 -0
- data/lib/wx/doc/const.rb +66 -66
- data/lib/wx/doc/event.rb +0 -6
- data/lib/wx/doc/functions.rb +9 -9
- data/lib/wx/doc/window.rb +5 -0
- data/lib/wx/keyword_defs.rb +43 -6
- data/lib/wx/version.rb +1 -1
- data/rakelib/lib/config/macosx.rb +1 -1
- 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 +5 -2
- data/rakelib/lib/core/parameter.rb +3 -0
- data/rakelib/lib/director/accelerator.rb +1 -1
- data/rakelib/lib/director/animation.rb +1 -1
- data/rakelib/lib/director/animation_ctrl.rb +20 -0
- data/rakelib/lib/director/app.rb +23 -5
- data/rakelib/lib/director/art_provider.rb +1 -1
- data/rakelib/lib/director/data_object_simple_base.rb +1 -2
- data/rakelib/lib/director/dialog.rb +5 -0
- data/rakelib/lib/director/dialup_event.rb +44 -0
- data/rakelib/lib/director/dialup_manager.rb +45 -0
- data/rakelib/lib/director/event.rb +20 -2
- data/rakelib/lib/director/file_ctrl.rb +35 -0
- data/rakelib/lib/director/file_ctrl_event.rb +26 -0
- data/rakelib/lib/director/gdicommon.rb +19 -1
- data/rakelib/lib/director/grid_cell_editor.rb +6 -6
- data/rakelib/lib/director/help_controller.rb +1 -1
- data/rakelib/lib/director/pgarray_editor_dialog.rb +0 -6
- data/rakelib/lib/director/pgeditor.rb +2 -2
- data/rakelib/lib/director/pgproperties.rb +2 -2
- data/rakelib/lib/director/richtext_buffer.rb +1 -1
- data/rakelib/lib/director/richtext_ctrl.rb +1 -1
- data/rakelib/lib/director/sash_event.rb +42 -0
- data/rakelib/lib/director/sizer.rb +64 -1
- data/rakelib/lib/director/sizer_item.rb +22 -0
- data/rakelib/lib/director/task_bar_icon.rb +1 -1
- data/rakelib/lib/director/tree_ctrl.rb +19 -44
- data/rakelib/lib/generate/doc/animation_ctrl.yaml +15 -0
- data/rakelib/lib/generate/doc/events.yaml +10 -4
- 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 +14 -3
- data/rakelib/lib/generate/interface.rb +4 -3
- data/rakelib/lib/specs/interfaces.rb +5 -1
- data/rakelib/lib/swig_runner.rb +4 -50
- data/rakelib/lib/typemap/common.rb +24 -9
- 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/samples/text/richtext.rb +0 -30
- 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_sizer.rb +43 -0
- data/tests/test_std_controls.rb +36 -0
- metadata +25 -4
- data/ext/wxruby3/swig/custom/swig3/rubyrun.swg +0 -456
@@ -54,7 +54,7 @@ module WXRuby3
|
|
54
54
|
int swig_res = SWIG_ConvertPtr(result, &ptr, $1_descriptor, 0 | SWIG_POINTER_DISOWN);
|
55
55
|
if (!SWIG_IsOK(swig_res))
|
56
56
|
{
|
57
|
-
Swig::DirectorTypeMismatchException::raise(rb_eTypeError,
|
57
|
+
Swig::DirectorTypeMismatchException::raise(swig_get_self(), "$symname", rb_eTypeError,
|
58
58
|
"create_popup_menu must return a Wx::Menu, or nil");
|
59
59
|
}
|
60
60
|
$result = reinterpret_cast < wxMenu * > (ptr);
|
@@ -17,13 +17,31 @@ module WXRuby3
|
|
17
17
|
include Typemap::TreeItemId
|
18
18
|
|
19
19
|
def setup
|
20
|
-
spec.post_processors << :fixtreectrl
|
21
20
|
spec.items.replace %w[wxTreeCtrl treebase.h]
|
22
21
|
spec.override_inheritance_chain('wxTreeCtrl', %w[wxControl wxWindow wxEvtHandler wxObject])
|
23
22
|
# mixin WithImages
|
24
23
|
spec.include_mixin 'wxTreeCtrl', 'Wx::WithImages'
|
25
24
|
spec.ignore('operator!=', 'operator==')
|
26
25
|
spec.include 'wx/dirctrl.h'
|
26
|
+
# Use a custom interface class to work around the wxTreeCtrl::SortItems/OnCompareItems issue
|
27
|
+
# without having to patch the SWIG director class
|
28
|
+
spec.add_header_code <<~__HEREDOC
|
29
|
+
class WxRubyTreeCtrl : public wxTreeCtrl
|
30
|
+
{
|
31
|
+
public:
|
32
|
+
WxRubyTreeCtrl() : wxTreeCtrl() {}
|
33
|
+
WxRubyTreeCtrl(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition,
|
34
|
+
const wxSize& size = wxDefaultSize, long style = wxTR_DEFAULT_STYLE,
|
35
|
+
const wxValidator& validator = wxDefaultValidator, const wxString& name = wxTreeCtrlNameStr)
|
36
|
+
: wxTreeCtrl(parent, id, pos, size, style, validator, name)
|
37
|
+
{}
|
38
|
+
virtual ~WxRubyTreeCtrl() {}
|
39
|
+
private:
|
40
|
+
DECLARE_DYNAMIC_CLASS(WxRubyTreeCtrl);
|
41
|
+
};
|
42
|
+
IMPLEMENT_DYNAMIC_CLASS(WxRubyTreeCtrl, wxTreeCtrl);
|
43
|
+
__HEREDOC
|
44
|
+
spec.use_class_implementation('wxTreeCtrl', 'WxRubyTreeCtrl')
|
27
45
|
# These only differ from SetXXXList in the way memory ownership is
|
28
46
|
# transferred. So only support the version that won't leak on wxRuby.
|
29
47
|
spec.ignore %w[
|
@@ -371,47 +389,4 @@ module WXRuby3
|
|
371
389
|
|
372
390
|
end # class Director
|
373
391
|
|
374
|
-
module SwigRunner
|
375
|
-
class Processor
|
376
|
-
|
377
|
-
# special post-processor for TreeCtrl
|
378
|
-
class Fixtreectrl < Processor
|
379
|
-
|
380
|
-
def run
|
381
|
-
director_found = false
|
382
|
-
update_source do |line|
|
383
|
-
# Ugly: special fixes for TreeCtrl - these macros and extra funcs
|
384
|
-
# are needed to allow user-defined sorting to work
|
385
|
-
# default ctor needed for Swig::Director
|
386
|
-
if line["Director(VALUE self) : swig_self(self), swig_disown_flag(false)"]
|
387
|
-
line = " Director() { } // added by fixmodule.rb \n" + line
|
388
|
-
end
|
389
|
-
if line["SwigDirector_wxTreeCtrl::SwigDirector_wxTreeCtrl(VALUE self)"]
|
390
|
-
line = "IMPLEMENT_DYNAMIC_CLASS(SwigDirector_wxTreeCtrl, wxTreeCtrl);\n" + line
|
391
|
-
director_found = true
|
392
|
-
end
|
393
|
-
|
394
|
-
line
|
395
|
-
end
|
396
|
-
if director_found
|
397
|
-
# We also need to tweak the header file
|
398
|
-
update_header do |line|
|
399
|
-
if line.strip == 'public:'
|
400
|
-
line << "\nSwigDirector_wxTreeCtrl() {};"
|
401
|
-
elsif /\A};/ =~ line
|
402
|
-
line = <<~__HEREDOC
|
403
|
-
private:
|
404
|
-
DECLARE_DYNAMIC_CLASS(SwigDirector_wxTreeCtrl);
|
405
|
-
};
|
406
|
-
__HEREDOC
|
407
|
-
end
|
408
|
-
line
|
409
|
-
end
|
410
|
-
end
|
411
|
-
end
|
412
|
-
end # class Fixtreectrl
|
413
|
-
|
414
|
-
end
|
415
|
-
end
|
416
|
-
|
417
392
|
end # module WXRuby3
|
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
:wxAnimationBundle:
|
3
|
+
:detail:
|
4
|
+
:pre:
|
5
|
+
:programlisting:
|
6
|
+
- :pattern: !ruby/regexp /.*/
|
7
|
+
:replace: |
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
animationCtrl = Wx::AnimationCtrl.new(parent, Wx::ID_ANY)
|
11
|
+
animations = Wx::AnimationBundle.new
|
12
|
+
animations.add("throbber.gif")
|
13
|
+
animations.add("throbber_2x.gif")
|
14
|
+
animationCtrl.play if animationCtrl.set_animation(animations)
|
15
|
+
```
|
@@ -57,6 +57,16 @@
|
|
57
57
|
if event.get_modifiers == Wx::KeyModifier::MOD_CONTROL
|
58
58
|
# ... handle Ctrl-XXX ...
|
59
59
|
```
|
60
|
+
:wxKeyEvent.GetRawKeyCode:
|
61
|
+
:detail:
|
62
|
+
:post:
|
63
|
+
- :pattern: !ruby/regexp /,\s+use\s+\#ifdef\s+\{Wx::HAS_RAW_KEY_CODES\}.*available\./
|
64
|
+
:subst: '.'
|
65
|
+
:wxKeyEvent.GetRawKeyFlags:
|
66
|
+
:detail:
|
67
|
+
:post:
|
68
|
+
- :pattern: !ruby/regexp /,\s+use\s+\#ifdef\s+\{Wx::HAS_RAW_KEY_CODES\}.*available\./
|
69
|
+
:subst: '.'
|
60
70
|
:wxMouseEvent.GetModifiers:
|
61
71
|
:detail:
|
62
72
|
:pre:
|
@@ -114,10 +124,6 @@
|
|
114
124
|
vb_pt = get_view_start # Top left corner of client
|
115
125
|
|
116
126
|
Wx::RegionIterator.for_region(get_update_region) do |region_it|
|
117
|
-
|
118
|
-
int vX,vY,vW,vH
|
119
|
-
wxRegionIterator upd(GetUpdateRegion()) # get the update rect list
|
120
|
-
|
121
127
|
region_it.each do |rct|
|
122
128
|
# rct == Dimensions of client area to repaint in pixels
|
123
129
|
|
@@ -18,6 +18,14 @@
|
|
18
18
|
|
19
19
|
end
|
20
20
|
```
|
21
|
+
:post:
|
22
|
+
- :pattern: !ruby/regexp /,\s+use\s+\{Wx::HAS_WINDOW_LABEL_IN_STATIC_BOX\}.*compile-time\./
|
23
|
+
:subst: '.'
|
24
|
+
:wxStaticBox.Create:
|
25
|
+
:detail:
|
26
|
+
:post:
|
27
|
+
- :pattern: !ruby/regexp /,\s+use\s+\{Wx::HAS_WINDOW_LABEL_IN_STATIC_BOX\}.*compile-time\./
|
28
|
+
:subst: '.'
|
21
29
|
:wxStaticBox.Enable:
|
22
30
|
:detail:
|
23
31
|
:pre:
|
@@ -11,6 +11,9 @@
|
|
11
11
|
Wx.log_error("Couldn't load resources!")
|
12
12
|
end
|
13
13
|
```
|
14
|
+
:post:
|
15
|
+
- :pattern: !ruby/regexp /If\s+\{Wx::USE_FILESYS\}.*\)\./
|
16
|
+
:subst: 'If {Wx::Setup::USE_FILESYSTEM} is enabled, this method understands {Wx::FileSystem} URLs.'
|
14
17
|
:wxXmlResource.LoadDialog:
|
15
18
|
:detail:
|
16
19
|
:pre:
|
data/rakelib/lib/generate/doc.rb
CHANGED
@@ -172,7 +172,7 @@ module WXRuby3
|
|
172
172
|
end
|
173
173
|
end
|
174
174
|
end
|
175
|
-
text.gsub!(/WX(K_[A-Z]+)/) { "{Wx::#{$1}}"}
|
175
|
+
text.gsub!(/WX(K_[A-Z]+)/) { "{Wx::KeyCode::#{$1}}"}
|
176
176
|
end
|
177
177
|
if event_section?
|
178
178
|
case text
|
@@ -280,7 +280,7 @@ module WXRuby3
|
|
280
280
|
|
281
281
|
def _ident_str_to_doc(s, ref_scope = nil)
|
282
282
|
return s if no_idents?
|
283
|
-
return s if %w[wxRuby wxMSW wxOSX wxGTK wxX11].any? { |w| s.start_with?(w) }
|
283
|
+
return s if %w[wxRuby wxMSW wxOSX wxGTK wxX11 wxMac].any? { |w| s.start_with?(w) }
|
284
284
|
nmlist = s.split('::')
|
285
285
|
nm_str = nmlist.shift.to_s
|
286
286
|
constnm = rb_wx_name(nm_str)
|
@@ -343,6 +343,7 @@ module WXRuby3
|
|
343
343
|
mtd = $1
|
344
344
|
args = _arglist_to_doc($2)
|
345
345
|
end
|
346
|
+
# transform the scope prefix
|
346
347
|
if DocGenerator.constants_xref_db.has_key?(constnm)
|
347
348
|
constnm = "#{DocGenerator.constants_xref_db[constnm]['mod']}::#{constnm}"
|
348
349
|
elsif DocGenerator.constants_xref_db.has_key?(rb_constant_name(nm_str))
|
@@ -355,8 +356,18 @@ module WXRuby3
|
|
355
356
|
known = false
|
356
357
|
constnm = "Wx::#{constnm}"
|
357
358
|
end
|
359
|
+
# transform and append the element id
|
358
360
|
if mtd.nil?
|
359
|
-
if DocGenerator.constants_xref_db.has_key?(rb_wx_name(itmnm))
|
361
|
+
if DocGenerator.constants_xref_db.has_key?(rb_wx_name(itmnm))
|
362
|
+
itmnm = rb_wx_name(itmnm)
|
363
|
+
# in case of enum constants the documented scope most likely omits the enum class
|
364
|
+
# which we want for correct linking for wxRuby
|
365
|
+
if DocGenerator.constants_xref_db[itmnm]['mod'].start_with?("#{constnm}::")
|
366
|
+
["#{DocGenerator.constants_xref_db[itmnm]['mod']}::#{rb_wx_name(itmnm)}", known]
|
367
|
+
else
|
368
|
+
["#{constnm}::#{rb_wx_name(itmnm)}", known]
|
369
|
+
end
|
370
|
+
elsif !_is_method?(itmnm, nm_str)
|
360
371
|
["#{constnm}::#{rb_wx_name(itmnm)}", known]
|
361
372
|
else
|
362
373
|
sep = _is_static_method?(nm_str, itmnm) ? '.' : '#'
|
@@ -590,19 +590,20 @@ module WXRuby3
|
|
590
590
|
fout.puts "%constant char* #{item.name} = #{$2};"
|
591
591
|
elsif item.value =~ /wx(Size|Point)(\(.*\))/
|
592
592
|
frbext = init_rb_ext_file unless frbext
|
593
|
-
frbext.indent { frbext.puts "#{
|
593
|
+
frbext.indent { frbext.puts "#{rb_constant_name(item.name)} = Wx::#{$1}.new#{$2}" }
|
594
594
|
frbext.puts
|
595
595
|
elsif item.value =~ /wx(Colour|Font)(\(.*\))/
|
596
596
|
frbext = init_rb_ext_file unless frbext
|
597
597
|
frbext.indent do
|
598
|
-
frbext.puts "Wx.add_delayed_constant(self, :#{
|
598
|
+
frbext.puts "Wx.add_delayed_constant(self, :#{rb_constant_name(item.name)}) { Wx::#{$1}.new#{$2} }"
|
599
599
|
end
|
600
600
|
frbext.puts
|
601
601
|
elsif item.value =~ /wxSystemSettings::(\w+)\((.*)\)/
|
602
602
|
frbext = init_rb_ext_file unless frbext
|
603
|
+
setting_mtd = $1
|
603
604
|
args = $2.split(',').collect {|a| rb_constant_value(a) }.join(', ')
|
604
605
|
frbext.indent do
|
605
|
-
frbext.puts "Wx.add_delayed_constant(self, :#{
|
606
|
+
frbext.puts "Wx.add_delayed_constant(self, :#{rb_constant_name(item.name)}) { Wx::SystemSettings.#{rb_method_name(setting_mtd)}(#{args}) }"
|
606
607
|
end
|
607
608
|
frbext.puts
|
608
609
|
else
|
@@ -153,6 +153,8 @@ module WXRuby3
|
|
153
153
|
Director.Spec(pkg, 'wxFileDirPickerEvent', director: Director::Event, requirements: Director.AnyOf(%w[wxUSE_DIRDLG wxUSE_DIRPICKERCTRL], %w[wxUSE_FILEDLG wxUSE_FILEPICKERCTRL]))
|
154
154
|
Director.Spec(pkg, 'wxDirPickerCtrl', requirements: %w[wxUSE_DIRDLG wxUSE_DIRPICKERCTRL])
|
155
155
|
Director.Spec(pkg, 'wxFilePickerCtrl', requirements: %w[wxUSE_FILEDLG wxUSE_FILEPICKERCTRL])
|
156
|
+
Director.Spec(pkg, 'wxFileCtrl', requirements: %w[wxUSE_FILECTRL])
|
157
|
+
Director.Spec(pkg, 'wxFileCtrlEvent', requirements: %w[wxUSE_FILECTRL])
|
156
158
|
Director.Spec(pkg, 'wxProgressDialog', director: Director::Dialog)
|
157
159
|
Director.Spec(pkg, 'wxWindowDisabler')
|
158
160
|
Director.Spec(pkg, 'wxBusyInfo', requirements: %w[wxUSE_BUSYINFO])
|
@@ -176,7 +178,7 @@ module WXRuby3
|
|
176
178
|
Director.Spec(pkg, 'wxTimePickerCtrl', requirements: %w[wxUSE_TIMEPICKCTRL])
|
177
179
|
Director.Spec(pkg, 'wxTimerEvent', director: Director::Event, requirements: %w[wxUSE_TIMER])
|
178
180
|
Director.Spec(pkg, 'wxTimer', requirements: %w[wxUSE_TIMER])
|
179
|
-
Director.Spec(pkg, 'wxSashEvent',
|
181
|
+
Director.Spec(pkg, 'wxSashEvent', requirements: %w[wxUSE_SASH])
|
180
182
|
Director.Spec(pkg, 'wxSashWindow', requirements: %w[wxUSE_SASH])
|
181
183
|
Director.Spec(pkg, 'wxSashLayoutWindow', requirements: %w[wxUSE_SASH])
|
182
184
|
Director.Spec(pkg, 'wxQueryLayoutInfoEvent', director: Director::SashLayoutEvent)
|
@@ -223,6 +225,8 @@ module WXRuby3
|
|
223
225
|
Director.Spec(pkg, 'wxBannerWindow', requirements: %w[wxUSE_BANNERWINDOW])
|
224
226
|
Director.Spec(pkg, 'wxInfoBar', requirements: %w[wxUSE_INFOBAR])
|
225
227
|
Director.Spec(pkg, 'wxFileSystem', requirements: %w[wxUSE_FILESYSTEM])
|
228
|
+
Director.Spec(pkg, 'wxDialUpManager', requirements: %w[wxUSE_DIALUP_MANAGER])
|
229
|
+
Director.Spec(pkg, 'wxDialUpEvent', requirements: %w[wxUSE_DIALUP_MANAGER])
|
226
230
|
}
|
227
231
|
|
228
232
|
Director.Package('Wx::PRT', 'wxUSE_PRINTING_ARCHITECTURE') do |pkg|
|
data/rakelib/lib/swig_runner.rb
CHANGED
@@ -224,6 +224,10 @@ module WXRuby3
|
|
224
224
|
name = $1
|
225
225
|
line['rb_funcall'] = 'wxRuby_Funcall'
|
226
226
|
line[name] = '"%s"' % rb_method_name(name[1..-2])
|
227
|
+
# director output exceptions
|
228
|
+
when /Swig::DirectorTypeMismatchException::raise\(swig_get_self\(\),\s+\"(\w+)\"/
|
229
|
+
name = $1
|
230
|
+
line[%Q{"#{name}"}] = %Q{"#{rb_method_name(name)}"}
|
227
231
|
# defined alias methods (original method name)
|
228
232
|
when /rb_define_alias\s*\(.*"[_a-zA-Z0-9]+[=\?]?".*("[_a-zA-Z0-9]*[=\?\!]?")/
|
229
233
|
name = $1
|
@@ -275,9 +279,6 @@ module WXRuby3
|
|
275
279
|
core_name = name
|
276
280
|
core_name = 'ruby3' if /\Awx\Z/i =~ core_name
|
277
281
|
|
278
|
-
skip_entire_method = false
|
279
|
-
brace_level = 0
|
280
|
-
|
281
282
|
fix_enum = false
|
282
283
|
enum_item = nil
|
283
284
|
|
@@ -288,45 +289,12 @@ module WXRuby3
|
|
288
289
|
# all following fixes are applicable only before we reached the
|
289
290
|
# Init_ function
|
290
291
|
|
291
|
-
# comment out swig_up because it is defined global in every module
|
292
|
-
if (line.index("bool Swig::Director::swig_up"))
|
293
|
-
line = "//" + line
|
294
|
-
end
|
295
|
-
|
296
|
-
if line =~ /char\* type_name = (RSTRING\(value\)->ptr|RSTRING_PTR\(value\));/
|
297
|
-
line = ""
|
298
|
-
end
|
299
|
-
# Patch submitted for SWIG 1.3.30
|
300
|
-
if (line.index("if (strcmp(type->name, type_name) == 0) {"))
|
301
|
-
line = " if ( value != Qnil && rb_obj_is_kind_of(obj, sklass->klass) ) {"
|
302
|
-
end
|
303
|
-
#TODO 1.3.30
|
304
|
-
# end
|
305
|
-
|
306
292
|
# Fix the class names used to determine derived/non-derived in 'initialize' ('new')
|
307
293
|
# wrappers
|
308
294
|
if line =~ /const\s+char\s+\*classname\s+SWIGUNUSED\s+=\s+"Wx#{core_name}::wx(\w+)";/
|
309
295
|
line.sub!(/\"Wx#{core_name}::wx#{$1}/, "\"#{package.fullname}::#{$1}")
|
310
296
|
end
|
311
297
|
|
312
|
-
# remove the UnknownExceptionHandler::handler method
|
313
|
-
if line.index('void UnknownExceptionHandler::handler()')
|
314
|
-
skip_entire_method = true
|
315
|
-
end
|
316
|
-
|
317
|
-
if (skip_entire_method)
|
318
|
-
line = "//#{line}"
|
319
|
-
if (line.index('{'))
|
320
|
-
brace_level += 1
|
321
|
-
end
|
322
|
-
if (line.index('}'))
|
323
|
-
brace_level -= 1
|
324
|
-
end
|
325
|
-
if (brace_level == 0)
|
326
|
-
skip_entire_method = false
|
327
|
-
end
|
328
|
-
end
|
329
|
-
|
330
298
|
# at the top of our Init_ function, make sure we only initialize
|
331
299
|
# ourselves once
|
332
300
|
if /void\s+Init_(wx|Wx)#{core_name}\(/ =~ line
|
@@ -358,20 +326,6 @@ module WXRuby3
|
|
358
326
|
line << "\n wxRuby_SetSwigTypeForClass(#{$2}.klass, #{$1});"
|
359
327
|
end
|
360
328
|
|
361
|
-
# TODO : can we improve this?
|
362
|
-
# Fix for Event.i - because it is implemented with a custom Ruby
|
363
|
-
# subclass, need to make this subclass SWIG info available under
|
364
|
-
# the normal name "SWIGTYPE_p_wxEvent" as it's referenced by many
|
365
|
-
# other classes.
|
366
|
-
if core_name == 'Event' or core_name == 'CommandEvent'
|
367
|
-
if line[/SWIG_TypeClientData\(SWIGTYPE_p_wxRuby(Command)?Event/]
|
368
|
-
line = line +
|
369
|
-
" // Inserted by fixmodule.rb\n" +
|
370
|
-
line.sub(/SWIGTYPE_p_wxRuby(Command)?Event/,
|
371
|
-
"SWIGTYPE_p_wx\\1Event")
|
372
|
-
end
|
373
|
-
end
|
374
|
-
|
375
329
|
# check for known enumerator constants
|
376
330
|
if (md = /rb_define_const\s*\(([^,]+),\s*"([_a-zA-Z0-9]*)"(.*)/.match(line)) # constant definition?
|
377
331
|
if !fix_enum # not fixing one yet
|
@@ -215,7 +215,7 @@ module WXRuby3
|
|
215
215
|
if ( TYPE($input) == T_DATA )
|
216
216
|
{
|
217
217
|
void* argp$argnum;
|
218
|
-
SWIG_ConvertPtr($input, &argp$argnum, $1_descriptor,
|
218
|
+
SWIG_ConvertPtr($input, &argp$argnum, $1_descriptor, 0);
|
219
219
|
$1 = reinterpret_cast< $1_basetype * >(argp$argnum);
|
220
220
|
}
|
221
221
|
else if ( TYPE($input) == T_ARRAY )
|
@@ -240,6 +240,28 @@ module WXRuby3
|
|
240
240
|
__CODE
|
241
241
|
end
|
242
242
|
|
243
|
+
map 'wxSize' => 'Array(Integer, Integer), Wx::Size',
|
244
|
+
'wxPoint' => 'Array(Integer, Integer), Wx::Point' do
|
245
|
+
|
246
|
+
map_directorout code: <<~__CODE
|
247
|
+
if (TYPE($input) == T_ARRAY && RARRAY_LEN($input) == 2)
|
248
|
+
{
|
249
|
+
$result = $1_basetype(NUM2INT( rb_ary_entry($input, 0)),
|
250
|
+
NUM2INT( rb_ary_entry($input, 1)));
|
251
|
+
}
|
252
|
+
else
|
253
|
+
{
|
254
|
+
void *ptr;
|
255
|
+
int res = SWIG_ConvertPtr($input, &ptr, $&1_descriptor, SWIG_POINTER_NO_NULL);
|
256
|
+
if (!SWIG_IsOK(res)) {
|
257
|
+
Swig::DirectorTypeMismatchException::raise(swig_get_self(), "$symname", SWIG_ErrorType(SWIG_ArgError(res)), "in output value of type '""$1_type""'");
|
258
|
+
}
|
259
|
+
$result = *(reinterpret_cast< $1_type * >(ptr));
|
260
|
+
}
|
261
|
+
__CODE
|
262
|
+
|
263
|
+
end
|
264
|
+
|
243
265
|
# Integer <> wxItemKind type mappings
|
244
266
|
|
245
267
|
map 'wxItemKind' => 'Integer' do
|
@@ -456,12 +478,10 @@ module WXRuby3
|
|
456
478
|
end
|
457
479
|
|
458
480
|
|
459
|
-
# Validators must be cast to correct subclass, but
|
460
|
-
# is a clone, and should not be freed, so disown after wrapping.
|
481
|
+
# Validators must be cast to correct subclass, but not owned
|
461
482
|
map 'wxValidator*' => 'Wx::Validator' do
|
462
483
|
map_out code: <<~__CODE
|
463
484
|
$result = wxRuby_WrapWxObjectInRuby($1);
|
464
|
-
if (!NIL_P($result)) RDATA($result)->dfree = SWIG_RubyRemoveTracking;
|
465
485
|
__CODE
|
466
486
|
end
|
467
487
|
|
@@ -633,11 +653,6 @@ module WXRuby3
|
|
633
653
|
end
|
634
654
|
end
|
635
655
|
|
636
|
-
# special case bc SWIG causes trouble in Window.cpp
|
637
|
-
map 'const wxRegion&', 'const wxRegion*', as: 'Wx::Region' do
|
638
|
-
map_out code: '$result = wxRuby_WrapWxObjectInRuby(new wxRegion(*static_cast<const wxRegion*> ($1)));'
|
639
|
-
end
|
640
|
-
|
641
656
|
# add type mapping for wxVariant input args
|
642
657
|
intypes = 'nil,String,Integer,Float,Time,Wx::Font,Wx::Colour,Wx::Variant,Array<WxVariant>,Array<String>,Object'
|
643
658
|
if Config.instance.features_set?('wxUSE_PROPGRID')
|
@@ -30,7 +30,7 @@ module WXRuby3
|
|
30
30
|
void* argp$argnum = NULL;
|
31
31
|
if ( TYPE($input) == T_DATA )
|
32
32
|
{
|
33
|
-
if (SWIG_IsOK(SWIG_ConvertPtr($input, &argp$argnum, $1_descriptor,
|
33
|
+
if (SWIG_IsOK(SWIG_ConvertPtr($input, &argp$argnum, $1_descriptor, 0)) && argp$argnum)
|
34
34
|
{
|
35
35
|
$1 = reinterpret_cast< $1_basetype * >(argp$argnum);
|
36
36
|
}
|
@@ -69,7 +69,7 @@ module WXRuby3
|
|
69
69
|
}
|
70
70
|
else
|
71
71
|
{
|
72
|
-
Swig::DirectorTypeMismatchException::raise(rb_eTypeError,
|
72
|
+
Swig::DirectorTypeMismatchException::raise(swig_get_self(), "$symname", rb_eTypeError,
|
73
73
|
"get_data_here should return a string, or nil on failure");
|
74
74
|
}
|
75
75
|
}
|
@@ -20,6 +20,11 @@ module WXRuby3
|
|
20
20
|
define do
|
21
21
|
|
22
22
|
map 'const wxPGPropArgCls&' => 'String,Wx::PG::PGProperty' do
|
23
|
+
|
24
|
+
add_header_code <<~__CODE
|
25
|
+
static WxRuby_ID s_pg_property_id("PGProperty");
|
26
|
+
__CODE
|
27
|
+
|
23
28
|
map_in temp: 'wxPGPropArgCls temp = (wxPGProperty *)0', code: <<~__CODE
|
24
29
|
if (!NIL_P($input))
|
25
30
|
{
|
@@ -29,12 +34,12 @@ module WXRuby3
|
|
29
34
|
}
|
30
35
|
else if (TYPE($input) == T_DATA)
|
31
36
|
{
|
32
|
-
VALUE rb_klass = rb_const_get(mWxPG,
|
37
|
+
VALUE rb_klass = rb_const_get(mWxPG, s_pg_property_id());
|
33
38
|
if (rb_obj_is_kind_of($input, rb_klass))
|
34
39
|
{
|
35
40
|
swig_type_info* swig_type = wxRuby_GetSwigTypeForClass(rb_klass);
|
36
41
|
wxPGProperty *pgprop = (wxPGProperty *)0;
|
37
|
-
SWIG_ConvertPtr($input, SWIG_as_voidptrptr(&pgprop), swig_type,
|
42
|
+
SWIG_ConvertPtr($input, SWIG_as_voidptrptr(&pgprop), swig_type, 0);
|
38
43
|
temp = wxPGPropArgCls(pgprop);
|
39
44
|
}
|
40
45
|
else
|
@@ -29,28 +29,26 @@ module WXRuby3
|
|
29
29
|
add_header_code <<~__CODE
|
30
30
|
static void wxRuby_PointArrayRubyToC(VALUE rb_arr, wxPoint wx_arr[])
|
31
31
|
{
|
32
|
-
wxPoint *wx_point;
|
33
32
|
VALUE rb_item;
|
34
33
|
for (int i = 0; i < RARRAY_LEN(rb_arr); i++)
|
35
34
|
{
|
36
35
|
rb_item = rb_ary_entry (rb_arr, i);
|
37
36
|
if (TYPE(rb_item) == T_DATA)
|
38
37
|
{
|
38
|
+
wxPoint *wx_point;
|
39
39
|
SWIG_ConvertPtr (rb_item, (void **) &wx_point,
|
40
|
-
SWIGTYPE_p_wxPoint,
|
40
|
+
SWIGTYPE_p_wxPoint, 0);
|
41
|
+
wx_arr[i] = *wx_point;
|
41
42
|
}
|
42
43
|
else if (TYPE(rb_item) == T_ARRAY && RARRAY_LEN(rb_item) == 2)
|
43
44
|
{
|
44
|
-
|
45
|
-
|
46
|
-
// Create a ruby object so the C++ obj is freed when GC runs
|
47
|
-
SWIG_NewPointerObj (wx_point, SWIGTYPE_p_wxPoint, 1);
|
45
|
+
wx_arr[i] = wxPoint (NUM2INT( rb_ary_entry(rb_item, 0)),
|
46
|
+
NUM2INT(rb_ary_entry (rb_item, 1)));
|
48
47
|
}
|
49
48
|
else
|
50
49
|
{
|
51
50
|
rb_raise(rb_eTypeError, "Wrong type for wxPoint parameter %i", i);
|
52
51
|
}
|
53
|
-
wx_arr[i] = *wx_point;
|
54
52
|
}
|
55
53
|
}
|
56
54
|
__CODE
|
data/rakelib/lib/util/string.rb
CHANGED
@@ -91,14 +91,18 @@ module WXRuby3
|
|
91
91
|
end
|
92
92
|
|
93
93
|
def rb_constant_value(name)
|
94
|
-
|
95
|
-
case
|
96
|
-
when
|
94
|
+
name = name.strip
|
95
|
+
case name
|
96
|
+
when /\A(null|nullptr)\Z/i
|
97
97
|
'nil'
|
98
|
+
when /\A(true|false)\Z/i
|
99
|
+
name.downcase
|
98
100
|
when /EmptyString/
|
99
101
|
%q['']
|
102
|
+
when /\A\"/
|
103
|
+
name
|
100
104
|
else
|
101
|
-
|
105
|
+
"#{name.start_with?('wx') ? 'Wx::' : ''}#{rb_constant_name(name)}"
|
102
106
|
end
|
103
107
|
end
|
104
108
|
|
@@ -110,7 +114,7 @@ module WXRuby3
|
|
110
114
|
ids = idstr.split('::')
|
111
115
|
if ids.size > 1
|
112
116
|
is_scoped = true
|
113
|
-
scoped_name =
|
117
|
+
scoped_name = rb_wx_name(ids.shift)
|
114
118
|
while ids.size > 1
|
115
119
|
scoped_name << '::' << ids.shift
|
116
120
|
end
|
@@ -127,7 +131,7 @@ module WXRuby3
|
|
127
131
|
when 'wxString'
|
128
132
|
'('
|
129
133
|
else
|
130
|
-
"#{
|
134
|
+
"#{idstr.start_with?('wx') ? 'Wx::' : ''}#{rb_wx_name(idstr)}.new("
|
131
135
|
end
|
132
136
|
end
|
133
137
|
else
|
@@ -143,8 +147,6 @@ module WXRuby3
|
|
143
147
|
# constant
|
144
148
|
if /[\-\+\.\d]+/ =~ idstr
|
145
149
|
idstr # numeric constant
|
146
|
-
elsif /\A(true|false|NULL|nullptr)/ =~ idstr
|
147
|
-
($1 == 'NULL' || $1 == 'nullptr') ? 'nil' : $1
|
148
150
|
else
|
149
151
|
if const_xref.has_key?(rb_constant_name(idstr))
|
150
152
|
"#{const_xref[rb_constant_name(idstr)]['mod']}::#{rb_constant_name(idstr)}"
|
data/samples/text/richtext.rb
CHANGED
@@ -1432,36 +1432,6 @@ class MyFrame < Wx::Frame
|
|
1432
1432
|
|
1433
1433
|
end
|
1434
1434
|
|
1435
|
-
# Forward command events to the current rich text control, if any
|
1436
|
-
def try_before(event)
|
1437
|
-
if event.is_command_event && !event.is_a?(Wx::ChildFocusEvent)
|
1438
|
-
# Problem: we can get infinite recursion because the events
|
1439
|
-
# climb back up to this frame, and repeat.
|
1440
|
-
# Assume that command events don't cause another command event
|
1441
|
-
# to be called, so we can rely on inCommand not being overwritten
|
1442
|
-
|
1443
|
-
if MyFrame.win_id != event.id && MyFrame.event_type != event.event_type
|
1444
|
-
MyFrame.event_type = event.event_type
|
1445
|
-
MyFrame.win_id = event.id
|
1446
|
-
focusWin = Wx.find_focus_descendant(self)
|
1447
|
-
focusWin = @richTextCtrl unless focusWin
|
1448
|
-
|
1449
|
-
if focusWin && focusWin.get_event_handler.process_event(event)
|
1450
|
-
MyFrame.event_type = 0
|
1451
|
-
MyFrame.win_id = 0
|
1452
|
-
return true
|
1453
|
-
end
|
1454
|
-
|
1455
|
-
MyFrame.event_type = 0
|
1456
|
-
MyFrame.win_id = 0
|
1457
|
-
else
|
1458
|
-
return false
|
1459
|
-
end
|
1460
|
-
end
|
1461
|
-
|
1462
|
-
false
|
1463
|
-
end
|
1464
|
-
|
1465
1435
|
# Write text
|
1466
1436
|
def write_initial_text
|
1467
1437
|
r = @richTextCtrl
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# Copyright (c) 2023 M.J.N. Corino, The Netherlands
|
2
|
+
#
|
3
|
+
# This software is released under the MIT license.
|
4
|
+
|
5
|
+
require 'test/unit'
|
6
|
+
require 'wx'
|
7
|
+
|
8
|
+
class TestApp < Test::Unit::TestCase
|
9
|
+
|
10
|
+
class TestFrame < Wx::Frame
|
11
|
+
def initialize
|
12
|
+
super(nil, -1, '')
|
13
|
+
evt_paint { on_paint }
|
14
|
+
end
|
15
|
+
|
16
|
+
def on_paint
|
17
|
+
paint {}
|
18
|
+
close
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class TestApp < Wx::App
|
23
|
+
def on_init
|
24
|
+
TestFrame.new.show
|
25
|
+
end
|
26
|
+
|
27
|
+
def on_exit
|
28
|
+
raise RuntimeError, 'on_exit exception'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_self_closing_frame
|
33
|
+
assert_raise_kind_of(RuntimeError) { TestApp.run }
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# Copyright (c) 2023 M.J.N. Corino, The Netherlands
|
2
|
+
#
|
3
|
+
# This software is released under the MIT license.
|
4
|
+
|
5
|
+
require 'test/unit'
|
6
|
+
require 'wx'
|
7
|
+
|
8
|
+
class AppInitExitExceptions < Test::Unit::TestCase
|
9
|
+
|
10
|
+
class TestApp < Wx::App
|
11
|
+
def on_init
|
12
|
+
raise RuntimeError, 'on_init exception'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_on_init_exception
|
17
|
+
assert_raise_kind_of(RuntimeError) { TestApp.run }
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|