iOS: copy brute-force port of Qt4 uikit plugin into Qt5.

The plugin has been renamed from uikit to ios.
Other than that, the plugin will now build, but do nothing. Most of
the Qt4 code is preserved, with a rough translation
into the Qt5 qpa API. A lot of code has simply been commented
out so far, and most lacking at the moment is the event dispatcher
which will need to be rewritten, and the opengl paint device
implementation. But it should suffice as a starting ground.

Also: The plugin will currently not automatically build when
building Qt, this needs to be enabled from configure first.

Change-Id: I0d229a453a8477618e06554655bffc5505203b44
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
This commit is contained in:
Richard Moe Gustavsen 2012-10-30 14:55:46 +01:00 committed by Tor Arne Vestbø
parent 6382105f3d
commit 8cbdb25ee6
14 changed files with 1601 additions and 0 deletions

View File

@ -0,0 +1,3 @@
{
"Keys": [ "ios" ]
}

View File

@ -0,0 +1,27 @@
TARGET = qios
include(../../qpluginbase.pri)
QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/platforms
QT += opengl
QT += core-private gui-private platformsupport-private opengl-private widgets-private
LIBS += -framework Cocoa -framework UIKit
OBJECTIVE_SOURCES = main.mm \
qiosintegration.mm \
qioswindow.mm \
qiosscreen.mm \
qioseventdispatcher.mm \
qiosbackingstore.mm
OBJECTIVE_HEADERS = qiosintegration.h \
qioswindow.h \
qiosscreen.h \
qioseventdispatcher.h \
qiosbackingstore.h
#HEADERS = qiossoftwareinputhandler.h
#include(../fontdatabases/coretext/coretext.pri)
target.path += $$[QT_INSTALL_PLUGINS]/platforms
INSTALLS += target

View File

