summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/android/qandroideventdispatcher.h
diff options
context:
space:
mode:
authorBogDan Vatra <bogdan@kde.org>2014-07-28 10:41:44 +0300
committerBogDan Vatra <bogdan@kde.org>2014-07-31 19:20:28 +0200
commit734c1268269a71b16829d36179e4a090f76c785e (patch)
tree619f318c2c2479845ca9c4a2cedce4ddd6711b8e /src/plugins/platforms/android/qandroideventdispatcher.h
parent7f9398fd4d23469c77c6a53eac0819f92dfc3928 (diff)
Android: Really suspend apps that are put in the background
The main event loop will be paused when an application is suspended, this is also the normal behavior of any Android application. When an application is suspended on Android all its Gl surfaces are destroyed and can't be used to render anymore. So, we need to pause the main event loop in order to pause all the timers which might trigger drawings. The event loop is resumed immediately after the application is foreground. AndroidManifest.xml contains more info about how to disable this behavior and what might happen if you do it. [ChangeLog][Android][Important Behavior Changes] The main event loop is now stopped when the app is suspended Task-number: QTBUG-36274 Change-Id: I4c0ba5df9d95f348bca67ea5c76865d6d20775e4 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Paul Olav Tvete <paul.tvete@digia.com>
Diffstat (limited to 'src/plugins/platforms/android/qandroideventdispatcher.h')
-rw-r--r--src/plugins/platforms/android/qandroideventdispatcher.h89
1 files changed, 89 insertions, 0 deletions
diff --git a/src/plugins/platforms/android/qandroideventdispatcher.h b/src/plugins/platforms/android/qandroideventdispatcher.h
new file mode 100644
index 0000000000..8d1bcf2122
--- /dev/null
+++ b/src/plugins/platforms/android/qandroideventdispatcher.h
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 BogDan Vatra <bogdan@kde.org>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QANDROIDEVENTDISPATCHER_H
+#define QANDROIDEVENTDISPATCHER_H
+
+#include <QtCore/QMutex>
+#include <QtCore/QSemaphore>
+#include <QtPlatformSupport/private/qunixeventdispatcher_qpa_p.h>
+
+class QAndroidEventDispatcher : public QUnixEventDispatcherQPA
+{
+ Q_OBJECT
+public:
+ explicit QAndroidEventDispatcher(QObject *parent = 0);
+ ~QAndroidEventDispatcher();
+ void start();
+ void stop();
+
+ void goingToStop(bool stop);
+
+protected:
+ int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
+ timespec *timeout);
+
+ bool processEvents(QEventLoop::ProcessEventsFlags flags);
+
+private:
+ QAtomicInt m_stopRequest;
+ QAtomicInt m_goingToStop;
+ QSemaphore m_dispatcherSemaphore, m_stopperSemaphore;
+};
+
+class QAndroidEventDispatcherStopper
+{
+public:
+ static QAndroidEventDispatcherStopper *instance();
+ void startAll();
+ void stopAll();
+ void addEventDispatcher(QAndroidEventDispatcher *dispatcher);
+ void removeEventDispatcher(QAndroidEventDispatcher *dispatcher);
+ void goingToStop(bool stop);
+
+private:
+ QMutex m_mutex;
+ bool started = true;
+ QVector<QAndroidEventDispatcher *> m_dispatchers;
+};
+
+
+#endif // QANDROIDEVENTDISPATCHER_H