nobody at rubyforge.org
2007-Jun-23 18:00 UTC
[Wxruby-development] [1063] trunk/wxruby2/swig/classes/EvtHandler.i: Add a public ''connect'' method for handling arbitary user-defined events
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type"
content="text/html; charset=utf-8" /><style
type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:'':'';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family:
verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;
font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding:
6px; }
#msg ul, pre { overflow: auto; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid;
padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family:
verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch
.binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<title>[1063] trunk/wxruby2/swig/classes/EvtHandler.i: Add a public
''connect'' method for handling arbitary user-defined
events</title>
</head>
<body>
<div id="msg">
<dl>
<dt>Revision</dt> <dd>1063</dd>
<dt>Author</dt> <dd>brokentoy</dd>
<dt>Date</dt> <dd>2007-06-23 14:00:12 -0400 (Sat, 23 Jun
2007)</dd>
</dl>
<h3>Log Message</h3>
<pre>Add a public ''connect'' method for handling arbitary
user-defined events</pre>
<h3>Modified Paths</h3>
<ul>
<li><a
href="#trunkwxruby2swigclassesEvtHandleri">trunk/wxruby2/swig/classes/EvtHandler.i</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkwxruby2swigclassesEvtHandleri"></a>
<div class="modfile"><h4>Modified:
trunk/wxruby2/swig/classes/EvtHandler.i (1062 => 1063)</h4>
<pre class="diff"><span>
<span class="info">---
trunk/wxruby2/swig/classes/EvtHandler.i        2007-06-23
16:33:16 UTC (rev 1062)
+++
trunk/wxruby2/swig/classes/EvtHandler.i        2007-06-23
18:00:12 UTC (rev 1063)
</span><span class="lines">@@ -10,11 +10,33 @@
</span><span class="cx"> %ignore wxEvtHandler::Disconnect;
</span><span class="cx">
</span><span class="cx"> %import
"include/wxObject.h"
</span><del>-
</del><span class="cx"> %include
"include/wxEvtHandler.h"
</span><span class="cx">
</span><del>-%{
</del><ins>+// The EvtHandler instance event methods (evt_xxx) are
not defined
+// here. Instead, they are defined by Events.cpp, generated from
+// swig/Event.i and modified by swig/fixevents.rb
</ins><span class="cx">
</span><ins>+// This provides the public Ruby
''connect'' method
+%extend wxEvtHandler {
+ VALUE connect(int firstId, int lastId, wxEventType eventType)
+ {
+ VALUE func = rb_funcall(rb_cProc, rb_intern("new"), 0);
+ rb_global_variable(&callbacks);
+ if(callbacks == Qnil)
+ callbacks = rb_ary_new();
+ rb_ary_push(callbacks, func);
+
+ wxObject* userData = new wxRbCallback(func);
+ wxObjectEventFunction function =
+ (wxObjectEventFunction )&wxRbCallback::EventThunker;
+ self->Connect(firstId, lastId, eventType, function, userData);
+        return
Qtrue;
+ }
+}
+
+
+%runtime{
+
</ins><span class="cx"> extern swig_class cWxEvtHandler;
</span><span class="cx"> static VALUE callbacks = Qnil;
</span><span class="cx">
</span><span class="lines">@@ -26,7 +48,6 @@
</span><span class="cx"> wxRbCallback(VALUE func) {
m_func = func; }
</span><span class="cx"> wxRbCallback(const
wxRbCallback &other) { m_func = other.m_func; }
</span><span class="cx">
</span><del>-
</del><span class="cx"> // This method handles all
events on the WxWidgets/C++ side. It link
</span><span class="cx"> // inspects the event and
based on the event''s type wraps it in the
</span><span class="cx"> // appropriate class (the
mapping can be found in
</span><span class="lines">@@ -49,11 +70,12 @@
</span><span class="cx">
</span><span class="cx"> VALUE m_func;
</span><span class="cx"> };
</span><ins>+}
</ins><span class="cx">
</span><del>-// Internal method that links a ruby Proc (the block
passed to evt_xxx)
-// to the WxWidgets C++ event handler method.
</del><ins>+%{
+// This is used by the evt_xxx methods from swig/Events.i
</ins><span class="cx"> void internal_connect(VALUE self,
int firstId, int lastId,
</span><del>- wxEventType eventType)
</del><ins>+                                        
wxEventType eventType)
</ins><span class="cx"> {
</span><span class="cx"> wxEvtHandler *cppSelf =
(wxEvtHandler *) 0 ;
</span><span class="cx"> SWIG_ConvertPtr(self, (void
**) &cppSelf, SWIGTYPE_p_wxEvtHandler, 1);
</span><span class="lines">@@ -67,11 +89,7 @@
</span><span class="cx"> wxObject* userData = new
wxRbCallback(func);
</span><span class="cx"> wxObjectEventFunction
function =
</span><span class="cx"> (wxObjectEventFunction
)&wxRbCallback::EventThunker;
</span><del>- (cppSelf)->Connect(firstId, lastId, eventType,
function, userData);
</del><ins>+                (cppSelf)->Connect(firstId,
lastId, eventType, function, userData);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> %}
</span><del>-
-// The EvtHandler instance event methods (evt_xxx) are not defined
-// here. Instead, they are defined by Events.cpp, generated from
-// swig/Event.i and modified by swig/fixevents.rb
</del></span></pre>
</div>
</div>
</body>
</html>
Possibly Parallel Threads
- [1035] trunk/wxruby2/swig/classes/EvtHandler.i: Removed a heap of redundant stuff that''s been #if 0''d for a while
- [1042] trunk/wxruby2: Overhaul of the event handling WxType->RubyClass mapping to make it
- [723] trunk/wxruby2: Added WindowCreateEvent and WindowDestroyEvent + event handlers (AF)
- [1064] trunk/wxruby2/swig/Events.i: Removed unused func, updated comments
- who can give me an EvtHandler#connect example?
