mirror of
https://gitlab.com/Theopse/fbi-i18n-zh.git
synced 2025-04-06 03:58:02 +08:00
Ensure UI stack access by a single thread at a time.
This commit is contained in:
parent
a81411aa6b
commit
0c41459643
@ -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();
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user