--- /dev/null
+/////////////////////////////////////////////////////////////////////////////
+// Name: cpp/event.h
+// Purpose: C++ helpers for user-defined events
+// Author: Mattia Barbon
+// Modified by:
+// Created: 30/03/2002
+// RCS-ID: $Id: event.h 2526 2009-02-07 14:35:21Z mbarbon $
+// Copyright: (c) 2002-2004, 2006-2007, 2009 Mattia Barbon
+// Licence: This program is free software; you can redistribute it and/or
+// modify it under the same terms as Perl itself
+/////////////////////////////////////////////////////////////////////////////
+
+#include <wx/event.h>
+
+#include "cpp/v_cback.h"
+
+class wxPlEvent : public wxEvent
+{
+ WXPLI_DECLARE_DYNAMIC_CLASS_CTOR( wxPlEvent );
+ WXPLI_DECLARE_V_CBACK();
+
+ // only to appease wxWidgets' RTTI
+ wxPlEvent() : m_callback( NULL ) {}
+public:
+ wxPlEvent( const char* package, int id, wxEventType eventType )
+ : wxEvent( id, eventType ),
+ m_callback( "Wx::PlEvent" )
+ {
+ m_callback.SetSelf( wxPli_make_object( this, package ), true );
+ }
+
+ virtual ~wxPlEvent()
+ {
+ m_callback.DeleteSelf( false );
+ }
+
+ virtual wxEvent* Clone() const;
+};
+
+wxEvent* wxPlEvent::Clone() const
+{
+ dTHX;
+ wxPlEvent* self = (wxPlEvent*)this;
+
+ // only to appease wxWidgets' RTTI
+ if( !self->m_callback.IsOk() )
+ return new wxPlEvent();
+
+ if( wxPliVirtualCallback_FindCallback( aTHX_ &self->m_callback, "Clone" ) )
+ {
+ SV* ret = wxPliVirtualCallback_CallCallback
+ ( aTHX_ &self->m_callback, G_SCALAR, NULL );
+ wxPlEvent* clone =
+ (wxPlEvent*)wxPli_sv_2_object( aTHX_ ret, "Wx::PlEvent" );
+
+ return clone;
+ }
+
+ return 0;
+}
+
+WXPLI_IMPLEMENT_DYNAMIC_CLASS_CTOR( wxPlEvent, wxEvent );
+
+class wxPlCommandEvent : public wxCommandEvent
+{
+ WXPLI_DECLARE_DYNAMIC_CLASS_CTOR( wxPlCommandEvent );
+ WXPLI_DECLARE_V_CBACK();
+
+ // only to appease wxWidgets' RTTI
+ wxPlCommandEvent() : m_callback( NULL ) {}
+public:
+ wxPlCommandEvent( const char* package, int id, wxEventType eventType )
+ : wxCommandEvent( id, eventType ),
+ m_callback( "Wx::PlCommandEvent" )
+ {
+ m_callback.SetSelf( wxPli_make_object( this, package ), true );
+ }
+
+ virtual ~wxPlCommandEvent()
+ {
+ m_callback.DeleteSelf( false );
+ }
+
+ virtual wxEvent* Clone() const;
+};
+
+wxEvent* wxPlCommandEvent::Clone() const
+{
+ dTHX;
+ wxPlCommandEvent* self = (wxPlCommandEvent*)this;
+
+ // only to appease wxWidgets' RTTI
+ if( !self->m_callback.IsOk() )
+ return new wxPlCommandEvent();
+
+ if( wxPliVirtualCallback_FindCallback( aTHX_ &self->m_callback, "Clone" ) )
+ {
+ SV* ret = wxPliVirtualCallback_CallCallback
+ ( aTHX_ &self->m_callback, G_SCALAR, NULL );
+ wxPlCommandEvent* clone = (wxPlCommandEvent*)
+ wxPli_sv_2_object( aTHX_ ret, "Wx::PlCommandEvent" );
+
+ return clone;
+ }
+
+ return 0;
+}
+
+WXPLI_IMPLEMENT_DYNAMIC_CLASS_CTOR( wxPlCommandEvent, wxCommandEvent );
+
+class wxPlThreadEvent : public wxEvent
+{
+ WXPLI_DECLARE_DYNAMIC_CLASS_CTOR( wxPlThreadEvent );
+public:
+ static void SetStash( SV* hv_ref )
+ {
+ m_hv = (HV*)SvRV( hv_ref );
+ }
+ static HV* GetStash() { return m_hv; }
+
+ wxPlThreadEvent() : m_data( 0 ) {}
+ wxPlThreadEvent( pTHX_ const char* package, int id, wxEventType eventType,
+ SV* data )
+ : wxEvent( id, eventType )
+ {
+ PL_lockhook( aTHX_ (SV*)GetStash() );
+ PL_sharehook( aTHX_ data );
+ int data_id;
+ char buffer[30];
+ size_t length;
+ for(;;)
+ {
+ data_id = rand();
+ length = sprintf( buffer, "%d", data_id );
+ if( !hv_exists( GetStash(), buffer, length ) )
+ break;
+ }
+ SV** dst = hv_fetch( GetStash(), buffer, length, 1 );
+ sv_setsv( *dst, data );
+ mg_set( *dst );
+ m_data = data_id;
+ }
+
+ wxPlThreadEvent( const wxPlThreadEvent& e )
+ : wxEvent( e ),
+ m_data( e.m_data )
+ { }
+
+ ~wxPlThreadEvent()
+ {
+ if( !m_data )
+ return;
+
+ dTHX;
+
+ ENTER;
+ SAVETMPS;
+
+ PL_lockhook( aTHX_ (SV*)m_hv );
+
+ char buffer[30];
+ size_t length = sprintf( buffer, "%d", m_data );
+
+ hv_delete( m_hv, buffer, length, G_DISCARD );
+
+ FREETMPS;
+ LEAVE;
+ }
+
+ int _GetData() const { return m_data; }
+
+ SV* GetData() const
+ {
+ dTHX;
+
+ if( !m_data )
+ return &PL_sv_undef;
+
+ PL_lockhook( aTHX_ (SV*)m_hv );
+
+ char buffer[30];
+ size_t length = sprintf( buffer, "%d", m_data );
+
+ SV** value = hv_fetch( m_hv, buffer, length, 0 );
+ if( !value )
+ return NULL;
+ mg_get( *value );
+ SvREFCNT_inc( *value );
+
+ return *value;
+ }
+
+ virtual wxEvent* Clone() const;
+private:
+ int m_data;
+ static HV* m_hv;
+};
+
+wxEvent* wxPlThreadEvent::Clone() const
+{
+ wxEvent* clone = new wxPlThreadEvent( *this );
+ ((wxPlThreadEvent*)this)->m_data = 0;
+
+ return clone;
+}
+
+HV* wxPlThreadEvent::m_hv = NULL;
+
+wxPliSelfRef* wxPliGetSelfForwxPlThreadEvent( wxObject* object ) { return 0; }
+// XXX HACK!
+#if wxUSE_EXTENDED_RTTI
+const wxClassInfo* wxPlThreadEvent::ms_classParents[] =
+ { &wxEvent::ms_classInfo , NULL };
+wxPliClassInfo wxPlThreadEvent::ms_classInfo(
+ ms_classParents, (wxChar*)wxT( "wxPlPlThreadEvent"),
+ (int)sizeof(wxPlThreadEvent), wxPlThreadEvent::wxCreateObject,
+ (wxPliGetCallbackObjectFn) wxPliGetSelfForwxPlThreadEvent );
+#else
+wxPliClassInfo wxPlThreadEvent::ms_classInfo(
+ (wxChar*)wxT( "wxPlPlThreadEvent"), &wxEvent::ms_classInfo,
+ NULL, (int)sizeof(wxPlThreadEvent), wxPlThreadEvent::wxCreateObject,
+ (wxPliGetCallbackObjectFn) wxPliGetSelfForwxPlThreadEvent );
+#endif
+wxObject* wxPlThreadEvent::wxCreateObject() { return new wxPlThreadEvent(); }
+
+// local variables: //
+// mode: c++ //
+// end: //