@ -0,0 +1,69 @@
/****************************************************************************
**
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/
**
** This file is part of the plugins of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** 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, Nokia gives you certain additional
** rights. These rights are described in the Nokia 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.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <qpa/qplatformintegrationplugin.h>
#include <qpa/qplatformthemeplugin.h>
#include "qiosintegration.h"
QT_BEGIN_NAMESPACE
class QIOSIntegrationPlugin : public QPlatformIntegrationPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.1" FILE "ios.json")
public:
QPlatformIntegration *create(const QString&, const QStringList&);
};
QPlatformIntegration * QIOSIntegrationPlugin::create(const QString& system, const QStringList& paramList)
{
Q_UNUSED(paramList);
if (system.toLower() == "ios")
return new QIOSIntegration;
return 0;
}
QT_END_NAMESPACE
#include "main.moc"

View File

@ -0,0 +1,65 @@
/****************************************************************************
**
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/
**
** This file is part of the plugins of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** 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, Nokia gives you certain additional
** rights. These rights are described in the Nokia 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.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QIOSBACKINGSTORE_H
#define QIOSBACKINGSTORE_H
#include <qpa/qplatformintegration.h>
#include <qpa/qplatformbackingstore.h>
QT_BEGIN_NAMESPACE
class QIOSBackingStore : public QPlatformBackingStore
{
public:
QIOSBackingStore(QWindow *window);
QPaintDevice *paintDevice();
void flush(QWindow *window, const QRegion &region, const QPoint &offset);
void resize(const QSize &size, const QRegion &staticContents);
private:
QPaintDevice *mPaintDevice;
};
QT_END_NAMESPACE
#endif // QIOSBACKINGSTORE_H

View File

@ -0,0 +1,139 @@
/****************************************************************************
**
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/
**
** This file is part of the plugins of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** 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, Nokia gives you certain additional
** rights. These rights are described in the Nokia 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.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "qiosbackingstore.h"
#include "qioswindow.h"
#include <QtOpenGL/private/qgl_p.h>
#include <QtOpenGL/private/qglpaintdevice_p.h>
#include <QtDebug>
class EAGLPaintDevice;
@interface PaintDeviceHelper : NSObject {
EAGLPaintDevice *device;
}
@property (nonatomic, assign) EAGLPaintDevice *device;
- (void)eaglView:(EAGLView *)view usesFramebuffer:(GLuint)buffer;
@end
class EAGLPaintDevice : public QGLPaintDevice
{
public:
EAGLPaintDevice(QWindow *window)
:QGLPaintDevice(), mWindow(window)
{
#if defined(QT_OPENGL_ES_2)
helper = [[PaintDeviceHelper alloc] init];
helper.device = this;
EAGLView *view = static_cast<QIOSWindow *>(window->handle())->nativeView();
view.delegate = helper;
m_thisFBO = view.fbo;
#endif
}
~EAGLPaintDevice()
{
#if defined(QT_OPENGL_ES_2)
[helper release];
#endif
}
void setFramebuffer(GLuint buffer) { m_thisFBO = buffer; }
int devType() const { return QInternal::OpenGL; }
QSize size() const { return mWindow->geometry().size(); }
QGLContext* context() const {
// Todo: siplify this:
return QGLContext::fromOpenGLContext(
static_cast<QIOSWindow *>(mWindow->handle())->glContext()->context());
}
QPaintEngine *paintEngine() const { return qt_qgl_paint_engine(); }
private:
QWindow *mWindow;
PaintDeviceHelper *helper;
};
@implementation PaintDeviceHelper
@synthesize device;
- (void)eaglView:(EAGLView *)view usesFramebuffer:(GLuint)buffer
{
Q_UNUSED(view)
if (device)
device->setFramebuffer(buffer);
}
@end
QT_BEGIN_NAMESPACE
QIOSBackingStore::QIOSBackingStore(QWindow *window)
: QPlatformBackingStore(window), mPaintDevice(new EAGLPaintDevice(window))
{
}
QPaintDevice *QIOSBackingStore::paintDevice()
{
return mPaintDevice;
}
void QIOSBackingStore::flush(QWindow *window, const QRegion &region, const QPoint &offset)
{
Q_UNUSED(region);
Q_UNUSED(offset);
qDebug() << __FUNCTION__ << "not implemented";
//static_cast<QIOSWindow *>(window->handle())->glContext()->swapBuffers();
}
void QIOSBackingStore::resize(const QSize &size, const QRegion &staticContents)
{
Q_UNUSED(size);
Q_UNUSED(staticContents);
qDebug() << __FUNCTION__ << "not implemented";
}
QT_END_NAMESPACE

View File

@ -0,0 +1,110 @@
/****************************************************************************
**
** Copyright (C) 2012 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$
**
****************************************************************************/
/****************************************************************************
**
** Copyright (c) 2007-2008, Apple, Inc.
**
** All rights reserved.
**
** Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are met:
**
** * Redistributions of source code must retain the above copyright notice,
** this list of conditions and the following disclaimer.
**
** * Redistributions in binary form must reproduce the above copyright notice,
** this list of conditions and the following disclaimer in the documentation
** and/or other materials provided with the distribution.
**
** * Neither the name of Apple, Inc. nor the names of its contributors
** may be used to endorse or promote products derived from this software
** without specific prior written permission.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
** PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
** LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
** NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
**
****************************************************************************/
#ifndef QEVENTDISPATCHER_IOS_P_H
#define QEVENTDISPATCHER_IOS_P_H
#include <QtCore/qabstracteventdispatcher.h>
QT_BEGIN_NAMESPACE
class QIOSEventDispatcher : public QAbstractEventDispatcher
{
Q_OBJECT
public:
explicit QIOSEventDispatcher(QObject *parent = 0); ~QIOSEventDispatcher();
bool processEvents(QEventLoop::ProcessEventsFlags flags);
bool hasPendingEvents();
void registerSocketNotifier(QSocketNotifier *notifier);
void unregisterSocketNotifier(QSocketNotifier *notifier);
void registerTimer(int timerId, int interval, Qt::TimerType timerType, QObject *object);
bool unregisterTimer(int timerId);
bool unregisterTimers(QObject *object);
QList<QAbstractEventDispatcher::TimerInfo> registeredTimers(QObject *object) const;
int remainingTime(int timerId);
void wakeUp();
void interrupt();
void flush();
};
QT_END_NAMESPACE
#endif // QEVENTDISPATCHER_IOS_P_H

View File

