wxruby3 0.9.7 → 0.9.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/INSTALL.md +161 -42
  3. data/README.md +28 -22
  4. data/ext/mkrf_conf_ext.rb +68 -0
  5. data/lib/wx/core/secret_store.rb +38 -0
  6. data/lib/wx/doc/extra/02_lifecycles.md +4 -4
  7. data/lib/wx/doc/extra/14_config.md +1 -1
  8. data/lib/wx/doc/secret_store.rb +55 -0
  9. data/lib/wx/version.rb +1 -1
  10. data/lib/wx/wxruby/base.rb +3 -5
  11. data/lib/wx/wxruby/cmd/check.rb +182 -0
  12. data/lib/wx/wxruby/cmd/sampler.rb +1 -1
  13. data/lib/wx/wxruby/cmd/setup.rb +6 -3
  14. data/lib/wx/wxruby/cmd/test.rb +1 -1
  15. data/rakelib/configure.rb +60 -52
  16. data/rakelib/gem.rake +97 -67
  17. data/rakelib/gem.rb +293 -41
  18. data/rakelib/install.rb +3 -3
  19. data/rakelib/lib/config/{cygwin.rb → freebsd.rb} +1 -1
  20. data/rakelib/lib/config/linux.rb +3 -1
  21. data/rakelib/lib/config/macosx.rb +42 -11
  22. data/rakelib/lib/config/mingw.rb +2 -2
  23. data/rakelib/lib/config/pkgman/{base.rb → linux.rb} +36 -61
  24. data/rakelib/lib/config/pkgman/macosx.rb +17 -78
  25. data/rakelib/lib/config/unixish.rb +11 -1
  26. data/rakelib/lib/config/{netbsd.rb → unknown.rb} +3 -2
  27. data/rakelib/lib/config.rb +49 -29
  28. data/rakelib/lib/director/aui_manager.rb +1 -1
  29. data/rakelib/lib/director/dialog.rb +8 -0
  30. data/rakelib/lib/director/grid_ctrl.rb +2 -2
  31. data/rakelib/lib/director/richtext_composite_object.rb +2 -4
  32. data/rakelib/lib/director/secret_store.rb +117 -0
  33. data/rakelib/lib/director/tree_event.rb +2 -2
  34. data/rakelib/lib/generate/doc/secret_store.yaml +55 -0
  35. data/rakelib/lib/generate/doc.rb +1 -1
  36. data/rakelib/lib/specs/interfaces.rb +1 -0
  37. data/rakelib/lib/typemap/common.rb +10 -0
  38. data/rakelib/prepost.rake +8 -1
  39. data/rakelib/yard/templates/default/fulldoc/html/css/wxruby3.css +4 -0
  40. data/samples/sampler/sample.rb +2 -0
  41. data/tests/lib/wxapp_runner.rb +1 -1
  42. data/tests/test_config.rb +7 -4
  43. data/tests/test_secret_store.rb +83 -0
  44. metadata +41 -22
  45. data/rakefile +0 -14
  46. data/rakelib/lib/config/pkgman/arch.rb +0 -53
  47. data/rakelib/lib/config/pkgman/debian.rb +0 -66
  48. data/rakelib/lib/config/pkgman/rhel.rb +0 -54
  49. data/rakelib/lib/config/pkgman/suse.rb +0 -54
@@ -18,7 +18,7 @@ module WXRuby3
18
18
 
19
19
  def install(pkgs)
20
20
  # do we need to install anything?
21
- if !pkgs.empty?
21
+ unless pkgs.empty?
22
22
  # can we install XCode commandline tools?
23
23
  unless no_autoinstall? || !pkgs.include?('xcode') || has_sudo? || is_root?
24
24
  STDERR.puts 'ERROR: Cannot check for or install required packages. Please install sudo or run as root and try again.'
@@ -50,18 +50,20 @@ module WXRuby3
50
50
 
51
51
  private
52
52
 
53
+ def pkgman
54
+ @pkgman ||= WXRuby3.config.sysinfo.os.pkgman
55
+ end
56
+
53
57
  def do_install(pkgs)
54
58
  rc = true
55
59
  # first see if we need to install XCode commandline tools
56
60
  if pkgs.include?('xcode')
