[XAM] Reverted UI open/close notifications to version before introduction of controller input.
- This should fix all strange issues with frozen titles after closing popups
This commit is contained in:
@@ -54,19 +54,6 @@ namespace xam {
|
|||||||
//
|
//
|
||||||
// We deliberately delay the XN_SYS_UI = false notification to give games time
|
// We deliberately delay the XN_SYS_UI = false notification to give games time
|
||||||
// to create a listener (if they're insane enough do this).
|
// to create a listener (if they're insane enough do this).
|
||||||
XamDialog::XamDialog(xe::ui::ImGuiDrawer* imgui_drawer)
|
|
||||||
: xe::ui::ImGuiDialog(imgui_drawer) {
|
|
||||||
kernel_state()->BroadcastNotification(kXNotificationSystemUI, true);
|
|
||||||
kernel_state()->xam_state()->xam_dialogs_shown_++;
|
|
||||||
}
|
|
||||||
|
|
||||||
XamDialog::~XamDialog() {
|
|
||||||
kernel_state()->xam_state()->xam_dialogs_shown_--;
|
|
||||||
if (kernel_state()->xam_state()->xam_dialogs_shown_ == 0) {
|
|
||||||
kernel_state()->BroadcastNotification(kXNotificationSystemUI, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
X_RESULT xeXamDispatchDialog(T* dialog,
|
X_RESULT xeXamDispatchDialog(T* dialog,
|
||||||
std::function<X_RESULT(T*)> close_callback,
|
std::function<X_RESULT(T*)> close_callback,
|
||||||
@@ -84,7 +71,9 @@ X_RESULT xeXamDispatchDialog(T* dialog,
|
|||||||
kernel_state()->emulator()->display_window()->app_context();
|
kernel_state()->emulator()->display_window()->app_context();
|
||||||
if (app_context.CallInUIThreadSynchronous(
|
if (app_context.CallInUIThreadSynchronous(
|
||||||
[&dialog, &fence]() { dialog->Then(&fence); })) {
|
[&dialog, &fence]() { dialog->Then(&fence); })) {
|
||||||
|
kernel_state()->xam_state()->xam_dialogs_shown_++;
|
||||||
fence.Wait();
|
fence.Wait();
|
||||||
|
kernel_state()->xam_state()->xam_dialogs_shown_--;
|
||||||
} else {
|
} else {
|
||||||
delete dialog;
|
delete dialog;
|
||||||
}
|
}
|
||||||
@@ -124,7 +113,9 @@ X_RESULT xeXamDispatchDialogEx(
|
|||||||
xe::threading::Fence fence;
|
xe::threading::Fence fence;
|
||||||
if (display_window->app_context().CallInUIThreadSynchronous(
|
if (display_window->app_context().CallInUIThreadSynchronous(
|
||||||
[&dialog, &fence]() { dialog->Then(&fence); })) {
|
[&dialog, &fence]() { dialog->Then(&fence); })) {
|
||||||
|
kernel_state()->xam_state()->xam_dialogs_shown_++;
|
||||||
fence.Wait();
|
fence.Wait();
|
||||||
|
kernel_state()->xam_state()->xam_dialogs_shown_--;
|
||||||
} else {
|
} else {
|
||||||
delete dialog;
|
delete dialog;
|
||||||
}
|
}
|
||||||
@@ -196,14 +187,19 @@ X_RESULT xeXamDispatchHeadlessEx(
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
X_RESULT xeXamDispatchDialogAsync(T* dialog,
|
X_RESULT xeXamDispatchDialogAsync(T* dialog,
|
||||||
std::function<void(T*)> close_callback) {
|
std::function<void(T*)> close_callback) {
|
||||||
|
kernel_state()->BroadcastNotification(kXNotificationSystemUI, true);
|
||||||
|
kernel_state()->xam_state()->xam_dialogs_shown_++;
|
||||||
// Important to pass captured vars by value here since we return from this
|
// Important to pass captured vars by value here since we return from this
|
||||||
// without waiting for the dialog to close so the original local vars will be
|
// without waiting for the dialog to close so the original local vars will be
|
||||||
// destroyed.
|
// destroyed.
|
||||||
dialog->set_close_callback([dialog, close_callback]() {
|
dialog->set_close_callback([dialog, close_callback]() {
|
||||||
close_callback(dialog);
|
close_callback(dialog);
|
||||||
|
|
||||||
|
kernel_state()->xam_state()->xam_dialogs_shown_--;
|
||||||
|
|
||||||
auto run = []() -> void {
|
auto run = []() -> void {
|
||||||
xe::threading::Sleep(std::chrono::milliseconds(100));
|
xe::threading::Sleep(std::chrono::milliseconds(100));
|
||||||
|
kernel_state()->BroadcastNotification(kXNotificationSystemUI, false);
|
||||||
};
|
};
|
||||||
|
|
||||||
std::thread thread(run);
|
std::thread thread(run);
|
||||||
@@ -214,12 +210,18 @@ X_RESULT xeXamDispatchDialogAsync(T* dialog,
|
|||||||
}
|
}
|
||||||
|
|
||||||
X_RESULT xeXamDispatchHeadlessAsync(std::function<void()> run_callback) {
|
X_RESULT xeXamDispatchHeadlessAsync(std::function<void()> run_callback) {
|
||||||
|
kernel_state()->BroadcastNotification(kXNotificationSystemUI, true);
|
||||||
|
kernel_state()->xam_state()->xam_dialogs_shown_++;
|
||||||
|
|
||||||
auto display_window = kernel_state()->emulator()->display_window();
|
auto display_window = kernel_state()->emulator()->display_window();
|
||||||
display_window->app_context().CallInUIThread([run_callback]() {
|
display_window->app_context().CallInUIThread([run_callback]() {
|
||||||
run_callback();
|
run_callback();
|
||||||
|
|
||||||
|
kernel_state()->xam_state()->xam_dialogs_shown_--;
|
||||||
|
|
||||||
auto run = []() -> void {
|
auto run = []() -> void {
|
||||||
xe::threading::Sleep(std::chrono::milliseconds(100));
|
xe::threading::Sleep(std::chrono::milliseconds(100));
|
||||||
|
kernel_state()->BroadcastNotification(kXNotificationSystemUI, false);
|
||||||
};
|
};
|
||||||
|
|
||||||
std::thread thread(run);
|
std::thread thread(run);
|
||||||
|
|||||||
@@ -25,9 +25,11 @@ class XamDialog : public xe::ui::ImGuiDialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
XamDialog(xe::ui::ImGuiDrawer* imgui_drawer);
|
XamDialog(xe::ui::ImGuiDrawer* imgui_drawer)
|
||||||
|
: xe::ui::ImGuiDialog(imgui_drawer) {}
|
||||||
|
|
||||||
|
virtual ~XamDialog() {};
|
||||||
|
|
||||||
~XamDialog();
|
|
||||||
void OnClose() override {
|
void OnClose() override {
|
||||||
if (close_callback_) {
|
if (close_callback_) {
|
||||||
close_callback_();
|
close_callback_();
|
||||||
|
|||||||
Reference in New Issue
Block a user