wxruby3 0.9.5 → 0.9.8
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 +440 -84
- data/README.md +40 -23
- data/ext/mkrf_conf_ext.rb +68 -0
- data/lib/wx/core/ext.rb +22 -3
- data/lib/wx/core/secret_store.rb +38 -0
- data/lib/wx/doc/extra/02_lifecycles.md +4 -4
- data/lib/wx/doc/extra/14_config.md +1 -1
- data/lib/wx/doc/secret_store.rb +55 -0
- data/lib/wx/version.rb +1 -1
- data/lib/wx/wxruby/base.rb +8 -8
- data/lib/wx/wxruby/cmd/check.rb +182 -0
- data/lib/wx/wxruby/cmd/sampler.rb +39 -29
- data/lib/wx/wxruby/cmd/setup.rb +125 -0
- data/lib/wx/wxruby/cmd/test.rb +56 -6
- data/rakelib/bin.rake +48 -0
- data/rakelib/bin.rb +62 -0
- data/rakelib/build.rb +11 -7
- data/rakelib/config.rake +3 -1
- data/rakelib/configure.rb +63 -35
- data/rakelib/doc.rake +3 -1
- data/rakelib/gem.rake +199 -0
- data/rakelib/gem.rb +334 -0
- data/rakelib/install.rb +5 -3
- data/rakelib/lib/config/{cygwin.rb → freebsd.rb} +1 -1
- data/rakelib/lib/config/linux.rb +26 -2
- data/rakelib/lib/config/macosx.rb +58 -11
- data/rakelib/lib/config/mingw.rb +134 -10
- data/rakelib/lib/config/pkgman/linux.rb +144 -0
- data/rakelib/lib/config/pkgman/macosx.rb +122 -0
- data/rakelib/lib/config/unixish.rb +47 -20
- data/rakelib/lib/config/{netbsd.rb → unknown.rb} +3 -2
- data/rakelib/lib/config.rb +301 -88
- data/rakelib/lib/core/package.rb +47 -49
- data/rakelib/lib/director/aui_manager.rb +1 -1
- data/rakelib/lib/director/dialog.rb +8 -0
- data/rakelib/lib/director/gdicommon.rb +1 -2
- data/rakelib/lib/director/grid_ctrl.rb +2 -2
- data/rakelib/lib/director/richtext_composite_object.rb +2 -4
- data/rakelib/lib/director/secret_store.rb +117 -0
- data/rakelib/lib/director/tree_event.rb +2 -2
- data/rakelib/lib/generate/doc/secret_store.yaml +55 -0
- data/rakelib/lib/generate/doc.rb +29 -14
- data/rakelib/lib/generate/interface.rb +4 -2
- data/rakelib/lib/specs/interfaces.rb +1 -0
- data/rakelib/lib/swig_runner.rb +11 -11
- data/rakelib/lib/typemap/common.rb +10 -0
- data/rakelib/prepost.rake +17 -5
- data/rakelib/yard/templates/default/fulldoc/html/css/wxruby3.css +18 -0
- data/rakelib/yard/templates/default/fulldoc/html/setup.rb +5 -5
- data/rakelib/yard/yard/relative_markdown_links.rb +7 -1
- data/samples/sampler/sample.rb +2 -0
- data/tests/lib/wxapp_runner.rb +1 -1
- data/tests/test_config.rb +7 -4
- data/tests/test_secret_store.rb +83 -0
- metadata +46 -23
- data/ext/mkrf_conf_srcgem.rb +0 -67
- data/rakelib/run.rake +0 -52
@@ -212,6 +212,14 @@ module WXRuby3
|
|
212
212
|
return Qfalse;
|
213
213
|
}
|
214
214
|
__HEREDOC
|
215
|
+
when 'wxSymbolPickerDialog'
|
216
|
+
# redefine these to prevent problematic handling of title/caption defaults
|
217
|
+
spec.ignore 'wxSymbolPickerDialog::wxSymbolPickerDialog(const wxString &, const wxString &, const wxString &, wxWindow *, wxWindowID, const wxString &, const wxPoint &, const wxSize &, long)',
|
218
|
+
'wxSymbolPickerDialog::Create',
|
219
|
+
ignore_doc: false
|
220
|
+
spec.extend_interface 'wxSymbolPickerDialog',
|
221
|
+
'wxSymbolPickerDialog(const wxString &symbol, const wxString &initialFont, const wxString &normalTextFont, wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &pos, const wxSize &size, long style)',
|
222
|
+
'bool Create(const wxString &symbol, const wxString &initialFont, const wxString &normalTextFont, wxWindow *parent, wxWindowID id, const wxString &caption, const wxPoint &pos, const wxSize &size, long style)'
|
215
223
|
when 'wxWizard'
|
216
224
|
# special handling
|
217
225
|
spec.ignore 'wxWizard::GetBitmap'
|
@@ -52,8 +52,7 @@ module WXRuby3
|
|
52
52
|
if Config.instance.wx_version >= '3.3.0'
|
53
53
|
# ignore these as they are supposed to specify unary minus but confuse
|
54
54
|
# SWIG
|
55
|
-
spec.ignore 'wxPoint::operator-(const wxPoint&)'
|
56
|
-
'wxRealPoint::operator-(const wxRealPoint&)'
|
55
|
+
spec.ignore 'wxPoint::operator-(const wxPoint&)'
|
57
56
|
end
|
58
57
|
spec.regard 'wxRect::Offset', regard_doc: false
|
59
58
|
# overrule common wxPoint mapping for wxRect ctor to fix ctor ambiguities here wrt wxSize
|
@@ -237,9 +237,9 @@ module WXRuby3
|
|
237
237
|
static const rb_data_type_t __wxGridWindow_type = {
|
238
238
|
"GridWindow",
|
239
239
|
#if RUBY_API_VERSION_MAJOR >= 3
|
240
|
-
{ NULL, NULL, __wxGridWindow_size, 0,
|
240
|
+
{ NULL, NULL, __wxGridWindow_size, 0, {}},
|
241
241
|
#else
|
242
|
-
{ NULL, NULL, __wxGridWindow_size,
|
242
|
+
{ NULL, NULL, __wxGridWindow_size, {}},
|
243
243
|
#endif
|
244
244
|
NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY
|
245
245
|
};
|
@@ -93,9 +93,9 @@ module WXRuby3
|
|
93
93
|
static const rb_data_type_t __wxRichTextFloatCollector_type = {
|
94
94
|
"RichTextFloatCollector",
|
95
95
|
#if RUBY_API_VERSION_MAJOR >= 3
|
96
|
-
{ NULL, NULL, __wxRichTextFloatCollector_size, 0,
|
96
|
+
{ NULL, NULL, __wxRichTextFloatCollector_size, 0, {}},
|
97
97
|
#else
|
98
|
-
{ NULL, NULL, __wxRichTextFloatCollector_size,
|
98
|
+
{ NULL, NULL, __wxRichTextFloatCollector_size, {}},
|
99
99
|
#endif
|
100
100
|
NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY
|
101
101
|
};
|
@@ -177,12 +177,10 @@ module WXRuby3
|
|
177
177
|
{
|
178
178
|
VALUE rc = Qnil;
|
179
179
|
const wxRichTextLineVector &lines = $self->GetLines();
|
180
|
-
int lnr = 0;
|
181
180
|
for (const wxRichTextLine* line : lines)
|
182
181
|
{
|
183
182
|
VALUE rb_ln = SWIG_NewPointerObj(SWIG_as_voidptr(const_cast<wxRichTextLine*> (line)), SWIGTYPE_p_wxRichTextLine, 0);
|
184
183
|
rc = rb_yield(rb_ln);
|
185
|
-
++lnr;
|
186
184
|
}
|
187
185
|
return rc;
|
188
186
|
}
|
@@ -0,0 +1,117 @@
|
|
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 SecretStore < Director
|
14
|
+
|
15
|
+
def setup
|
16
|
+
super
|
17
|
+
spec.items << 'wxSecretValue'
|
18
|
+
spec.gc_as_untracked # don't even track SecretStore and SecretValue objects
|
19
|
+
# there is no possibility of SecretStore derivatives
|
20
|
+
# not least because wxRuby only ever allows a single global SecretStore
|
21
|
+
spec.disable_proxies
|
22
|
+
spec.make_abstract 'wxSecretStore'
|
23
|
+
|
24
|
+
spec.include 'ruby/encoding.h'
|
25
|
+
|
26
|
+
spec.ignore 'wxSecretValue::GetAsString',
|
27
|
+
'wxSecretValue::GetSize',
|
28
|
+
'wxSecretValue::GetData',
|
29
|
+
'wxSecretValue::Wipe',
|
30
|
+
'wxSecretValue::WipeString',
|
31
|
+
'wxSecretValue::wxSecretValue(const wxString&)',
|
32
|
+
'wxSecretValue::wxSecretValue(size_t, const void *)'
|
33
|
+
spec.regard 'wxSecretValue::wxSecretValue()',
|
34
|
+
'wxSecretValue::wxSecretValue(const wxSecretValue&)',
|
35
|
+
regard_doc: false
|
36
|
+
# customize string arg ctor
|
37
|
+
spec.add_extend_code 'wxSecretValue', <<~__HEREDOC
|
38
|
+
wxSecretValue(VALUE secret_string)
|
39
|
+
{
|
40
|
+
if (RTEST(secret_string) && TYPE(secret_string) == T_STRING)
|
41
|
+
{
|
42
|
+
if (ENCODING_GET(secret_string) == rb_utf8_encindex())
|
43
|
+
{
|
44
|
+
return new wxSecretValue(RSTR_TO_WXSTR(secret_string));
|
45
|
+
}
|
46
|
+
else
|
47
|
+
{
|
48
|
+
return new wxSecretValue(RSTRING_LEN(secret_string), (void*)StringValuePtr(secret_string));
|
49
|
+
}
|
50
|
+
}
|
51
|
+
else
|
52
|
+
{
|
53
|
+
rb_raise(rb_eArgError, "Expected String or Wx::SecretValue for #0");
|
54
|
+
}
|
55
|
+
}
|
56
|
+
__HEREDOC
|
57
|
+
|
58
|
+
# customize GetData
|
59
|
+
spec.map 'const void*' => 'String', swig: false do
|
60
|
+
map_out code: ''
|
61
|
+
end
|
62
|
+
spec.add_extend_code 'wxSecretValue', <<~__HEREDOC
|
63
|
+
VALUE get_data()
|
64
|
+
{
|
65
|
+
size_t sz = $self->GetSize();
|
66
|
+
const void* data = $self->GetData();
|
67
|
+
return rb_enc_str_new(static_cast<const char*>(data), sz, rb_ascii8bit_encoding());
|
68
|
+
}
|
69
|
+
|
70
|
+
VALUE get_as_string()
|
71
|
+
{
|
72
|
+
size_t sz = $self->GetSize();
|
73
|
+
const void* data = $self->GetData();
|
74
|
+
return rb_utf8_str_new(static_cast<const char*>(data), sz);
|
75
|
+
}
|
76
|
+
__HEREDOC
|
77
|
+
|
78
|
+
# customize GetDefault
|
79
|
+
spec.ignore 'wxSecretStore::GetDefault', ignore_doc: false
|
80
|
+
spec.add_extend_code 'wxSecretStore', <<~__HEREDOC
|
81
|
+
static VALUE get_default()
|
82
|
+
{
|
83
|
+
wxSecretStore* result = new wxSecretStore(wxSecretStore::GetDefault());
|
84
|
+
return SWIG_NewPointerObj(result, SWIGTYPE_p_wxSecretStore, SWIG_POINTER_OWN);
|
85
|
+
}
|
86
|
+
__HEREDOC
|
87
|
+
spec.map 'wxString *errmsg' => 'String' do
|
88
|
+
map_in ignore: true, temp: 'wxString tmp', code: '$1 = &tmp;'
|
89
|
+
map_argout code: <<~__CODE
|
90
|
+
if ($result == Qfalse)
|
91
|
+
{
|
92
|
+
$result = SWIG_Ruby_AppendOutput($result, WXSTR_TO_RSTR(tmp$argnum));
|
93
|
+
}
|
94
|
+
__CODE
|
95
|
+
end
|
96
|
+
spec.map 'wxString& username' => 'String' do
|
97
|
+
map_in ignore: true, temp: 'wxString tmp', code: '$1 = &tmp;'
|
98
|
+
map_argout code: <<~__CODE
|
99
|
+
if ($result == Qtrue)
|
100
|
+
{
|
101
|
+
$result = SWIG_Ruby_AppendOutput($result, WXSTR_TO_RSTR(tmp$argnum));
|
102
|
+
}
|
103
|
+
__CODE
|
104
|
+
end
|
105
|
+
# the type matching of the username argument is tricky here since there only is the const difference
|
106
|
+
# have to explicitly overrule here for Save() incl. explicitly negating the argout mapping
|
107
|
+
spec.map 'const wxString& username' => 'String' do
|
108
|
+
map_in temp: 'wxString tmp', code: 'tmp = RSTR_TO_WXSTR($input); $1 = &tmp;'
|
109
|
+
map_argout by_ref: true
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
end # class SecretStore
|
114
|
+
|
115
|
+
end # class Director
|
116
|
+
|
117
|
+
end # module WXRuby3
|
@@ -55,9 +55,9 @@ module WXRuby3
|
|
55
55
|
static const rb_data_type_t __wxTreeItemId_type = {
|
56
56
|
"TreeItemId",
|
57
57
|
#if RUBY_API_VERSION_MAJOR >= 3
|
58
|
-
{ NULL, NULL, __wxTreeItemId_size, 0,
|
58
|
+
{ NULL, NULL, __wxTreeItemId_size, 0, {}},
|
59
59
|
#else
|
60
|
-
{ NULL, NULL, __wxTreeItemId_size,
|
60
|
+
{ NULL, NULL, __wxTreeItemId_size, {}},
|
61
61
|
#endif
|
62
62
|
NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY
|
63
63
|
};
|
@@ -0,0 +1,55 @@
|
|
1
|
+
---
|
2
|
+
:wxSecretStore:
|
3
|
+
:detail:
|
4
|
+
:pre:
|
5
|
+
:programlisting:
|
6
|
+
- :pattern: !ruby/regexp /\!store\..*Save.*username.*password\)/
|
7
|
+
:replace: |
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
store = Wx::SecretStore.get_default
|
11
|
+
rc, err = store.ok?
|
12
|
+
if rc
|
13
|
+
unless store.save('MyApp/MyService', username, password)
|
14
|
+
Wx.log_warning('Failed to save credentials to the system secret store.')
|
15
|
+
end
|
16
|
+
else
|
17
|
+
Wx.log_warning("This system doesn't support storing passwords securely (#{err}).")
|
18
|
+
end
|
19
|
+
```
|
20
|
+
- :pattern: !ruby/regexp /store\..*Load.*username.*password\)/
|
21
|
+
:replace: |
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
store = Wx::SecretStore.get_default
|
25
|
+
rc, _ = store.ok?
|
26
|
+
if rc
|
27
|
+
password = Wx::SecretValue.new
|
28
|
+
rc, username = store.load('MyApp/MyService', password)
|
29
|
+
if rc
|
30
|
+
# ... use the password ...
|
31
|
+
end
|
32
|
+
end
|
33
|
+
```
|
34
|
+
:wxSecretStore.IsOk:
|
35
|
+
:brief:
|
36
|
+
:replace:
|
37
|
+
:text: |
|
38
|
+
Check if this object can actually be used.
|
39
|
+
Returns true if the object can be used.
|
40
|
+
Returns false and an error message describing the reason if not.
|
41
|
+
|
42
|
+
:wxSecretStore.Load:
|
43
|
+
:detail:
|
44
|
+
:post:
|
45
|
+
- :pattern: !ruby/regexp /Otherwise\s+the\s+function.*arguments\./
|
46
|
+
:subst: |
|
47
|
+
Otherwise the function returns true and the username and updates the provided password argument.
|
48
|
+
|
49
|
+
:wxSecretValue:
|
50
|
+
:detail:
|
51
|
+
:post:
|
52
|
+
- :pattern: !ruby/regexp /\s+\Z/
|
53
|
+
:subst: |
|
54
|
+
|
55
|
+
@note Due to a bug using binary secrets will not work for WXGTK wxWidgets<=3.2.4 (WXOSX and WXMSW work fine). This has been fixed for later versions.
|
data/rakelib/lib/generate/doc.rb
CHANGED
@@ -26,22 +26,30 @@ module WXRuby3
|
|
26
26
|
WX_GLOBAL_CONSTANTS=false
|
27
27
|
require 'wx'
|
28
28
|
def handle_module(mod, table)
|
29
|
+
Wx.delayed_constants_for(mod).each do |key, delayed_const|
|
30
|
+
table[key.sym.to_s] = { type: true, value: delayed_const.to_s }
|
31
|
+
end
|
29
32
|
mod.constants.each do |c|
|
30
33
|
a_const = mod.const_get(c)
|
31
34
|
if (::Module === a_const || ::Class === a_const) && a_const.name.start_with?('Wx::') # Wx:: Package submodule or Class (possibly Enum)
|
32
35
|
handle_module(a_const, table[c.to_s] = {})
|
33
36
|
elsif Wx::Enum === a_const
|
34
|
-
table[c.to_s] = { type:
|
35
|
-
elsif !(::Hash === a_const || ::Array === a_const)
|
36
|
-
|
37
|
+
table[c.to_s] = { type: true, value: "\#{a_const.class}.new(\#{a_const.to_i})" }
|
38
|
+
elsif !(::Hash === a_const || ::Array === a_const)
|
39
|
+
case a_const
|
40
|
+
when Wx::Size
|
41
|
+
table[c.to_s] = { type: true, value: "Wx::Size.new(\#{a_const.width}, \#{a_const.height})" }
|
42
|
+
when Wx::Point
|
43
|
+
table[c.to_s] = { type: true, value: "Wx::Point.new(\#{a_const.x}, \#{a_const.y})" }
|
44
|
+
else
|
45
|
+
table[c.to_s] = { type: true, value: a_const } unless c == :THE_APP
|
46
|
+
end
|
37
47
|
end
|
38
48
|
end
|
39
49
|
end
|
40
|
-
Wx
|
41
|
-
|
42
|
-
|
43
|
-
STDOUT.puts JSON.dump(table)
|
44
|
-
end
|
50
|
+
table = { 'Wx' => {}}
|
51
|
+
handle_module(Wx, table['Wx'])
|
52
|
+
STDOUT.puts JSON.dump(table)
|
45
53
|
__SCRIPT
|
46
54
|
STDERR.puts "* executing constants collection script:\n#{script}" if Director.trace?
|
47
55
|
begin
|
@@ -693,15 +701,22 @@ module WXRuby3
|
|
693
701
|
# at least 2 newlines to make Yard skip/forget the header comment
|
694
702
|
fdoc.puts
|
695
703
|
fdoc.puts
|
696
|
-
|
697
|
-
|
698
|
-
|
704
|
+
mod_indent = 0
|
705
|
+
package.all_modules.each do |modnm|
|
706
|
+
fdoc.iputs("module #{package.fullname}", mod_indent)
|
707
|
+
fdoc.puts
|
708
|
+
mod_indent += 1
|
709
|
+
end
|
710
|
+
fdoc.indent(mod_indent) do
|
699
711
|
gen_constants_doc(fdoc)
|
700
712
|
gen_functions_doc(fdoc) unless no_gen?(:functions)
|
701
713
|
gen_class_doc(fdoc) unless no_gen?(:classes)
|
702
714
|
end
|
703
|
-
|
704
|
-
|
715
|
+
package.all_modules.each do |_|
|
716
|
+
mod_indent -= 1
|
717
|
+
fdoc.puts
|
718
|
+
fdoc.iputs('end', mod_indent)
|
719
|
+
end
|
705
720
|
end
|
706
721
|
end
|
707
722
|
|
@@ -742,7 +757,7 @@ module WXRuby3
|
|
742
757
|
end
|
743
758
|
|
744
759
|
def gen_constant_value(val)
|
745
|
-
if ::String === val && /\A(#<(.*)>|[\w:]
|
760
|
+
if ::String === val && /\A(#<(.*)>|[\w:]+\.\w+\(.*\))\Z/ =~ val
|
746
761
|
if $2
|
747
762
|
valstr = $2
|
748
763
|
if /\Awx/ =~ valstr
|
@@ -603,7 +603,8 @@ module WXRuby3
|
|
603
603
|
elsif item.value =~ /wx(Colour|Font)(\(.*\))/
|
604
604
|
frbext = init_rb_ext_file unless frbext
|
605
605
|
frbext.indent do
|
606
|
-
|
606
|
+
code = "Wx::#{$1}.new#{$2}"
|
607
|
+
frbext.puts "Wx.add_delayed_constant(self, :#{rb_constant_name(item.name)}, '#{code}') { #{code} }"
|
607
608
|
end
|
608
609
|
frbext.puts
|
609
610
|
elsif item.value =~ /wxSystemSettings::(\w+)\((.*)\)/
|
@@ -611,7 +612,8 @@ module WXRuby3
|
|
611
612
|
setting_mtd = $1
|
612
613
|
args = $2.split(',').collect {|a| rb_constant_value(a) }.join(', ')
|
613
614
|
frbext.indent do
|
614
|
-
|
615
|
+
code = "Wx::SystemSettings.#{rb_method_name(setting_mtd)}(#{args})"
|
616
|
+
frbext.puts "Wx.add_delayed_constant(self, :#{rb_constant_name(item.name)}, '#{code}') { #{code} }"
|
615
617
|
end
|
616
618
|
frbext.puts
|
617
619
|
else
|
@@ -233,6 +233,7 @@ module WXRuby3
|
|
233
233
|
Director.Spec(pkg, 'wxPersistenceManager', requirements: %w[USE_CONFIG])
|
234
234
|
Director.Spec(pkg, 'wxPersistentObject', requirements: %w[USE_CONFIG])
|
235
235
|
Director.Spec(pkg, 'wxPersistentWindow', requirements: %w[USE_CONFIG])
|
236
|
+
Director.Spec(pkg, 'wxSecretStore', requirements: %w[USE_SECRETSTORE])
|
236
237
|
}
|
237
238
|
|
238
239
|
Director.Package('Wx::PRT', 'USE_PRINTING_ARCHITECTURE') do |pkg|
|
data/rakelib/lib/swig_runner.rb
CHANGED
@@ -43,24 +43,23 @@ module WXRuby3
|
|
43
43
|
@swig_version
|
44
44
|
end
|
45
45
|
|
46
|
-
|
47
46
|
def check_swig
|
48
47
|
begin
|
49
48
|
@swig_version = `#{WXRuby3::Config.get_config('swig')} -version`[/\d+\.\d+\.\d+/]
|
50
49
|
rescue Exception
|
51
|
-
|
50
|
+
$stderr.puts "ERROR: Could not run SWIG (#{WXRuby3::Config.get_config('swig')})"
|
52
51
|
exit(1)
|
53
52
|
end
|
54
53
|
|
55
|
-
# Very old versions put --version on
|
54
|
+
# Very old versions put --version on $stderr, not $stdout
|
56
55
|
unless @swig_version
|
57
|
-
|
56
|
+
$stderr.puts "Could not get version info from SWIG; " +
|
58
57
|
"is a very old version installed?.\n"
|
59
58
|
exit(1)
|
60
59
|
end
|
61
60
|
|
62
61
|
if @swig_version < SWIG_MINIMUM_VERSION
|
63
|
-
|
62
|
+
$stderr.puts "SWIG version #{@swig_version} is installed, " +
|
64
63
|
"minimum version required is #{SWIG_MINIMUM_VERSION}.\n"
|
65
64
|
exit(1)
|
66
65
|
end
|
@@ -72,11 +71,12 @@ module WXRuby3
|
|
72
71
|
check_swig unless swig_state
|
73
72
|
inc_paths = "-I#{config.wxruby_dir} -I#{config.swig_dir}/custom"
|
74
73
|
inc_paths << " -I#{config.swig_dir}/custom/swig#{swig_major}"
|
75
|
-
sh "#{config.get_config('swig')} #{config.wx_cppflags.join(' ')} " +
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
74
|
+
WXRuby3.config.sh "#{config.get_config('swig')} #{config.wx_cppflags.join(' ')} " +
|
75
|
+
"#{config.extra_cppflags.join(' ')} #{config.verbose_flag} #{inc_paths} " +
|
76
|
+
#"-w401 -w801 -w515 -c++ -ruby " +
|
77
|
+
"-w801 -c++ -ruby " +
|
78
|
+
"-o #{target} #{source}",
|
79
|
+
fail_on_error: true
|
80
80
|
end
|
81
81
|
|
82
82
|
end
|
@@ -205,7 +205,7 @@ module WXRuby3
|
|
205
205
|
end
|
206
206
|
|
207
207
|
def self.run(pid, director, target)
|
208
|
-
|
208
|
+
Config.instance.log_progress("Processor.#{pid}: #{target}")
|
209
209
|
const_get(camelize(pid.to_s)).new(director, target).run
|
210
210
|
end
|
211
211
|
|
@@ -262,6 +262,16 @@ module WXRuby3
|
|
262
262
|
|
263
263
|
end
|
264
264
|
|
265
|
+
# output typemaps for common value objects like wxPoint, wxSize, wxRect and wxRealPoint,
|
266
|
+
# making sure to ALWAYS create managed copies
|
267
|
+
%w[Point Size Rect RealPoint].each do |klass|
|
268
|
+
map "const wx#{klass}&", "const wx#{klass}*", as: "Wx::#{klass}" do
|
269
|
+
map_out code: <<~__CODE
|
270
|
+
$result = SWIG_NewPointerObj((new wx#{klass}(*static_cast< const wx#{klass}* >($1))), SWIGTYPE_p_wx#{klass}, SWIG_POINTER_OWN);
|
271
|
+
__CODE
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
265
275
|
# Integer <> wxItemKind type mappings
|
266
276
|
|
267
277
|
map 'wxItemKind' => 'Integer' do
|
data/rakelib/prepost.rake
CHANGED
@@ -23,16 +23,28 @@ namespace 'wxruby' do
|
|
23
23
|
|
24
24
|
namespace 'post' do
|
25
25
|
|
26
|
-
task :srcgem => %w[gem:wxwin gem:install
|
26
|
+
task :srcgem => %w[gem:wxwin gem:install] do
|
27
|
+
$stdout.print "Generating wxRuby3 reference documentation..." if WXRuby3.config.run_silent?
|
28
|
+
Rake::Task['wxruby:doc'].invoke
|
29
|
+
$stdout.puts 'done!' if WXRuby3.config.run_silent?
|
27
30
|
# cleanup
|
28
|
-
rm_rf('rakelib')
|
29
|
-
|
30
|
-
|
31
|
+
rm_rf('rakelib', verbose: !WXRuby3.config.run_silent?)
|
32
|
+
rm_f('Rakefile', verbose: !WXRuby3.config.run_silent?)
|
33
|
+
rm_f('ext/mkrf_conf_ext.rb', verbose: !WXRuby3.config.run_silent?)
|
34
|
+
rm_rf('ext/wxruby3', verbose: !WXRuby3.config.run_silent?)
|
35
|
+
WXRuby3.config.cleanup_bootstrap
|
36
|
+
File.open(File.join(WXRuby3::Config.wxruby_root, 'ext', 'wxruby.setup.done'), 'w') { |f| f << '1' }
|
31
37
|
end
|
32
38
|
|
33
|
-
task :
|
39
|
+
task :binpkg => 'gem:install' do
|
34
40
|
# cleanup
|
35
41
|
rm_rf('rakelib')
|
42
|
+
rm_f('Rakefile')
|
43
|
+
rm_f('ext/mkrf_conf_ext.rb')
|
44
|
+
rm_rf('ext/wxruby3')
|
45
|
+
rm_f('*.pkg')
|
46
|
+
rm_f('*.sha')
|
47
|
+
File.open(File.join(WXRuby3::Config.wxruby_root, 'ext', 'wxruby.setup.done'), 'w') { |f| f << '1' }
|
36
48
|
end
|
37
49
|
|
38
50
|
namespace 'gem' do
|
@@ -77,3 +77,21 @@ div.wxrb-logo table td {
|
|
77
77
|
font-weight: bold;
|
78
78
|
font-size: 0.9em;
|
79
79
|
}
|
80
|
+
|
81
|
+
#filecontents {
|
82
|
+
margin-right: 340px;
|
83
|
+
}
|
84
|
+
|
85
|
+
#filecontents blockquote {
|
86
|
+
border-left: .5em solid #e0e0e0;
|
87
|
+
margin: 10px;
|
88
|
+
padding-left: 10px;
|
89
|
+
}
|
90
|
+
|
91
|
+
#toc {
|
92
|
+
position: fixed;
|
93
|
+
overflow-y: scroll;
|
94
|
+
overflow-x: hidden;
|
95
|
+
top: 1em;
|
96
|
+
bottom: 0;
|
97
|
+
}
|
@@ -1,19 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
def init
|
4
|
-
# It seems YARD messes things up so that a
|
4
|
+
# It seems YARD messes things up so that a lot of classes, modules and constants are not properly
|
5
5
|
# registered in their enclosing namespaces.
|
6
6
|
# This hack makes sure that if that is the case we fix that here.
|
7
|
-
|
8
|
-
|
7
|
+
all_objects = Registry.all(:class, :constant, :module)
|
8
|
+
all_objects.each do |c|
|
9
9
|
if (ns = c.namespace)
|
10
10
|
unless ns.children.any? { |nsc| nsc.path == c.path }
|
11
|
-
ns.children << c # class missing from child list of enclosing namespace -> add here
|
11
|
+
ns.children << c # class/module/constant missing from child list of enclosing namespace -> add here
|
12
12
|
end
|
13
13
|
end
|
14
14
|
if (ns = Registry[c.namespace.path])
|
15
15
|
unless ns.children.any? { |nsc| nsc.path == c.path }
|
16
|
-
ns.children << c # class missing from child list of enclosing namespace -> add here
|
16
|
+
ns.children << c # class/module/constant missing from child list of enclosing namespace -> add here
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
@@ -31,12 +31,18 @@ module YARD # rubocop:disable Style/Documentation
|
|
31
31
|
if fnames.include?(href.path)
|
32
32
|
link.replace "{file:#{href} #{link.inner_html}}"
|
33
33
|
elsif href.path.end_with?('_md.html') && (fname = fnames.find {|fnm| fnm.end_with?(href.path.sub(/_md.html\Z/, '.md')) })
|
34
|
-
link.replace "{file:#{fname} #{link.inner_html}}"
|
34
|
+
link.replace "{file:#{fname}#{href.fragment ? "##{fragment_to_yard(href.fragment)}" : ''} #{link.inner_html}}"
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
38
38
|
super(html.to_s)
|
39
39
|
end
|
40
|
+
|
41
|
+
# this does not work with mixed case labels but is good enough for us
|
42
|
+
def fragment_to_yard(s)
|
43
|
+
s.start_with?('label-') ? s : "label-#{s.gsub('-', '+').capitalize}"
|
44
|
+
end
|
45
|
+
|
40
46
|
end
|
41
47
|
|
42
48
|
Templates::Template.extra_includes << RelativeMarkdownLinks
|
data/samples/sampler/sample.rb
CHANGED
data/tests/lib/wxapp_runner.rb
CHANGED
data/tests/test_config.rb
CHANGED
@@ -203,13 +203,16 @@ class TestConfig < Test::Unit::TestCase
|
|
203
203
|
def run_env_var_tests(cfg)
|
204
204
|
# by default expansion is on
|
205
205
|
|
206
|
+
# Cirrus CI Linux builds run in privileged container without proper user env
|
207
|
+
has_user = Wx::PLATFORM == 'WXMSW' || ENV['USER']
|
208
|
+
|
206
209
|
# add a number of entries for env var in new group 'Environment'
|
207
210
|
cfg['/Environment/HOME'] = '$HOME'
|
208
|
-
cfg['Environment'].USER = Wx::PLATFORM == 'WXMSW' ? '%USERNAME%' : '${USER}'
|
211
|
+
cfg['Environment'].USER = Wx::PLATFORM == 'WXMSW' ? '%USERNAME%' : '${USER}' if has_user
|
209
212
|
cfg['/Environment/PATH'] = '$(PATH)'
|
210
213
|
|
211
214
|
assert_equal(ENV['HOME'], cfg.Environment['HOME'])
|
212
|
-
assert_equal(ENV[Wx::PLATFORM == 'WXMSW' ? 'USERNAME' : 'USER'], cfg['/Environment/USER'])
|
215
|
+
assert_equal(ENV[Wx::PLATFORM == 'WXMSW' ? 'USERNAME' : 'USER'], cfg['/Environment/USER']) if has_user
|
213
216
|
assert_equal(ENV['PATH'], cfg.Environment.PATH)
|
214
217
|
|
215
218
|
# test escaping
|
@@ -225,9 +228,9 @@ class TestConfig < Test::Unit::TestCase
|
|
225
228
|
|
226
229
|
assert_equal('${NonExistingLongNonsenseVariable}', cfg.Environment['NONSENSE'])
|
227
230
|
|
228
|
-
cfg['/Environment/MULTIPLE'] = "$HOME / #{Wx::PLATFORM == 'WXMSW' ? '%USERNAME%' : '${USER}'}"
|
231
|
+
cfg['/Environment/MULTIPLE'] = "$HOME / #{Wx::PLATFORM == 'WXMSW' ? '%USERNAME%' : '${USER}'}" if has_user
|
229
232
|
|
230
|
-
assert_equal("#{ENV['HOME']} / #{Wx::PLATFORM == 'WXMSW' ? ENV['USERNAME'] : ENV['USER']}", cfg.Environment['MULTIPLE'])
|
233
|
+
assert_equal("#{ENV['HOME']} / #{Wx::PLATFORM == 'WXMSW' ? ENV['USERNAME'] : ENV['USER']}", cfg.Environment['MULTIPLE']) if has_user
|
231
234
|
|
232
235
|
# disable env var expansion
|
233
236
|
cfg.expand_env_vars = false
|