mirror of
https://github.com/Rosalie241/RMG.git
synced 2026-07-25 08:04:01 +02:00
112 lines
2.9 KiB
C++
112 lines
2.9 KiB
C++
/*
|
|
* Rosalie's Mupen GUI - https://github.com/Rosalie241/RMG
|
|
* Copyright (C) 2020-2025 Rosalie Wanders <rosalie@mailbox.org>
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 3.
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
#define CORE_INTERNAL
|
|
#include "ConvertStringEncoding.hpp"
|
|
#include "Callback.hpp"
|
|
#include "Library.hpp"
|
|
|
|
#include <iostream>
|
|
|
|
//
|
|
// Local Structs
|
|
//
|
|
|
|
struct l_DebugCallbackMessage
|
|
{
|
|
std::string Context;
|
|
int Level = 0;
|
|
std::string Message;
|
|
};
|
|
|
|
//
|
|
// Local Variables
|
|
//
|
|
|
|
static bool l_SetupCallbacks = false;
|
|
static std::function<void(enum CoreDebugMessageType, std::string, std::string)> l_DebugCallbackFunc;
|
|
static std::function<void(enum CoreStateCallbackType, int)> l_StateCallbackFunc;
|
|
static bool l_PrintCallbacks = false;
|
|
static std::vector<l_DebugCallbackMessage> l_PendingCallbacks;
|
|
|
|
|
|
//
|
|
// Internal Functions
|
|
//
|
|
|
|
void CoreDebugCallback(void* context, int level, const char* message)
|
|
{
|
|
std::string contextString(static_cast<char*>(context));
|
|
std::string messageString(message);
|
|
|
|
if (!l_SetupCallbacks)
|
|
{
|
|
l_PendingCallbacks.push_back({contextString, level, message});
|
|
return;
|
|
}
|
|
|
|
if (l_PrintCallbacks)
|
|
{
|
|
std::cout << contextString << messageString << std::endl;
|
|
}
|
|
|
|
// convert string encoding accordingly
|
|
if (messageString.starts_with("IS64:"))
|
|
{
|
|
messageString = CoreConvertStringEncoding(message, CoreStringEncoding::EUC_JP);
|
|
}
|
|
else if (contextString.starts_with("[CORE]"))
|
|
{
|
|
messageString = CoreConvertStringEncoding(message, CoreStringEncoding::Shift_JIS);
|
|
}
|
|
|
|
l_DebugCallbackFunc((CoreDebugMessageType)level, contextString, messageString);
|
|
}
|
|
|
|
void CoreStateCallback(void*, m64p_core_param param, int value)
|
|
{
|
|
if (!l_SetupCallbacks)
|
|
{
|
|
return;
|
|
}
|
|
|
|
l_StateCallbackFunc((CoreStateCallbackType)param, value);
|
|
}
|
|
|
|
//
|
|
// Exported Functions
|
|
//
|
|
|
|
CORE_EXPORT bool CoreSetupCallbacks(std::function<void(enum CoreDebugMessageType, std::string, std::string)> debugCallbackFunc,
|
|
std::function<void(enum CoreStateCallbackType, int)> stateCallbackFunc)
|
|
{
|
|
l_DebugCallbackFunc = debugCallbackFunc;
|
|
l_StateCallbackFunc = stateCallbackFunc;
|
|
l_SetupCallbacks = true;
|
|
|
|
// send pending messages
|
|
for (const auto& callback : l_PendingCallbacks)
|
|
{
|
|
CoreDebugCallback(const_cast<char*>(callback.Context.c_str()), callback.Level, callback.Message.c_str());
|
|
}
|
|
l_PendingCallbacks.clear();
|
|
|
|
return true;
|
|
}
|
|
|
|
CORE_EXPORT void CoreSetPrintDebugCallback(bool enabled)
|
|
{
|
|
l_PrintCallbacks = enabled;
|
|
}
|
|
|
|
CORE_EXPORT void CoreAddCallbackMessage(CoreDebugMessageType type, std::string message)
|
|
{
|
|
CoreDebugCallback(const_cast<char*>("[GUI] "), static_cast<int>(type), message.c_str());
|
|
}
|