Hi,

On 15/03/2011 22:00, Mattia Barbon wrote:

2) change wxPli_create_evthandler to transparently use the existing
instance if present, and call wxPli_make_object otherwise

Attached patch implements this - but in reverse - always creates new object, then sets m_self to this if virtual class. Seems to work OK.

Other way around would have needed wider changes ( wxPliUserDataCD needed option to store RV with increased ref count rather than copying it).

I have duplicated a few lines from wxPli_object_2_sv -
which I suppose could be better wrapped in a new function

wxPliSelfRef* wxPli_get_selfref ( wxObject* object );

??

I also thought that it may be an idea to add an additional flag :

SV* wxPli_create_evthandler( pTHX_ wxEvtHandler* object,
                             const char* classname,
                             bool forcevirtual = false )

That way existing virtual implementations like wxScrolledWindow could use generic templates and all xssub stuff would still work unchanged.

If it looks OK I'll update with any suggested changes and retest /apply.

Regards

Mark
Index: cpp/helpers.cpp
===================================================================
--- cpp/helpers.cpp     (revision 3036)
+++ cpp/helpers.cpp     (working copy)
@@ -610,7 +610,29 @@
     wxPliUserDataCD* clientData = new wxPliUserDataCD( sv );
 
     object->SetClientObject( clientData );
+    
+    /* If this is a class with virtual methods (wxPl) set m_self */
+    /* to be same RV as clientdata */
+    
+    wxClassInfo *ci = object->GetClassInfo();
+    const wxChar* wxclassname = ci->GetClassName();
+    
+#if wxUSE_UNICODE
+    if( wcsncmp( wxclassname, wxT("wxPl"), 4 ) == 0 ) 
+#else
+    if( strnEQ( wxclassname, "wxPl", 4 ) ) 
+#endif    
+       {
+               wxPliClassInfo* cci = (wxPliClassInfo*)ci;
+               wxPliSelfRef* sr = cci->m_func( (wxObject*)(object) );
 
+               if( sr && sr->m_self )
+               {
+                  SvREFCNT_dec( sr->GetSelf() );
+                  sr->SetSelf(clientData->GetData(), true);
+               }
+       }
+
     return sv;
 }
 
Index: typemap
===================================================================
--- typemap     (revision 3036)
+++ typemap     (working copy)
@@ -191,8 +191,8 @@
 wxPlVScrolledWindow *   O_WXEVTHANDLER
 wxPlHScrolledWindow *   O_WXEVTHANDLER
 wxPlHVScrolledWindow *  O_WXEVTHANDLER
-wxVListBox *            O_WXOBJECT
-wxPlVListBox *          O_WXOBJECT
+wxVListBox *            O_WXEVTHANDLER
+wxPlVListBox *          O_WXEVTHANDLER
 wxSplitterWindow *      O_WXEVTHANDLER
 wxSearchCtrl *          O_WXEVTHANDLER
 wxSashWindow *          O_WXEVTHANDLER
Index: typemap.tmpl
===================================================================
--- typemap.tmpl        (revision 3036)
+++ typemap.tmpl        (working copy)
@@ -191,8 +191,8 @@
 wxPlVScrolledWindow *   O_WXEVTHANDLER
 wxPlHScrolledWindow *   O_WXEVTHANDLER
 wxPlHVScrolledWindow *  O_WXEVTHANDLER
-wxVListBox *            O_WXOBJECT
-wxPlVListBox *          O_WXOBJECT
+wxVListBox *            O_WXEVTHANDLER
+wxPlVListBox *          O_WXEVTHANDLER
 wxSplitterWindow *      O_WXEVTHANDLER
 wxSearchCtrl *          O_WXEVTHANDLER
 wxSashWindow *          O_WXEVTHANDLER
Index: XS/VListBox.xsp
===================================================================
--- XS/VListBox.xsp     (revision 3036)
+++ XS/VListBox.xsp     (working copy)
@@ -185,7 +185,7 @@
 
     %name{newDefault} wxPlVListBox()
         %code{% RETVAL = new wxPlVListBox( CLASS ); 
-              // wxPli_create_evthandler( aTHX_ RETVAL, CLASS );
+                wxPli_create_evthandler( aTHX_ RETVAL, CLASS );
              %};
     %name{newFull} wxPlVListBox( wxWindow *parent,
                                  wxWindowID id = wxID_ANY,
@@ -195,7 +195,7 @@
                                  const wxString& name = wxVListBoxNameStr )
         %code{% RETVAL = new wxPlVListBox( CLASS, parent, id, pos, size,
                                            style, name );
-                // wxPli_create_evthandler( aTHX_ RETVAL, CLASS );
+                wxPli_create_evthandler( aTHX_ RETVAL, CLASS );
              %};
 };
 
Index: XS/VScrolledWindow.xsp
===================================================================
--- XS/VScrolledWindow.xsp      (revision 3036)
+++ XS/VScrolledWindow.xsp      (working copy)
@@ -272,7 +272,9 @@
 %}
 
     %name{newDefault} wxPlHScrolledWindow()
-        %code{% RETVAL = new wxPlHScrolledWindow( CLASS ); %};
+        %code{% RETVAL = new wxPlHScrolledWindow( CLASS ); 
+                wxPli_create_evthandler( aTHX_ RETVAL, CLASS );
+             %};
     %name{newFull} wxPlHScrolledWindow( wxWindow *parent,
                                         wxWindowID id = wxID_ANY,
                                         const wxPoint& pos = wxDefaultPosition,
@@ -281,6 +283,7 @@
                                         const wxString& name = wxPanelNameStr )
         %code{% RETVAL = new wxPlHScrolledWindow( CLASS, parent, id, pos, size,
                                                   style, name );
+                wxPli_create_evthandler( aTHX_ RETVAL, CLASS );
                 %};
 };
 
@@ -299,7 +302,9 @@
 %}
 
     %name{newDefault} wxPlVScrolledWindow()
-        %code{% RETVAL = new wxPlVScrolledWindow( CLASS ); %};
+        %code{% RETVAL = new wxPlVScrolledWindow( CLASS ); 
+                wxPli_create_evthandler( aTHX_ RETVAL, CLASS );
+              %};
     %name{newFull} wxPlVScrolledWindow( wxWindow *parent,
                                         wxWindowID id = wxID_ANY,
                                         const wxPoint& pos = wxDefaultPosition,
@@ -308,6 +313,7 @@
                                         const wxString& name = wxPanelNameStr )
         %code{% RETVAL = new wxPlVScrolledWindow( CLASS, parent, id, pos, size,
                                                   style, name );
+                 wxPli_create_evthandler( aTHX_ RETVAL, CLASS );
                 %};
 };
 
@@ -326,7 +332,9 @@
 %}
 
     %name{newDefault} wxPlHVScrolledWindow()
-        %code{% RETVAL = new wxPlHVScrolledWindow( CLASS ); %};
+        %code{% RETVAL = new wxPlHVScrolledWindow( CLASS ); 
+                wxPli_create_evthandler( aTHX_ RETVAL, CLASS );
+              %};
     %name{newFull} wxPlHVScrolledWindow( wxWindow *parent,
                                          wxWindowID id = wxID_ANY,
                                          const wxPoint& pos = 
wxDefaultPosition,
@@ -335,6 +343,7 @@
                                          const wxString& name = wxPanelNameStr 
)
         %code{% RETVAL = new wxPlHVScrolledWindow( CLASS, parent, id, pos,
                                                    size, style, name );
+                wxPli_create_evthandler( aTHX_ RETVAL, CLASS );
                 %};
 };
 

Reply via email to