@ -0,0 +1,154 @@
/****************************************************************************
**
** Copyright (C) 2012 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$
**
****************************************************************************/
/****************************************************************************
**
** Copyright (c) 2007-2008, Apple, Inc.
**
** All rights reserved.
**
** Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are met:
**
** * Redistributions of source code must retain the above copyright notice,
** this list of conditions and the following disclaimer.
**
** * Redistributions in binary form must reproduce the above copyright notice,
** this list of conditions and the following disclaimer in the documentation
** and/or other materials provided with the distribution.
**
** * Neither the name of Apple, Inc. nor the names of its contributors
** may be used to endorse or promote products derived from this software
** without specific prior written permission.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
** PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
** LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
** NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
**
****************************************************************************/
#include "qioseventdispatcher.h"
#include <qdebug.h>
QT_BEGIN_NAMESPACE
QT_USE_NAMESPACE
QIOSEventDispatcher::QIOSEventDispatcher(QObject *parent)
{
Q_UNUSED(parent);
qDebug() << __FUNCTION__ << "eventdispatcher not implemented";
}
QIOSEventDispatcher::~QIOSEventDispatcher()
{}
bool QIOSEventDispatcher::processEvents(QEventLoop::ProcessEventsFlags flags)
{
Q_UNUSED(flags);
return false;
}
bool QIOSEventDispatcher::hasPendingEvents()
{
return false;
}
void QIOSEventDispatcher::registerSocketNotifier(QSocketNotifier *notifier)
{
Q_UNUSED(notifier);
}
void QIOSEventDispatcher::unregisterSocketNotifier(QSocketNotifier *notifier)
{
Q_UNUSED(notifier);
}
void QIOSEventDispatcher::registerTimer(int timerId, int interval, Qt::TimerType timerType, QObject *object)
{
Q_UNUSED(timerId);
Q_UNUSED(interval);
Q_UNUSED(timerType);
Q_UNUSED(object);
}
bool QIOSEventDispatcher::unregisterTimer(int timerId)
{
Q_UNUSED(timerId);
return false;
}
bool QIOSEventDispatcher::unregisterTimers(QObject *object)
{
Q_UNUSED(object);
return false;
}
QList<QAbstractEventDispatcher::TimerInfo> QIOSEventDispatcher::registeredTimers(QObject *object) const
{
Q_UNUSED(object);
return QList<TimerInfo>();
}
int QIOSEventDispatcher::remainingTime(int timerId)
{
Q_UNUSED(timerId);
return 0;
}
void QIOSEventDispatcher::wakeUp()
{}
void QIOSEventDispatcher::interrupt()
{}
void QIOSEventDispatcher::flush()
{}
QT_END_NAMESPACE

View File

