diff --git a/source/main.c b/source/main.c index 463f9a4..c7ae6ab 100644 --- a/source/main.c +++ b/source/main.c @@ -15,6 +15,8 @@ void cleanup() { clipboard_clear(); task_quit_all(); + + ui_exit(); screen_exit(); socExit(); @@ -65,6 +67,7 @@ int main(int argc, const char* argv[]) { } screen_init(); + ui_init(); mainmenu_open(); diff --git a/source/ui/ui.c b/source/ui/ui.c index c36b90d..3113895 100644 --- a/source/ui/ui.c +++ b/source/ui/ui.c @@ -13,34 +13,65 @@ static ui_view* ui_stack[MAX_UI_VIEWS]; static int ui_stack_top = -1; +static Handle ui_stack_mutex = 0; + +void ui_init() { + if(ui_stack_mutex == 0) { + svcCreateMutex(&ui_stack_mutex, false); + } +} + +void ui_exit() { + if(ui_stack_mutex != 0) { + svcCloseHandle(ui_stack_mutex); + ui_stack_mutex = 0; + } +} + bool ui_push(ui_view* view) { if(view == NULL) { return false; } + svcWaitSynchronization(ui_stack_mutex, U64_MAX); + if(ui_stack_top >= MAX_UI_VIEWS - 1) { return false; } ui_stack[++ui_stack_top] = view; + + svcReleaseMutex(ui_stack_mutex); + return true; } ui_view* ui_peek() { + svcWaitSynchronization(ui_stack_mutex, U64_MAX); + if(ui_stack_top == -1) { return NULL; } - return ui_stack[ui_stack_top]; + ui_view* ui = ui_stack[ui_stack_top]; + + svcReleaseMutex(ui_stack_mutex); + + return ui; } ui_view* ui_pop() { + svcWaitSynchronization(ui_stack_mutex, U64_MAX); + if(ui_stack_top == -1) { return NULL; } - ui_view* view = ui_peek(); + ui_view* view = ui_stack[ui_stack_top]; ui_stack[ui_stack_top--] = NULL; + + svcReleaseMutex(ui_stack_mutex); + return view; } diff --git a/source/ui/ui.h b/source/ui/ui.h index 7ddad0b..6648b15 100644 --- a/source/ui/ui.h +++ b/source/ui/ui.h @@ -11,6 +11,9 @@ typedef struct ui_view_s { void (*drawBottom)(struct ui_view_s* view, void* data, float x1, float y1, float x2, float y2); } ui_view; +void ui_init(); +void ui_exit(); + bool ui_push(ui_view* view); ui_view* ui_peek(); ui_view* ui_pop();