Qt: Always poll controllers even when not running
Fixes pause hotkey not unpausing when bound to controller.
This commit is contained in:
parent
5a1b00825d
commit
b56546d8ad
|
@ -185,7 +185,6 @@ void InputButtonBindingWidget::hookControllerInput()
|
||||||
if (!controller_interface)
|
if (!controller_interface)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_host_interface->enableBackgroundControllerPolling();
|
|
||||||
controller_interface->SetHook([this](const ControllerInterface::Hook& ei) {
|
controller_interface->SetHook([this](const ControllerInterface::Hook& ei) {
|
||||||
if (ei.type == ControllerInterface::Hook::Type::Axis)
|
if (ei.type == ControllerInterface::Hook::Type::Axis)
|
||||||
{
|
{
|
||||||
|
@ -216,7 +215,6 @@ void InputButtonBindingWidget::unhookControllerInput()
|
||||||
return;
|
return;
|
||||||
|
|
||||||
controller_interface->ClearHook();
|
controller_interface->ClearHook();
|
||||||
m_host_interface->disableBackgroundControllerPolling();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void InputButtonBindingWidget::bindToControllerAxis(int controller_index, int axis_index, bool positive)
|
void InputButtonBindingWidget::bindToControllerAxis(int controller_index, int axis_index, bool positive)
|
||||||
|
@ -263,7 +261,6 @@ void InputAxisBindingWidget::hookControllerInput()
|
||||||
if (!controller_interface)
|
if (!controller_interface)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_host_interface->enableBackgroundControllerPolling();
|
|
||||||
controller_interface->SetHook([this](const ControllerInterface::Hook& ei) {
|
controller_interface->SetHook([this](const ControllerInterface::Hook& ei) {
|
||||||
if (ei.type == ControllerInterface::Hook::Type::Axis)
|
if (ei.type == ControllerInterface::Hook::Type::Axis)
|
||||||
{
|
{
|
||||||
|
@ -287,7 +284,6 @@ void InputAxisBindingWidget::unhookControllerInput()
|
||||||
return;
|
return;
|
||||||
|
|
||||||
controller_interface->ClearHook();
|
controller_interface->ClearHook();
|
||||||
m_host_interface->disableBackgroundControllerPolling();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void InputAxisBindingWidget::bindToControllerAxis(int controller_index, int axis_index)
|
void InputAxisBindingWidget::bindToControllerAxis(int controller_index, int axis_index)
|
||||||
|
@ -327,7 +323,6 @@ void InputRumbleBindingWidget::hookControllerInput()
|
||||||
if (!controller_interface)
|
if (!controller_interface)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_host_interface->enableBackgroundControllerPolling();
|
|
||||||
controller_interface->SetHook([this](const ControllerInterface::Hook& ei) {
|
controller_interface->SetHook([this](const ControllerInterface::Hook& ei) {
|
||||||
if (ei.type == ControllerInterface::Hook::Type::Button && ei.value > 0.0f)
|
if (ei.type == ControllerInterface::Hook::Type::Button && ei.value > 0.0f)
|
||||||
{
|
{
|
||||||
|
@ -346,7 +341,6 @@ void InputRumbleBindingWidget::unhookControllerInput()
|
||||||
return;
|
return;
|
||||||
|
|
||||||
controller_interface->ClearHook();
|
controller_interface->ClearHook();
|
||||||
m_host_interface->disableBackgroundControllerPolling();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void InputRumbleBindingWidget::bindToControllerRumble(int controller_index)
|
void InputRumbleBindingWidget::bindToControllerRumble(int controller_index)
|
||||||
|
|
|
@ -65,12 +65,15 @@ bool QtHostInterface::initializeOnThread()
|
||||||
m_controller_interface->PollEvents();
|
m_controller_interface->PollEvents();
|
||||||
|
|
||||||
// bind buttons/axises
|
// bind buttons/axises
|
||||||
|
createBackgroundControllerPollTimer();
|
||||||
|
startBackgroundControllerPollTimer();
|
||||||
updateInputMap();
|
updateInputMap();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtHostInterface::shutdownOnThread()
|
void QtHostInterface::shutdownOnThread()
|
||||||
{
|
{
|
||||||
|
destroyBackgroundControllerPollTimer();
|
||||||
CommonHostInterface::Shutdown();
|
CommonHostInterface::Shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -396,7 +399,7 @@ void QtHostInterface::OnSystemCreated()
|
||||||
CommonHostInterface::OnSystemCreated();
|
CommonHostInterface::OnSystemCreated();
|
||||||
|
|
||||||
wakeThread();
|
wakeThread();
|
||||||
destroyBackgroundControllerPollTimer();
|
stopBackgroundControllerPollTimer();
|
||||||
|
|
||||||
emit emulationStarted();
|
emit emulationStarted();
|
||||||
}
|
}
|
||||||
|
@ -407,28 +410,23 @@ void QtHostInterface::OnSystemPaused(bool paused)
|
||||||
|
|
||||||
emit emulationPaused(paused);
|
emit emulationPaused(paused);
|
||||||
|
|
||||||
if (m_background_controller_polling_enable_count > 0)
|
|
||||||
{
|
|
||||||
if (paused)
|
|
||||||
createBackgroundControllerPollTimer();
|
|
||||||
else
|
|
||||||
destroyBackgroundControllerPollTimer();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!paused)
|
if (!paused)
|
||||||
{
|
{
|
||||||
wakeThread();
|
wakeThread();
|
||||||
|
stopBackgroundControllerPollTimer();
|
||||||
emit focusDisplayWidgetRequested();
|
emit focusDisplayWidgetRequested();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
startBackgroundControllerPollTimer();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtHostInterface::OnSystemDestroyed()
|
void QtHostInterface::OnSystemDestroyed()
|
||||||
{
|
{
|
||||||
HostInterface::OnSystemDestroyed();
|
HostInterface::OnSystemDestroyed();
|
||||||
|
|
||||||
if (m_background_controller_polling_enable_count > 0)
|
startBackgroundControllerPollTimer();
|
||||||
createBackgroundControllerPollTimer();
|
|
||||||
|
|
||||||
emit emulationStopped();
|
emit emulationStopped();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -762,42 +760,6 @@ void QtHostInterface::saveScreenshot()
|
||||||
SaveScreenshot(nullptr, true, true);
|
SaveScreenshot(nullptr, true, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtHostInterface::enableBackgroundControllerPolling()
|
|
||||||
{
|
|
||||||
if (!isOnWorkerThread())
|
|
||||||
{
|
|
||||||
QMetaObject::invokeMethod(this, "enableBackgroundControllerPolling", Qt::BlockingQueuedConnection);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!m_controller_interface || m_background_controller_polling_enable_count++ > 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!m_system || m_paused)
|
|
||||||
{
|
|
||||||
createBackgroundControllerPollTimer();
|
|
||||||
|
|
||||||
// drain the event queue so we don't get events late
|
|
||||||
m_controller_interface->PollEvents();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QtHostInterface::disableBackgroundControllerPolling()
|
|
||||||
{
|
|
||||||
if (!isOnWorkerThread())
|
|
||||||
{
|
|
||||||
QMetaObject::invokeMethod(this, "disableBackgroundControllerPolling");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Assert(m_background_controller_polling_enable_count > 0);
|
|
||||||
if (!m_controller_interface || --m_background_controller_polling_enable_count > 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!m_system || m_paused)
|
|
||||||
destroyBackgroundControllerPollTimer();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QtHostInterface::doBackgroundControllerPoll()
|
void QtHostInterface::doBackgroundControllerPoll()
|
||||||
{
|
{
|
||||||
m_controller_interface->PollEvents();
|
m_controller_interface->PollEvents();
|
||||||
|
@ -810,7 +772,6 @@ void QtHostInterface::createBackgroundControllerPollTimer()
|
||||||
m_background_controller_polling_timer->setSingleShot(false);
|
m_background_controller_polling_timer->setSingleShot(false);
|
||||||
m_background_controller_polling_timer->setTimerType(Qt::VeryCoarseTimer);
|
m_background_controller_polling_timer->setTimerType(Qt::VeryCoarseTimer);
|
||||||
connect(m_background_controller_polling_timer, &QTimer::timeout, this, &QtHostInterface::doBackgroundControllerPoll);
|
connect(m_background_controller_polling_timer, &QTimer::timeout, this, &QtHostInterface::doBackgroundControllerPoll);
|
||||||
m_background_controller_polling_timer->start(BACKGROUND_CONTROLLER_POLLING_INTERVAL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtHostInterface::destroyBackgroundControllerPollTimer()
|
void QtHostInterface::destroyBackgroundControllerPollTimer()
|
||||||
|
@ -819,6 +780,22 @@ void QtHostInterface::destroyBackgroundControllerPollTimer()
|
||||||
m_background_controller_polling_timer = nullptr;
|
m_background_controller_polling_timer = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QtHostInterface::startBackgroundControllerPollTimer()
|
||||||
|
{
|
||||||
|
if (m_background_controller_polling_timer->isActive() || !m_controller_interface)
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_background_controller_polling_timer->start(BACKGROUND_CONTROLLER_POLLING_INTERVAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QtHostInterface::stopBackgroundControllerPollTimer()
|
||||||
|
{
|
||||||
|
if (!m_background_controller_polling_timer->isActive() || !m_controller_interface)
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_background_controller_polling_timer->stop();
|
||||||
|
}
|
||||||
|
|
||||||
void QtHostInterface::createThread()
|
void QtHostInterface::createThread()
|
||||||
{
|
{
|
||||||
m_original_thread = QThread::currentThread();
|
m_original_thread = QThread::currentThread();
|
||||||
|
|
|
@ -126,13 +126,6 @@ public Q_SLOTS:
|
||||||
void redrawDisplayWindow();
|
void redrawDisplayWindow();
|
||||||
void toggleFullscreen();
|
void toggleFullscreen();
|
||||||
|
|
||||||
/// Enables controller polling even without a system active. Must be matched by a call to
|
|
||||||
/// disableBackgroundControllerPolling.
|
|
||||||
void enableBackgroundControllerPolling();
|
|
||||||
|
|
||||||
/// Disables background controller polling.
|
|
||||||
void disableBackgroundControllerPolling();
|
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void doStopThread();
|
void doStopThread();
|
||||||
void onHostDisplayWindowResized(int width, int height);
|
void onHostDisplayWindowResized(int width, int height);
|
||||||
|
@ -190,6 +183,8 @@ private:
|
||||||
|
|
||||||
void createBackgroundControllerPollTimer();
|
void createBackgroundControllerPollTimer();
|
||||||
void destroyBackgroundControllerPollTimer();
|
void destroyBackgroundControllerPollTimer();
|
||||||
|
void startBackgroundControllerPollTimer();
|
||||||
|
void stopBackgroundControllerPollTimer();
|
||||||
|
|
||||||
void createThread();
|
void createThread();
|
||||||
void stopThread();
|
void stopThread();
|
||||||
|
@ -213,7 +208,6 @@ private:
|
||||||
std::atomic_bool m_shutdown_flag{false};
|
std::atomic_bool m_shutdown_flag{false};
|
||||||
|
|
||||||
QTimer* m_background_controller_polling_timer = nullptr;
|
QTimer* m_background_controller_polling_timer = nullptr;
|
||||||
u32 m_background_controller_polling_enable_count = 0;
|
|
||||||
|
|
||||||
bool m_is_rendering_to_main = false;
|
bool m_is_rendering_to_main = false;
|
||||||
bool m_is_fullscreen = false;
|
bool m_is_fullscreen = false;
|
||||||
|
|
Loading…
Reference in New Issue