HostInterface: Fix crash on startup with controller connected
This commit is contained in:
@ -61,6 +61,7 @@ bool HostInterface::Initialize()
|
||||
{
|
||||
SetUserDirectory();
|
||||
InitializeUserDirectory();
|
||||
LoadSettings();
|
||||
m_game_list = std::make_unique<GameList>();
|
||||
m_game_list->SetCacheFilename(GetGameListCacheFileName());
|
||||
m_game_list->SetDatabaseFilename(GetGameListDatabaseFileName());
|
||||
|
||||
@ -158,8 +158,8 @@ protected:
|
||||
/// Sets the base path for the user directory. Can be overridden by platform/frontend/command line.
|
||||
virtual void SetUserDirectory();
|
||||
|
||||
/// Ensures all subdirectories of the user directory are created.
|
||||
void CreateUserDirectorySubdirectories();
|
||||
/// Performs the initial load of settings. Should call CheckSettings() and m_settings.Load().
|
||||
virtual void LoadSettings() = 0;
|
||||
|
||||
/// Returns the path of the settings file.
|
||||
std::string GetSettingsFileName() const;
|
||||
|
||||
@ -59,22 +59,6 @@ bool QtHostInterface::initializeOnThread()
|
||||
if (m_controller_interface)
|
||||
m_controller_interface->PollEvents();
|
||||
|
||||
// no need to lock here because the main thread is waiting for us
|
||||
m_qsettings = std::make_unique<QSettings>(QString::fromStdString(GetSettingsFileName()), QSettings::IniFormat);
|
||||
QtSettingsInterface si(m_qsettings.get());
|
||||
|
||||
// check settings validity
|
||||
const QSettings::Status settings_status = m_qsettings->status();
|
||||
if (settings_status != QSettings::NoError)
|
||||
{
|
||||
m_qsettings->clear();
|
||||
SetDefaultSettings(si);
|
||||
}
|
||||
|
||||
// load in settings
|
||||
CheckSettings(si);
|
||||
m_settings.Load(si);
|
||||
|
||||
// bind buttons/axises
|
||||
updateInputMap();
|
||||
return true;
|
||||
@ -417,6 +401,25 @@ void QtHostInterface::OnSystemStateSaved(bool global, s32 slot)
|
||||
emit stateSaved(QString::fromStdString(m_system->GetRunningCode()), global, slot);
|
||||
}
|
||||
|
||||
void QtHostInterface::LoadSettings()
|
||||
{
|
||||
// no need to lock here because the main thread is waiting for us
|
||||
m_qsettings = std::make_unique<QSettings>(QString::fromStdString(GetSettingsFileName()), QSettings::IniFormat);
|
||||
QtSettingsInterface si(m_qsettings.get());
|
||||
|
||||
// check settings validity
|
||||
const QSettings::Status settings_status = m_qsettings->status();
|
||||
if (settings_status != QSettings::NoError)
|
||||
{
|
||||
m_qsettings->clear();
|
||||
SetDefaultSettings(si);
|
||||
}
|
||||
|
||||
// load in settings
|
||||
CheckSettings(si);
|
||||
m_settings.Load(si);
|
||||
}
|
||||
|
||||
void QtHostInterface::SetDefaultSettings(SettingsInterface& si)
|
||||
{
|
||||
CommonHostInterface::SetDefaultSettings(si);
|
||||
|
||||
@ -133,6 +133,7 @@ protected:
|
||||
void OnRunningGameChanged() override;
|
||||
void OnSystemStateSaved(bool global, s32 slot) override;
|
||||
|
||||
void LoadSettings() override;
|
||||
void SetDefaultSettings(SettingsInterface& si) override;
|
||||
void UpdateInputMap() override;
|
||||
|
||||
|
||||
@ -295,12 +295,6 @@ bool SDLHostInterface::Initialize()
|
||||
if (!FileSystem::SetWorkingDirectory(m_user_directory.c_str()))
|
||||
Log_ErrorPrintf("Failed to set working directory to '%s'", m_user_directory.c_str());
|
||||
|
||||
// Settings need to be loaded prior to creating the window for OpenGL bits.
|
||||
INISettingsInterface si(GetSettingsFileName());
|
||||
m_settings_copy.Load(si);
|
||||
m_settings = m_settings_copy;
|
||||
m_fullscreen = m_settings_copy.start_fullscreen;
|
||||
|
||||
if (!CreateSDLWindow())
|
||||
{
|
||||
Log_ErrorPrintf("Failed to create SDL window");
|
||||
@ -334,6 +328,15 @@ void SDLHostInterface::Shutdown()
|
||||
HostInterface::Shutdown();
|
||||
}
|
||||
|
||||
void SDLHostInterface::LoadSettings()
|
||||
{
|
||||
// Settings need to be loaded prior to creating the window for OpenGL bits.
|
||||
INISettingsInterface si(GetSettingsFileName());
|
||||
m_settings_copy.Load(si);
|
||||
m_settings = m_settings_copy;
|
||||
m_fullscreen = m_settings_copy.start_fullscreen;
|
||||
}
|
||||
|
||||
void SDLHostInterface::ReportError(const char* message)
|
||||
{
|
||||
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "DuckStation", message, m_window);
|
||||
|
||||
@ -29,19 +29,21 @@ public:
|
||||
void ReportMessage(const char* message) override;
|
||||
bool ConfirmMessage(const char* message) override;
|
||||
|
||||
bool Initialize();
|
||||
bool Initialize() override;
|
||||
void Shutdown() override;
|
||||
|
||||
void Run();
|
||||
|
||||
protected:
|
||||
void LoadSettings() override;
|
||||
|
||||
bool AcquireHostDisplay() override;
|
||||
void ReleaseHostDisplay() override;
|
||||
std::unique_ptr<AudioStream> CreateAudioStream(AudioBackend backend) override;
|
||||
|
||||
void OnSystemCreated() override;
|
||||
void OnSystemPaused(bool paused) override;
|
||||
void OnSystemDestroyed();
|
||||
void OnSystemDestroyed() override;
|
||||
void OnControllerTypeChanged(u32 slot) override;
|
||||
|
||||
private:
|
||||
|
||||
Reference in New Issue
Block a user