@ -0,0 +1,75 @@
/****************************************************************************
**
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/
**
** This file is part of the plugins of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** 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, Nokia gives you certain additional
** rights. These rights are described in the Nokia 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.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QPLATFORMINTEGRATION_UIKIT_H
#define QPLATFORMINTEGRATION_UIKIT_H
#include <qpa/qplatformintegration.h>
QT_BEGIN_NAMESPACE
class QIOSIntegration : public QPlatformIntegration
{
public:
QIOSIntegration();
~QIOSIntegration();
static QIOSIntegration *instance();
QPlatformPixmap *createPlatformPixmap(QPlatformPixmap::PixelType type) const;
QPlatformWindow *createPlatformWindow(QWindow *window) const;
QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const;
QList<QPlatformScreen *> screens() const;
QPlatformFontDatabase *fontDatabase() const;
QAbstractEventDispatcher *guiThreadEventDispatcher() const;
private:
QList<QPlatformScreen *> mScreens;
QPlatformFontDatabase *mFontDb;
};
QT_END_NAMESPACE
#endif

View File

@ -0,0 +1,106 @@
/****************************************************************************
**
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/
**
** This file is part of the plugins of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** 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, Nokia gives you certain additional
** rights. These rights are described in the Nokia 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.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "qiosIntegration.h"
#include "qioswindow.h"
#include "qiosbackingstore.h"
#include "qiosscreen.h"
#include "qioseventdispatcher.h"
#include <QtPlatformSupport/private/qcoretextfontdatabase_p.h>
#include <QtDebug>
QT_BEGIN_NAMESPACE
static QIOSIntegration *m_instance = 0;
QIOSIntegration * QIOSIntegration::instance()
{
return m_instance;
}
QIOSIntegration::QIOSIntegration()
:mFontDb(new QCoreTextFontDatabase)
{
if (!m_instance)
m_instance = this;
mScreens << new QIOSScreen(0);
}
QIOSIntegration::~QIOSIntegration()
{
}
QPlatformPixmap *QIOSIntegration::createPlatformPixmap(QPlatformPixmap::PixelType type) const
{
Q_UNUSED(type);
qDebug() << __FUNCTION__ << "not yet implemented";
return 0;
//return new QRasterPixmapData(type);
}
QPlatformWindow *QIOSIntegration::createPlatformWindow(QWindow *window) const
{
return new QIOSWindow(window);
}
QList<QPlatformScreen *> QIOSIntegration::screens() const
{
return mScreens;
}
QPlatformBackingStore *QIOSIntegration::createPlatformBackingStore(QWindow *window) const
{
return new QIOSBackingStore(window);
}
QAbstractEventDispatcher *QIOSIntegration::guiThreadEventDispatcher() const
{
return new QIOSEventDispatcher();
}
QPlatformFontDatabase * QIOSIntegration::fontDatabase() const
{
return mFontDb;
}
QT_END_NAMESPACE

View File

@ -0,0 +1,76 @@
/****************************************************************************
**
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/
**
** This file is part of the plugins of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** 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, Nokia gives you certain additional
** rights. These rights are described in the Nokia 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.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QIOSSCREEN_H
#define QIOSSCREEN_H
#include <UIKit/UIKit.h>
#include <qpa/qplatformscreen.h>
QT_BEGIN_NAMESPACE
class QIOSScreen : public QPlatformScreen
{
public:
QIOSScreen(int screenIndex);
~QIOSScreen();
QRect geometry() const { return m_geometry; }
int depth() const { return m_depth; }
QImage::Format format() const { return m_format; }
QSizeF physicalSize() const { return m_physicalSize; }
UIScreen *uiScreen() const;
void updateInterfaceOrientation();
private:
QRect m_geometry;
int m_depth;
QImage::Format m_format;
QSize m_physicalSize;
int m_index;
};
QT_END_NAMESPACE
#endif

View File

@ -0,0 +1,120 @@
/****************************************************************************
**
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/
**
** This file is part of the plugins of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** 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, Nokia gives you certain additional
** rights. These rights are described in the Nokia 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.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "qiosscreen.h"
#include "qioswindow.h"
#include <QtGui/QGuiApplication>
#include <QtDebug>
QT_BEGIN_NAMESPACE
QIOSScreen::QIOSScreen(int screenIndex)
: QPlatformScreen(),
m_index(screenIndex)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
CGRect bounds = [uiScreen() bounds];
CGFloat scale = [uiScreen() scale];
updateInterfaceOrientation();
m_format = QImage::Format_ARGB32_Premultiplied;
m_depth = 24;
const qreal inch = 25.4;
qreal unscaledDpi = 160.;
int dragDistance = 12 * scale;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
unscaledDpi = 132.;
dragDistance = 10 * scale;
}
m_physicalSize = QSize(qRound(bounds.size.width * inch / unscaledDpi), qRound(bounds.size.height * inch / unscaledDpi));
//qApp->setStartDragDistance(dragDistance);
/*
QFont font; // system font is helvetica, so that is fine already
font.setPixelSize([UIFont systemFontSize] * scale);
qApp->setFont(font);
*/
[pool release];
}
QIOSScreen::~QIOSScreen()
{
}
UIScreen *QIOSScreen::uiScreen() const
{
return [[UIScreen screens] objectAtIndex:m_index];
}
void QIOSScreen::updateInterfaceOrientation()
{
qDebug() << __FUNCTION__ << "not implemented";
/*
CGRect bounds = [uiScreen() bounds];
CGFloat scale = [uiScreen() scale];
switch ([[UIApplication sharedApplication] statusBarOrientation]) {
case UIInterfaceOrientationPortrait:
case UIInterfaceOrientationPortraitUpsideDown:
m_geometry = QRect(bounds.origin.x * scale, bounds.origin.y * scale,
bounds.size.width * scale, bounds.size.height * scale);;
break;
case UIInterfaceOrientationLandscapeLeft:
case UIInterfaceOrientationLandscapeRight:
m_geometry = QRect(bounds.origin.x * scale, bounds.origin.y * scale,
bounds.size.height * scale, bounds.size.width * scale);
break;
}
foreach (QWidget *widget, qApp->topLevelWidgets()) {
QIOSWindow *platformWindow = static_cast<QIOSWindow *>(widget->platformWindow());
if (platformWindow && platformWindow->platformScreen() == this) {
platformWindow->updateGeometryAndOrientation();
}
}
*/
}
QT_END_NAMESPACE

