diff options
Diffstat (limited to 'src/plugins/platforms/android/qandroidplatformwindow.cpp')
-rw-r--r-- | src/plugins/platforms/android/qandroidplatformwindow.cpp | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/src/plugins/platforms/android/qandroidplatformwindow.cpp b/src/plugins/platforms/android/qandroidplatformwindow.cpp new file mode 100644 index 0000000000..7c2dfd6bac --- /dev/null +++ b/src/plugins/platforms/android/qandroidplatformwindow.cpp @@ -0,0 +1,157 @@ +/**************************************************************************** +** +** Copyright (C) 2014 BogDan Vatra <bogdan@kde.org> +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** 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$ +** +****************************************************************************/ + +#include "qandroidplatformwindow.h" +#include "qandroidplatformopenglcontext.h" +#include "qandroidplatformscreen.h" + +#include "androidjnimain.h" +#include <qpa/qwindowsysteminterface.h> + +QT_BEGIN_NAMESPACE + +QAndroidPlatformWindow::QAndroidPlatformWindow(QWindow *window) + : QPlatformWindow(window) +{ + m_windowFlags = Qt::Widget; + m_windowState = Qt::WindowNoState; + static QAtomicInt winIdGenerator(1); + m_windowId = winIdGenerator.fetchAndAddRelaxed(1); + setWindowState(window->windowState()); +} + +void QAndroidPlatformWindow::lower() +{ + platformScreen()->lower(this); +} + +void QAndroidPlatformWindow::raise() +{ + updateStatusBarVisibility(); + platformScreen()->raise(this); +} + +void QAndroidPlatformWindow::setGeometry(const QRect &rect) +{ + QWindowSystemInterface::handleGeometryChange(window(), rect); + QPlatformWindow::setGeometry(rect); +} + +void QAndroidPlatformWindow::setVisible(bool visible) +{ + if (visible) + updateStatusBarVisibility(); + + if (visible) { + if (m_windowState & Qt::WindowFullScreen) + setGeometry(platformScreen()->geometry()); + else if (m_windowState & Qt::WindowMaximized) + setGeometry(platformScreen()->availableGeometry()); + } + + QPlatformWindow::setVisible(visible); + + if (visible) + platformScreen()->addWindow(this); + else + platformScreen()->removeWindow(this); + + // The Android Activity is activated before Qt is initialized, causing the application state to + // never be set to 'active'. We explicitly set this state when the first window becomes visible. + if (visible) + QtAndroid::setApplicationActive(); +} + +void QAndroidPlatformWindow::setWindowState(Qt::WindowState state) +{ + if (m_windowState == state) + return; + + QPlatformWindow::setWindowState(state); + m_windowState = state; + + if (window()->isVisible()) + updateStatusBarVisibility(); +} + +void QAndroidPlatformWindow::setWindowFlags(Qt::WindowFlags flags) +{ + if (m_windowFlags == flags) + return; + + m_windowFlags = flags; +} + +Qt::WindowFlags QAndroidPlatformWindow::windowFlags() const +{ + return m_windowFlags; +} + +QAndroidPlatformScreen *QAndroidPlatformWindow::platformScreen() const +{ + return static_cast<QAndroidPlatformScreen *>(window()->screen()->handle()); +} + +void QAndroidPlatformWindow::propagateSizeHints() +{ + //shut up warning from default implementation +} + +void QAndroidPlatformWindow::requestActivateWindow() +{ + platformScreen()->topWindowChanged(window()); +} + +void QAndroidPlatformWindow::updateStatusBarVisibility() +{ + Qt::WindowFlags flags = window()->flags(); + bool isNonRegularWindow = flags & (Qt::Popup | Qt::Dialog | Qt::Sheet) & ~Qt::Window; + if (!isNonRegularWindow) { + if (m_windowState & Qt::WindowFullScreen) + QtAndroid::hideStatusBar(); + else if (m_windowState & Qt::WindowMaximized) + QtAndroid::showStatusBar(); + } +} + + +QT_END_NAMESPACE |