mirror of
https://github.com/wiiu-env/WiiUPluginLoaderBackend.git
synced 2024-11-24 13:49:17 +01:00
Simplify NotificationUtils
This commit is contained in:
parent
950a55cd8f
commit
a66bd1f275
@ -1,61 +1,8 @@
|
|||||||
#include "NotificationsUtils.h"
|
#include "NotificationsUtils.h"
|
||||||
#include "globals.h"
|
#include "globals.h"
|
||||||
#include "utils/logger.h"
|
#include "utils/logger.h"
|
||||||
#include <coreinit/cache.h>
|
|
||||||
#include <coreinit/messagequeue.h>
|
|
||||||
#include <coreinit/thread.h>
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <notifications/notifications.h>
|
#include <notifications/notifications.h>
|
||||||
#include <thread>
|
|
||||||
|
|
||||||
std::unique_ptr<std::thread> sNotificationsThread;
|
|
||||||
static bool sShutdownNotificationsThread = false;
|
|
||||||
|
|
||||||
OSMessageQueue sNotificationQueue;
|
|
||||||
OSMessage sNotificationMessages[0x10];
|
|
||||||
|
|
||||||
#define NOTIFICATION_QUEUE_COMMAND_STOP 0
|
|
||||||
#define NOTIFICATION_QUEUE_COMMAND_ERROR 1
|
|
||||||
|
|
||||||
struct NotificationMessageWrapper {
|
|
||||||
NotificationModuleNotificationType type = NOTIFICATION_MODULE_NOTIFICATION_TYPE_INFO;
|
|
||||||
char text[512] = {};
|
|
||||||
float duration = 10.0f;
|
|
||||||
};
|
|
||||||
|
|
||||||
void NotificationMainLoop() {
|
|
||||||
bool isOverlayReady = false;
|
|
||||||
while (!sShutdownNotificationsThread &&
|
|
||||||
NotificationModule_IsOverlayReady(&isOverlayReady) == NOTIFICATION_MODULE_RESULT_SUCCESS && !isOverlayReady) {
|
|
||||||
OSSleepTicks(OSMillisecondsToTicks(16));
|
|
||||||
}
|
|
||||||
if (sShutdownNotificationsThread || !isOverlayReady) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
OSMessage recv;
|
|
||||||
while (OSReceiveMessage(&sNotificationQueue, &recv, OS_MESSAGE_FLAGS_BLOCKING)) {
|
|
||||||
if (recv.args[0] == NOTIFICATION_QUEUE_COMMAND_STOP) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (recv.args[0] == NOTIFICATION_QUEUE_COMMAND_ERROR) {
|
|
||||||
auto *param = (NotificationMessageWrapper *) recv.message;
|
|
||||||
if (param->type == NOTIFICATION_MODULE_NOTIFICATION_TYPE_INFO) {
|
|
||||||
NotificationModule_SetDefaultValue(NOTIFICATION_MODULE_NOTIFICATION_TYPE_INFO, NOTIFICATION_MODULE_DEFAULT_OPTION_DURATION_BEFORE_FADE_OUT, param->duration);
|
|
||||||
NotificationModule_AddInfoNotification(param->text);
|
|
||||||
} else if (param->type == NOTIFICATION_MODULE_NOTIFICATION_TYPE_ERROR) {
|
|
||||||
NotificationModule_SetDefaultValue(NOTIFICATION_MODULE_NOTIFICATION_TYPE_ERROR, NOTIFICATION_MODULE_DEFAULT_OPTION_DURATION_BEFORE_FADE_OUT, param->duration);
|
|
||||||
NotificationModule_AddErrorNotification(param->text);
|
|
||||||
} else {
|
|
||||||
DEBUG_FUNCTION_LINE_WARN("Unsupported notification type: %d", param->type);
|
|
||||||
}
|
|
||||||
|
|
||||||
free(param);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DisplayNotificationMessage(std::string_view text, NotificationModuleNotificationType type, float duration) {
|
bool DisplayNotificationMessage(std::string_view text, NotificationModuleNotificationType type, float duration) {
|
||||||
if (!gNotificationModuleLoaded) {
|
if (!gNotificationModuleLoaded) {
|
||||||
@ -64,23 +11,17 @@ bool DisplayNotificationMessage(std::string_view text, NotificationModuleNotific
|
|||||||
if (type == NOTIFICATION_MODULE_NOTIFICATION_TYPE_DYNAMIC) {
|
if (type == NOTIFICATION_MODULE_NOTIFICATION_TYPE_DYNAMIC) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
auto *param = (NotificationMessageWrapper *) malloc(sizeof(NotificationMessageWrapper));
|
|
||||||
if (!param) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
strncpy(param->text, text.data(), sizeof(param->text) - 1);
|
|
||||||
param->type = type;
|
|
||||||
param->duration = duration;
|
|
||||||
|
|
||||||
OSMessage send;
|
if (type == NOTIFICATION_MODULE_NOTIFICATION_TYPE_INFO) {
|
||||||
send.message = param;
|
NotificationModule_SetDefaultValue(NOTIFICATION_MODULE_NOTIFICATION_TYPE_INFO, NOTIFICATION_MODULE_DEFAULT_OPTION_DURATION_BEFORE_FADE_OUT, duration);
|
||||||
send.args[0] = NOTIFICATION_QUEUE_COMMAND_ERROR;
|
NotificationModule_AddInfoNotification(text.data());
|
||||||
auto res = OSSendMessage(&sNotificationQueue, &send, OS_MESSAGE_FLAGS_NONE);
|
} else if (type == NOTIFICATION_MODULE_NOTIFICATION_TYPE_ERROR) {
|
||||||
if (!res) {
|
NotificationModule_SetDefaultValue(NOTIFICATION_MODULE_NOTIFICATION_TYPE_ERROR, NOTIFICATION_MODULE_DEFAULT_OPTION_DURATION_BEFORE_FADE_OUT, duration);
|
||||||
DEBUG_FUNCTION_LINE_ERR("Failed to add Error Notification: Queue full");
|
NotificationModule_AddErrorNotification(text.data());
|
||||||
free(param);
|
} else {
|
||||||
return false;
|
DEBUG_FUNCTION_LINE_WARN("Unsupported notification type: %d", type);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -90,28 +31,4 @@ bool DisplayInfoNotificationMessage(std::string_view text, float duration) {
|
|||||||
|
|
||||||
bool DisplayErrorNotificationMessage(std::string_view text, float duration) {
|
bool DisplayErrorNotificationMessage(std::string_view text, float duration) {
|
||||||
return DisplayNotificationMessage(text, NOTIFICATION_MODULE_NOTIFICATION_TYPE_ERROR, duration);
|
return DisplayNotificationMessage(text, NOTIFICATION_MODULE_NOTIFICATION_TYPE_ERROR, duration);
|
||||||
}
|
|
||||||
|
|
||||||
void StartNotificationThread() {
|
|
||||||
sNotificationsThread.reset();
|
|
||||||
sShutdownNotificationsThread = false;
|
|
||||||
if (!gNotificationModuleLoaded) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr int32_t messageSize = sizeof(sNotificationMessages) / sizeof(sNotificationMessages[0]);
|
|
||||||
OSInitMessageQueue(&sNotificationQueue, sNotificationMessages, messageSize);
|
|
||||||
sNotificationsThread = make_unique_nothrow<std::thread>(NotificationMainLoop);
|
|
||||||
}
|
|
||||||
|
|
||||||
void StopNotificationThread() {
|
|
||||||
if (sNotificationsThread != nullptr) {
|
|
||||||
OSMessage message;
|
|
||||||
message.args[0] = NOTIFICATION_QUEUE_COMMAND_STOP;
|
|
||||||
OSSendMessage(&sNotificationQueue, &message, OS_MESSAGE_FLAGS_NONE);
|
|
||||||
sShutdownNotificationsThread = true;
|
|
||||||
OSMemoryBarrier();
|
|
||||||
sNotificationsThread->join();
|
|
||||||
sNotificationsThread.reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -2,10 +2,6 @@
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
void StartNotificationThread();
|
|
||||||
|
|
||||||
void StopNotificationThread();
|
|
||||||
|
|
||||||
bool DisplayInfoNotificationMessage(std::string_view text, float duration);
|
bool DisplayInfoNotificationMessage(std::string_view text, float duration);
|
||||||
|
|
||||||
bool DisplayErrorNotificationMessage(std::string_view text, float duration);
|
bool DisplayErrorNotificationMessage(std::string_view text, float duration);
|
@ -1,4 +1,3 @@
|
|||||||
#include "NotificationsUtils.h"
|
|
||||||
#include "PluginManagement.h"
|
#include "PluginManagement.h"
|
||||||
#include "coreinit/interrupts.h"
|
#include "coreinit/interrupts.h"
|
||||||
#include "coreinit/scheduler.h"
|
#include "coreinit/scheduler.h"
|
||||||
@ -65,8 +64,6 @@ WUMS_APPLICATION_ENDS() {
|
|||||||
}
|
}
|
||||||
gUsedRPLs.clear();
|
gUsedRPLs.clear();
|
||||||
|
|
||||||
StopNotificationThread();
|
|
||||||
|
|
||||||
deinitLogging();
|
deinitLogging();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,8 +77,6 @@ WUMS_APPLICATION_STARTS() {
|
|||||||
|
|
||||||
OSReport("Running WiiUPluginLoaderBackend " VERSION_FULL "\n");
|
OSReport("Running WiiUPluginLoaderBackend " VERSION_FULL "\n");
|
||||||
|
|
||||||
StartNotificationThread();
|
|
||||||
|
|
||||||
gUsedRPLs.clear();
|
gUsedRPLs.clear();
|
||||||
|
|
||||||
// If an allocated rpl was not released properly (e.g. if something else calls OSDynload_Acquire without releasing it) memory get leaked.
|
// If an allocated rpl was not released properly (e.g. if something else calls OSDynload_Acquire without releasing it) memory get leaked.
|
||||||
|
Loading…
Reference in New Issue
Block a user