on xenial help sign in
alternative patch from Albert
4113c0dLukáš Tinkl
plugins/Utils/Timer.cpp+5−2
@@ -37,13 +37,16 @@ void Timer::setInterval(int msecs)
37void Timer::start()
37void Timer::start()
38{
38{
39 m_timer.start();
39 m_timer.start();
40− AbstractTimer::start();
41}
40}
42
41
43void Timer::stop()
42void Timer::stop()
44{
43{
45 m_timer.stop();
44 m_timer.stop();
46− AbstractTimer::stop();
45+}
46+
47+bool Timer::isRunning() const
48+{
49+ return m_timer.isActive();
47}
50}
48
51
49bool Timer::isSingleShot() const
52bool Timer::isSingleShot() const
plugins/Utils/Timer.h+5−6
@@ -30,18 +30,16 @@ class AbstractTimer : public QObject
30{
30{
31 Q_OBJECT
31 Q_OBJECT
32public:
32public:
33− AbstractTimer(QObject *parent) : QObject(parent), m_isRunning(false) {}
33+ AbstractTimer(QObject *parent) : QObject(parent) {}
34 virtual int interval() const = 0;
34 virtual int interval() const = 0;
35 virtual void setInterval(int msecs) = 0;
35 virtual void setInterval(int msecs) = 0;
36− virtual void start() { m_isRunning = true; }
36+ virtual void start() = 0;
37− virtual void stop() { m_isRunning = false; }
37+ virtual void stop() = 0;
38− bool isRunning() const { return m_isRunning; }
38+ virtual bool isRunning() const = 0;
39 virtual bool isSingleShot() const = 0;
39 virtual bool isSingleShot() const = 0;
40 virtual void setSingleShot(bool value) = 0;
40 virtual void setSingleShot(bool value) = 0;
41Q_SIGNALS:
41Q_SIGNALS:
42 void timeout();
42 void timeout();
43−private:
44− bool m_isRunning;
45};
43};
46
44
47/** A QTimer wrapper */
45/** A QTimer wrapper */
@@ -55,6 +53,7 @@ public:
55 void setInterval(int msecs) override;
53 void setInterval(int msecs) override;
56 void start() override;
54 void start() override;
57 void stop() override;
55 void stop() override;
56+ bool isRunning() const override;
58 bool isSingleShot() const override;
57 bool isSingleShot() const override;
59 void setSingleShot(bool value) override;
58 void setSingleShot(bool value) override;
60private:
59private:
tests/plugins/Utils/WindowInputMonitorTest.cpp+53−1
@@ -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;
53private:
55private:
54 int m_interval;
56 int m_interval;
55 bool m_singleShot;
57 bool m_singleShot;
58+ bool m_isRunning;
56 qint64 m_nextTimeoutTime;
59 qint64 m_nextTimeoutTime;
57};
60};
58
61
@@ -85,6 +88,8 @@ private Q_SLOTS:
85 void tapWhileTouching();
88 void tapWhileTouching();
86 void multipleHomeKeys();
89 void multipleHomeKeys();
87
90
91+ void repeatedSuperPress();
92+
88private:
93private:
89 void passTime(qint64 timeSpanMs);
94 void passTime(qint64 timeSpanMs);
90
95
@@ -258,12 +263,49 @@ void WindowInputMonitorTest::multipleHomeKeys()
258 QCOMPARE(activatedSpy.count(), 1);
263 QCOMPARE(activatedSpy.count(), 1);
259}
264}
260
265
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+
261/////////////////////////////////// FakeTimer //////////////////////////////////
302/////////////////////////////////// FakeTimer //////////////////////////////////
262
303
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)
267{
309{
268}
310}
269
311
@@ -285,10 +327,20 @@ void FakeTimer::update()
285
327
286void FakeTimer::start()
328void FakeTimer::start()
287{
329{
288− AbstractTimer::start();
330+ m_isRunning = true;
289 m_nextTimeoutTime = FakeElapsedTimer::msecsSinceEpoch + (qint64)interval();
331 m_nextTimeoutTime = FakeElapsedTimer::msecsSinceEpoch + (qint64)interval();
290}
332}
291
333
334+void FakeTimer::stop()
335+{
336+ m_isRunning = false;
337+}
338+
339+bool FakeTimer::isRunning() const
340+{
341+ return m_isRunning;
342+}
343+
292int FakeTimer::interval() const
344int FakeTimer::interval() const
293{
345{
294 return m_interval;
346 return m_interval;