wxruby3 0.9.0 → 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/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/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/const.rb +83 -0
- 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/const.rb +66 -66
- data/lib/wx/doc/controlwithitems.rb +17 -7
- data/lib/wx/doc/data_object.rb +2 -2
- data/lib/wx/doc/event.rb +0 -6
- data/lib/wx/doc/evthandler.rb +113 -108
- data/lib/wx/doc/font.rb +1 -0
- data/lib/wx/doc/functions.rb +9 -9
- 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 -42
- data/lib/wx/doc/window_disabler.rb +10 -6
- data/lib/wx/grid/grid.rb +27 -4
- data/lib/wx/keyword_defs.rb +43 -6
- 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 +1 -1
- 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/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 +19 -9
- data/rakelib/lib/core/parameter.rb +3 -0
- data/rakelib/lib/core/spec.rb +6 -1
- data/rakelib/lib/director/accelerator.rb +3 -4
- data/rakelib/lib/director/accessible.rb +47 -0
- data/rakelib/lib/director/animation.rb +1 -1
- data/rakelib/lib/director/animation_ctrl.rb +20 -0
- data/rakelib/lib/director/app.rb +15 -304
- data/rakelib/lib/director/app_traits.rb +10 -12
- data/rakelib/lib/director/art_provider.rb +1 -1
- data/rakelib/lib/director/ctrl_with_items.rb +17 -5
- data/rakelib/lib/director/data_format.rb +1 -1
- data/rakelib/lib/director/data_object_simple_base.rb +1 -2
- data/rakelib/lib/director/derived_dc.rb +1 -1
- data/rakelib/lib/director/dialog.rb +6 -0
- data/rakelib/lib/director/dialup_event.rb +44 -0
- data/rakelib/lib/director/dialup_manager.rb +45 -0
- data/rakelib/lib/director/drag_image.rb +2 -3
- data/rakelib/lib/director/event.rb +22 -4
- data/rakelib/lib/director/file_ctrl.rb +35 -0
- data/rakelib/lib/director/file_ctrl_event.rb +26 -0
- data/rakelib/lib/director/frame.rb +1 -3
- data/rakelib/lib/director/gdicommon.rb +27 -11
- data/rakelib/lib/director/graphics_context.rb +2 -4
- data/rakelib/lib/director/grid_cell_editor.rb +6 -6
- data/rakelib/lib/director/grid_ctrl.rb +34 -3
- data/rakelib/lib/director/help_controller.rb +1 -1
- 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/pgarray_editor_dialog.rb +0 -6
- data/rakelib/lib/director/pgeditor.rb +2 -2
- data/rakelib/lib/director/pgproperties.rb +3 -3
- data/rakelib/lib/director/pgproperty.rb +24 -1
- data/rakelib/lib/director/property_grid_interface.rb +5 -10
- data/rakelib/lib/director/richtext_buffer.rb +1 -1
- data/rakelib/lib/director/richtext_composite_object.rb +25 -0
- data/rakelib/lib/director/richtext_ctrl.rb +15 -5
- 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/sash_event.rb +42 -0
- data/rakelib/lib/director/sizer.rb +79 -1
- data/rakelib/lib/director/sizer_item.rb +22 -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 +6 -14
- 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 +24 -50
- 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/animation_ctrl.yaml +15 -0
- 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/events.yaml +10 -4
- data/rakelib/lib/generate/doc/panel.yaml +7 -0
- 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 +89 -16
- data/rakelib/lib/generate/interface.rb +4 -3
- data/rakelib/lib/specs/interfaces.rb +161 -156
- data/rakelib/lib/swig_runner.rb +4 -50
- data/rakelib/lib/typemap/common.rb +54 -10
- 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/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/text/richtext.rb +0 -30
- data/samples/treectrl/treectrl.rb +1 -1
- data/tests/media/beep_lo.wav +0 -0
- 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_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 +59 -0
- data/tests/test_std_controls.rb +78 -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 +54 -5
- data/ext/wxruby3/swig/custom/swig3/rubyrun.swg +0 -456
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 94bf5f5a3d4107e4a77c02971756de87b044c3d9edfbedd0b0aa0fe3e95e6ae7
|
|
4
|
+
data.tar.gz: 83d78771dde19401cbb0e5f915c7eb86903bf76357f1a1d0be4d10edf1f0d4a7
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f1ac191dac02b350104d6336d38af941126056f30da9d2bffa12d480592216f0059f7cc1e22fa4020898a26faeffbc64d71df09eefd2b3329956c5e70a97b23b
|
|
7
|
+
data.tar.gz: '08d86fdf568ef0b67d76c670ccd108194342c7c0d97710419f7e98e0c852d8a863540aa3c320052237c27adf1c37f4d92a7c927fb827fcbbc5d05a73789e40e1'
|
data/.yardopts
CHANGED
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
// Copyright (c) 2023 M.J.N. Corino, The Netherlands
|
|
2
|
+
//
|
|
3
|
+
// This software is released under the MIT license.
|
|
4
|
+
|
|
5
|
+
#include <memory>
|
|
6
|
+
|
|
7
|
+
/*
|
|
8
|
+
* WxRuby3 App class
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
class wxRubyApp : public wxApp
|
|
12
|
+
{
|
|
13
|
+
private:
|
|
14
|
+
bool is_running_ = false;
|
|
15
|
+
VALUE self_ = Qnil;
|
|
16
|
+
public:
|
|
17
|
+
static wxRubyApp* GetInstance () { return dynamic_cast<wxRubyApp*> (wxApp::GetInstance()); }
|
|
18
|
+
|
|
19
|
+
virtual ~wxRubyApp()
|
|
20
|
+
{
|
|
21
|
+
#ifdef __WXTRACE__
|
|
22
|
+
std::wcout << "~wxRubyApp" << std::endl;
|
|
23
|
+
#endif
|
|
24
|
+
// unlink
|
|
25
|
+
if (this->self_ != Qnil)
|
|
26
|
+
{
|
|
27
|
+
DATA_PTR(this->self_) = 0;
|
|
28
|
+
}
|
|
29
|
+
this->self_ = Qnil;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// special event handler for destruction of windows which is done
|
|
33
|
+
// automatically by wxWidgets. Tag the object as having been destroyed
|
|
34
|
+
// by WxWidgets.
|
|
35
|
+
void OnWindowDestroy(wxWindowDestroyEvent &event)
|
|
36
|
+
{
|
|
37
|
+
wxObject* wx_obj = event.GetEventObject();
|
|
38
|
+
#ifdef __WXRB_DEBUG__
|
|
39
|
+
if (wxRuby_TraceLevel()>0)
|
|
40
|
+
std::wcout << "<= OnWindowDestroy [" << wx_obj << "]" << std::endl;
|
|
41
|
+
#endif
|
|
42
|
+
GC_SetWindowDeleted((void *)wx_obj);
|
|
43
|
+
event.Skip();
|
|
44
|
+
#ifdef __WXRB_DEBUG__
|
|
45
|
+
if (wxRuby_TraceLevel()>0)
|
|
46
|
+
std::wcout << "=> OnWindowDestroy [" << wx_obj << "]" << std::endl;
|
|
47
|
+
#endif
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
bool IsRunning() const { return this->is_running_; }
|
|
51
|
+
|
|
52
|
+
// When ruby's garbage collection runs, if the app is still active, it
|
|
53
|
+
// cycles through all currently known SWIG objects and calls this
|
|
54
|
+
// function on each to preserve still active Wx::Windows, and also
|
|
55
|
+
// pending Wx::Events which have been queued from the Ruby side (the
|
|
56
|
+
// only sort of events that will be in the tracking hash.
|
|
57
|
+
static void markIterate(void* ptr, VALUE rb_obj)
|
|
58
|
+
{
|
|
59
|
+
// Check if it's a valid object (sometimes SWIG doesn't return what we're
|
|
60
|
+
// expecting), a descendant of Wx::Window (but not a Dialog), and if it has not yet been
|
|
61
|
+
// deleted by WxWidgets; if so, mark it.
|
|
62
|
+
if ( TYPE(rb_obj) == T_DATA )
|
|
63
|
+
{
|
|
64
|
+
if ( rb_obj_is_kind_of(rb_obj, wxRuby_GetWindowClass()) )
|
|
65
|
+
{
|
|
66
|
+
rb_gc_mark(rb_obj);
|
|
67
|
+
}
|
|
68
|
+
else if (rb_obj_is_kind_of(rb_obj, wxRuby_GetDefaultEventClass()) )
|
|
69
|
+
rb_gc_mark(rb_obj);
|
|
70
|
+
}
|
|
71
|
+
else if (TYPE(rb_obj) == T_ARRAY )
|
|
72
|
+
{
|
|
73
|
+
VALUE proc = rb_ary_entry(rb_obj, 0);
|
|
74
|
+
if (rb_obj_is_kind_of(proc, rb_cProc) || rb_obj_is_kind_of(proc, rb_cMethod))
|
|
75
|
+
{
|
|
76
|
+
// keep the async call alive
|
|
77
|
+
rb_gc_mark(rb_obj);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Implements GC protection across wxRuby. Always called because
|
|
83
|
+
// Wx::THE_APP is a constant so always checked in GC mark phase.
|
|
84
|
+
static void mark_wxRubyApp(void *ptr)
|
|
85
|
+
{
|
|
86
|
+
|
|
87
|
+
#ifdef __WXRB_DEBUG__
|
|
88
|
+
if (wxRuby_TraceLevel()>0)
|
|
89
|
+
std::wcout << "=== Starting App GC mark phase" << std::endl;
|
|
90
|
+
#endif
|
|
91
|
+
|
|
92
|
+
// If the App has ended, the ruby object will have been unlinked from
|
|
93
|
+
// the C++ one; this implies that all Windows have already been destroyed
|
|
94
|
+
// so there is no point trying to mark them, and doing so may cause
|
|
95
|
+
// errors.
|
|
96
|
+
if ( !wxRubyApp::GetInstance() || !wxRubyApp::GetInstance()->IsRunning() )
|
|
97
|
+
{
|
|
98
|
+
#ifdef __WXRB_DEBUG__
|
|
99
|
+
if (wxRuby_TraceLevel()>0)
|
|
100
|
+
std::wcout << "=== App not started yet or has ended, skipping mark phase" << std::endl;
|
|
101
|
+
#endif
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Mark any active (tracked) log target
|
|
106
|
+
wxLog* curLog = wxLog::GetActiveTarget();
|
|
107
|
+
VALUE rb_cur_log = wxRuby_FindTracking(curLog);
|
|
108
|
+
if (!NIL_P(rb_cur_log))
|
|
109
|
+
{
|
|
110
|
+
rb_gc_mark(rb_cur_log);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Mark evt handler procs associated with live windows - see
|
|
114
|
+
// classes/EvtHandler.i
|
|
115
|
+
wxRuby_MarkProtectedEvtHandlerProcs();
|
|
116
|
+
|
|
117
|
+
// run registered markers
|
|
118
|
+
for (wxVector<WXRBMarkFunction>::iterator it = WXRuby_Mark_List.begin();
|
|
119
|
+
it != WXRuby_Mark_List.end() ;++it)
|
|
120
|
+
{
|
|
121
|
+
(*it) ();
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// To do the main marking, primarily of Windows, iterate over SWIG's
|
|
125
|
+
// list of tracked objects
|
|
126
|
+
wxRuby_IterateTracking(&wxRubyApp::markIterate);
|
|
127
|
+
|
|
128
|
+
#ifdef __WXRB_DEBUG__
|
|
129
|
+
if (wxRuby_TraceLevel()>0)
|
|
130
|
+
std::wcout << "=== App GC mark phase completed" << std::endl;
|
|
131
|
+
#endif
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// This is the method run when main_loop is called in Ruby
|
|
135
|
+
// wxEntry calls the C++ App::OnInit method
|
|
136
|
+
int main_loop()
|
|
137
|
+
{
|
|
138
|
+
int rc = 0;
|
|
139
|
+
|
|
140
|
+
// There should ever only be only a single App instance running
|
|
141
|
+
if (rb_const_defined(mWxCore, rb_intern("THE_APP")))
|
|
142
|
+
{
|
|
143
|
+
rb_raise(rb_eRuntimeError, "There is already another App instance running");
|
|
144
|
+
return -1;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Set self reference and global THE_APP constant
|
|
148
|
+
this->self_ = SWIG_RubyInstanceFor(this);
|
|
149
|
+
rb_define_const(mWxCore, "THE_APP", this->self_);
|
|
150
|
+
// Also cache the Ruby App reference on the stack here as after
|
|
151
|
+
// wxEntry returns the C++ App instance will have been destroyed
|
|
152
|
+
// and we cannot reference it (or it's members) anymore
|
|
153
|
+
VALUE the_app = this->self_;
|
|
154
|
+
|
|
155
|
+
this->Connect(wxEVT_DESTROY,
|
|
156
|
+
wxWindowDestroyEventHandler(wxRubyApp::OnWindowDestroy));
|
|
157
|
+
|
|
158
|
+
#ifdef __WXRB_DEBUG__
|
|
159
|
+
if (wxRuby_TraceLevel()>0)
|
|
160
|
+
std::wcout << "Calling wxEntry, this=" << this << std::endl;
|
|
161
|
+
#endif
|
|
162
|
+
|
|
163
|
+
// collect ruby app name and arguments array
|
|
164
|
+
VALUE rb_args = rb_get_argv();
|
|
165
|
+
int argc = 1 + RARRAY_LEN(rb_args);
|
|
166
|
+
std::unique_ptr<char*[]> argv_safe = std::make_unique<char*[]> (argc);
|
|
167
|
+
VALUE sval = rb_gv_get("$0");
|
|
168
|
+
argv_safe[0] = StringValuePtr(sval);
|
|
169
|
+
for (int i=0; i<RARRAY_LEN(rb_args) ;++i)
|
|
170
|
+
{
|
|
171
|
+
sval = rb_ary_entry(rb_args, i);
|
|
172
|
+
argv_safe[1+i] = StringValuePtr(sval);
|
|
173
|
+
}
|
|
174
|
+
// there is no need to copy the strings as we only need them until
|
|
175
|
+
// wxEntry returns
|
|
176
|
+
|
|
177
|
+
#ifdef __WXMSW__
|
|
178
|
+
wxApp::m_nCmdShow = SW_NORMAL;
|
|
179
|
+
#endif
|
|
180
|
+
rc = wxEntry(argc, argv_safe.get());
|
|
181
|
+
|
|
182
|
+
/*
|
|
183
|
+
At this point the C++ wxRubyApp instance has been destroyed so take care NOT to reference
|
|
184
|
+
it or any of it's members anymore but only unroll the callstack.
|
|
185
|
+
*/
|
|
186
|
+
|
|
187
|
+
#ifdef __WXRB_DEBUG__
|
|
188
|
+
if (wxRuby_TraceLevel()>0)
|
|
189
|
+
std::wcout << "returned from wxEntry..." << std::endl;
|
|
190
|
+
#endif
|
|
191
|
+
rb_gc_start();
|
|
192
|
+
#ifdef __WXRB_DEBUG__
|
|
193
|
+
if (wxRuby_TraceLevel()>0)
|
|
194
|
+
std::wcout << "survived gc" << std::endl;
|
|
195
|
+
#endif
|
|
196
|
+
|
|
197
|
+
rb_const_remove(mWxCore, rb_intern("THE_APP"));
|
|
198
|
+
|
|
199
|
+
VALUE exc = rb_iv_get(the_app, "@exception");
|
|
200
|
+
if (!NIL_P(exc))
|
|
201
|
+
{
|
|
202
|
+
rb_exc_raise(exc);
|
|
203
|
+
}
|
|
204
|
+
return rc;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// This method initializes the stock objects (Pens, Brushes, Fonts)
|
|
208
|
+
// before yielding to ruby by calling the App's on_init method.
|
|
209
|
+
// Note that as of wxWidget 2.8, the stock fonts in particular cannot
|
|
210
|
+
// be initialized any earlier than this without crashing
|
|
211
|
+
bool OnInit() override
|
|
212
|
+
{
|
|
213
|
+
#ifdef __WXRB_DEBUG__
|
|
214
|
+
if (wxRuby_TraceLevel()>0)
|
|
215
|
+
std::wcout << "OnInit..." << std::endl;
|
|
216
|
+
#endif
|
|
217
|
+
|
|
218
|
+
if (!wxApp::OnInit())
|
|
219
|
+
return false;
|
|
220
|
+
|
|
221
|
+
// Signal that we've started
|
|
222
|
+
this->is_running_ = true;
|
|
223
|
+
// Set up the GDI objects
|
|
224
|
+
Init_wxRubyStockObjects();
|
|
225
|
+
// Get the ruby representation of the App object, and call the
|
|
226
|
+
// ruby on_init method to set up the initial window state
|
|
227
|
+
bool ex_caught = false;
|
|
228
|
+
VALUE result = wxRuby_Funcall(ex_caught, this->self_, rb_intern("on_ruby_init"), 0, 0);
|
|
229
|
+
|
|
230
|
+
if (ex_caught)
|
|
231
|
+
{
|
|
232
|
+
#ifdef __WXRB_DEBUG__
|
|
233
|
+
wxRuby_PrintException(result);
|
|
234
|
+
#endif
|
|
235
|
+
rb_iv_set(this->self_, "@exception", result);
|
|
236
|
+
result = Qfalse; // exit app
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// If on_init return any (ruby) true value, signal to wxWidgets to
|
|
240
|
+
// enter the main event loop by returning true, else return false
|
|
241
|
+
// which will make wxWidgets exit.
|
|
242
|
+
if ( result == Qfalse || result == Qnil )
|
|
243
|
+
{
|
|
244
|
+
this->is_running_ = false;
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
else
|
|
248
|
+
{
|
|
249
|
+
return true;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
int OnExit() override
|
|
254
|
+
{
|
|
255
|
+
#ifdef __WXRB_DEBUG__
|
|
256
|
+
if (wxRuby_TraceLevel()>0)
|
|
257
|
+
std::wcout << "OnExit..." << std::endl;
|
|
258
|
+
#endif
|
|
259
|
+
|
|
260
|
+
// Get the ruby representation of the App object, and call the
|
|
261
|
+
// ruby on_exit method (if any) for application level cleanup
|
|
262
|
+
ID on_exit_id = rb_intern("on_exit");
|
|
263
|
+
if (rb_funcall(this->self_, rb_intern("respond_to?"), 1, ID2SYM(on_exit_id)) == Qtrue)
|
|
264
|
+
{
|
|
265
|
+
bool ex_caught = false;
|
|
266
|
+
VALUE rc = wxRuby_Funcall(ex_caught, this->self_, on_exit_id, 0, 0);
|
|
267
|
+
if (ex_caught)
|
|
268
|
+
{
|
|
269
|
+
#ifdef __WXRB_DEBUG__
|
|
270
|
+
wxRuby_PrintException(rc);
|
|
271
|
+
#endif
|
|
272
|
+
rb_iv_set(this->self_, "@exception", rc);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// perform wxRuby cleanup
|
|
277
|
+
_wxRuby_Cleanup();
|
|
278
|
+
|
|
279
|
+
// execute base wxWidgets functionality
|
|
280
|
+
return this->wxApp::OnExit();
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// actually implemented in ruby in classes/app.rb
|
|
284
|
+
virtual void OnAssertFailure(const wxChar *file, int line, const wxChar *func, const wxChar *cond, const wxChar *msg) override
|
|
285
|
+
{
|
|
286
|
+
if (rb_during_gc() || NIL_P(this->self_))
|
|
287
|
+
{
|
|
288
|
+
std::wcerr << file << "(" << line << "): ASSERT " << cond
|
|
289
|
+
<< (NIL_P(this->self_) ? " fired without THE_APP in " : " fired during GC phase in ")
|
|
290
|
+
<< func << "() with message [" << msg << "]" << std::endl;
|
|
291
|
+
}
|
|
292
|
+
else
|
|
293
|
+
{
|
|
294
|
+
VALUE obj0 = Qnil ;
|
|
295
|
+
VALUE obj1 = Qnil ;
|
|
296
|
+
VALUE obj2 = Qnil ;
|
|
297
|
+
VALUE obj3 = Qnil ;
|
|
298
|
+
VALUE obj4 = Qnil ;
|
|
299
|
+
|
|
300
|
+
obj0 = rb_str_new2((const char *)wxString(file).utf8_str());
|
|
301
|
+
obj1 = INT2NUM(line);
|
|
302
|
+
obj2 = rb_str_new2((const char *)wxString(func).utf8_str());
|
|
303
|
+
obj3 = rb_str_new2((const char *)wxString(cond).utf8_str());
|
|
304
|
+
obj4 = rb_str_new2((const char *)wxString(msg).utf8_str());
|
|
305
|
+
(void)wxRuby_Funcall(this->self_, rb_intern("on_assert_failure"), 5,obj0,obj1,obj2,obj3,obj4);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
void _wxRuby_Cleanup()
|
|
310
|
+
{
|
|
311
|
+
#ifdef __WXRB_DEBUG__
|
|
312
|
+
if (wxRuby_TraceLevel()>0)
|
|
313
|
+
std::wcout << "wxRuby_Cleanup..." << std::endl;
|
|
314
|
+
#endif
|
|
315
|
+
// Note in a global variable that the App has ended, so that we
|
|
316
|
+
// can skip any GC marking later
|
|
317
|
+
this->is_running_ = false;
|
|
318
|
+
|
|
319
|
+
// if a Ruby implemented logger has been installed clean that up
|
|
320
|
+
// before we exit, otherwise let wxWidgets handle things
|
|
321
|
+
wxLog *oldlog = wxLog::GetActiveTarget();
|
|
322
|
+
if (wxRuby_FindTracking(oldlog) != Qnil)
|
|
323
|
+
{
|
|
324
|
+
oldlog = wxLog::SetActiveTarget(new wxLogStderr);
|
|
325
|
+
}
|
|
326
|
+
else
|
|
327
|
+
{
|
|
328
|
+
oldlog = 0;
|
|
329
|
+
}
|
|
330
|
+
SetTopWindow(0);
|
|
331
|
+
if ( oldlog )
|
|
332
|
+
{
|
|
333
|
+
SWIG_RubyUnlinkObjects(oldlog);
|
|
334
|
+
SWIG_RubyRemoveTracking(oldlog);
|
|
335
|
+
delete oldlog;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
};
|
|
@@ -456,7 +456,7 @@ protected:
|
|
|
456
456
|
}
|
|
457
457
|
|
|
458
458
|
#ifdef wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
|
|
459
|
-
virtual bool DoReadLongLong(const wxString& key, wxLongLong_t *pll) const
|
|
459
|
+
virtual bool DoReadLongLong(const wxString& key, wxLongLong_t *pll) const override
|
|
460
460
|
{
|
|
461
461
|
wxConfigPathChanger path(this, key);
|
|
462
462
|
|
|
@@ -487,7 +487,7 @@ protected:
|
|
|
487
487
|
}
|
|
488
488
|
#endif // wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
|
|
489
489
|
|
|
490
|
-
virtual bool DoReadDouble(const wxString& key, double* val) const
|
|
490
|
+
virtual bool DoReadDouble(const wxString& key, double* val) const override
|
|
491
491
|
{
|
|
492
492
|
wxConfigPathChanger path(this, key);
|
|
493
493
|
|
|
@@ -517,7 +517,7 @@ protected:
|
|
|
517
517
|
}
|
|
518
518
|
}
|
|
519
519
|
|
|
520
|
-
virtual bool DoReadBool(const wxString& key, bool* val) const
|
|
520
|
+
virtual bool DoReadBool(const wxString& key, bool* val) const override
|
|
521
521
|
{
|
|
522
522
|
wxConfigPathChanger path(this, key);
|
|
523
523
|
|
|
@@ -637,7 +637,7 @@ protected:
|
|
|
637
637
|
}
|
|
638
638
|
|
|
639
639
|
#ifdef wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
|
|
640
|
-
virtual bool DoWriteLongLong(const wxString& key, wxLongLong_t value)
|
|
640
|
+
virtual bool DoWriteLongLong(const wxString& key, wxLongLong_t value) override
|
|
641
641
|
{
|
|
642
642
|
wxConfigPathChanger path(this, key);
|
|
643
643
|
wxString strName = path.Name();
|
|
@@ -675,7 +675,7 @@ protected:
|
|
|
675
675
|
}
|
|
676
676
|
#endif // wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
|
|
677
677
|
|
|
678
|
-
virtual bool DoWriteDouble(const wxString& key, double value)
|
|
678
|
+
virtual bool DoWriteDouble(const wxString& key, double value) override
|
|
679
679
|
{
|
|
680
680
|
wxConfigPathChanger path(this, key);
|
|
681
681
|
wxString strName = path.Name();
|
|
@@ -712,7 +712,7 @@ protected:
|
|
|
712
712
|
return true;
|
|
713
713
|
}
|
|
714
714
|
|
|
715
|
-
virtual bool DoWriteBool(const wxString& key, bool value)
|
|
715
|
+
virtual bool DoWriteBool(const wxString& key, bool value) override
|
|
716
716
|
{
|
|
717
717
|
wxConfigPathChanger path(this, key);
|
|
718
718
|
wxString strName = path.Name();
|
|
@@ -62,6 +62,9 @@ WXRUBY_EXPORT bool GC_IsWindowDeleted(void *ptr);
|
|
|
62
62
|
WXRUBY_EXPORT swig_type_info* wxRuby_GetSwigTypeForClass(VALUE cls);
|
|
63
63
|
WXRUBY_EXPORT swig_type_info* wxRuby_GetSwigTypeForClassName(const char* clsname);
|
|
64
64
|
WXRUBY_EXPORT void wxRuby_SetSwigTypeForClass(VALUE cls, swig_type_info* ty);
|
|
65
|
+
// and wx class names -> Ruby class
|
|
66
|
+
WXRUBY_EXPORT void wxRuby_SetRbClassForWxName(const wxString& wx_name, VALUE cls);
|
|
67
|
+
WXRUBY_EXPORT VALUE wxRuby_GetRbClassForWxName(const wxString& wx_name);
|
|
65
68
|
|
|
66
69
|
// Common wrapping functions
|
|
67
70
|
WXRUBY_EXPORT VALUE wxRuby_WrapWxObjectInRuby(wxObject* obj);
|
data/ext/wxruby3/swig/common.i
CHANGED
|
@@ -13,6 +13,28 @@
|
|
|
13
13
|
%feature("compactdefaultargs");
|
|
14
14
|
%feature("flatnested");
|
|
15
15
|
|
|
16
|
+
%exception {
|
|
17
|
+
try {
|
|
18
|
+
$action
|
|
19
|
+
}
|
|
20
|
+
catch (const Swig::DirectorException& swigex) {
|
|
21
|
+
if (rb_obj_is_kind_of(swigex.getError(), rb_eException))
|
|
22
|
+
{
|
|
23
|
+
rb_exc_raise(swigex.getError());
|
|
24
|
+
}
|
|
25
|
+
else
|
|
26
|
+
{
|
|
27
|
+
rb_exc_raise(rb_exc_new_cstr(swigex.getError(), swigex.what()));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch (const std::exception& ex) {
|
|
31
|
+
rb_raise(rb_eRuntimeError, "Unexpected C++ exception: %s", ex.what());
|
|
32
|
+
}
|
|
33
|
+
catch (...) {
|
|
34
|
+
rb_raise(rb_eRuntimeError, "Unexpected UNKNOWN exception");
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
16
38
|
%begin %{
|
|
17
39
|
/*
|
|
18
40
|
* Since SWIG does not provide readily usable export macros
|