lua_close wasn't being called at all before due to the delete commandInterface being missing. With it there, the lua gc could delete the LuaComponent before the LuaWindow. Make sure if that happens, it tells the parent LuaWindow it's already been gced
98 lines
1.8 KiB
C++
98 lines
1.8 KiB
C++
#include "Config.h"
|
|
#ifdef LUACONSOLE
|
|
|
|
#include "LuaComponent.h"
|
|
|
|
#include "LuaScriptInterface.h"
|
|
#include "LuaWindow.h"
|
|
|
|
#include "gui/interface/Component.h"
|
|
#include "gui/interface/Window.h"
|
|
|
|
int LuaComponentCallback::CheckAndAssignArg1(lua_State *l)
|
|
{
|
|
if (lua_type(l, 1) != LUA_TNIL)
|
|
{
|
|
luaL_checktype(l, 1, LUA_TFUNCTION);
|
|
}
|
|
LuaSmartRef::Assign(l, 1);
|
|
return 0;
|
|
}
|
|
|
|
LuaComponent::LuaComponent(lua_State * l) : component(nullptr), owner_ref(LUA_REFNIL)
|
|
{
|
|
this->l = l; // I don't get how this doesn't cause crashes later on
|
|
|
|
lua_pushstring(l, "Luacon_ci");
|
|
lua_gettable(l, LUA_REGISTRYINDEX);
|
|
ci = (LuaScriptInterface*)lua_touserdata(l, -1);
|
|
lua_pop(l, 1);
|
|
}
|
|
|
|
int LuaComponent::position(lua_State * l)
|
|
{
|
|
int args = lua_gettop(l);
|
|
if(args)
|
|
{
|
|
luaL_checktype(l, 1, LUA_TNUMBER);
|
|
luaL_checktype(l, 2, LUA_TNUMBER);
|
|
component->Position = ui::Point(lua_tointeger(l, 1), lua_tointeger(l, 2));
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
lua_pushinteger(l, component->Position.X);
|
|
lua_pushinteger(l, component->Position.Y);
|
|
return 2;
|
|
}
|
|
}
|
|
|
|
int LuaComponent::size(lua_State * l)
|
|
{
|
|
int args = lua_gettop(l);
|
|
if(args)
|
|
{
|
|
luaL_checktype(l, 1, LUA_TNUMBER);
|
|
luaL_checktype(l, 2, LUA_TNUMBER);
|
|
component->Size = ui::Point(lua_tointeger(l, 1), lua_tointeger(l, 2));
|
|
component->Invalidate();
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
lua_pushinteger(l, component->Size.X);
|
|
lua_pushinteger(l, component->Size.Y);
|
|
return 2;
|
|
}
|
|
}
|
|
|
|
int LuaComponent::visible(lua_State * l)
|
|
{
|
|
int args = lua_gettop(l);
|
|
if(args)
|
|
{
|
|
luaL_checktype(l, 1, LUA_TBOOLEAN);
|
|
component->Visible = lua_toboolean(l, 1);
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
lua_pushboolean(l, component->Visible);
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
LuaComponent::~LuaComponent()
|
|
{
|
|
if (parent)
|
|
parent->ClearRef(this);
|
|
|
|
if (component)
|
|
{
|
|
if (component->GetParentWindow())
|
|
component->GetParentWindow()->RemoveComponent(component);
|
|
delete component;
|
|
}
|
|
}
|
|
#endif
|