mirror of
https://github.com/chibicitiberiu/rainmeter-studio.git
synced 2024-02-24 04:33:31 +00:00
Lua:
- Removed GetValue() (which has never worked) and deprecated GetStringValue(). The measure value should be returned on Update() now. - Some related tweaks and cosmetic changes
This commit is contained in:
@ -19,35 +19,33 @@
|
||||
#include "../Rainmeter.h"
|
||||
|
||||
int LuaManager::c_RefCount = 0;
|
||||
lua_State* LuaManager::c_pState = 0;
|
||||
lua_State* LuaManager::c_State = 0;
|
||||
|
||||
void LuaManager::Init()
|
||||
{
|
||||
if (c_pState == NULL)
|
||||
if (c_State == NULL)
|
||||
{
|
||||
// Initialize Lua
|
||||
c_pState = lua_open();
|
||||
c_State = lua_open();
|
||||
|
||||
// Load Lua base libraries
|
||||
luaL_openlibs(c_pState);
|
||||
luaL_openlibs(c_State);
|
||||
|
||||
// Initialize tolua
|
||||
tolua_open(c_pState);
|
||||
tolua_open(c_State);
|
||||
|
||||
// Register custom types and functions
|
||||
RegisterTypes(c_pState);
|
||||
|
||||
tolua_module(c_pState, NULL, 0);
|
||||
tolua_beginmodule(c_pState, NULL);
|
||||
RegisterGlobal(c_pState);
|
||||
RegisterMeasure(c_pState);
|
||||
RegisterGroup(c_pState);
|
||||
RegisterMeasure(c_pState);
|
||||
RegisterMeter(c_pState);
|
||||
RegisterMeterWindow(c_pState);
|
||||
RegisterRainmeter(c_pState);
|
||||
RegisterMeterString(c_pState);
|
||||
tolua_endmodule(c_pState);
|
||||
tolua_module(c_State, NULL, 0);
|
||||
tolua_beginmodule(c_State, NULL);
|
||||
RegisterGlobal(c_State);
|
||||
RegisterMeasure(c_State);
|
||||
RegisterGroup(c_State);
|
||||
RegisterMeasure(c_State);
|
||||
RegisterMeter(c_State);
|
||||
RegisterMeterWindow(c_State);
|
||||
RegisterRainmeter(c_State);
|
||||
RegisterMeterString(c_State);
|
||||
tolua_endmodule(c_State);
|
||||
}
|
||||
|
||||
++c_RefCount;
|
||||
@ -60,17 +58,13 @@ void LuaManager::CleanUp()
|
||||
--c_RefCount;
|
||||
}
|
||||
|
||||
if (c_RefCount == 0 && c_pState != NULL)
|
||||
if (c_RefCount == 0 && c_State != NULL)
|
||||
{
|
||||
lua_close(c_pState);
|
||||
c_pState = NULL;
|
||||
lua_close(c_State);
|
||||
c_State = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void LuaManager::RegisterTypes(lua_State* L)
|
||||
{
|
||||
}
|
||||
|
||||
void LuaManager::ReportErrors(lua_State* L)
|
||||
{
|
||||
LuaLog(LOG_ERROR, "Script: %s", lua_tostring(L, -1));
|
||||
|
@ -27,19 +27,16 @@ public:
|
||||
static void Init();
|
||||
static void CleanUp();
|
||||
|
||||
static lua_State* GetState() { return c_pState; }
|
||||
static lua_State* GetState() { return c_State; }
|
||||
|
||||
static void ReportErrors(lua_State * L);
|
||||
static void ReportErrors(lua_State* L);
|
||||
static void LuaLog(int nLevel, const char* format, ... );
|
||||
|
||||
protected:
|
||||
static int c_RefCount;
|
||||
|
||||
static lua_State* c_pState;
|
||||
static lua_State* c_State;
|
||||
|
||||
private:
|
||||
static void RegisterTypes(lua_State* L);
|
||||
|
||||
static void RegisterGlobal(lua_State* L);
|
||||
static void RegisterRainmeter(lua_State* L);
|
||||
static void RegisterGroup(lua_State* L);
|
||||
|
@ -1,201 +1,220 @@
|
||||
/*
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include "../StdAfx.h"
|
||||
#include "LuaScript.h"
|
||||
#include "LuaManager.h"
|
||||
#include "../Rainmeter.h"
|
||||
|
||||
LuaScript::LuaScript(lua_State* p_pState, const char* p_strFile) : m_pState(p_pState), m_strFile(_strdup(p_strFile)),
|
||||
/*
|
||||
** LuaScript
|
||||
**
|
||||
** The constructor
|
||||
**
|
||||
*/
|
||||
LuaScript::LuaScript(lua_State* state, const char* file) : m_State(state),
|
||||
m_iRef(LUA_NOREF),
|
||||
m_bInitialized(true)
|
||||
m_Initialized(true)
|
||||
{
|
||||
int result = luaL_loadfile(m_pState, p_strFile);
|
||||
int result = luaL_loadfile(m_State, file);
|
||||
|
||||
// If the file loaded okay.
|
||||
if (result == 0)
|
||||
{
|
||||
// Create the table this script will reside in
|
||||
lua_newtable(m_pState);
|
||||
lua_newtable(m_State);
|
||||
|
||||
// Create the metatable that will store the global table
|
||||
lua_createtable(m_pState, 0, 1);
|
||||
lua_createtable(m_State, 0, 1);
|
||||
|
||||
// Push the global teble
|
||||
lua_pushvalue(m_pState, LUA_GLOBALSINDEX);
|
||||
lua_pushvalue(m_State, LUA_GLOBALSINDEX);
|
||||
|
||||
// Set the __index of the table to be the global table
|
||||
lua_setfield(m_pState, -2, "__index");
|
||||
lua_setfield(m_State, -2, "__index");
|
||||
|
||||
// Set the metatable for the script's table
|
||||
lua_setmetatable(m_pState, -2);
|
||||
lua_setmetatable(m_State, -2);
|
||||
|
||||
// Put the table into the global table
|
||||
m_iRef = luaL_ref(m_pState, LUA_GLOBALSINDEX);
|
||||
m_iRef = luaL_ref(m_State, LUA_GLOBALSINDEX);
|
||||
|
||||
PushTable();
|
||||
|
||||
// Set the environment for the function to be run in to be the table that
|
||||
// has been created for the script/
|
||||
lua_setfenv(m_pState, -2);
|
||||
lua_setfenv(m_State, -2);
|
||||
|
||||
// Execute the Lua script
|
||||
result = lua_pcall(m_pState, 0, LUA_MULTRET, 0);
|
||||
result = lua_pcall(m_State, 0, LUA_MULTRET, 0);
|
||||
|
||||
if (result)
|
||||
{
|
||||
m_bInitialized = false;
|
||||
LuaManager::LuaLog(LOG_ERROR, "Script: Could not run file: %s", lua_tostring(m_pState, -1));
|
||||
lua_pop(m_pState, 1);
|
||||
m_Initialized = false;
|
||||
LuaManager::LuaLog(LOG_ERROR, "Script: Could not run file: %s", lua_tostring(m_State, -1));
|
||||
lua_pop(m_State, 1);
|
||||
|
||||
luaL_unref(m_pState, LUA_GLOBALSINDEX, m_iRef);
|
||||
luaL_unref(m_State, LUA_GLOBALSINDEX, m_iRef);
|
||||
m_iRef = LUA_NOREF;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_bInitialized = false;
|
||||
LuaManager::LuaLog(LOG_ERROR, "Script: Could not run file: %s", lua_tostring(m_pState, -1));
|
||||
lua_pop(m_pState, 1);
|
||||
m_Initialized = false;
|
||||
LuaManager::LuaLog(LOG_ERROR, "Script: Could not run file: %s", lua_tostring(m_State, -1));
|
||||
lua_pop(m_State, 1);
|
||||
}
|
||||
}
|
||||
|
||||
LuaScript::~LuaScript(void)
|
||||
/*
|
||||
** ~LuaScript
|
||||
**
|
||||
** The destructor
|
||||
**
|
||||
*/
|
||||
LuaScript::~LuaScript()
|
||||
{
|
||||
luaL_unref(m_pState, LUA_GLOBALSINDEX, m_iRef);
|
||||
if (m_strFile) free(m_strFile);
|
||||
luaL_unref(m_State, LUA_GLOBALSINDEX, m_iRef);
|
||||
}
|
||||
|
||||
void LuaScript::BindVariable(const char* p_strName, void* p_pValue, const char* p_strTypeName)
|
||||
{
|
||||
PushTable();
|
||||
|
||||
/*
|
||||
// Push the variable name we want to put a value in.
|
||||
lua_pushstring(m_pState, p_strName);
|
||||
// Push the value
|
||||
tolua_pushusertype(m_pState, p_pValue, p_strTypeName);
|
||||
// Bind the variable
|
||||
lua_settable(m_pState, -3);
|
||||
|
||||
// Pop our table off of the stack
|
||||
lua_pop(m_pState, 1);
|
||||
|
||||
*/
|
||||
|
||||
// Push the variable name we want to put a value in.
|
||||
lua_pushstring(m_pState, "SKIN");
|
||||
// Push the value
|
||||
tolua_pushusertype(m_pState, p_pValue, "CMeterWindow");
|
||||
// Bind the variable
|
||||
lua_settable(m_pState, -3);
|
||||
|
||||
//lua_pop(m_pLuaScript->GetState(), 1);
|
||||
}
|
||||
|
||||
double LuaScript::RunFunctionDouble(const char* p_strFuncName)
|
||||
{
|
||||
double result = -1;
|
||||
|
||||
if (m_bInitialized && p_strFuncName)
|
||||
{
|
||||
// Push our table onto the stack
|
||||
PushTable();
|
||||
|
||||
// Push the function onto the stack
|
||||
lua_getfield(m_pState, -1, p_strFuncName);
|
||||
|
||||
if (lua_pcall(m_pState, 0, 1, 0))
|
||||
{
|
||||
LuaManager::ReportErrors(m_pState);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!lua_isnumber(m_pState, -1))
|
||||
{
|
||||
LuaManager::LuaLog(LOG_ERROR, "Script: Function '%s' must return a number: %s", p_strFuncName, m_strFile);
|
||||
}
|
||||
|
||||
result = lua_tonumber(m_pState, -1);
|
||||
}
|
||||
|
||||
// Pop both the table and the return value off the stack.
|
||||
lua_pop(m_pState, 2);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
std::wstring LuaScript::RunFunctionString(const char* p_strFuncName)
|
||||
{
|
||||
std::wstring result;
|
||||
|
||||
if (m_bInitialized && p_strFuncName)
|
||||
{
|
||||
// Push our table onto the stack
|
||||
PushTable();
|
||||
|
||||
// Push the function onto the stack
|
||||
lua_getfield(m_pState, -1, p_strFuncName);
|
||||
|
||||
if (lua_pcall(m_pState, 0, 1, 0))
|
||||
{
|
||||
LuaManager::ReportErrors(m_pState);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!lua_isstring(m_pState, -1))
|
||||
{
|
||||
LuaManager::LuaLog(LOG_ERROR, "Script: Function '%s' must return a string: %s", p_strFuncName, m_strFile);
|
||||
}
|
||||
|
||||
const char* str = lua_tostring(m_pState, -1);
|
||||
result = ConvertToWide(str);
|
||||
}
|
||||
|
||||
// Pop both the table and the return value off the stack.
|
||||
lua_pop(m_pState, 2);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void LuaScript::RunFunction(const char* p_strFuncName)
|
||||
{
|
||||
if (m_bInitialized && p_strFuncName)
|
||||
{
|
||||
// Push our table onto the stack
|
||||
PushTable();
|
||||
|
||||
// Push the function onto the stack
|
||||
lua_getfield(m_pState,-1, p_strFuncName);
|
||||
|
||||
if (lua_pcall(m_pState, 0, 0, 0))
|
||||
{
|
||||
LuaManager::ReportErrors(m_pState);
|
||||
}
|
||||
|
||||
lua_pop(m_pState, 1);
|
||||
}
|
||||
}
|
||||
|
||||
bool LuaScript::FunctionExists(const char* p_strFuncName)
|
||||
/*
|
||||
** IsFunction
|
||||
**
|
||||
** Checks if given function is defined in the script file.
|
||||
**
|
||||
*/
|
||||
bool LuaScript::IsFunction(const char* funcName)
|
||||
{
|
||||
bool bExists = false;
|
||||
|
||||
if (m_bInitialized && p_strFuncName)
|
||||
if (m_Initialized && funcName)
|
||||
{
|
||||
// Push our table onto the stack
|
||||
PushTable();
|
||||
|
||||
// Push the function onto the stack
|
||||
lua_getfield(m_pState, -1, p_strFuncName);
|
||||
lua_getfield(m_State, -1, funcName);
|
||||
|
||||
if (lua_isfunction( m_pState, -1))
|
||||
if (lua_isfunction(m_State, -1))
|
||||
{
|
||||
bExists = true;
|
||||
}
|
||||
|
||||
// Pop both the table and the function off the stack.
|
||||
lua_pop(m_pState, 2);
|
||||
lua_pop(m_State, 2);
|
||||
}
|
||||
|
||||
return bExists;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** RunFunction
|
||||
**
|
||||
** Runs given function in script file.
|
||||
**
|
||||
*/
|
||||
void LuaScript::RunFunction(const char* funcName)
|
||||
{
|
||||
if (m_Initialized)
|
||||
{
|
||||
// Push our table onto the stack
|
||||
PushTable();
|
||||
|
||||
// Push the function onto the stack
|
||||
lua_getfield(m_State, -1, funcName);
|
||||
|
||||
if (lua_pcall(m_State, 0, 0, 0))
|
||||
{
|
||||
LuaManager::ReportErrors(m_State);
|
||||
}
|
||||
|
||||
lua_pop(m_State, 1);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** RunFunctionWithReturn
|
||||
**
|
||||
** Runs given function in script file and stores the retruned number and/or string.
|
||||
** Returns true if the executed function returns a valid value.
|
||||
**
|
||||
*/
|
||||
bool LuaScript::RunFunctionWithReturn(const char* funcName, double& numValue, std::wstring& strValue)
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
if (m_Initialized)
|
||||
{
|
||||
// Push our table onto the stack
|
||||
PushTable();
|
||||
|
||||
// Push the function onto the stack
|
||||
lua_getfield(m_State, -1, funcName);
|
||||
|
||||
if (lua_pcall(m_State, 0, 1, 0))
|
||||
{
|
||||
LuaManager::ReportErrors(m_State);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (lua_isstring(m_State, -1))
|
||||
{
|
||||
const char* str = lua_tostring(m_State, -1);
|
||||
strValue = ConvertToWide(str);
|
||||
|
||||
// A number is a string and numerical string (e.g. "10") is a number, so check for it here
|
||||
if (lua_isnumber(m_State, -1))
|
||||
{
|
||||
numValue = lua_tonumber(m_State, -1);
|
||||
}
|
||||
|
||||
ret = true;
|
||||
}
|
||||
}
|
||||
|
||||
lua_pop(m_State, 2);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//void LuaScript::BindVariable(const char* p_strName, void* p_pValue, const char* p_strTypeName)
|
||||
//{
|
||||
// PushTable();
|
||||
//
|
||||
// /*
|
||||
// // Push the variable name we want to put a value in.
|
||||
// lua_pushstring(m_State, p_strName);
|
||||
// // Push the value
|
||||
// tolua_pushusertype(m_State, p_pValue, p_strTypeName);
|
||||
// // Bind the variable
|
||||
// lua_settable(m_State, -3);
|
||||
//
|
||||
// // Pop our table off of the stack
|
||||
// lua_pop(m_State, 1);
|
||||
//
|
||||
// */
|
||||
//
|
||||
// // Push the variable name we want to put a value in.
|
||||
// lua_pushstring(m_State, "SKIN");
|
||||
// // Push the value
|
||||
// tolua_pushusertype(m_State, p_pValue, "CMeterWindow");
|
||||
// // Bind the variable
|
||||
// lua_settable(m_State, -3);
|
||||
//
|
||||
// //lua_pop(m_pLuaScript->GetState(), 1);
|
||||
//}
|
||||
//
|
@ -1,45 +1,46 @@
|
||||
#ifndef LUA_SCRIPT_H
|
||||
#define LUA_SCRIPT_H
|
||||
/*
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
#include <stdio.h>
|
||||
#include "string"
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __LUASCRIPT_H__
|
||||
#define __LUASCRIPT_H__
|
||||
|
||||
#include "lua.hpp"
|
||||
|
||||
class LuaScript
|
||||
{
|
||||
public:
|
||||
|
||||
LuaScript(lua_State* p_pState, const char* p_strFile);
|
||||
|
||||
~LuaScript(void);
|
||||
LuaScript(lua_State* state, const char* file);
|
||||
~LuaScript();
|
||||
|
||||
bool FunctionExists(const char* p_strFuncName);
|
||||
bool IsInitialized() { return m_Initialized; }
|
||||
|
||||
void RunFunction(const char* p_strFuncName);
|
||||
lua_State* GetState() { return m_State; }
|
||||
void PushTable() { lua_rawgeti(m_State, LUA_GLOBALSINDEX, m_iRef); }
|
||||
|
||||
double RunFunctionDouble(const char* p_strFuncName);
|
||||
bool IsFunction(const char* funcName);
|
||||
void RunFunction(const char* funcName);
|
||||
bool RunFunctionWithReturn(const char* funcName, double& numValue, std::wstring& strValue);
|
||||
|
||||
std::wstring RunFunctionString(const char* p_strFuncName);
|
||||
|
||||
lua_State* GetState() { return m_pState; }
|
||||
|
||||
bool IsInitialized() { return m_bInitialized; }
|
||||
|
||||
void BindVariable(const char* p_strName, void* p_pValue, const char* p_strTypeName);
|
||||
|
||||
void PushTable() { lua_rawgeti(m_pState, LUA_GLOBALSINDEX, m_iRef); }
|
||||
|
||||
static void ReportErrors(lua_State * L);
|
||||
static void ReportErrors(lua_State* L);
|
||||
|
||||
protected:
|
||||
lua_State* m_State;
|
||||
|
||||
lua_State* m_pState;
|
||||
|
||||
char* m_strFile;
|
||||
int m_iRef;
|
||||
|
||||
bool m_bInitialized;
|
||||
bool m_Initialized;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -20,5 +20,3 @@ void LuaManager::RegisterGlobal(lua_State* L)
|
||||
lua_register(L, "print", Global_Log);
|
||||
luaL_register(L, "TO", TO_funcs); // For backwards compatibility
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user