Only attempt a graceful shutdown when there's a STM hook
For Wii graceful shutdown to work, the emulated software has to open the STM event hook and install a hook. Without this, there is no way to inform them about the shutdown, so trying to do a graceful shutdown and requiring the use of the shutdown fallback (exiting a second time to force) is pointless.
This commit is contained in:
parent
48ff76d495
commit
a0a246bf3e
|
@ -135,6 +135,11 @@ IPCCommandResult CWII_IPC_HLE_Device_stm_eventhook::IOCtl(u32 command_address)
|
||||||
return GetNoReply();
|
return GetNoReply();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CWII_IPC_HLE_Device_stm_eventhook::HasHookInstalled() const
|
||||||
|
{
|
||||||
|
return s_event_hook_address != 0;
|
||||||
|
}
|
||||||
|
|
||||||
void CWII_IPC_HLE_Device_stm_eventhook::TriggerEvent(const u32 event) const
|
void CWII_IPC_HLE_Device_stm_eventhook::TriggerEvent(const u32 event) const
|
||||||
{
|
{
|
||||||
if (!m_Active || s_event_hook_address == 0)
|
if (!m_Active || s_event_hook_address == 0)
|
||||||
|
|
|
@ -59,6 +59,7 @@ public:
|
||||||
IPCCommandResult Close(u32 command_address, bool force) override;
|
IPCCommandResult Close(u32 command_address, bool force) override;
|
||||||
IPCCommandResult IOCtl(u32 command_address) override;
|
IPCCommandResult IOCtl(u32 command_address) override;
|
||||||
|
|
||||||
|
bool HasHookInstalled() const;
|
||||||
void ResetButton() const;
|
void ResetButton() const;
|
||||||
void PowerButton() const;
|
void PowerButton() const;
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,8 @@
|
||||||
#include "Core/HW/Wiimote.h"
|
#include "Core/HW/Wiimote.h"
|
||||||
#include "Core/Host.h"
|
#include "Core/Host.h"
|
||||||
#include "Core/HotkeyManager.h"
|
#include "Core/HotkeyManager.h"
|
||||||
|
#include "Core/IPC_HLE/WII_IPC_HLE.h"
|
||||||
|
#include "Core/IPC_HLE/WII_IPC_HLE_Device_stm.h"
|
||||||
#include "Core/IPC_HLE/WII_IPC_HLE_Device_usb_bt_emu.h"
|
#include "Core/IPC_HLE/WII_IPC_HLE_Device_usb_bt_emu.h"
|
||||||
#include "Core/IPC_HLE/WII_IPC_HLE_WiiMote.h"
|
#include "Core/IPC_HLE/WII_IPC_HLE_WiiMote.h"
|
||||||
#include "Core/Movie.h"
|
#include "Core/Movie.h"
|
||||||
|
@ -1341,7 +1343,9 @@ void CFrame::DoStop()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SConfig::GetInstance().bWii && !m_tried_graceful_shutdown)
|
const auto& stm = WII_IPC_HLE_Interface::GetDeviceByName("/dev/stm/eventhook");
|
||||||
|
if (!m_tried_graceful_shutdown && stm &&
|
||||||
|
std::static_pointer_cast<CWII_IPC_HLE_Device_stm_eventhook>(stm)->HasHookInstalled())
|
||||||
{
|
{
|
||||||
Core::DisplayMessage("Shutting down", 30000);
|
Core::DisplayMessage("Shutting down", 30000);
|
||||||
// Unpause because gracefully shutting down needs the game to actually request a shutdown
|
// Unpause because gracefully shutting down needs the game to actually request a shutdown
|
||||||
|
|
|
@ -23,6 +23,8 @@
|
||||||
#include "Core/Core.h"
|
#include "Core/Core.h"
|
||||||
#include "Core/HW/Wiimote.h"
|
#include "Core/HW/Wiimote.h"
|
||||||
#include "Core/Host.h"
|
#include "Core/Host.h"
|
||||||
|
#include "Core/IPC_HLE/WII_IPC_HLE.h"
|
||||||
|
#include "Core/IPC_HLE/WII_IPC_HLE_Device_stm.h"
|
||||||
#include "Core/IPC_HLE/WII_IPC_HLE_Device_usb_bt_emu.h"
|
#include "Core/IPC_HLE/WII_IPC_HLE_Device_usb_bt_emu.h"
|
||||||
#include "Core/IPC_HLE/WII_IPC_HLE_WiiMote.h"
|
#include "Core/IPC_HLE/WII_IPC_HLE_WiiMote.h"
|
||||||
#include "Core/State.h"
|
#include "Core/State.h"
|
||||||
|
@ -232,7 +234,9 @@ class PlatformX11 : public Platform
|
||||||
{
|
{
|
||||||
if (s_shutdown_requested.TestAndClear())
|
if (s_shutdown_requested.TestAndClear())
|
||||||
{
|
{
|
||||||
if (!s_tried_graceful_shutdown.IsSet() && SConfig::GetInstance().bWii)
|
const auto& stm = WII_IPC_HLE_Interface::GetDeviceByName("/dev/stm/eventhook");
|
||||||
|
if (!s_tried_graceful_shutdown.IsSet() && stm &&
|
||||||
|
std::static_pointer_cast<CWII_IPC_HLE_Device_stm_eventhook>(stm)->HasHookInstalled())
|
||||||
{
|
{
|
||||||
ProcessorInterface::PowerButton_Tap();
|
ProcessorInterface::PowerButton_Tap();
|
||||||
s_tried_graceful_shutdown.Set();
|
s_tried_graceful_shutdown.Set();
|
||||||
|
|
Loading…
Reference in New Issue