summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Mansell <phiren@gmail.com>2015-07-13 12:05:54 +1200
committerScott Mansell <phiren@gmail.com>2015-07-13 12:05:54 +1200
commit87e19f1c190719bd1280eb94bcdf372caca5287b (patch)
treea3f3d0e48533f02bf0bfc6f37e9abf0e20c51a54
parentcc79334faf14c8525d828eaafa99ed6432842de4 (diff)
parent6e969133f5e0f5fe9551a0ace39b242c5c3aac78 (diff)
Merge pull request #2705 from phire/fixrumble
evdev: Delete rumble effects on the correct file descriptor.
-rw-r--r--Source/Core/InputCommon/ControllerInterface/evdev/evdev.cpp15
-rw-r--r--Source/Core/InputCommon/ControllerInterface/evdev/evdev.h1
2 files changed, 14 insertions, 2 deletions
diff --git a/Source/Core/InputCommon/ControllerInterface/evdev/evdev.cpp b/Source/Core/InputCommon/ControllerInterface/evdev/evdev.cpp
index 9b31da73c4..6ee55ba0e5 100644
--- a/Source/Core/InputCommon/ControllerInterface/evdev/evdev.cpp
+++ b/Source/Core/InputCommon/ControllerInterface/evdev/evdev.cpp
@@ -216,6 +216,12 @@ void evdevDevice::ForceFeedback::SetState(ControlState state)
// libevdev doesn't have nice helpers for forcefeedback
// we will use the file descriptors directly.
+ if (m_id != -1) // delete the previous effect (which also stops it)
+ {
+ ioctl(m_fd, EVIOCRMFF, m_id);
+ m_id = -1;
+ }
+
if (state > 0) // Upload and start an effect.
{
ff_effect effect;
@@ -260,9 +266,14 @@ void evdevDevice::ForceFeedback::SetState(ControlState state)
write(m_fd, (const void*) &play, sizeof(play));
}
- else if (m_id != -1) // delete the effect (which also stops it)
+}
+
+evdevDevice::ForceFeedback::~ForceFeedback()
+{
+ // delete the uploaded effect, so we don't leak it.
+ if (m_id != -1)
{
- ioctl(m_id, EVIOCRMFF, m_id);
+ ioctl(m_fd, EVIOCRMFF, m_id);
}
}
diff --git a/Source/Core/InputCommon/ControllerInterface/evdev/evdev.h b/Source/Core/InputCommon/ControllerInterface/evdev/evdev.h
index d1555c8cce..2926e44805 100644
--- a/Source/Core/InputCommon/ControllerInterface/evdev/evdev.h
+++ b/Source/Core/InputCommon/ControllerInterface/evdev/evdev.h
@@ -52,6 +52,7 @@ private:
public:
std::string GetName() const override;
ForceFeedback(u16 type, libevdev* dev) : m_type(type), m_dev(dev), m_id(-1) { m_fd = libevdev_get_fd(dev); }
+ ~ForceFeedback();
void SetState(ControlState state) override;
private:
const u16 m_type;