57
61
  pkgs.delete('xcode')
58
- rc = run('xcode-select --install')
62
+ rc = auth_run('xcode-select --install')
59
63
  end
60
- # now check if we need any other packages (which need Homebrew or MacPorts)
64
+ # now check if we need any other packages
61
65
  if rc && !pkgs.empty?
62
- # Has Ruby been installed through MacPorts?
63
- if has_macports? &&
64
- (ruby_info = expand('port -q installed installed').strip.split("\n").find { |ln| ln.strip =~ /\Aruby\d+\s/ })
66
+ if pkgman.macports?
65
67
 
66
68
  # this is really crap; with MacPorts we need to install swig-ruby instead of simply swig
67
69
  # which for whatever nonsensical reason will pull in another (older) Ruby version (probably 2.3 or such)
@@ -70,59 +72,15 @@ module WXRuby3
70
72
  pkgs.delete('swig')
71
73
  pkgs << 'swig-ruby'
72
74
  end
73
- # in case MacPorts was installed with root privileges this install would also have to be run
74
- # with root privileges (otherwise it would fail early on with access problems) so we can
75
- # just run without sudo as we either have root privileges for root-installed MacPorts or
76
- # we're running without root privileges for user-installed MacPorts
77
- pkgs.each { |pkg| rc &&= sh("port install #{pkg}") }
78
-
79
- # or are we running without root privileges and have Homebrew installed?
80
- # (Ruby may be installed using Homebrew itself or using a Ruby version manager like RVM)
81
- elsif !is_root? && has_homebrew?
82
75
 
83
- pkgs.each { |pkg| rc &&= sh("brew install #{pkg}") }
84
-
85
- # or do we have MacPorts (running either privileged or not) and
86
- # a Ruby installed using a Ruby version manager.
87
- elsif has_macports?
88
-
89
- # same crap as above
90
- if pkgs.include?('swig')
91
- pkgs.delete('swig')
92
- pkgs << 'swig-ruby'
93
- end
94
- # in case MacPorts was installed with root privileges this install would also have to be run
95
- # with root privileges (otherwise it would fail early on with access problems) so we can
96
- # just run without sudo as we either have root privileges for root-installed MacPorts or
97
- # we're running without root privileges for user-installed MacPorts
98
- pkgs.each { |pkg| rc &&= sh("port install #{pkg}") }
99
-
100
- else
101
- if has_homebrew? || is_root?
102
- $stderr.puts <<~__ERROR_TXT
103
- ERROR: Unsupported Ruby installation. wxRuby3 can only be installed for Ruby with root privileges
104
- in case Ruby was installed with MacPorts. Homebrew should not be run with root privileges.
105
-
106
- Re-install a supported Ruby setup and try again.
107
- __ERROR_TXT
108
- else
109
- $stderr.puts <<~__ERROR_TXT
110
- ERROR: Unsupported Ruby installation. wxRuby3 requires either a MacPorts installed Ruby version
111
- or a non-privileged Ruby installation and have Homebrew installed.
112
-
113
- Install either Homebrew or MacPorts and try again.
114
- __ERROR_TXT
115
- end
116
- exit(1)
117
76
  end
77
+
78
+ # actually install packages
79
+ pkgs.each { |pkg| rc &&= run(pkgman.make_install_command(pkg)); break unless rc }
118
80
  end
119
81
  rc
120
82
  end
121
83
 
122
- def builds_wxwidgets?
123
- Config.get_config('with-wxwin') && Config.get_cfg_string('wxwin').empty?
124
- end
125
-
126
84
  def no_autoinstall?
127
85
  Config.get_config('autoinstall') == false
128
86
  end
@@ -132,46 +90,27 @@ module WXRuby3
132
90
  end
133
91
 
134
92
  def has_sudo?
135
- system('command -v sudo > /dev/null')
93
+ WXRuby3.config.sysinfo.os.has_sudo?
136
94
  end
137
95
 
138
96
  def is_root?
139
- if @is_root.nil?
140
- @is_root = (`id -u 2>/dev/null`.chomp == '0')
141
- end
142
- @is_root
143
- end
144
-
145
- def has_macports?
146
- if @has_macports.nil?
147
- @has_macports = system('command -v port>/dev/null')
148
- end
97
+ WXRuby3.config.sysinfo.os.is_root?
149
98
  end
