1 /*********************************************************************** 2 created: Thu Jan 26 2006 3 author: Tomas Lindquist Olsen <tomas@famolsen.dk> 4 5 purpose: Defines interface for LuaFunctor class 6 *************************************************************************/ 7 /*************************************************************************** 8 * Copyright (C) 2004 - 2008 Paul D Turner & The CEGUI Development Team 9 * 10 * Permission is hereby granted, free of charge, to any person obtaining 11 * a copy of this software and associated documentation files (the 12 * "Software"), to deal in the Software without restriction, including 13 * without limitation the rights to use, copy, modify, merge, publish, 14 * distribute, sublicense, and/or sell copies of the Software, and to 15 * permit persons to whom the Software is furnished to do so, subject to 16 * the following conditions: 17 * 18 * The above copyright notice and this permission notice shall be 19 * included in all copies or substantial portions of the Software. 20 * 21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 22 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 23 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 24 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 25 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 26 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 27 * OTHER DEALINGS IN THE SOFTWARE. 28 ***************************************************************************/ 29 #ifndef _CEGUILuaFunctor_h_ 30 #define _CEGUILuaFunctor_h_ 31 32 #include "CEGUI/EventSet.h" 33 34 struct lua_State; 35 36 // Start of CEGUI namespace section 37 namespace CEGUI 38 { 39 40 // forward declaration 41 class LuaScriptModule; 42 43 /*! 44 \brief 45 Functor class used for subscribing Lua functions to CEGUI events 46 */ 47 class LuaFunctor 48 { 49 public: 50 LuaFunctor(lua_State* state, int func, int selfIndex); 51 LuaFunctor(lua_State* state, const String& func, int selfIndex); 52 53 LuaFunctor(lua_State* state, const int func, const int selfIndex, 54 const String& error_handler); 55 LuaFunctor(lua_State* state, const String& func, const int selfIndex, 56 const String& error_handler); 57 LuaFunctor(lua_State* state, const int func, const int selfIndex, 58 const int error_handler); 59 LuaFunctor(lua_State* state, const String& func, const int selfIndex, 60 const int error_handler); 61 62 LuaFunctor(const LuaFunctor& cp); 63 ~LuaFunctor(); 64 65 bool operator()(const EventArgs& args) const; 66 67 /*! 68 \brief 69 function used to subscribe any Lua function as event handler. 70 References using the Lua registry. 71 To be called from Lua only. 72 */ 73 static Event::Connection SubscribeEvent(EventSet* self, 74 const String& eventName, 75 const int funcIndex, 76 const int selfIndex, 77 const int error_handler, 78 lua_State* L); 79 80 /*! 81 \brief 82 Pushes the Lua function named \param name on top of the Lua stack. 83 The name may contain '.' (dots) character for (nested) table values. 84 */ 85 static void pushNamedFunction(lua_State* L, const String& name); 86 87 private: 88 /*! 89 \brief 90 Invalidate the registry references. This is used internally to ensure 91 that the references do not get released (for example when we destroy 92 a temporary object) 93 */ 94 void invalidateLuaRefs(); 95 96 lua_State* L; 97 mutable int index; 98 int self; 99 mutable bool needs_lookup; 100 mutable String function_name; 101 102 //! Error handler function to pass to lua_pcall. 103 mutable String d_errFuncName; 104 //! registry index of the function to pass to lua_pcall. 105 mutable int d_errFuncIndex; 106 //! signfies whether we made the reference index at d_errFuncIndex. 107 mutable bool d_ourErrFuncIndex; 108 109 friend class LuaScriptModule; 110 }; 111 112 } // namespace CEGUI 113 114 #endif // end of guard _CEGUILuaFunctor_h_ 115