View File

@ -0,0 +1,73 @@
/****************************************************************************
**
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/
**
** This file is part of the plugins of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** 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, Nokia gives you certain additional
** rights. These rights are described in the Nokia 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.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QIOSSOFTWAREINPUTHANDLER_H
#define QIOSSOFTWAREINPUTHANDLER_H
#include <QtCore/QObject>
#include <QtCore/QPointer>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
class QIOSSoftwareInputHandler : public QObject
{
Q_OBJECT
public:
QIOSSoftwareInputHandler() : mCurrentFocusWidget(0), mCurrentFocusObject(0) {}
bool eventFilter(QObject *obj, QEvent *event);
private slots:
void activeFocusChanged(bool focus);
private:
bool closeSoftwareInputPanel(QWidget *widget);
QPointer<QWidget> mCurrentFocusWidget;
QPointer<QObject> mCurrentFocusObject;
};
QT_END_NAMESPACE
#endif

View File

@ -0,0 +1,135 @@
/****************************************************************************
**
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/
**
** This file is part of the plugins of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** 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, Nokia gives you certain additional
** rights. These rights are described in the Nokia 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.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QIOSWINDOW_H
#define QIOSWINDOW_H
#include <qpa/qplatformwindow.h>
#import <UIKit/UIKit.h>
#import <OpenGLES/ES1/gl.h>
#import <OpenGLES/ES1/glext.h>
#import <OpenGLES/ES2/gl.h>
#import <OpenGLES/ES2/glext.h>
#import <OpenGLES/EAGL.h>
@interface EAGLView : UIView <UIKeyInput>
{
QPlatformWindow *mWindow;
EAGLContext *mContext;
GLint mFramebufferWidth;
GLint mFramebufferHeight;
GLuint mFramebuffer, mColorRenderbuffer, mDepthRenderbuffer;
id delegate;
// ------- Text Input ----------
UITextAutocapitalizationType autocapitalizationType;
UITextAutocorrectionType autocorrectionType;
BOOL enablesReturnKeyAutomatically;
UIKeyboardAppearance keyboardAppearance;
UIKeyboardType keyboardType;
UIReturnKeyType returnKeyType;
BOOL secureTextEntry;
}
- (void)setContext:(EAGLContext *)newContext;
- (void)presentFramebuffer;
- (void)deleteFramebuffer;
- (void)createFramebuffer;
- (void)makeCurrent;
- (void)setWindow:(QPlatformWindow *)window;
- (void)sendMouseEventForTouches:(NSSet *)touches withEvent:(UIEvent *)event fakeButtons:(Qt::MouseButtons)buttons;
@property (readonly,getter=fbo) GLint fbo;
@property (nonatomic, assign) id delegate;
// ------- Text Input ----------
@property(nonatomic) UITextAutocapitalizationType autocapitalizationType;
@property(nonatomic) UITextAutocorrectionType autocorrectionType;
@property(nonatomic) BOOL enablesReturnKeyAutomatically;
@property(nonatomic) UIKeyboardAppearance keyboardAppearance;
@property(nonatomic) UIKeyboardType keyboardType;
@property(nonatomic) UIReturnKeyType returnKeyType;
@property(nonatomic, getter=isSecureTextEntry) BOOL secureTextEntry;
@end
@protocol EAGLViewDelegate
- (void)eaglView:(EAGLView *)view usesFramebuffer:(GLuint)buffer;
@end
class EAGLPlatformContext;
QT_BEGIN_NAMESPACE
class QIOSScreen;
class QIOSWindow : public QPlatformWindow
{
public:
explicit QIOSWindow(QWindow *window);
~QIOSWindow();
UIWindow *nativeWindow() const { return mWindow; }
EAGLView *nativeView() const { return mView; }
void setGeometry(const QRect &rect);
UIWindow *ensureNativeWindow();
QPlatformOpenGLContext *glContext() const;
QIOSScreen *platformScreen() const { return mScreen; }
void updateGeometryAndOrientation();
private:
QIOSScreen *mScreen;
UIWindow *mWindow;
CGRect mFrame;
EAGLView *mView;
mutable EAGLPlatformContext *mContext;
};
QT_END_NAMESPACE
#endif // QIOSWINDOW_H

View File

@ -0,0 +1,449 @@
/****************************************************************************
**
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/
**
** This file is part of the plugins of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** 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, Nokia gives you certain additional
** rights. These rights are described in the Nokia 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.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#import <QuartzCore/CAEAGLLayer.h>
#include "qioswindow.h"
#include "qiosscreen.h"
#include <QtDebug>
#include <QtGui/QKeyEvent>
#include <qpa/qplatformopenglcontext.h>
#include <qpa/qwindowsysteminterface.h>
#include <QtDebug>
static GLint stencilBits()
{
static GLint bits;
static bool initialized = false;
if (!initialized) {
glGetIntegerv(GL_STENCIL_BITS, &bits);
initialized = true;
}
return bits;
}
/*
static GLint depthBits()
{
// we can choose between GL_DEPTH24_STENCIL8_OES and GL_DEPTH_COMPONENT16
return stencilBits() > 0 ? 24 : 16;
}
*/
class EAGLPlatformContext : public QPlatformOpenGLContext
{
public:
EAGLPlatformContext(EAGLView *view)
: mView(view)
{
/*
mFormat.setWindowApi(QPlatformWindowFormat::OpenGL);
mFormat.setDepthBufferSize(depthBits());
mFormat.setAccumBufferSize(0);
mFormat.setRedBufferSize(8);
mFormat.setGreenBufferSize(8);
mFormat.setBlueBufferSize(8);
mFormat.setAlphaBufferSize(8);
mFormat.setStencilBufferSize(stencilBits());
mFormat.setSamples(0);
mFormat.setSampleBuffers(false);
mFormat.setDoubleBuffer(true);
mFormat.setDepth(true);
mFormat.setRgba(true);
mFormat.setAlpha(true);
mFormat.setAccum(false);
mFormat.setStencil(stencilBits() > 0);
mFormat.setStereo(false);
mFormat.setDirectRendering(false);
*/
#if defined(QT_OPENGL_ES_2)
EAGLContext *aContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
#else
EAGLContext *aContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
#endif
[mView setContext:aContext];
}
~EAGLPlatformContext() { }
bool makeCurrent(QPlatformSurface *surface)
{
Q_UNUSED(surface);
qDebug() << __FUNCTION__ << "not implemented";
//QPlatformOpenGLContext::makeCurrent();
//[mView makeCurrent];
return false;
}
void doneCurrent()
{
qDebug() << __FUNCTION__ << "not implemented";
//QPlatformOpenGLContext::doneCurrent();
}
void swapBuffers(QPlatformSurface *surface)
{
Q_UNUSED(surface);
qDebug() << __FUNCTION__ << "not implemented";
//[mView presentFramebuffer];
}
QFunctionPointer getProcAddress(const QByteArray& ) { return 0; }
QSurfaceFormat format() const
{
return mFormat;
}
private:
EAGLView *mView;
QSurfaceFormat mFormat;
};
@implementation EAGLView
@synthesize delegate;
+ (Class)layerClass
{
return [CAEAGLLayer class];
}
- (id)initWithFrame:(CGRect)frame
{
if ((self = [super initWithFrame:frame])) {
CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
eaglLayer.opaque = TRUE;
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], kEAGLDrawablePropertyRetainedBacking,
kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat,
nil];
autocapitalizationType = UITextAutocapitalizationTypeNone;
autocorrectionType = UITextAutocorrectionTypeNo;
enablesReturnKeyAutomatically = NO;
keyboardAppearance = UIKeyboardAppearanceDefault;
keyboardType = UIKeyboardTypeDefault;
returnKeyType = UIReturnKeyDone;
secureTextEntry = NO;
}
return self;
}
- (void)setContext:(EAGLContext *)newContext
{
if (mContext != newContext)
{
[self deleteFramebuffer];
[mContext release];
mContext = [newContext retain];
[EAGLContext setCurrentContext:nil];
}
}
- (void)presentFramebuffer
{
if (mContext) {
[EAGLContext setCurrentContext:mContext];
glBindRenderbuffer(GL_RENDERBUFFER, mColorRenderbuffer);
[mContext presentRenderbuffer:GL_RENDERBUFFER];
}
}
- (void)deleteFramebuffer
{
if (mContext)
{
[EAGLContext setCurrentContext:mContext];
if (mFramebuffer) {
glDeleteFramebuffers(1, &mFramebuffer);
mFramebuffer = 0;
}
if (mColorRenderbuffer) {
glDeleteRenderbuffers(1, &mColorRenderbuffer);
mColorRenderbuffer = 0;
}
if (mDepthRenderbuffer) {
glDeleteRenderbuffers(1, &mDepthRenderbuffer);
mDepthRenderbuffer = 0;
}
}
}
- (void)createFramebuffer
{
if (mContext && !mFramebuffer)
{
[EAGLContext setCurrentContext:mContext];
glGenFramebuffers(1, &mFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
glGenRenderbuffers(1, &mColorRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, mColorRenderbuffer);
[mContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &mFramebufferWidth);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &mFramebufferHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, mColorRenderbuffer);
glGenRenderbuffers(1, &mDepthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, mDepthRenderbuffer);
if (stencilBits() > 0) {
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, mFramebufferWidth, mFramebufferHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mDepthRenderbuffer);
} else {
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, mFramebufferWidth, mFramebufferHeight);
}
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mDepthRenderbuffer);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));
if (delegate && [delegate respondsToSelector:@selector(eaglView:usesFramebuffer:)]) {
[delegate eaglView:self usesFramebuffer:mFramebuffer];
}
}
}
- (void)makeCurrent
{
if (mContext)
{
[EAGLContext setCurrentContext:mContext];
if (!mFramebuffer)
[self createFramebuffer];
glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
glViewport(0, 0, mFramebufferWidth, mFramebufferHeight);
}
}
- (GLint)fbo
{
return mFramebuffer;
}
- (void)setWindow:(QPlatformWindow *)window
{
mWindow = window;
}
- (void)sendMouseEventForTouches:(NSSet *)touches withEvent:(UIEvent *)event fakeButtons:(Qt::MouseButtons)buttons
{
UITouch *touch = [touches anyObject];
CGPoint locationInView = [touch locationInView:self];
CGFloat scaleFactor = [self contentScaleFactor];
QPoint p(locationInView.x * scaleFactor, locationInView.y * scaleFactor);
// TODO handle global touch point? for status bar?
QWindowSystemInterface::handleMouseEvent(mWindow->window(), (ulong)(event.timestamp*1000),
p, p, buttons);
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self sendMouseEventForTouches:touches withEvent:event fakeButtons:Qt::LeftButton];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
[self sendMouseEventForTouches:touches withEvent:event fakeButtons:Qt::LeftButton];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[self sendMouseEventForTouches:touches withEvent:event fakeButtons:Qt::NoButton];
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
[self sendMouseEventForTouches:touches withEvent:event fakeButtons:Qt::NoButton];
}
// ------- Text Input ----------
@synthesize autocapitalizationType;
@synthesize autocorrectionType;
@synthesize enablesReturnKeyAutomatically;
@synthesize keyboardAppearance;
@synthesize keyboardType;
@synthesize returnKeyType;
@synthesize secureTextEntry;
- (BOOL)canBecomeFirstResponder
{
return YES;
}
- (BOOL)hasText
{
return YES;
}
- (void)insertText:(NSString *)text
{
QString string = QString::fromUtf8([text UTF8String]);
int key = 0;
if ([text isEqualToString:@"\n"])
key = (int)Qt::Key_Return;
// Send key event to window system interface
QWindowSystemInterface::handleKeyEvent(
0, QEvent::KeyPress, key, Qt::NoModifier, string, false, int(string.length()));
QWindowSystemInterface::handleKeyEvent(
0, QEvent::KeyRelease, key, Qt::NoModifier, string, false, int(string.length()));
}
- (void)deleteBackward
{
// Send key event to window system interface
QWindowSystemInterface::handleKeyEvent(
0, QEvent::KeyPress, (int)Qt::Key_Backspace, Qt::NoModifier);
QWindowSystemInterface::handleKeyEvent(
0, QEvent::KeyRelease, (int)Qt::Key_Backspace, Qt::NoModifier);
}
@end
QT_BEGIN_NAMESPACE
QIOSWindow::QIOSWindow(QWindow *window) :
QPlatformWindow(window),
mWindow(nil),
mContext(0)
{
mScreen = static_cast<QIOSScreen *>(QPlatformScreen::platformScreenForWindow(window));
mView = [[EAGLView alloc] init];
}
QIOSWindow::~QIOSWindow()
{
delete mContext; mContext = 0;
[mView release];
[mWindow release];
}
void QIOSWindow::setGeometry(const QRect &rect)
{
// Not supported. Only a single "full screen" window is supported
QPlatformWindow::setGeometry(rect);
}
UIWindow *QIOSWindow::ensureNativeWindow()
{
if (!mWindow) {
mWindow = [[UIWindow alloc] init];
updateGeometryAndOrientation();
// window
mWindow.screen = mScreen->uiScreen();
// for some reason setting the screen resets frame.origin, so we need to set the frame afterwards
mWindow.frame = mFrame;
// view
[mView deleteFramebuffer];
mView.frame = CGRectMake(0, 0, mWindow.bounds.size.width, mWindow.bounds.size.height); // fill
[mView setContentScaleFactor:[mWindow.screen scale]];
[mView setMultipleTouchEnabled:YES];
[mView setWindow:this];
[mWindow addSubview:mView];
[mWindow setNeedsDisplay];
[mWindow makeKeyAndVisible];
}
return mWindow;
}
void QIOSWindow::updateGeometryAndOrientation()
{
if (!mWindow)
return;
mFrame = [mScreen->uiScreen() applicationFrame];
CGRect screen = [mScreen->uiScreen() bounds];
QRect geom;
CGFloat angle = 0;
switch ([[UIApplication sharedApplication] statusBarOrientation]) {
case UIInterfaceOrientationPortrait:
geom = QRect(mFrame.origin.x, mFrame.origin.y, mFrame.size.width, mFrame.size.height);
break;
case UIInterfaceOrientationPortraitUpsideDown:
geom = QRect(screen.size.width - mFrame.origin.x - mFrame.size.width,
screen.size.height - mFrame.origin.y - mFrame.size.height,
mFrame.size.width,
mFrame.size.height);
angle = M_PI;
break;
case UIInterfaceOrientationLandscapeLeft:
geom = QRect(screen.size.height - mFrame.origin.y - mFrame.size.height,
mFrame.origin.x,
mFrame.size.height,
mFrame.size.width);
angle = -M_PI/2.;
break;
case UIInterfaceOrientationLandscapeRight:
geom = QRect(mFrame.origin.y,
screen.size.width - mFrame.origin.x - mFrame.size.width,
mFrame.size.height,
mFrame.size.width);
angle = +M_PI/2.;
break;
}
CGFloat scale = [mScreen->uiScreen() scale];
geom = QRect(geom.x() * scale, geom.y() * scale,
geom.width() * scale, geom.height() * scale);
if (angle != 0) {
[mView layer].transform = CATransform3DMakeRotation(angle, 0, 0, 1.);
} else {
[mView layer].transform = CATransform3DIdentity;
}
[mView setNeedsDisplay];
window()->setGeometry(geom);
}
QPlatformOpenGLContext *QIOSWindow::glContext() const
{
if (!mContext) {
mContext = new EAGLPlatformContext(mView);
}
return mContext;
}
QT_END_NAMESPACE