150
99
 
151
- def has_homebrew?
152
- if @has_homebrew.nil?
153
- @has_homebrew = system('command -v brew>/dev/null')
154
- end
155
- end
156
-
157
- def run(cmd)
100
+ def auth_run(cmd)
158
101
  $stdout.print "Running #{cmd}..."
159
102
  rc = WXRuby3.config.sh("#{is_root? ? '' : 'sudo '}#{cmd}")
160
- $stderr.puts (rc ? 'done!' : 'FAILED!')
103
+ $stderr.puts(rc ? 'done!' : 'FAILED!')
161
104
  rc
162
105
  end
163
106
 
164
- def sh(*cmd, title: nil)
107
+ def run(*cmd, title: nil)
165
108
  $stdout.print(title ? title : "Running #{cmd}...")
166
109
  rc = WXRuby3.config.sh(*cmd)
167
- $stderr.puts (rc ? 'done!' : 'FAILED!')
110
+ $stderr.puts(rc ? 'done!' : 'FAILED!')
168
111
  rc
169
112
  end
170
113
 
171
- def expand(cmd)
172
- WXRuby3.config.expand(cmd)
173
- end
174
-
175
114
  end
176
115
 
177
116
  end
@@ -66,6 +66,12 @@ module WXRuby3
66
66
  def get_rpath_origin
67
67
  "$ORIGIN"
68
68
  end
69
+ protected :get_rpath_origin
70
+
71
+ # add deployment lookup paths for wxruby shared libraries
72
+ def update_shlib_loadpaths(shlib)
73
+ WXRuby3.config.patch_rpath(shlib, WXRuby3.config.get_rpath_origin, "#{WXRuby3.config.get_rpath_origin}/../ext")
74
+ end
69
75
 
70
76
  def expand(cmd)
71
77
  STDERR.puts "> sh: #{cmd}" if verbose?
@@ -74,6 +80,10 @@ module WXRuby3
74
80
  s
75
81
  end
76
82
 
83
+ def download_file(url, dest)
84
+ sh("curl -L #{url} --output #{dest}")
85
+ end
86
+
77
87
  private
78
88
 
79
89
  def wx_checkout
@@ -101,7 +111,7 @@ module WXRuby3
101
111
  end
102
112
 
103
113
  def wx_configure
104
- bash('./configure --prefix=`pwd`/install --disable-tests --without-subdirs --disable-debug_info')
114
+ bash('./configure --prefix=`pwd`/install --disable-tests --without-subdirs --without-regex --disable-debug_info')
105
115
  end
106
116
 
107
117
  def wx_make
@@ -3,7 +3,8 @@
3
3
  # This software is released under the MIT license.
4
4
 
5
5
  ###
6
- # wxRuby3 buildtools configuration
6
+ # wxRuby3 buildtools configuration fallback
7
7
  ###
8
8
 
9
- raise "NETBSD platform is unsupported as yet."
9
+ $stderr.puts 'ERROR: Unsupported Ruby platform!'
10
+ exit(1)
@@ -11,6 +11,7 @@ require 'fileutils'
11
11
  require 'json'
12
12
  require 'open3'
13
13
  require 'monitor'
14
+ require 'plat4m'
14
15
 
15
16
  module FileUtils
16
17
  # add convenience methods
@@ -67,7 +68,8 @@ module WXRuby3
67
68
  'sodir' => '$siterubyverarch',
68
69
  }
69
70
 
