@@ -48,11 +48,14 @@ public:
48 int interval() const override;
48 int interval() const override;
49 void setInterval(int msecs) override;
49 void setInterval(int msecs) override;
50 void start() override;
50 void start() override;
51+ void stop() override;
52+ bool isRunning() const override;
51 bool isSingleShot() const override;
53 bool isSingleShot() const override;
52 void setSingleShot(bool value) override;
54 void setSingleShot(bool value) override;
54 int m_interval;
56 int m_interval;
55 bool m_singleShot;
57 bool m_singleShot;
56 qint64 m_nextTimeoutTime;
59 qint64 m_nextTimeoutTime;
@@ -85,6 +88,8 @@ private Q_SLOTS:
85 void tapWhileTouching();
88 void tapWhileTouching();
86 void multipleHomeKeys();
89 void multipleHomeKeys();
91+ void repeatedSuperPress();
89 void passTime(qint64 timeSpanMs);
94 void passTime(qint64 timeSpanMs);
@@ -258,12 +263,49 @@ void WindowInputMonitorTest::multipleHomeKeys()
258 QCOMPARE(activatedSpy.count(), 1);
263 QCOMPARE(activatedSpy.count(), 1);
266+// regression test for lp:1607427
267+void WindowInputMonitorTest::repeatedSuperPress()
269+ WindowInputMonitor homeKeyWatcher(m_fakeTimerFactory->create(), new FakeElapsedTimer);
270+ QSignalSpy activatedSpy(&homeKeyWatcher, &WindowInputMonitor::homeKeyActivated);
271+ QVERIFY(activatedSpy.isValid());
276+ QKeyEvent keyEvent(QEvent::KeyPress, Qt::Key_Super_L, Qt::NoModifier);
277+ homeKeyWatcher.update(&keyEvent);
281+ QKeyEvent keyEvent(QEvent::KeyRelease, Qt::Key_Super_L, Qt::NoModifier);
282+ homeKeyWatcher.update(&keyEvent);
285+ QCOMPARE(activatedSpy.count(), 1);
288+ activatedSpy.clear();
290+ QKeyEvent keyEvent(QEvent::KeyPress, Qt::Key_Super_L, Qt::NoModifier);
291+ homeKeyWatcher.update(&keyEvent);
295+ QKeyEvent keyEvent(QEvent::KeyRelease, Qt::Key_Super_L, Qt::NoModifier);
296+ homeKeyWatcher.update(&keyEvent);
299+ QCOMPARE(activatedSpy.count(), 1);
261/////////////////////////////////// FakeTimer //////////////////////////////////
302/////////////////////////////////// FakeTimer //////////////////////////////////
263FakeTimer::FakeTimer(QObject *parent)
304FakeTimer::FakeTimer(QObject *parent)
264 : UnityUtil::AbstractTimer(parent)
305 : UnityUtil::AbstractTimer(parent)
265 , m_interval(0)
306 , m_interval(0)
266 , m_singleShot(true)
307 , m_singleShot(true)
308+ , m_isRunning(false)
@@ -285,10 +327,20 @@ void FakeTimer::update()
286void FakeTimer::start()
328void FakeTimer::start()
288− AbstractTimer::start();
330+ m_isRunning = true;
289 m_nextTimeoutTime = FakeElapsedTimer::msecsSinceEpoch + (qint64)interval();
331 m_nextTimeoutTime = FakeElapsedTimer::msecsSinceEpoch + (qint64)interval();
334+void FakeTimer::stop()
336+ m_isRunning = false;
339+bool FakeTimer::isRunning() const
292int FakeTimer::interval() const
344int FakeTimer::interval() const
294 return m_interval;
346 return m_interval;