Files
itgmania212121/src/DisplaySpec.cpp
T

153 lines
3.2 KiB
C++
Raw Normal View History

2017-06-18 11:55:16 -04:00
#include "global.h"
#include "DisplaySpec.h"
#include "LuaBinding.h"
#include "RageLog.h"
2023-04-20 19:02:13 +02:00
#include <vector>
2017-06-18 11:55:16 -04:00
class LunaDisplayMode: public Luna<DisplayMode>
{
public:
DEFINE_METHOD( GetWidth, width );
DEFINE_METHOD( GetHeight, height );
DEFINE_METHOD( GetRefreshRate, refreshRate );
LunaDisplayMode()
{
ADD_METHOD( GetWidth );
ADD_METHOD( GetHeight );
ADD_METHOD( GetRefreshRate );
}
};
LUA_REGISTER_CLASS( DisplayMode )
class LunaDisplaySpec: public Luna<DisplaySpec>
{
public:
DEFINE_METHOD( GetId, id() );
DEFINE_METHOD( GetName, name() );
DEFINE_METHOD( IsVirtual, isVirtual() );
static int GetSupportedModes( T* p, lua_State *L)
{
std::vector<DisplayMode*> v;
for (auto const &m: p->supportedModes())
{
v.push_back( const_cast<DisplayMode*>(&m));
}
LuaHelpers::CreateTableFromArray( v, L );
return 1;
}
static int GetCurrentMode( T *p, lua_State *L )
{
2019-06-22 12:35:38 -07:00
if (p->currentMode() != nullptr) {
2017-06-18 11:55:16 -04:00
DisplayMode *m = const_cast<DisplayMode *>( p->currentMode() );
m->PushSelf( L );
} else {
lua_pushnil( L );
}
return 1;
}
LunaDisplaySpec()
{
ADD_METHOD( GetId );
ADD_METHOD( GetName );
ADD_METHOD( GetSupportedModes );
ADD_METHOD( IsVirtual );
ADD_METHOD( GetCurrentMode );
}
};
LUA_REGISTER_CLASS( DisplaySpec )
namespace
{
const char *DISPLAYSPECS = "DisplaySpecs";
DisplaySpecs *check_DisplaySpecs(lua_State *L)
{
void *ud = luaL_checkudata( L, 1, DISPLAYSPECS );
2019-06-22 12:35:38 -07:00
luaL_argcheck( L, ud != nullptr, 1, "`DisplaySpecs` expected" );
2017-06-18 11:55:16 -04:00
return static_cast<DisplaySpecs *>(ud);
}
int DisplaySpecs_gc(lua_State *L)
{
DisplaySpecs *specs = static_cast<DisplaySpecs *> (lua_touserdata( L, 1 ));
if (specs)
{
specs->~DisplaySpecs();
}
return 0;
}
int DisplaySpecs_len(lua_State *L)
{
DisplaySpecs *specs = check_DisplaySpecs( L );
if (specs)
{
lua_pushinteger( L, specs->size() );
} else
{
lua_pushinteger( L, 0 );
}
return 1;
}
int DisplaySpecs_tostring(lua_State *L)
{
DisplaySpecs *specs = check_DisplaySpecs( L );
lua_pushfstring( L, "DisplaySpecs: %p", specs );
return 1;
}
int DisplaySpecs_get(lua_State *L)
{
DisplaySpecs *specs = check_DisplaySpecs( L );
if (specs)
{
int index = luaL_checkint( L, 2 );
luaL_argcheck( L, 1 <= index && static_cast<unsigned int> (index) <= specs->size(), 2,
"index out of range" );
DisplaySpecs::iterator it = specs->begin();
std::advance( it, index - 1 );
DisplaySpec *s = const_cast<DisplaySpec *>(&(*it));
s->PushSelf( L );
}
else
{
lua_pushnil( L );
}
return 1;
}
const luaL_Reg DisplaySpecs_meta[] =
{
{"__gc", DisplaySpecs_gc},
{"__index", DisplaySpecs_get},
{"__len", DisplaySpecs_len},
{"__tostring", DisplaySpecs_tostring},
2019-06-22 12:35:38 -07:00
{nullptr, nullptr}
2017-06-18 11:55:16 -04:00
};
void register_DisplaySpecs(lua_State *L)
{
luaL_newmetatable( L, DISPLAYSPECS );
luaL_openlib( L, 0, DisplaySpecs_meta, 0 );
lua_pop( L, 1 );
}
}
REGISTER_WITH_LUA_FUNCTION(register_DisplaySpecs);
DisplaySpecs *pushDisplaySpecs(lua_State *L, const DisplaySpecs &specs)
{
void *vpSpecs = lua_newuserdata( L, sizeof( DisplaySpecs ));
DisplaySpecs *pspecs = new( vpSpecs ) DisplaySpecs( specs );
luaL_getmetatable( L, DISPLAYSPECS );
lua_setmetatable( L, -2 );
return pspecs;
}