70
- CFG_KEYS.concat(%w{wxwin wxxml wxwininstdir with-wxwin with-debug swig doxygen})
71
+ CFG_KEYS.concat(%w{wxwin wxxml wxwininstdir with-wxwin with-debug swig doxygen git})
72
+ WXW_SYS_KEY = 'with-system-wxwin'
71
73
  CONFIG.merge!({
72
74
  'wxwin' => ENV['WXWIN'] || '',
73
75
  'wxxml' => ENV['WXXML'] || '',
@@ -280,7 +282,7 @@ module WXRuby3
280
282
  end
281
283
  begin
282
284
  # setup ENV for child execution
283
- ENV.merge!(Config.instance.exec_env)
285
+ ENV.update(Config.instance.exec_env)
284
286
  output = `#{cmd.join(' ')}`
285
287
  ensure
286
288
  # restore ENV
@@ -350,7 +352,7 @@ module WXRuby3
350
352
 
351
353
  def test(*tests, **options)
352
354
  errors = 0
353
- excludes = (ENV['WXRUBY_TEST_EXCLUDE'] || '').split(';')
355
+ excludes = (ENV['WXRUBY_TEST_EXCLUDE'] || '').split(':')
354
356
  tests = Dir.glob(File.join(Config.instance.test_dir, '*.rb')) if tests.empty?
355
357
  tests.each do |test|
356
358
  unless excludes.include?(File.basename(test, '.*'))
@@ -381,6 +383,10 @@ module WXRuby3
381
383
  []
382
384
  end
383
385
 
386
+ def download_file(_url, _dest)
387
+ raise NoMethodError
388
+ end
389
+
384
390
  def install_prerequisites
385
391
  pkg_deps = check_tool_pkgs
386
392
  if get_config('autoinstall') == false
@@ -443,16 +449,22 @@ module WXRuby3
443
449
  def get_rpath_origin
444
450
  ''
445
451
  end
452
+ protected :get_rpath_origin
446
453
 
447
- def check_rpath_patch
454
+ def patch_rpath(_shlib, *)
448
455
  true
449
456
  end
457
+ protected :patch_rpath
450
458
 
451
- def patch_rpath(_shlib, *)
459
+ def update_shlib_loadpaths(_shlib)
460
+ true
461
+ end
462
+
463
+ def update_shlib_ruby_libpath(_shlib)
452
464
  true
453
465
  end
454
466
 
455
- def update_shlib_loadpaths(_shlib, _deplibs)
467
+ def update_shlib_wxwin_libpaths(_shlib, _deplibs)
456
468
  true
457
469
  end
458
470
 
@@ -494,15 +506,23 @@ module WXRuby3
494
506
  end
495
507
 
496
508
  def save
509
+ cfg = WXRuby3::CONFIG.dup
510
+ wxw_system = !!cfg.delete(WXW_SYS_KEY)
511
+ cfg['wxwin'] = '@system' if wxw_system
497
512
  File.open(build_cfg, 'w') do |f|
498
- f << JSON.pretty_generate(WXRuby3::CONFIG)
513
+ f << JSON.pretty_generate(cfg)
499
514
  end
500
515
  end
501
516
 
502
517
  def load
503
518
  if File.file?(build_cfg)
504
519
  File.open(build_cfg, 'r') do |f|
505
- WXRuby3::CONFIG.merge!(JSON.load(f.read))
520
+ cfg = JSON.load(f.read)
521
+ if cfg['wxwin'] == '@system'
522
+ cfg[WXW_SYS_KEY] = true
523
+ cfg.delete('wxwin')
524
+ end
525
+ WXRuby3::CONFIG.merge!(cfg)
506
526
  end
507
527
  end
508
528
  end
@@ -515,10 +535,8 @@ module WXRuby3
515
535
  case RUBY_PLATFORM
516
536
  when /mingw/
517
537
  :mingw
518
- when /cygwin/
519
- :cygwin
520
- when /netbsd/
521
- :netbsd
538
+ when /freebsd/
539
+ :freebsd
522
540
  when /darwin/
523
541
  :macosx
524
542
  when /linux/
@@ -538,15 +556,26 @@ module WXRuby3
538
556
  def initialize
539
557
  @ruby_exe = RB_CONFIG["ruby_install_name"]
540
558
 
541
- @extmk = /extmk\.rb/ =~ $0
542
- @platform = Config.platform
543
- require File.join(File.dirname(__FILE__), 'config', @platform.to_s)
559
+ @sysinfo = Plat4m.current rescue nil
560
+ @platform = if @sysinfo
561
+ case @sysinfo.os.id
562
+ when :darwin
563
+ :macosx
564
+ when :windows
565
+ RUBY_PLATFORM =~ /mingw/ ? :mingw : :unknown
566
+ else
567
+ @sysinfo.os.id
568
+ end
569
+ else
570
+ :unknown
571
+ end
572
+ require_relative File.join('config', @platform.to_s)
544
573
  self.class.include(WXRuby3::Config::Platform)
545
574
 
546
575
  init # initialize settings
547
576
  end
548
577
 
549
- attr_reader :ruby_exe, :extmk, :platform, :helper_modules, :helper_inits, :include_modules, :verbosity
578
+ attr_reader :ruby_exe, :sysinfo, :platform, :helper_modules, :helper_inits, :include_modules, :verbosity
550
579
  attr_reader :release_build, :debug_build, :verbose_debug, :no_deprecate
551
580
  attr_reader :ruby_cppflags, :ruby_ldflags, :ruby_libs, :extra_cflags, :extra_cppflags, :extra_ldflags,
552
581
  :extra_libs, :cpp_out_flag, :link_output_flag, :obj_ext, :dll_ext,
@@ -593,11 +622,6 @@ module WXRuby3
593
622
 
594
623
  # Extra swig helper files to be built
595
624
  @helper_modules = %w|RubyStockObjects|
596
- # if macosx?
597
- # %w|RubyStockObjects Mac|
598
- # else
599
- # %w|RubyStockObjects|
600
- # end
601
625
  # helper to initialize on startup (stock objects can only be initialized after App creation)
602
626
  @helper_inits = @helper_modules - %w|RubyStockObjects|
603
627
 
@@ -640,7 +664,7 @@ module WXRuby3
640
664
  @obj_ext = RB_CONFIG["OBJEXT"]
641
665
  @dll_ext = RB_CONFIG['DLEXT']
642
666
 
643
- # Exclude certian classes from being built, even if they are present
667
+ # Exclude certain classes from being built, even if they are present
644
668
  # in the configuration of wxWidgets.
645
669
  if ENV['WXRUBY_EXCLUDED']
646
670
  ENV['WXRUBY_EXCLUDED'].split(",").each { |classname| exclude_module(classname) }
@@ -704,16 +728,12 @@ module WXRuby3
704
728
  @wx_abi_version || ''
705
729
  end
706
730
 
707
- def cygwin?
708
- @platform == :cygwin
709
- end
710
-
711
731
  def mingw?
712
732
  @platform == :mingw
713
733
  end
714
734
 
715
- def netbsd?
716
- @platform == :netbsd
735
+ def freebsd?
736
+ @platform == :freebsd
717
737
  end
718
738
 
719
739
  def macosx?
@@ -725,7 +745,7 @@ module WXRuby3
725
745
  end
726
746
 
727
747
  def windows?
728
- mingw? || cygwin?
748
+ mingw?
729
749
  end
730
750
 
731
751
  def ldflags(_target)
@@ -53,7 +53,7 @@ module WXRuby3
53
53
  m_actionWindow = NULL;
54
54
  m_hoverButton = NULL;
55
55
  m_art = new wxAuiDefaultDockArt;
56
- m_hintWnd = NULL;
56
+ #{Config.instance.wx_version < '3.3.0' ? 'm_hintWnd = NULL;' : ''}
57
57
  m_flags = wxAUI_MGR_DEFAULT;
58
58
  m_hasMaximized = false;
59
59
  m_dockConstraintX = 0.3;
@@ -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'
@@ -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, 0},
240
+ { NULL, NULL, __wxGridWindow_size, 0, {}},
241
241
  #else
242
- { NULL, NULL, __wxGridWindow_size, 0},
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, 0},
96
+ { NULL, NULL, __wxRichTextFloatCollector_size, 0, {}},
97
97
  #else
98
- { NULL, NULL, __wxRichTextFloatCollector_size, 0},
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, 0},
58
+ { NULL, NULL, __wxTreeItemId_size, 0, {}},
59
59
  #else
60
- { NULL, NULL, __wxTreeItemId_size, 0},
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.
@@ -713,9 +713,9 @@ module WXRuby3
713
713
  gen_class_doc(fdoc) unless no_gen?(:classes)
714
714
  end
715
715
  package.all_modules.each do |_|
716
+ mod_indent -= 1
716
717
  fdoc.puts
717
718
  fdoc.iputs('end', mod_indent)
718
- mod_indent -= 1
719
719
  end
720
720
  end
721
721
  end
@@ -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|
@@ -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