mirror of
https://github.com/chibicitiberiu/rainmeter-studio.git
synced 2024-02-24 04:33:31 +00:00
Script: Improve 6560518
The Unicode state is not tracked using a stack instead of a raw boolean. This means that a Unicode script that e.g. updates a non-Unicode script measure will now work properly.
This commit is contained in:
parent
20393df751
commit
a3efbbac3f
@ -117,7 +117,7 @@ void MeasureScript::ReadOptions(ConfigParser& parser, const WCHAR* section)
|
|||||||
bool hasInitializeFunction = m_LuaScript.IsFunction(g_InitializeFunctionName);
|
bool hasInitializeFunction = m_LuaScript.IsFunction(g_InitializeFunctionName);
|
||||||
m_HasUpdateFunction = m_LuaScript.IsFunction(g_UpdateFunctionName);
|
m_HasUpdateFunction = m_LuaScript.IsFunction(g_UpdateFunctionName);
|
||||||
|
|
||||||
lua_State* L = m_LuaScript.GetState();
|
auto L = m_LuaScript.GetState();
|
||||||
lua_rawgeti(L, LUA_GLOBALSINDEX, m_LuaScript.GetRef());
|
lua_rawgeti(L, LUA_GLOBALSINDEX, m_LuaScript.GetRef());
|
||||||
|
|
||||||
*(MeterWindow**)lua_newuserdata(L, sizeof(MeterWindow*)) = m_MeterWindow;
|
*(MeterWindow**)lua_newuserdata(L, sizeof(MeterWindow*)) = m_MeterWindow;
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
int LuaManager::c_RefCount = 0;
|
int LuaManager::c_RefCount = 0;
|
||||||
lua_State* LuaManager::c_State = 0;
|
lua_State* LuaManager::c_State = 0;
|
||||||
|
|
||||||
bool LuaManager::c_UnicodeState = false;
|
std::vector<bool> LuaManager::c_UnicodeStateStack;
|
||||||
|
|
||||||
void LuaManager::Initialize()
|
void LuaManager::Initialize()
|
||||||
{
|
{
|
||||||
@ -73,14 +73,14 @@ void LuaManager::ReportErrors(const std::wstring& file)
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::wstring str(file, file.find_last_of(L'\\') + 1);
|
std::wstring str(file, file.find_last_of(L'\\') + 1);
|
||||||
str += c_UnicodeState ? StringUtil::WidenUTF8(error) : StringUtil::Widen(error);
|
str += IsUnicodeState() ? StringUtil::WidenUTF8(error) : StringUtil::Widen(error);
|
||||||
LogErrorF(L"Script: %s", str.c_str());
|
LogErrorF(L"Script: %s", str.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void LuaManager::PushWide(const WCHAR* str)
|
void LuaManager::PushWide(const WCHAR* str)
|
||||||
{
|
{
|
||||||
lua_State* L = c_State;
|
lua_State* L = c_State;
|
||||||
const std::string narrowStr = c_UnicodeState ?
|
const std::string narrowStr = IsUnicodeState() ?
|
||||||
StringUtil::NarrowUTF8(str) : StringUtil::Narrow(str);
|
StringUtil::NarrowUTF8(str) : StringUtil::Narrow(str);
|
||||||
lua_pushlstring(L, narrowStr.c_str(), narrowStr.length());
|
lua_pushlstring(L, narrowStr.c_str(), narrowStr.length());
|
||||||
}
|
}
|
||||||
@ -88,7 +88,7 @@ void LuaManager::PushWide(const WCHAR* str)
|
|||||||
void LuaManager::PushWide(const std::wstring& str)
|
void LuaManager::PushWide(const std::wstring& str)
|
||||||
{
|
{
|
||||||
lua_State* L = c_State;
|
lua_State* L = c_State;
|
||||||
const std::string narrowStr = c_UnicodeState ?
|
const std::string narrowStr = IsUnicodeState() ?
|
||||||
StringUtil::NarrowUTF8(str) : StringUtil::Narrow(str);
|
StringUtil::NarrowUTF8(str) : StringUtil::Narrow(str);
|
||||||
lua_pushlstring(L, narrowStr.c_str(), narrowStr.length());
|
lua_pushlstring(L, narrowStr.c_str(), narrowStr.length());
|
||||||
}
|
}
|
||||||
@ -98,6 +98,6 @@ std::wstring LuaManager::ToWide(int narg)
|
|||||||
lua_State* L = c_State;
|
lua_State* L = c_State;
|
||||||
size_t strLen = 0;
|
size_t strLen = 0;
|
||||||
const char* str = lua_tolstring(L, narg, &strLen);
|
const char* str = lua_tolstring(L, narg, &strLen);
|
||||||
return c_UnicodeState ?
|
return IsUnicodeState() ?
|
||||||
StringUtil::WidenUTF8(str, (int)strLen) : StringUtil::Widen(str, (int)strLen);
|
StringUtil::WidenUTF8(str, (int)strLen) : StringUtil::Widen(str, (int)strLen);
|
||||||
}
|
}
|
||||||
|
@ -26,15 +26,25 @@ extern "C"
|
|||||||
#include "lauxlib.h"
|
#include "lauxlib.h"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
class LuaManager
|
class LuaManager
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
class ScopedLuaState
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ScopedLuaState(bool unicode) { LuaManager::c_UnicodeStateStack.push_back(unicode); }
|
||||||
|
~ScopedLuaState() { LuaManager::c_UnicodeStateStack.pop_back(); }
|
||||||
|
operator lua_State*() { return LuaManager::c_State; }
|
||||||
|
};
|
||||||
|
|
||||||
static void Initialize();
|
static void Initialize();
|
||||||
static void Finalize();
|
static void Finalize();
|
||||||
|
|
||||||
static lua_State* GetState(bool unicode) { c_UnicodeState = unicode; return c_State; }
|
static ScopedLuaState GetState(bool unicode) { return ScopedLuaState(unicode); }
|
||||||
|
|
||||||
static bool IsUnicodeState() { return c_UnicodeState; }
|
static bool IsUnicodeState() { return c_UnicodeStateStack.back(); }
|
||||||
|
|
||||||
static void ReportErrors(const std::wstring& file);
|
static void ReportErrors(const std::wstring& file);
|
||||||
|
|
||||||
@ -53,9 +63,10 @@ private:
|
|||||||
static void RegisterMeterWindow(lua_State* L);
|
static void RegisterMeterWindow(lua_State* L);
|
||||||
static void RegisterMeterString(lua_State* L);
|
static void RegisterMeterString(lua_State* L);
|
||||||
|
|
||||||
// If set true |true|, Lua strings converted to/from as if they were encoded in UTF-8. Otherwise
|
// If the back of the vector is |true|, Lua strings converted to/from as if they were encoded
|
||||||
// Lua strings are treated as if they are encoded in the default system encoding.
|
// in UTF-8. Otherwise Lua strings are treated as if they are encoded in the default system
|
||||||
static bool c_UnicodeState;
|
// encoding.
|
||||||
|
static std::vector<bool> c_UnicodeStateStack;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -55,7 +55,7 @@ bool LuaScript::Initialize(const std::wstring& scriptFile)
|
|||||||
fclose(file);
|
fclose(file);
|
||||||
file = nullptr;
|
file = nullptr;
|
||||||
|
|
||||||
lua_State* L = GetState();
|
auto L = GetState();
|
||||||
bool scriptLoaded = false;
|
bool scriptLoaded = false;
|
||||||
|
|
||||||
// Treat the script as Unicode if it has the UTF-16 LE BOM.
|
// Treat the script as Unicode if it has the UTF-16 LE BOM.
|
||||||
@ -122,7 +122,7 @@ bool LuaScript::Initialize(const std::wstring& scriptFile)
|
|||||||
|
|
||||||
void LuaScript::Uninitialize()
|
void LuaScript::Uninitialize()
|
||||||
{
|
{
|
||||||
lua_State* L = GetState();
|
auto L = GetState();
|
||||||
|
|
||||||
if (m_Ref != LUA_NOREF)
|
if (m_Ref != LUA_NOREF)
|
||||||
{
|
{
|
||||||
@ -138,7 +138,7 @@ void LuaScript::Uninitialize()
|
|||||||
*/
|
*/
|
||||||
bool LuaScript::IsFunction(const char* funcName)
|
bool LuaScript::IsFunction(const char* funcName)
|
||||||
{
|
{
|
||||||
lua_State* L = GetState();
|
auto L = GetState();
|
||||||
bool bExists = false;
|
bool bExists = false;
|
||||||
|
|
||||||
if (IsInitialized())
|
if (IsInitialized())
|
||||||
@ -164,7 +164,7 @@ bool LuaScript::IsFunction(const char* funcName)
|
|||||||
*/
|
*/
|
||||||
void LuaScript::RunFunction(const char* funcName)
|
void LuaScript::RunFunction(const char* funcName)
|
||||||
{
|
{
|
||||||
lua_State* L = GetState();
|
auto L = GetState();
|
||||||
|
|
||||||
if (IsInitialized())
|
if (IsInitialized())
|
||||||
{
|
{
|
||||||
@ -189,7 +189,7 @@ void LuaScript::RunFunction(const char* funcName)
|
|||||||
*/
|
*/
|
||||||
int LuaScript::RunFunctionWithReturn(const char* funcName, double& numValue, std::wstring& strValue)
|
int LuaScript::RunFunctionWithReturn(const char* funcName, double& numValue, std::wstring& strValue)
|
||||||
{
|
{
|
||||||
lua_State* L = GetState();
|
auto L = GetState();
|
||||||
int type = LUA_TNIL;
|
int type = LUA_TNIL;
|
||||||
|
|
||||||
if (IsInitialized())
|
if (IsInitialized())
|
||||||
@ -234,7 +234,7 @@ int LuaScript::RunFunctionWithReturn(const char* funcName, double& numValue, std
|
|||||||
*/
|
*/
|
||||||
void LuaScript::RunString(const std::wstring& str)
|
void LuaScript::RunString(const std::wstring& str)
|
||||||
{
|
{
|
||||||
lua_State* L = GetState();
|
auto L = GetState();
|
||||||
|
|
||||||
if (IsInitialized())
|
if (IsInitialized())
|
||||||
{
|
{
|
||||||
|
@ -35,7 +35,7 @@ public:
|
|||||||
int GetRef() { return m_Ref; }
|
int GetRef() { return m_Ref; }
|
||||||
bool IsUnicode() const { return m_Unicode; }
|
bool IsUnicode() const { return m_Unicode; }
|
||||||
|
|
||||||
lua_State* GetState() { return LuaManager::GetState(m_Unicode); }
|
LuaManager::ScopedLuaState GetState() { return LuaManager::GetState(m_Unicode); }
|
||||||
|
|
||||||
bool IsFunction(const char* funcName);
|
bool IsFunction(const char* funcName);
|
||||||
void RunFunction(const char* funcName);
|
void RunFunction(const char* funcName);
|
||||||
|
Loading…
Reference in New Issue
Block a user