@@ -48,11 +48,14 @@ public:
4848 int interval() const override;
4949 void setInterval(int msecs) override;
5050 void start() override;
51+ void stop() override;
52+ bool isRunning() const override;
5153 bool isSingleShot() const override;
5254 void setSingleShot(bool value) override;
5355private:
5456 int m_interval;
5557 bool m_singleShot;
58+ bool m_isRunning;
5659 qint64 m_nextTimeoutTime;
5760};
5861
@@ -85,6 +88,8 @@ private Q_SLOTS:
8588 void tapWhileTouching();
8689 void multipleHomeKeys();
8790
91+ void repeatedSuperPress();
92+
8893private:
8994 void passTime(qint64 timeSpanMs);
9095
@@ -258,12 +263,49 @@ void WindowInputMonitorTest::multipleHomeKeys()
258263 QCOMPARE(activatedSpy.count(), 1);
259264}
260265
266+// regression test for lp:1607427
267+void WindowInputMonitorTest::repeatedSuperPress()
268+{
269+ WindowInputMonitor homeKeyWatcher(m_fakeTimerFactory->create(), new FakeElapsedTimer);
270+ QSignalSpy activatedSpy(&homeKeyWatcher, &WindowInputMonitor::homeKeyActivated);
271+ QVERIFY(activatedSpy.isValid());
272+
273+ // 1st try
274+ passTime(1000);
275+ {
276+ QKeyEvent keyEvent(QEvent::KeyPress, Qt::Key_Super_L, Qt::NoModifier);
277+ homeKeyWatcher.update(&keyEvent);
278+ }
279+ passTime(50);
280+ {
281+ QKeyEvent keyEvent(QEvent::KeyRelease, Qt::Key_Super_L, Qt::NoModifier);
282+ homeKeyWatcher.update(&keyEvent);
283+ }
284+ passTime(1000);
285+ QCOMPARE(activatedSpy.count(), 1);
286+
287+ // 2nd try
288+ activatedSpy.clear();
289+ {
290+ QKeyEvent keyEvent(QEvent::KeyPress, Qt::Key_Super_L, Qt::NoModifier);
291+ homeKeyWatcher.update(&keyEvent);
292+ }
293+ passTime(50);
294+ {
295+ QKeyEvent keyEvent(QEvent::KeyRelease, Qt::Key_Super_L, Qt::NoModifier);
296+ homeKeyWatcher.update(&keyEvent);
297+ }
298+ passTime(1000);
299+ QCOMPARE(activatedSpy.count(), 1);
300+}
301+
261302/////////////////////////////////// FakeTimer //////////////////////////////////
262303
263304FakeTimer::FakeTimer(QObject *parent)
264305 : UnityUtil::AbstractTimer(parent)
265306 , m_interval(0)
266307 , m_singleShot(true)
308+ , m_isRunning(false)
267309{
268310}
269311
@@ -285,10 +327,20 @@ void FakeTimer::update()
285327
286328void FakeTimer::start()
287329{
288− AbstractTimer::start();
330+ m_isRunning = true;
289331 m_nextTimeoutTime = FakeElapsedTimer::msecsSinceEpoch + (qint64)interval();
290332}
291333
334+void FakeTimer::stop()
335+{
336+ m_isRunning = false;
337+}
338+
339+bool FakeTimer::isRunning() const
340+{
341+ return m_isRunning;
342+}
343+
292344int FakeTimer::interval() const
293345{
294346 return m_interval;