virtual void ProcessEvent( Event &event ) { if( released ) { // the function pointer has been released, but // we're hanging around, waiting for shutdown or GC return; } // onloads cant be called within building process if( /* event.GetType() == "load" && */ asmodule->isBuilding() ) { // TODO: we should eliminate chain to DocumentLoader like this, so move // event postponing somewhere else UI_Main::Get()->getDocumentLoader()->postponeOnload( this, event ); return; } Element *elem = event.GetTargetElement(); fetchFunctionPtr( elem->GetOwnerDocument()->GetSourceURL() ); // push elem and event as parameters to the internal function // and call it if( UI_Main::Get()->debugOn() ) { Com_Printf( "ScriptEventListener: Event %s, target %s, script %s\n", event.GetType().CString(), event.GetTargetElement()->GetTagName().CString(), script.CString() ); } if( funcPtr.isValid() ) { elem->AddReference(); event.AddReference(); try { asIScriptContext *context = asmodule->getContext(); // the context may actually be NULL after AS shutdown if( context ) { funcPtr.setContext( context ); funcPtr( elem, &event ); } } catch( ASBind::Exception & ) { Com_Printf( S_COLOR_RED "ScriptEventListener: Failed to call function %s %s\n", funcName.CString(), script.CString() ); } } else { Com_Printf( S_COLOR_RED "ScriptEventListener: Not gonna call invalid function %s %s\n", funcName.CString(), script.CString() ); } }
virtual void ProcessEvent( Event &event ) { // onloads cant be called within building process if( /* event.GetType() == "load" && */ asmodule->isBuilding() ) { UI_Main::Get()->getDocumentLoader()->postponeOnload( this, event ); return; } Element *elem = event.GetTargetElement(); if( UI_Main::Get()->debugOn() ) { Com_Printf( "ScriptEventCaller: Event %s, target %s, func %s\n", event.GetType().CString(), event.GetTargetElement()->GetTagName().CString(), funcPtr.getName() ); } if( funcPtr.isValid() ) { elem->AddReference(); event.AddReference(); try { asIScriptContext *context = asmodule->getContext(); // the context may actually be NULL after AS shutdown if( context ) { funcPtr.setContext( context ); funcPtr( elem, &event ); } } catch( ASBind::Exception & ) { Com_Printf( S_COLOR_RED "ScriptEventListener: Failed to call function %s\n", funcPtr.getName() ); } } else { Com_Printf( S_COLOR_RED "ScriptEventListener: Not gonna call invalid function %s\n", funcPtr.getName() ); } }