wxruby3 0.9.1 → 0.9.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/.yardopts +1 -0
- data/ext/wxruby3/include/wxRubyApp.h +338 -0
- data/ext/wxruby3/include/wxruby-Config.h +6 -6
- data/ext/wxruby3/swig/common.i +1 -1
- data/lib/wx/aui/aui_tab_ctrl.rb +18 -0
- data/lib/wx/aui/auinotebook.rb +6 -2
- data/lib/wx/aui/require.rb +1 -0
- data/lib/wx/core/app.rb +2 -2
- data/lib/wx/core/collapsible_pane.rb +1 -1
- data/lib/wx/core/controlwithitems.rb +8 -6
- data/lib/wx/core/menu.rb +10 -0
- data/lib/wx/core/notebook.rb +6 -2
- data/lib/wx/core/sizer.rb +11 -0
- data/lib/wx/core/task_bar_button.rb +19 -0
- data/lib/wx/core/textctrl.rb +11 -1
- data/lib/wx/core/{treectrl.rb → tree_ctrl.rb} +31 -12
- data/lib/wx/core/window.rb +10 -0
- data/lib/wx/doc/app.rb +48 -38
- data/lib/wx/doc/art_locator.rb +47 -43
- data/lib/wx/doc/aui/auimanager.rb +16 -8
- data/lib/wx/doc/aui/auinotebook.rb +20 -5
- data/lib/wx/doc/clipboard.rb +11 -7
- data/lib/wx/doc/colour_dialog.rb +14 -10
- data/lib/wx/doc/controlwithitems.rb +17 -7
- data/lib/wx/doc/data_object.rb +2 -2
- data/lib/wx/doc/evthandler.rb +113 -108
- data/lib/wx/doc/font.rb +1 -0
- data/lib/wx/doc/gc_dc.rb +6 -1
- data/lib/wx/doc/graphics_context.rb +1 -0
- data/lib/wx/doc/grid/grid.rb +22 -1
- data/lib/wx/doc/help_controller.rb +11 -7
- data/lib/wx/doc/html/html_help_controller.rb +12 -4
- data/lib/wx/doc/list_ctrl.rb +33 -29
- data/lib/wx/doc/menu.rb +20 -0
- data/lib/wx/doc/notebook.rb +21 -0
- data/lib/wx/doc/pg/events.rb +13 -9
- data/lib/wx/doc/pg/pg_property.rb +18 -0
- data/lib/wx/doc/progress_dialog.rb +36 -32
- data/lib/wx/doc/prt/page_setup_dialog.rb +20 -12
- data/lib/wx/doc/prt/print_data.rb +13 -5
- data/lib/wx/doc/prt/print_dialog.rb +31 -23
- data/lib/wx/doc/prt/printer.rb +20 -12
- data/lib/wx/doc/radio_box.rb +19 -15
- data/lib/wx/doc/rbn/ribbon_bar.rb +13 -5
- data/lib/wx/doc/rbn/ribbon_button_bar.rb +13 -5
- data/lib/wx/doc/rbn/ribbon_gallery.rb +13 -5
- data/lib/wx/doc/rbn/ribbon_tool_bar.rb +13 -5
- data/lib/wx/doc/region_iterator.rb +32 -28
- data/lib/wx/doc/rtc/rich_text_composite_object.rb +24 -0
- data/lib/wx/doc/rtc/rich_text_ctrl.rb +24 -0
- data/lib/wx/doc/rtc/rich_text_paragraph.rb +24 -0
- data/lib/wx/doc/rtc/richtext_buffer.rb +27 -19
- data/lib/wx/doc/rtc/richtext_printing.rb +17 -9
- data/lib/wx/doc/rtc/richtext_style_sheet.rb +17 -9
- data/lib/wx/doc/sizer.rb +20 -0
- data/lib/wx/doc/stc/styled_text_ctrl.rb +24 -0
- data/lib/wx/doc/stream.rb +39 -35
- data/lib/wx/doc/system_settings.rb +30 -26
- data/lib/wx/doc/text_validator.rb +12 -8
- data/lib/wx/doc/textctrl.rb +16 -0
- data/lib/wx/doc/tree_ctrl.rb +95 -0
- data/lib/wx/doc/treebook.rb +9 -5
- data/lib/wx/doc/v_list_box.rb +9 -5
- data/lib/wx/doc/variant.rb +164 -160
- data/lib/wx/doc/window.rb +57 -47
- data/lib/wx/doc/window_disabler.rb +10 -6
- data/lib/wx/grid/grid.rb +27 -4
- data/lib/wx/pg/pg_property.rb +22 -0
- data/lib/wx/rtc/require.rb +3 -0
- data/lib/wx/rtc/rich_text_composite_object.rb +25 -0
- data/lib/wx/rtc/rich_text_ctrl.rb +25 -0
- data/lib/wx/rtc/rich_text_paragraph.rb +25 -0
- data/lib/wx/stc/require.rb +1 -0
- data/lib/wx/stc/styled_text_ctrl.rb +25 -0
- data/lib/wx/version.rb +1 -1
- data/rakelib/lib/config/linux.rb +0 -3
- data/rakelib/lib/config/macosx.rb +2 -2
- data/rakelib/lib/config/mingw.rb +1 -1
- data/rakelib/lib/config/unixish.rb +1 -1
- data/rakelib/lib/config.rb +14 -4
- data/rakelib/lib/core/package.rb +14 -7
- data/rakelib/lib/core/spec.rb +6 -1
- data/rakelib/lib/director/accelerator.rb +2 -3
- data/rakelib/lib/director/accessible.rb +47 -0
- data/rakelib/lib/director/app.rb +12 -319
- data/rakelib/lib/director/app_traits.rb +10 -12
- data/rakelib/lib/director/ctrl_with_items.rb +17 -5
- data/rakelib/lib/director/data_format.rb +1 -1
- data/rakelib/lib/director/derived_dc.rb +1 -1
- data/rakelib/lib/director/dialog.rb +1 -0
- data/rakelib/lib/director/drag_image.rb +2 -3
- data/rakelib/lib/director/event.rb +2 -2
- data/rakelib/lib/director/frame.rb +1 -3
- data/rakelib/lib/director/gdicommon.rb +8 -10
- data/rakelib/lib/director/graphics_context.rb +2 -4
- data/rakelib/lib/director/grid_ctrl.rb +34 -3
- data/rakelib/lib/director/icon.rb +5 -2
- data/rakelib/lib/director/list_ctrl.rb +5 -6
- data/rakelib/lib/director/locale.rb +1 -3
- data/rakelib/lib/director/log.rb +1 -4
- data/rakelib/lib/director/media_ctrl.rb +54 -0
- data/rakelib/lib/director/menu.rb +16 -1
- data/rakelib/lib/director/menu_item.rb +2 -2
- data/rakelib/lib/director/pgproperties.rb +1 -1
- data/rakelib/lib/director/pgproperty.rb +24 -1
- data/rakelib/lib/director/property_grid_interface.rb +5 -10
- data/rakelib/lib/director/richtext_composite_object.rb +25 -0
- data/rakelib/lib/director/richtext_ctrl.rb +14 -4
- data/rakelib/lib/director/richtext_formatting_dialog.rb +7 -5
- data/rakelib/lib/director/richtext_paragraph_layout_box.rb +9 -7
- data/rakelib/lib/director/sizer.rb +15 -0
- data/rakelib/lib/director/static_box.rb +4 -5
- data/rakelib/lib/director/styled_text_ctrl.rb +12 -0
- data/rakelib/lib/director/task_bar_button.rb +30 -0
- data/rakelib/lib/director/task_bar_icon.rb +5 -13
- data/rakelib/lib/director/textctrl.rb +12 -1
- data/rakelib/lib/director/tool_tip.rb +1 -1
- data/rakelib/lib/director/top_level_window.rb +4 -5
- data/rakelib/lib/director/tree_ctrl.rb +5 -6
- data/rakelib/lib/director/variant.rb +1 -1
- data/rakelib/lib/director/window.rb +24 -5
- data/rakelib/lib/director.rb +4 -4
- data/rakelib/lib/extractor/function.rb +6 -6
- data/rakelib/lib/extractor.rb +34 -5
- data/rakelib/lib/generate/analyzer.rb +8 -3
- data/rakelib/lib/generate/doc/busy_info.yaml +0 -2
- data/rakelib/lib/generate/doc/clipboard.yaml +0 -2
- data/rakelib/lib/generate/doc/cursor.yaml +0 -2
- data/rakelib/lib/generate/doc/panel.yaml +7 -0
- data/rakelib/lib/generate/doc.rb +76 -14
- data/rakelib/lib/specs/interfaces.rb +161 -160
- data/rakelib/lib/typemap/common.rb +30 -1
- data/rakelib/yard/templates/default/fulldoc/html/css/wxruby3.css +74 -2
- data/rakelib/yard/templates/default/fulldoc/html/full_list.erb +38 -0
- data/rakelib/yard/templates/default/fulldoc/html/setup.rb +39 -0
- data/rakelib/yard/templates/default/tags/html/wxrb_require.erb +10 -0
- data/rakelib/yard/templates/default/tags/setup.rb +16 -0
- data/rakelib/yard/yard-custom-templates.rb +3 -0
- data/samples/treectrl/treectrl.rb +1 -1
- data/tests/media/beep_lo.wav +0 -0
- data/tests/test_list_ctrl.rb +1 -1
- data/tests/test_media_ctrl.rb +38 -0
- data/tests/test_menu.rb +69 -0
- data/tests/test_pg.rb +27 -0
- data/tests/test_richtext.rb +45 -0
- data/tests/test_sizer.rb +16 -0
- data/tests/test_std_controls.rb +42 -1
- data/tests/test_styled_text_ctrl.rb +46 -0
- data/tests/test_tree_ctrl.rb +138 -0
- data/tests/test_window.rb +12 -0
- data/tests/testapp_noframe.rb +1 -1
- metadata +31 -3
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Copyright (c) 2023 M.J.N. Corino, The Netherlands
|
|
2
|
+
#
|
|
3
|
+
# This software is released under the MIT license.
|
|
4
|
+
|
|
5
|
+
module Wx
|
|
6
|
+
|
|
7
|
+
module RTC
|
|
8
|
+
|
|
9
|
+
class RichTextParagraph
|
|
10
|
+
|
|
11
|
+
# Overload to provide Enumerator without block
|
|
12
|
+
wx_each_line = instance_method :each_line
|
|
13
|
+
define_method :each_line do |&block|
|
|
14
|
+
if block
|
|
15
|
+
wx_each_line.bind(self).call(&block)
|
|
16
|
+
else
|
|
17
|
+
::Enumerator.new { |y| wx_each_line.bind(self).call { |ln| y << ln } }
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
data/lib/wx/stc/require.rb
CHANGED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Copyright (c) 2023 M.J.N. Corino, The Netherlands
|
|
2
|
+
#
|
|
3
|
+
# This software is released under the MIT license.
|
|
4
|
+
|
|
5
|
+
module Wx
|
|
6
|
+
|
|
7
|
+
module STC
|
|
8
|
+
|
|
9
|
+
class StyledTextCtrl
|
|
10
|
+
|
|
11
|
+
# Overload to provide Enumerator without block
|
|
12
|
+
wx_each_line = instance_method :each_line
|
|
13
|
+
define_method :each_line do |&block|
|
|
14
|
+
if block
|
|
15
|
+
wx_each_line.bind(self).call(&block)
|
|
16
|
+
else
|
|
17
|
+
::Enumerator.new { |y| wx_each_line.bind(self).call { |ln| y << ln } }
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
data/lib/wx/version.rb
CHANGED
data/rakelib/lib/config/linux.rb
CHANGED
|
@@ -65,9 +65,6 @@ module WXRuby3
|
|
|
65
65
|
# create a .so binary
|
|
66
66
|
@extra_ldflags << '-shared'
|
|
67
67
|
|
|
68
|
-
# This class is not available on linux ports (wxGTK/wxQT/wxX11/wxMotif)
|
|
69
|
-
exclude_module('wxPrinterDC')
|
|
70
|
-
|
|
71
68
|
unless @wx_path.empty?
|
|
72
69
|
libdirs = @wx_libs.select {|s| s.start_with?('-L')}.collect {|s| s.sub(/^-L/,'')}
|
|
73
70
|
@exec_env['LD_LIBRARY_PATH'] = "#{ENV['LD_LIBRARY_PATH']}:#{dest_dir}:#{libdirs.join(':')}"
|
|
@@ -65,7 +65,7 @@ module WXRuby3
|
|
|
65
65
|
end
|
|
66
66
|
end
|
|
67
67
|
# some weird thing with this; at least sometimes '--libs all' will not output media library even if feature active
|
|
68
|
-
if features_set?('
|
|
68
|
+
if features_set?('USE_MEDIACTRL')
|
|
69
69
|
lib_list = wx_config("--libs media").split(' ')
|
|
70
70
|
until lib_list.empty?
|
|
71
71
|
s = lib_list.shift
|
|
@@ -107,7 +107,7 @@ module WXRuby3
|
|
|
107
107
|
@ld.sub!(/-o\s*\Z/, '')
|
|
108
108
|
|
|
109
109
|
@extra_cflags.concat %w[-Wno-unused-function -Wno-conversion-null -Wno-sometimes-uninitialized
|
|
110
|
-
-Wno-overloaded-virtual -Wno-deprecated-copy
|
|
110
|
+
-Wno-overloaded-virtual -Wno-deprecated-copy]
|
|
111
111
|
@extra_cflags << ' -Wno-deprecated-declarations' unless @no_deprecated
|
|
112
112
|
|
|
113
113
|
# create a .dylib binary
|
data/rakelib/lib/config/mingw.rb
CHANGED
|
@@ -136,7 +136,7 @@ module WXRuby3
|
|
|
136
136
|
wx_libset = ::Set.new
|
|
137
137
|
wx_libset.merge wx_config("--libs all").split(' ')
|
|
138
138
|
# some weird thing with this; at least sometimes '--libs all' will not output media library even if feature active
|
|
139
|
-
if features_set?('
|
|
139
|
+
if features_set?('USE_MEDIACTRL')
|
|
140
140
|
wx_libset.merge wx_config("--libs media").split(' ')
|
|
141
141
|
end
|
|
142
142
|
wx_libset.collect { |s| s.dup }
|
data/rakelib/lib/config.rb
CHANGED
|
@@ -589,7 +589,7 @@ module WXRuby3
|
|
|
589
589
|
private :any_feature_set?
|
|
590
590
|
|
|
591
591
|
def features_set?(*featureset)
|
|
592
|
-
featureset.all? do |feature|
|
|
592
|
+
featureset.flatten.all? do |feature|
|
|
593
593
|
if AnyOf === feature
|
|
594
594
|
any_feature_set?(*feature.features)
|
|
595
595
|
else
|
|
@@ -615,9 +615,19 @@ module WXRuby3
|
|
|
615
615
|
def _retrieve_features(wxwidgets_setup_h)
|
|
616
616
|
features = {}
|
|
617
617
|
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
618
|
+
if is_configured? && wxwidgets_setup_h
|
|
619
|
+
File.read(wxwidgets_setup_h).scan(/^\s*#define\s+(wx\w+|__\w+__)\s+([01])/) do | define |
|
|
620
|
+
feat_val = $2.to_i.zero? ? false : true
|
|
621
|
+
feat_id = $1.sub(/\Awx/i, '').gsub(/\A__|__\Z/, '')
|
|
622
|
+
features[feat_id] = feat_val
|
|
623
|
+
end
|
|
624
|
+
# make sure correct platform defines are included as well which will not be the case always
|
|
625
|
+
# (for example __WXMSW__ and __WXOSX__ are not in setup.h)
|
|
626
|
+
features['WXMSW'] = true if features['GNUWIN32']
|
|
627
|
+
features['WXOSX'] = true if features['DARWIN']
|
|
628
|
+
# prior to wxWidgets 3.3 this feature was not set for wxGTK builds
|
|
629
|
+
features['WXGTK'] = true if features['LINUX'] && !features['WXGTK'] && wx_port == :wxgtk
|
|
630
|
+
end
|
|
621
631
|
|
|
622
632
|
features
|
|
623
633
|
end
|
data/rakelib/lib/core/package.rb
CHANGED
|
@@ -105,7 +105,7 @@ module WXRuby3
|
|
|
105
105
|
end
|
|
106
106
|
|
|
107
107
|
def included_directors
|
|
108
|
-
directors.select { |dir| !Config.instance.excluded_module?(dir.spec) }
|
|
108
|
+
directors.select { |dir| Package.full_docs? || !Config.instance.excluded_module?(dir.spec) }
|
|
109
109
|
end
|
|
110
110
|
|
|
111
111
|
def director_for_class(class_name)
|
|
@@ -248,7 +248,7 @@ module WXRuby3
|
|
|
248
248
|
end
|
|
249
249
|
|
|
250
250
|
# next initialize all modules with classes depending (bases AND mixins) on classes in any modules already
|
|
251
|
-
#
|
|
251
|
+
# selecteduntil there are no more modules left or none that are left depend on any selected ones
|
|
252
252
|
while dir_inx = inc_dirs.find_index { |dir| !dir.spec.initialize_at_end && is_dir_with_fulfilled_deps?(dir, cls_set) }
|
|
253
253
|
dir = inc_dirs[dir_inx]
|
|
254
254
|
modreg = Spec.module_registry[dir.spec.module_name]
|
|
@@ -359,8 +359,7 @@ module WXRuby3
|
|
|
359
359
|
# generate constant definitions for feature defines from setup.h
|
|
360
360
|
fsrc.puts %Q{VALUE mWxSetup = rb_define_module_under(#{module_variable}, "Setup");}
|
|
361
361
|
Config.instance.features.each do |feature, val|
|
|
362
|
-
|
|
363
|
-
fsrc.puts %Q{rb_define_const(mWxSetup, "#{const_name}", Q#{val});}
|
|
362
|
+
fsrc.puts %Q{rb_define_const(mWxSetup, "#{feature}", Q#{val});}
|
|
364
363
|
end
|
|
365
364
|
else
|
|
366
365
|
fsrc.puts %Q{#{module_variable} = rb_define_module_under(wxRuby_Core(), "#{name}");}
|
|
@@ -523,10 +522,12 @@ module WXRuby3
|
|
|
523
522
|
# ----------------------------------------------------------------------------
|
|
524
523
|
|
|
525
524
|
|
|
526
|
-
|
|
525
|
+
module Wx
|
|
527
526
|
|
|
528
|
-
|
|
529
|
-
|
|
527
|
+
class EvtHandler
|
|
528
|
+
|
|
529
|
+
__HEREDOC
|
|
530
|
+
fdoc.indent(2) do
|
|
530
531
|
fdoc.doc.puts "@!group #{name} Event handler methods"
|
|
531
532
|
fdoc.puts
|
|
532
533
|
evts_handled = ::Set.new
|
|
@@ -557,6 +558,8 @@ module WXRuby3
|
|
|
557
558
|
fdoc.doc.puts '@!endgroup'
|
|
558
559
|
end
|
|
559
560
|
fdoc.puts
|
|
561
|
+
fdoc.puts ' end'
|
|
562
|
+
fdoc.puts
|
|
560
563
|
fdoc.puts 'end'
|
|
561
564
|
end
|
|
562
565
|
end
|
|
@@ -634,6 +637,10 @@ module WXRuby3
|
|
|
634
637
|
end
|
|
635
638
|
private :generate_core_doc
|
|
636
639
|
|
|
640
|
+
def self.full_docs?
|
|
641
|
+
!!ENV['WXRUBY_FULLDOCS']
|
|
642
|
+
end
|
|
643
|
+
|
|
637
644
|
def generate_docs
|
|
638
645
|
# make sure all modules have been extracted from xml
|
|
639
646
|
included_directors.each {|dir| dir.extract_interface(false, gendoc: true) }
|
data/rakelib/lib/core/spec.rb
CHANGED
|
@@ -327,7 +327,12 @@ module WXRuby3
|
|
|
327
327
|
end
|
|
328
328
|
|
|
329
329
|
def ignore(*names, ignore_doc: true)
|
|
330
|
-
names.flatten.each {|n| @ignores[n] = ignore_doc}
|
|
330
|
+
names.flatten.each { |n| @ignores[n] = {ignore: true, ignore_doc: ignore_doc} }
|
|
331
|
+
self
|
|
332
|
+
end
|
|
333
|
+
|
|
334
|
+
def ignore_unless(feature_set, *names)
|
|
335
|
+
names.flatten.each { |n| @ignores[n] = {ignore: feature_set} }
|
|
331
336
|
self
|
|
332
337
|
end
|
|
333
338
|
|
|
@@ -47,9 +47,8 @@ module WXRuby3
|
|
|
47
47
|
(TYPE($input) == T_STRING && RSTRING_LEN($input) == 1) );
|
|
48
48
|
__CODE
|
|
49
49
|
end
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
end
|
|
50
|
+
spec.ignore_unless('WXMSW',
|
|
51
|
+
'wxAcceleratorTable::wxAcceleratorTable(const wxString &)')
|
|
53
52
|
spec.add_swig_code <<~__HEREDOC
|
|
54
53
|
%warnfilter(509) wxAcceleratorTable::wxAcceleratorTable;
|
|
55
54
|
__HEREDOC
|
|
@@ -0,0 +1,47 @@
|
|
|
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 Accessible < Director
|
|
14
|
+
|
|
15
|
+
def setup
|
|
16
|
+
super
|
|
17
|
+
spec.make_abstract 'wxAccessible'
|
|
18
|
+
spec.map 'wxAccessible**' => 'Wx::Accessible' do
|
|
19
|
+
map_in ignore: true, temp: 'wxAccessible* tmp', code: '$1 = &tmp;'
|
|
20
|
+
map_argout code: <<~__HEREDOC
|
|
21
|
+
if (tmp$argnum)
|
|
22
|
+
{
|
|
23
|
+
$result = SWIG_Ruby_AppendOutput($result, SWIG_NewPointerObj(SWIG_as_voidptr(tmp$argnum), SWIGTYPE_p_wxAccessible, 0));
|
|
24
|
+
}
|
|
25
|
+
__HEREDOC
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
spec.map 'wxString *' => 'String' do
|
|
29
|
+
map_in ignore: true, temp: 'wxString tmp', code: '$1 = &tmp;'
|
|
30
|
+
map_argout code: '$result = SWIG_Ruby_AppendOutput($result, WXSTR_TO_RSTR(tmp$argnum));'
|
|
31
|
+
end
|
|
32
|
+
spec.map 'wxAccRole *' => 'Wx::AccRole' do
|
|
33
|
+
map_in ignore: true, temp: 'wxAccRole tmp', code: '$1 = &tmp;'
|
|
34
|
+
map_argout code: <<~__HEREDOC
|
|
35
|
+
$result = SWIG_Ruby_AppendOutput($result, wxRuby_GetEnumValueObject("AccRole", static_cast<int>(tmp$argnum)));
|
|
36
|
+
__HEREDOC
|
|
37
|
+
end
|
|
38
|
+
spec.map_apply 'int * OUTPUT' => ['int * childCount', 'int * childId', 'int * toId']
|
|
39
|
+
spec.map_apply 'long * OUTPUT' => 'long * state'
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
end
|
|
47
|
+
|
data/rakelib/lib/director/app.rb
CHANGED
|
@@ -16,6 +16,15 @@ module WXRuby3
|
|
|
16
16
|
|
|
17
17
|
def setup
|
|
18
18
|
spec.items << 'wxAppConsole' << 'wxEventFilter'
|
|
19
|
+
if Config.instance.wx_version >= '3.3.0'
|
|
20
|
+
spec.items << 'wxDarkModeSettings'
|
|
21
|
+
spec.ignore_unless('WXMSW', 'wxDarkModeSettings', 'wxMenuColour')
|
|
22
|
+
if Config.instance.features_set?('WXMSW')
|
|
23
|
+
spec.disown 'wxDarkModeSettings *settings'
|
|
24
|
+
# wxDarkModeSettings does has have virt dtor; it's just not documented
|
|
25
|
+
spec.suppress_warning(514, 'wxDarkModeSettings')
|
|
26
|
+
end
|
|
27
|
+
end
|
|
19
28
|
spec.fold_bases('wxApp' => 'wxAppConsole', 'wxAppConsole' => 'wxEventFilter')
|
|
20
29
|
spec.override_inheritance_chain('wxApp', %w[wxEvtHandler wxObject])
|
|
21
30
|
spec.ignore %w{
|
|
@@ -134,339 +143,23 @@ module WXRuby3
|
|
|
134
143
|
extern "C" void Init_wxRubyStockObjects();
|
|
135
144
|
extern void wxRuby_MarkProtectedEvtHandlerProcs();
|
|
136
145
|
|
|
137
|
-
#ifdef __WXMSW__
|
|
138
|
-
extern "C"
|
|
139
|
-
{
|
|
140
|
-
WXDLLIMPEXP_BASE HINSTANCE wxGetInstance();
|
|
141
|
-
}
|
|
142
|
-
#endif
|
|
143
|
-
|
|
144
146
|
static wxVector<WXRBMarkFunction> WXRuby_Mark_List;
|
|
145
147
|
|
|
146
148
|
WXRUBY_EXPORT void wxRuby_AppendMarker(WXRBMarkFunction marker)
|
|
147
149
|
{
|
|
148
150
|
WXRuby_Mark_List.push_back(marker);
|
|
149
151
|
}
|
|
150
|
-
|
|
151
|
-
class wxRubyApp : public wxApp
|
|
152
|
-
{
|
|
153
|
-
private:
|
|
154
|
-
static wxRubyApp* instance_;
|
|
155
152
|
|
|
156
|
-
|
|
157
|
-
public:
|
|
158
|
-
static wxRubyApp* GetInstance () { return instance_; }
|
|
159
|
-
|
|
160
|
-
virtual ~wxRubyApp()
|
|
161
|
-
{
|
|
162
|
-
#ifdef __WXTRACE__
|
|
163
|
-
std::wcout << "~wxRubyApp" << std::endl;
|
|
164
|
-
#endif
|
|
165
|
-
// unlink
|
|
166
|
-
VALUE the_app = rb_const_get(#{spec.package.module_variable}, rb_intern("THE_APP"));
|
|
167
|
-
if (the_app != Qnil)
|
|
168
|
-
{
|
|
169
|
-
DATA_PTR(the_app) = 0;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// special event handler for destruction of windows which is done
|
|
174
|
-
// automatically by wxWidgets. Tag the object as having been destroyed
|
|
175
|
-
// by WxWidgets.
|
|
176
|
-
void OnWindowDestroy(wxWindowDestroyEvent &event)
|
|
177
|
-
{
|
|
178
|
-
wxObject* wx_obj = event.GetEventObject();
|
|
179
|
-
#ifdef __WXRB_DEBUG__
|
|
180
|
-
if (wxRuby_TraceLevel()>0)
|
|
181
|
-
std::wcout << "<= OnWindowDestroy [" << wx_obj << "]" << std::endl;
|
|
182
|
-
#endif
|
|
183
|
-
GC_SetWindowDeleted((void *)wx_obj);
|
|
184
|
-
event.Skip();
|
|
185
|
-
#ifdef __WXRB_DEBUG__
|
|
186
|
-
if (wxRuby_TraceLevel()>0)
|
|
187
|
-
std::wcout << "=> OnWindowDestroy [" << wx_obj << "]" << std::endl;
|
|
188
|
-
#endif
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
bool IsRunning() const { return this->is_running_; }
|
|
192
|
-
|
|
193
|
-
// When ruby's garbage collection runs, if the app is still active, it
|
|
194
|
-
// cycles through all currently known SWIG objects and calls this
|
|
195
|
-
// function on each to preserve still active Wx::Windows, and also
|
|
196
|
-
// pending Wx::Events which have been queued from the Ruby side (the
|
|
197
|
-
// only sort of events that will be in the tracking hash.
|
|
198
|
-
static void markIterate(void* ptr, VALUE rb_obj)
|
|
199
|
-
{
|
|
200
|
-
// Check if it's a valid object (sometimes SWIG doesn't return what we're
|
|
201
|
-
// expecting), a descendant of Wx::Window (but not a Dialog), and if it has not yet been
|
|
202
|
-
// deleted by WxWidgets; if so, mark it.
|
|
203
|
-
if ( TYPE(rb_obj) == T_DATA )
|
|
204
|
-
{
|
|
205
|
-
if ( rb_obj_is_kind_of(rb_obj, wxRuby_GetWindowClass()) )
|
|
206
|
-
{
|
|
207
|
-
rb_gc_mark(rb_obj);
|
|
208
|
-
}
|
|
209
|
-
else if (rb_obj_is_kind_of(rb_obj, wxRuby_GetDefaultEventClass()) )
|
|
210
|
-
rb_gc_mark(rb_obj);
|
|
211
|
-
}
|
|
212
|
-
else if (TYPE(rb_obj) == T_ARRAY )
|
|
213
|
-
{
|
|
214
|
-
VALUE proc = rb_ary_entry(rb_obj, 0);
|
|
215
|
-
if (rb_obj_is_kind_of(proc, rb_cProc) || rb_obj_is_kind_of(proc, rb_cMethod))
|
|
216
|
-
{
|
|
217
|
-
// keep the async call alive
|
|
218
|
-
rb_gc_mark(rb_obj);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
// Implements GC protection across wxRuby. Always called because
|
|
224
|
-
// Wx::THE_APP is a constant so always checked in GC mark phase.
|
|
225
|
-
static void mark_wxRubyApp(void *ptr)
|
|
226
|
-
{
|
|
227
|
-
|
|
228
|
-
#ifdef __WXRB_DEBUG__
|
|
229
|
-
if (wxRuby_TraceLevel()>0)
|
|
230
|
-
std::wcout << "=== Starting App GC mark phase" << std::endl;
|
|
231
|
-
#endif
|
|
232
|
-
|
|
233
|
-
// If the App has ended, the ruby object will have been unlinked from
|
|
234
|
-
// the C++ one; this implies that all Windows have already been destroyed
|
|
235
|
-
// so there is no point trying to mark them, and doing so may cause
|
|
236
|
-
// errors.
|
|
237
|
-
if ( !wxRubyApp::GetInstance() || !wxRubyApp::GetInstance()->IsRunning() )
|
|
238
|
-
{
|
|
239
|
-
#ifdef __WXRB_DEBUG__
|
|
240
|
-
if (wxRuby_TraceLevel()>0)
|
|
241
|
-
std::wcout << "=== App has ended, skipping mark phase" << std::endl;
|
|
242
|
-
#endif
|
|
243
|
-
return;
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
// Mark any active (tracked) log target
|
|
247
|
-
wxLog* curLog = wxLog::GetActiveTarget();
|
|
248
|
-
VALUE rb_cur_log = wxRuby_FindTracking(curLog);
|
|
249
|
-
if (!NIL_P(rb_cur_log))
|
|
250
|
-
{
|
|
251
|
-
rb_gc_mark(rb_cur_log);
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
// Mark evt handler procs associated with live windows - see
|
|
255
|
-
// classes/EvtHandler.i
|
|
256
|
-
wxRuby_MarkProtectedEvtHandlerProcs();
|
|
257
|
-
|
|
258
|
-
// run registered markers
|
|
259
|
-
for (wxVector<WXRBMarkFunction>::iterator it = WXRuby_Mark_List.begin();
|
|
260
|
-
it != WXRuby_Mark_List.end() ;++it)
|
|
261
|
-
{
|
|
262
|
-
(*it) ();
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
// To do the main marking, primarily of Windows, iterate over SWIG's
|
|
266
|
-
// list of tracked objects
|
|
267
|
-
wxRuby_IterateTracking(&wxRubyApp::markIterate);
|
|
268
|
-
|
|
269
|
-
#ifdef __WXRB_DEBUG__
|
|
270
|
-
if (wxRuby_TraceLevel()>0)
|
|
271
|
-
std::wcout << "=== App GC mark phase completed" << std::endl;
|
|
272
|
-
#endif
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
// This is the method run when main_loop is called in Ruby
|
|
276
|
-
// wxEntry calls the C++ App::OnInit method
|
|
277
|
-
int main_loop()
|
|
278
|
-
{
|
|
279
|
-
VALUE rb_app = SWIG_RubyInstanceFor(this);
|
|
280
|
-
rb_define_const(#{spec.package.module_variable}, "THE_APP", rb_app);
|
|
281
|
-
this->Connect(wxEVT_DESTROY,
|
|
282
|
-
wxWindowDestroyEventHandler(wxRubyApp::OnWindowDestroy));
|
|
283
|
-
|
|
284
|
-
#ifdef __WXRB_DEBUG__
|
|
285
|
-
if (wxRuby_TraceLevel()>0)
|
|
286
|
-
std::wcout << "Calling wxEntry, this=" << this << std::endl;
|
|
287
|
-
#endif
|
|
288
|
-
|
|
289
|
-
#ifdef __WXMSW__
|
|
290
|
-
extern int wxEntry(HINSTANCE hInstance,
|
|
291
|
-
HINSTANCE WXUNUSED(hPrevInstance),
|
|
292
|
-
wxCmdLineArgType WXUNUSED(pCmdLine),
|
|
293
|
-
int nCmdShow);
|
|
294
|
-
wxEntry(wxGetInstance(),
|
|
295
|
-
(HINSTANCE)0,
|
|
296
|
-
(wxCmdLineArgType)"",
|
|
297
|
-
(int)true);
|
|
298
|
-
#else
|
|
299
|
-
int argc = 1;
|
|
300
|
-
const char* argv[2] = { "ruby", 0 };
|
|
301
|
-
wxEntry(argc, const_cast<char**>(&argv[0]));
|
|
302
|
-
#endif
|
|
303
|
-
|
|
304
|
-
rb_const_remove(#{spec.package.module_variable}, rb_intern("THE_APP"));
|
|
305
|
-
|
|
306
|
-
#ifdef __WXRB_DEBUG__
|
|
307
|
-
if (wxRuby_TraceLevel()>0)
|
|
308
|
-
std::wcout << "returned from wxEntry..." << std::endl;
|
|
309
|
-
#endif
|
|
310
|
-
rb_gc_start();
|
|
311
|
-
#ifdef __WXRB_DEBUG__
|
|
312
|
-
if (wxRuby_TraceLevel()>0)
|
|
313
|
-
std::wcout << "survived gc" << std::endl;
|
|
314
|
-
#endif
|
|
315
|
-
|
|
316
|
-
VALUE exc = rb_iv_get(rb_app, "@exception");
|
|
317
|
-
if (!NIL_P(exc))
|
|
318
|
-
{
|
|
319
|
-
rb_exc_raise(exc);
|
|
320
|
-
}
|
|
321
|
-
return 0;
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
// This method initializes the stock objects (Pens, Brushes, Fonts)
|
|
325
|
-
// before yielding to ruby by calling the App's on_init method.
|
|
326
|
-
// Note that as of wxWidget 2.8, the stock fonts in particular cannot
|
|
327
|
-
// be initialized any earlier than this without crashing
|
|
328
|
-
bool OnInit() override
|
|
329
|
-
{
|
|
330
|
-
#ifdef __WXRB_DEBUG__
|
|
331
|
-
if (wxRuby_TraceLevel()>0)
|
|
332
|
-
std::wcout << "OnInit..." << std::endl;
|
|
333
|
-
#endif
|
|
334
|
-
// set standard App name
|
|
335
|
-
this->SetAppName(wxString("wxruby"));
|
|
336
|
-
// Signal that we've started
|
|
337
|
-
wxRubyApp::instance_ = this; // there should ALWAYS EVER be only 1 app instance running/created
|
|
338
|
-
this->is_running_ = true;
|
|
339
|
-
// Set up the GDI objects
|
|
340
|
-
Init_wxRubyStockObjects();
|
|
341
|
-
// Get the ruby representation of the App object, and call the
|
|
342
|
-
// ruby on_init method to set up the initial window state
|
|
343
|
-
VALUE the_app = rb_const_get(#{spec.package.module_variable}, rb_intern("THE_APP"));
|
|
344
|
-
bool ex_caught = false;
|
|
345
|
-
VALUE result = wxRuby_Funcall(ex_caught, the_app, rb_intern("on_ruby_init"), 0, 0);
|
|
346
|
-
|
|
347
|
-
if (ex_caught)
|
|
348
|
-
{
|
|
349
|
-
#ifdef __WXRB_DEBUG__
|
|
350
|
-
wxRuby_PrintException(result);
|
|
351
|
-
#endif
|
|
352
|
-
rb_iv_set(the_app, "@exception", result);
|
|
353
|
-
result = Qfalse; // exit app
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
// If on_init return any (ruby) true value, signal to wxWidgets to
|
|
357
|
-
// enter the main event loop by returning true, else return false
|
|
358
|
-
// which will make wxWidgets exit.
|
|
359
|
-
if ( result == Qfalse || result == Qnil )
|
|
360
|
-
{
|
|
361
|
-
wxRubyApp::instance_ = 0;
|
|
362
|
-
this->is_running_ = false;
|
|
363
|
-
return false;
|
|
364
|
-
}
|
|
365
|
-
else
|
|
366
|
-
{
|
|
367
|
-
return true;
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
int OnExit() override
|
|
372
|
-
{
|
|
373
|
-
#ifdef __WXRB_DEBUG__
|
|
374
|
-
if (wxRuby_TraceLevel()>0)
|
|
375
|
-
std::wcout << "OnExit..." << std::endl;
|
|
376
|
-
#endif
|
|
377
|
-
|
|
378
|
-
// Get the ruby representation of the App object, and call the
|
|
379
|
-
// ruby on_exit method (if any) for application level cleanup
|
|
380
|
-
VALUE the_app = rb_const_get(#{spec.package.module_variable}, rb_intern("THE_APP"));
|
|
381
|
-
ID on_exit_id = rb_intern("on_exit");
|
|
382
|
-
if (rb_funcall(the_app, rb_intern("respond_to?"), 1, ID2SYM(on_exit_id)) == Qtrue)
|
|
383
|
-
{
|
|
384
|
-
bool ex_caught = false;
|
|
385
|
-
VALUE rc = wxRuby_Funcall(ex_caught, the_app, on_exit_id, 0, 0);
|
|
386
|
-
if (ex_caught)
|
|
387
|
-
{
|
|
388
|
-
#ifdef __WXRB_DEBUG__
|
|
389
|
-
wxRuby_PrintException(rc);
|
|
390
|
-
#endif
|
|
391
|
-
rb_iv_set(the_app, "@exception", rc);
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
// perform wxRuby cleanup
|
|
396
|
-
_wxRuby_Cleanup();
|
|
397
|
-
|
|
398
|
-
// execute base wxWidgets functionality
|
|
399
|
-
return this->wxApp::OnExit();
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
// actually implemented in ruby in classes/app.rb
|
|
403
|
-
virtual void OnAssertFailure(const wxChar *file, int line, const wxChar *func, const wxChar *cond, const wxChar *msg) override
|
|
404
|
-
{
|
|
405
|
-
VALUE rb_app = SWIG_RubyInstanceFor(this);
|
|
406
|
-
if (rb_during_gc() || NIL_P(rb_app))
|
|
407
|
-
{
|
|
408
|
-
std::wcout << file << "(" << line << "): ASSERT " << cond
|
|
409
|
-
<< (NIL_P(rb_app) ? " fired without THE_APP in " : " fired during GC phase in ")
|
|
410
|
-
<< func << "() with message [" << msg << "]" << std::endl;
|
|
411
|
-
}
|
|
412
|
-
else
|
|
413
|
-
{
|
|
414
|
-
VALUE obj0 = Qnil ;
|
|
415
|
-
VALUE obj1 = Qnil ;
|
|
416
|
-
VALUE obj2 = Qnil ;
|
|
417
|
-
VALUE obj3 = Qnil ;
|
|
418
|
-
VALUE obj4 = Qnil ;
|
|
419
|
-
|
|
420
|
-
obj0 = rb_str_new2((const char *)wxString(file).utf8_str());
|
|
421
|
-
obj1 = INT2NUM(line);
|
|
422
|
-
obj2 = rb_str_new2((const char *)wxString(func).utf8_str());
|
|
423
|
-
obj3 = rb_str_new2((const char *)wxString(cond).utf8_str());
|
|
424
|
-
obj4 = rb_str_new2((const char *)wxString(msg).utf8_str());
|
|
425
|
-
(void)wxRuby_Funcall(rb_app, rb_intern("on_assert_failure"), 5,obj0,obj1,obj2,obj3,obj4);
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
void _wxRuby_Cleanup()
|
|
430
|
-
{
|
|
431
|
-
#ifdef __WXRB_DEBUG__
|
|
432
|
-
if (wxRuby_TraceLevel()>0)
|
|
433
|
-
std::wcout << "wxRuby_Cleanup..." << std::endl;
|
|
434
|
-
#endif
|
|
435
|
-
// Note in a global variable that the App has ended, so that we
|
|
436
|
-
// can skip any GC marking later
|
|
437
|
-
wxRubyApp::instance_ = 0;
|
|
438
|
-
this->is_running_ = false;
|
|
439
|
-
|
|
440
|
-
// if a Ruby implemented logger has been installed clean that up
|
|
441
|
-
// before we exit, otherwise let wxWidgets handle things
|
|
442
|
-
wxLog *oldlog = wxLog::GetActiveTarget();
|
|
443
|
-
if (wxRuby_FindTracking(oldlog) != Qnil)
|
|
444
|
-
{
|
|
445
|
-
oldlog = wxLog::SetActiveTarget(new wxLogStderr);
|
|
446
|
-
}
|
|
447
|
-
else
|
|
448
|
-
{
|
|
449
|
-
oldlog = 0;
|
|
450
|
-
}
|
|
451
|
-
SetTopWindow(0);
|
|
452
|
-
if ( oldlog )
|
|
453
|
-
{
|
|
454
|
-
SWIG_RubyUnlinkObjects(oldlog);
|
|
455
|
-
SWIG_RubyRemoveTracking(oldlog);
|
|
456
|
-
delete oldlog;
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
};
|
|
460
|
-
wxRubyApp* wxRubyApp::instance_ = 0;
|
|
153
|
+
#include "wxRubyApp.h"
|
|
461
154
|
|
|
462
155
|
WXRUBY_EXPORT bool wxRuby_IsAppRunning()
|
|
463
156
|
{
|
|
464
|
-
return wxRubyApp::GetInstance()
|
|
157
|
+
return wxRubyApp::GetInstance() && wxRubyApp::GetInstance()->IsRunning();
|
|
465
158
|
}
|
|
466
159
|
|
|
467
160
|
WXRUBY_EXPORT void wxRuby_ExitMainLoop(VALUE exception)
|
|
468
161
|
{
|
|
469
|
-
if (wxRubyApp::GetInstance()
|
|
162
|
+
if (wxRubyApp::GetInstance() && wxRubyApp::GetInstance()->IsRunning())
|
|
470
163
|
{
|
|
471
164
|
if (!NIL_P(exception))
|
|
472
165
|
{
|