MainNoGUI: Shut down Wii software gracefully

This commit is contained in:
Léo Lam
2016-10-01 21:35:29 +02:00
parent 5d8d696185
commit 453c4a4915

View File

@ -34,6 +34,8 @@
static bool rendererHasFocus = true; static bool rendererHasFocus = true;
static bool rendererIsFullscreen = false; static bool rendererIsFullscreen = false;
static Common::Flag s_running{true}; static Common::Flag s_running{true};
static Common::Flag s_shutdown_requested{false};
static Common::Flag s_tried_graceful_shutdown{false};
static void signal_handler(int) static void signal_handler(int)
{ {
@ -41,7 +43,12 @@ static void signal_handler(int)
if (write(STDERR_FILENO, message, sizeof(message)) < 0) if (write(STDERR_FILENO, message, sizeof(message)) < 0)
{ {
} }
s_running.Clear(); s_shutdown_requested.Set();
}
namespace ProcessorInterface
{
void PowerButton_Tap();
} }
class Platform class Platform
@ -222,6 +229,19 @@ class PlatformX11 : public Platform
// The actual loop // The actual loop
while (s_running.IsSet()) while (s_running.IsSet())
{ {
if (s_shutdown_requested.TestAndClear())
{
if (!s_tried_graceful_shutdown.IsSet() && SConfig::GetInstance().bWii)
{
ProcessorInterface::PowerButton_Tap();
s_tried_graceful_shutdown.Set();
}
else
{
s_running.Clear();
}
}
XEvent event; XEvent event;
KeySym key; KeySym key;
for (int num_events = XPending(dpy); num_events > 0; num_events--) for (int num_events = XPending(dpy); num_events > 0; num_events--)
@ -286,7 +306,7 @@ class PlatformX11 : public Platform
break; break;
case ClientMessage: case ClientMessage:
if ((unsigned long)event.xclient.data.l[0] == XInternAtom(dpy, "WM_DELETE_WINDOW", False)) if ((unsigned long)event.xclient.data.l[0] == XInternAtom(dpy, "WM_DELETE_WINDOW", False))
s_running.Clear(); s_shutdown_requested.Set();
break; break;
} }
} }
@ -375,6 +395,7 @@ int main(int argc, char* argv[])
UICommon::SetUserDirectory(""); // Auto-detect user folder UICommon::SetUserDirectory(""); // Auto-detect user folder
UICommon::Init(); UICommon::Init();
Core::SetOnStoppedCallback([]() { s_running.Clear(); });
platform->Init(); platform->Init();
// Shut down cleanly on SIGINT and SIGTERM // Shut down cleanly on SIGINT and SIGTERM