From bf3dde61cc7d611b1e5f2a18e533c535c4cd7ff8 Mon Sep 17 00:00:00 2001 From: Kevin Ottens Date: Mon, 30 Apr 2012 17:20:24 +0200 Subject: Pause/resume sensor on application (de)activation Each sensor now installs itself as an event filter of the application object waiting to (de)activation events. When an ApplicationDeactivate event arrives sensors are paused, they get resumed on ApplicationActivate. This behavior is inhibited by the alwaysOn property. Change-Id: I559239f279d9412d8836efad08e6688019504b16 Reviewed-by: Thomas McGuire Reviewed-by: Tennessee Carmel-Veilleux Reviewed-by: Lincoln Ramsay --- src/plugins/sensors/blackberry/bbsensorbackend.cpp | 40 ++++++++++++++++++++++ src/plugins/sensors/blackberry/bbsensorbackend.h | 3 ++ src/plugins/sensors/blackberry/blackberry.pro | 2 +- 3 files changed, 44 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/plugins/sensors/blackberry/bbsensorbackend.cpp b/src/plugins/sensors/blackberry/bbsensorbackend.cpp index d39f6e4a..7a8a2933 100644 --- a/src/plugins/sensors/blackberry/bbsensorbackend.cpp +++ b/src/plugins/sensors/blackberry/bbsensorbackend.cpp @@ -41,6 +41,7 @@ #include "bbsensorbackend.h" #include +#include #include static const int microSecondsPerSecond = 1000 * 1000; @@ -59,6 +60,7 @@ BbSensorBackendBase::BbSensorBackendBase(const QString &devicePath, sensor_type_ QSensor *sensor) : QSensorBackend(sensor), m_deviceFile(devicePath), m_sensorType(sensorType) { + QCoreApplication::instance()->installEventFilter(this); connect(sensor, SIGNAL(alwaysOnChanged()), this, SLOT(applyAlwaysOnProperty())); } @@ -114,6 +116,25 @@ qreal BbSensorBackendBase::convertValue(float bbValue) return bbValue; } +bool BbSensorBackendBase::eventFilter(QObject *object, QEvent *event) +{ + if (object == QCoreApplication::instance()) { + switch (event->type()) { + case QEvent::ApplicationActivate: + setPaused(false); + break; + case QEvent::ApplicationDeactivate: + if (!sensor()->isAlwaysOn()) + setPaused(true); + break; + default: + break; + } + } + + return QSensorBackend::eventFilter(object, event); +} + void BbSensorBackendBase::start() { if (!m_deviceFile.open(QFile::ReadOnly | QFile::Unbuffered)) { @@ -190,4 +211,23 @@ void BbSensorBackendBase::applyAlwaysOnProperty() perror(QString::fromLatin1("Setting sensor always on for %1 failed") .arg(m_deviceFile.fileName()).toLocal8Bit()); } + + // We might need to pause now + setPaused(QGuiApplication::focusWindow() == 0 && !sensor()->isAlwaysOn()); +} + +void BbSensorBackendBase::setPaused(bool paused) +{ + if (!m_deviceFile.isOpen()) + return; + + sensor_devctl_enable_u enableState; + enableState.tx.enable = paused ? 0 : 1; + + const int result = devctl(m_deviceFile.handle(), DCMD_SENSOR_ENABLE, &enableState, sizeof(enableState), NULL); + if (result != EOK) { + perror(QString::fromLatin1("Setting sensor enabled (%1) for %2 failed") + .arg(paused) + .arg(m_deviceFile.fileName()).toLocal8Bit()); + } } diff --git a/src/plugins/sensors/blackberry/bbsensorbackend.h b/src/plugins/sensors/blackberry/bbsensorbackend.h index a3afb372..4e4406a4 100644 --- a/src/plugins/sensors/blackberry/bbsensorbackend.h +++ b/src/plugins/sensors/blackberry/bbsensorbackend.h @@ -79,9 +79,12 @@ protected: virtual void processEvent(const sensor_event_t &sensorEvent) = 0; + virtual bool eventFilter(QObject *object, QEvent *event); + private slots: void dataAvailable(); void applyAlwaysOnProperty(); + void setPaused(bool paused); private: QFile m_deviceFile; diff --git a/src/plugins/sensors/blackberry/blackberry.pro b/src/plugins/sensors/blackberry/blackberry.pro index b5c339c4..15c6626d 100644 --- a/src/plugins/sensors/blackberry/blackberry.pro +++ b/src/plugins/sensors/blackberry/blackberry.pro @@ -1,7 +1,7 @@ load(qt_module) TARGET = qtsensors_blackberry -QT = sensors core +QT = sensors core gui DEFINES += QT_NO_CAST_FROM_ASCII QT_NO_CAST_TO_ASCII load(qt_plugin) -- cgit v1.2.3