Skip to content

Commit

Permalink
Merge pull request #8043 from jordan-woyak/mapping-ui-event-block-fix
Browse files Browse the repository at this point in the history
DolphinQt: Fix mapping of space, return, and mouse-clicks.
  • Loading branch information
stenzek authored Apr 28, 2019
2 parents 1b16627 + 4e39d83 commit aee1551
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 14 deletions.
2 changes: 1 addition & 1 deletion Source/Core/DolphinQt/Config/Mapping/MappingButton.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ MappingButton::MappingButton(MappingWidget* parent, ControlReference* ref, bool
setToolTip(
tr("Left-click to detect input.\nMiddle-click to clear.\nRight-click for more options."));

connect(this, &MappingButton::pressed, this, &MappingButton::Detect);
connect(this, &MappingButton::clicked, this, &MappingButton::Detect);

if (indicator)
connect(parent, &MappingWidget::Update, this, &MappingButton::UpdateIndicator);
Expand Down
20 changes: 15 additions & 5 deletions Source/Core/DolphinQt/Config/Mapping/MappingCommon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include <QPushButton>
#include <QRegExp>
#include <QString>
#include <QTimer>

#include "DolphinQt/QtUtils/BlockUserInputFilter.h"
#include "InputCommon/ControlReference/ControlReference.h"
Expand Down Expand Up @@ -52,7 +53,9 @@ QString DetectExpression(QPushButton* button, ciface::Core::DeviceContainer& dev
const std::vector<std::string>& device_strings,
const ciface::Core::DeviceQualifier& default_device, Quote quote)
{
button->installEventFilter(BlockUserInputFilter::Instance());
const auto filter = new BlockUserInputFilter(button);

button->installEventFilter(filter);
button->grabKeyboard();
button->grabMouse();

Expand All @@ -63,16 +66,23 @@ QString DetectExpression(QPushButton* button, ciface::Core::DeviceContainer& dev
QApplication::processEvents();

// Avoid that the button press itself is registered as an event
Common::SleepCurrentThread(100);
Common::SleepCurrentThread(50);

std::shared_ptr<ciface::Core::Device> device;
ciface::Core::Device::Input* input;

std::tie(device, input) = device_container.DetectInput(INPUT_DETECT_TIME, device_strings);

button->releaseMouse();
button->releaseKeyboard();
button->removeEventFilter(BlockUserInputFilter::Instance());
const auto timer = new QTimer(button);

button->connect(timer, &QTimer::timeout, [button, filter] {
button->releaseMouse();
button->releaseKeyboard();
button->removeEventFilter(filter);
});

// Prevent mappings of "space", "return", or mouse clicks from re-activating detection.
timer->start(500);

button->setText(old_text);

Expand Down
6 changes: 0 additions & 6 deletions Source/Core/DolphinQt/QtUtils/BlockUserInputFilter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,6 @@

#include <QEvent>

BlockUserInputFilter* BlockUserInputFilter::Instance()
{
static BlockUserInputFilter s_block_user_input_filter;
return &s_block_user_input_filter;
}

bool BlockUserInputFilter::eventFilter(QObject* object, QEvent* event)
{
const QEvent::Type event_type = event->type();
Expand Down
3 changes: 1 addition & 2 deletions Source/Core/DolphinQt/QtUtils/BlockUserInputFilter.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,8 @@ class BlockUserInputFilter : public QObject
{
Q_OBJECT
public:
static BlockUserInputFilter* Instance();
using QObject::QObject;

private:
BlockUserInputFilter() = default;
bool eventFilter(QObject* object, QEvent* event) override;
};

0 comments on commit aee1551

Please sign in to comment.