From 94038a1e03dae76ea9560766b07d79ba45c67f1a Mon Sep 17 00:00:00 2001 From: Michael Maltese Date: Tue, 13 Jun 2017 16:52:55 -0700 Subject: [PATCH 1/6] MappingButton: remove GetFirstButtonPress logic --- .../Core/DolphinQt2/Config/Mapping/MappingButton.cpp | 5 ----- .../Core/DolphinQt2/Config/Mapping/MappingWidget.cpp | 10 ---------- Source/Core/DolphinQt2/Config/Mapping/MappingWidget.h | 1 - 3 files changed, 16 deletions(-) diff --git a/Source/Core/DolphinQt2/Config/Mapping/MappingButton.cpp b/Source/Core/DolphinQt2/Config/Mapping/MappingButton.cpp index 02e6917d8c..cd776f6cbb 100644 --- a/Source/Core/DolphinQt2/Config/Mapping/MappingButton.cpp +++ b/Source/Core/DolphinQt2/Config/Mapping/MappingButton.cpp @@ -42,13 +42,8 @@ void MappingButton::OnButtonPressed() setText(QStringLiteral("...")); - Common::SleepCurrentThread(100); - SetBlockInputs(true); - if (m_parent->GetFirstButtonPress()) - m_reference->Detect(10, dev.get()); - // Avoid that the button press itself is registered as an event Common::SleepCurrentThread(100); diff --git a/Source/Core/DolphinQt2/Config/Mapping/MappingWidget.cpp b/Source/Core/DolphinQt2/Config/Mapping/MappingWidget.cpp index ff7e7c1e20..c2d64e6ee5 100644 --- a/Source/Core/DolphinQt2/Config/Mapping/MappingWidget.cpp +++ b/Source/Core/DolphinQt2/Config/Mapping/MappingWidget.cpp @@ -114,16 +114,6 @@ void MappingWidget::Update() LoadSettings(); } -bool MappingWidget::GetFirstButtonPress() -{ - if (m_first) - { - m_first = false; - return true; - } - return false; -} - ControllerEmu::EmulatedController* MappingWidget::GetController() const { return m_parent->GetController(); diff --git a/Source/Core/DolphinQt2/Config/Mapping/MappingWidget.h b/Source/Core/DolphinQt2/Config/Mapping/MappingWidget.h index a942038b3f..81dd605628 100644 --- a/Source/Core/DolphinQt2/Config/Mapping/MappingWidget.h +++ b/Source/Core/DolphinQt2/Config/Mapping/MappingWidget.h @@ -51,7 +51,6 @@ public: virtual InputConfig* GetConfig() = 0; void Update(); - bool GetFirstButtonPress(); protected: int GetPort() const; From ef563fc032b0b36fb3d5f168585c9ce72732a325 Mon Sep 17 00:00:00 2001 From: Michael Maltese Date: Tue, 13 Jun 2017 16:56:14 -0700 Subject: [PATCH 2/6] MappingWidget: call Clear() on numerics and bools --- Source/Core/DolphinQt2/Config/Mapping/MappingWidget.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Source/Core/DolphinQt2/Config/Mapping/MappingWidget.cpp b/Source/Core/DolphinQt2/Config/Mapping/MappingWidget.cpp index c2d64e6ee5..87d0741e29 100644 --- a/Source/Core/DolphinQt2/Config/Mapping/MappingWidget.cpp +++ b/Source/Core/DolphinQt2/Config/Mapping/MappingWidget.cpp @@ -98,6 +98,12 @@ void MappingWidget::OnClearFields() { for (auto* button : m_buttons) button->Clear(); + + for (auto* spinbox : m_numerics) + spinbox->Clear(); + + for (auto* checkbox : m_bools) + checkbox->Clear(); } void MappingWidget::Update() From 6c73079011b866f923e4ebdce0b2bf1781d7a569 Mon Sep 17 00:00:00 2001 From: Michael Maltese Date: Tue, 13 Jun 2017 16:56:33 -0700 Subject: [PATCH 3/6] MappingWidget: fix typo and call Update() on bools --- Source/Core/DolphinQt2/Config/Mapping/MappingWidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/DolphinQt2/Config/Mapping/MappingWidget.cpp b/Source/Core/DolphinQt2/Config/Mapping/MappingWidget.cpp index 87d0741e29..ad3b672ccf 100644 --- a/Source/Core/DolphinQt2/Config/Mapping/MappingWidget.cpp +++ b/Source/Core/DolphinQt2/Config/Mapping/MappingWidget.cpp @@ -114,7 +114,7 @@ void MappingWidget::Update() for (auto* spinbox : m_numerics) spinbox->Update(); - for (auto* checkbox : m_numerics) + for (auto* checkbox : m_bools) checkbox->Update(); LoadSettings(); From 2188ac785af005037340eb5dd167d327266dbc8f Mon Sep 17 00:00:00 2001 From: Michael Maltese Date: Tue, 13 Jun 2017 16:57:05 -0700 Subject: [PATCH 4/6] Move MappingWindow::OnDefaultFieldsPressed() to correct file --- .../Core/DolphinQt2/Config/Mapping/MappingButton.cpp | 10 ---------- .../Core/DolphinQt2/Config/Mapping/MappingWindow.cpp | 10 ++++++++++ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Source/Core/DolphinQt2/Config/Mapping/MappingButton.cpp b/Source/Core/DolphinQt2/Config/Mapping/MappingButton.cpp index cd776f6cbb..b72f13aa9a 100644 --- a/Source/Core/DolphinQt2/Config/Mapping/MappingButton.cpp +++ b/Source/Core/DolphinQt2/Config/Mapping/MappingButton.cpp @@ -90,16 +90,6 @@ void MappingButton::SetBlockInputs(const bool block) m_block = block; } -void MappingWindow::OnDefaultFieldsPressed() -{ - if (m_controller == nullptr) - return; - - m_controller->LoadDefaults(g_controller_interface); - m_controller->UpdateReferences(g_controller_interface); - emit Update(); -} - bool MappingButton::event(QEvent* event) { return !m_block ? QPushButton::event(event) : true; diff --git a/Source/Core/DolphinQt2/Config/Mapping/MappingWindow.cpp b/Source/Core/DolphinQt2/Config/Mapping/MappingWindow.cpp index 660ac02174..785ff5788e 100644 --- a/Source/Core/DolphinQt2/Config/Mapping/MappingWindow.cpp +++ b/Source/Core/DolphinQt2/Config/Mapping/MappingWindow.cpp @@ -381,3 +381,13 @@ bool MappingWindow::event(QEvent* event) return false; } + +void MappingWindow::OnDefaultFieldsPressed() +{ + if (m_controller == nullptr) + return; + + m_controller->LoadDefaults(g_controller_interface); + m_controller->UpdateReferences(g_controller_interface); + emit Update(); +} From 5b6c8c3ad0902d27a15cb733fe29f9cbedf10e1a Mon Sep 17 00:00:00 2001 From: Michael Maltese Date: Tue, 13 Jun 2017 17:11:52 -0700 Subject: [PATCH 5/6] MappingButton: grab and release mouse and keyboard instead of calling parent SetBlockInputs --- .../Config/Mapping/MappingButton.cpp | 28 +++++++++++++------ .../DolphinQt2/Config/Mapping/MappingButton.h | 1 - .../Config/Mapping/MappingWidget.cpp | 5 ---- .../DolphinQt2/Config/Mapping/MappingWidget.h | 1 - .../Config/Mapping/MappingWindow.cpp | 13 --------- .../DolphinQt2/Config/Mapping/MappingWindow.h | 4 --- 6 files changed, 19 insertions(+), 33 deletions(-) diff --git a/Source/Core/DolphinQt2/Config/Mapping/MappingButton.cpp b/Source/Core/DolphinQt2/Config/Mapping/MappingButton.cpp index b72f13aa9a..cfa33dcca3 100644 --- a/Source/Core/DolphinQt2/Config/Mapping/MappingButton.cpp +++ b/Source/Core/DolphinQt2/Config/Mapping/MappingButton.cpp @@ -42,7 +42,9 @@ void MappingButton::OnButtonPressed() setText(QStringLiteral("...")); - SetBlockInputs(true); + m_block = true; + grabKeyboard(); + grabMouse(); // Avoid that the button press itself is registered as an event Common::SleepCurrentThread(100); @@ -51,7 +53,10 @@ void MappingButton::OnButtonPressed() m_parent->GetParent()->GetDeviceQualifier(), m_parent->GetController()->default_device); - SetBlockInputs(false); + releaseMouse(); + releaseKeyboard(); + m_block = false; + if (!expr.isEmpty()) { m_reference->expression = expr.toStdString(); @@ -84,15 +89,20 @@ void MappingButton::Update() m_parent->SaveSettings(); } -void MappingButton::SetBlockInputs(const bool block) -{ - m_parent->SetBlockInputs(block); - m_block = block; -} - bool MappingButton::event(QEvent* event) { - return !m_block ? QPushButton::event(event) : true; + const QEvent::Type event_type = event->type(); + // Returning 'true' means "yes, this event has been handled, don't propagate it to parent + // widgets". + if (m_block && + (event_type == QEvent::KeyPress || event_type == QEvent::KeyRelease || + event_type == QEvent::MouseButtonPress || event_type == QEvent::MouseButtonRelease || + event_type == QEvent::MouseButtonDblClick)) + { + return true; + } + + return QPushButton::event(event); } void MappingButton::mouseReleaseEvent(QMouseEvent* event) diff --git a/Source/Core/DolphinQt2/Config/Mapping/MappingButton.h b/Source/Core/DolphinQt2/Config/Mapping/MappingButton.h index 37db71cc00..ec11106287 100644 --- a/Source/Core/DolphinQt2/Config/Mapping/MappingButton.h +++ b/Source/Core/DolphinQt2/Config/Mapping/MappingButton.h @@ -30,7 +30,6 @@ private: void OnButtonPressed(); void OnButtonTimeout(); void Connect(); - void SetBlockInputs(const bool block); MappingWidget* m_parent; ControlReference* m_reference; diff --git a/Source/Core/DolphinQt2/Config/Mapping/MappingWidget.cpp b/Source/Core/DolphinQt2/Config/Mapping/MappingWidget.cpp index ad3b672ccf..bde2f6bcfb 100644 --- a/Source/Core/DolphinQt2/Config/Mapping/MappingWidget.cpp +++ b/Source/Core/DolphinQt2/Config/Mapping/MappingWidget.cpp @@ -89,11 +89,6 @@ QGroupBox* MappingWidget::CreateGroupBox(const QString& name, ControllerEmu::Con return group_box; } -void MappingWidget::SetBlockInputs(const bool block) -{ - m_parent->SetBlockInputs(block); -} - void MappingWidget::OnClearFields() { for (auto* button : m_buttons) diff --git a/Source/Core/DolphinQt2/Config/Mapping/MappingWidget.h b/Source/Core/DolphinQt2/Config/Mapping/MappingWidget.h index 81dd605628..2c24c1a814 100644 --- a/Source/Core/DolphinQt2/Config/Mapping/MappingWidget.h +++ b/Source/Core/DolphinQt2/Config/Mapping/MappingWidget.h @@ -43,7 +43,6 @@ public: ControllerEmu::EmulatedController* GetController() const; std::shared_ptr GetDevice() const; - void SetBlockInputs(const bool block); MappingWindow* GetParent() const; virtual void LoadSettings() = 0; diff --git a/Source/Core/DolphinQt2/Config/Mapping/MappingWindow.cpp b/Source/Core/DolphinQt2/Config/Mapping/MappingWindow.cpp index 785ff5788e..216573c6b1 100644 --- a/Source/Core/DolphinQt2/Config/Mapping/MappingWindow.cpp +++ b/Source/Core/DolphinQt2/Config/Mapping/MappingWindow.cpp @@ -369,19 +369,6 @@ std::shared_ptr MappingWindow::GetDevice() const return g_controller_interface.FindDevice(m_devq); } -void MappingWindow::SetBlockInputs(const bool block) -{ - m_block = block; -} - -bool MappingWindow::event(QEvent* event) -{ - if (!m_block) - return QDialog::event(event); - - return false; -} - void MappingWindow::OnDefaultFieldsPressed() { if (m_controller == nullptr) diff --git a/Source/Core/DolphinQt2/Config/Mapping/MappingWindow.h b/Source/Core/DolphinQt2/Config/Mapping/MappingWindow.h index 1d5cbb58e5..760b47e151 100644 --- a/Source/Core/DolphinQt2/Config/Mapping/MappingWindow.h +++ b/Source/Core/DolphinQt2/Config/Mapping/MappingWindow.h @@ -53,7 +53,6 @@ public: const ciface::Core::DeviceQualifier& GetDeviceQualifier() const; std::shared_ptr GetDevice() const; - void SetBlockInputs(const bool block); ControllerEmu::EmulatedController* GetController() const; signals: void Update(); @@ -80,8 +79,6 @@ private: void OnProfileChanged(int index); void OnDeviceChanged(int index); - bool event(QEvent* event) override; - ControllerEmu::EmulatedController* m_controller = nullptr; // Main @@ -114,7 +111,6 @@ private: Type m_mapping_type; const int m_port; bool m_is_complex; - bool m_block = false; InputConfig* m_config; ciface::Core::DeviceQualifier m_devq; }; From 7c79673d780872c26bc8cb6808d22826c0a806c1 Mon Sep 17 00:00:00 2001 From: Michael Maltese Date: Tue, 13 Jun 2017 17:36:30 -0700 Subject: [PATCH 6/6] MappingButton: make m_block a Common::Flag --- .../DolphinQt2/Config/Mapping/MappingButton.cpp | 16 +++++++++------- .../DolphinQt2/Config/Mapping/MappingButton.h | 3 ++- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Source/Core/DolphinQt2/Config/Mapping/MappingButton.cpp b/Source/Core/DolphinQt2/Config/Mapping/MappingButton.cpp index cfa33dcca3..84ba377337 100644 --- a/Source/Core/DolphinQt2/Config/Mapping/MappingButton.cpp +++ b/Source/Core/DolphinQt2/Config/Mapping/MappingButton.cpp @@ -33,19 +33,21 @@ void MappingButton::Connect() void MappingButton::OnButtonPressed() { - if (m_block || m_parent->GetDevice() == nullptr || !m_reference->IsInput()) + if (m_parent->GetDevice() == nullptr || !m_reference->IsInput()) return; + if (!m_block.TestAndSet()) + return; + + grabKeyboard(); + grabMouse(); + // Make sure that we don't block event handling std::thread([this] { const auto dev = m_parent->GetDevice(); setText(QStringLiteral("...")); - m_block = true; - grabKeyboard(); - grabMouse(); - // Avoid that the button press itself is registered as an event Common::SleepCurrentThread(100); @@ -55,7 +57,7 @@ void MappingButton::OnButtonPressed() releaseMouse(); releaseKeyboard(); - m_block = false; + m_block.Clear(); if (!expr.isEmpty()) { @@ -94,7 +96,7 @@ bool MappingButton::event(QEvent* event) const QEvent::Type event_type = event->type(); // Returning 'true' means "yes, this event has been handled, don't propagate it to parent // widgets". - if (m_block && + if (m_block.IsSet() && (event_type == QEvent::KeyPress || event_type == QEvent::KeyRelease || event_type == QEvent::MouseButtonPress || event_type == QEvent::MouseButtonRelease || event_type == QEvent::MouseButtonDblClick)) diff --git a/Source/Core/DolphinQt2/Config/Mapping/MappingButton.h b/Source/Core/DolphinQt2/Config/Mapping/MappingButton.h index ec11106287..0714147d43 100644 --- a/Source/Core/DolphinQt2/Config/Mapping/MappingButton.h +++ b/Source/Core/DolphinQt2/Config/Mapping/MappingButton.h @@ -4,6 +4,7 @@ #pragma once +#include "Common/Flag.h" #include "DolphinQt2/QtUtils/ElidedButton.h" class ControlReference; @@ -33,5 +34,5 @@ private: MappingWidget* m_parent; ControlReference* m_reference; - bool m_block = false; + Common::Flag m_block; };