Merge remote-tracking branch 'origin/5.4' into dev
Conflicts: src/corelib/tools/qbytearray.cpp src/gui/kernel/qplatformsystemtrayicon.cpp src/gui/kernel/qplatformsystemtrayicon.h src/plugins/platforms/xcb/xcb-plugin.pro Change-Id: I00355d3908b678af8a61c38f9e814a63df808c79
This commit is contained in:
commit
aaff94c2df
@ -39,10 +39,11 @@ int main(int, char **)
|
||||
{
|
||||
GMainContext *context;
|
||||
GSource *source;
|
||||
GPollFD *pollfd;
|
||||
GPollFD *pollfd = NULL;
|
||||
if (!g_thread_supported())
|
||||
g_thread_init(NULL);
|
||||
context = g_main_context_default();
|
||||
(void)context;
|
||||
source = g_source_new(0, 0);
|
||||
g_source_add_poll(source, pollfd);
|
||||
return 0;
|
||||
|
@ -91,15 +91,15 @@ bool MySortFilterProxyModel::lessThan(const QModelIndex &left,
|
||||
if (leftData.type() == QVariant::DateTime) {
|
||||
return leftData.toDateTime() < rightData.toDateTime();
|
||||
} else {
|
||||
QRegExp *emailPattern = new QRegExp("([\\w\\.]*@[\\w\\.]*)");
|
||||
static QRegExp emailPattern("[\\w\\.]*@[\\w\\.]*)");
|
||||
|
||||
QString leftString = leftData.toString();
|
||||
if(left.column() == 1 && emailPattern->indexIn(leftString) != -1)
|
||||
leftString = emailPattern->cap(1);
|
||||
if(left.column() == 1 && emailPattern.indexIn(leftString) != -1)
|
||||
leftString = emailPattern.cap(1);
|
||||
|
||||
QString rightString = rightData.toString();
|
||||
if(right.column() == 1 && emailPattern->indexIn(rightString) != -1)
|
||||
rightString = emailPattern->cap(1);
|
||||
if(right.column() == 1 && emailPattern.indexIn(rightString) != -1)
|
||||
rightString = emailPattern.cap(1);
|
||||
|
||||
return QString::localeAwareCompare(leftString, rightString) < 0;
|
||||
}
|
||||
|
@ -50,9 +50,6 @@ warnings_are_errors:warning_clean {
|
||||
reg_ver = $${QT_CLANG_MAJOR_VERSION}.$${QT_CLANG_MINOR_VERSION}
|
||||
contains(apple_ver, "4\\.[012]|5\\.[01]")|contains(reg_ver, "3\\.[34]") {
|
||||
QMAKE_CXXFLAGS_WARN_ON += -Werror -Wno-error=\\$${LITERAL_HASH}warnings -Wno-error=deprecated-declarations $$WERROR
|
||||
|
||||
# glibc's bswap_XX macros use the "register" keyword
|
||||
linux:equals(reg_ver, "3.4"): QMAKE_CXXFLAGS_WARN_ON += -Wno-error=deprecated-register
|
||||
}
|
||||
} else:intel_icc:linux {
|
||||
# Intel CC 13.0 - 15.0, on Linux only
|
||||
|
@ -917,6 +917,9 @@
|
||||
\row \li c++11 \li C++11 support is enabled. This option has no effect if
|
||||
the compiler does not support C++11.
|
||||
By default, support is disabled.
|
||||
\row \li c++14 \li C++14 support is enabled. This option has no effect if
|
||||
the compiler does not support C++14.
|
||||
By default, support is disabled.
|
||||
\endtable
|
||||
|
||||
When you use the \c debug_and_release option (which is the default under
|
||||
|
@ -221,7 +221,7 @@ function(QT5_ADD_RESOURCES outfiles )
|
||||
# let's make a configured file and add it as a dependency so cmake is run
|
||||
# again when dependencies need to be recomputed.
|
||||
qt5_make_output_file("${infile}" "" "qrc.depends" out_depends)
|
||||
configure_file("${infile}" "${out_depends}" COPY_ONLY)
|
||||
configure_file("${infile}" "${out_depends}" COPYONLY)
|
||||
else()
|
||||
# The .qrc file does not exist (yet). Let's add a dependency and hope
|
||||
# that it will be generated later
|
||||
|
@ -40,10 +40,6 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef __GLIBC__
|
||||
#include <byteswap.h>
|
||||
#endif
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
|
||||
@ -276,18 +272,16 @@ template <> inline qint8 qFromBigEndian<qint8>(const uchar *src)
|
||||
*/
|
||||
template <typename T> T qbswap(T source);
|
||||
|
||||
#ifdef __GLIBC__
|
||||
// GCC 4.3 implemented all the intrinsics, but the 16-bit one only got implemented in 4.8;
|
||||
// Clang 2.6 implemented the 32- and 64-bit but waited until 3.2 to implement the 16-bit one
|
||||
#if (defined(Q_CC_GNU) && Q_CC_GNU >= 403) || (defined(Q_CC_CLANG) && Q_CC_CLANG >= 206)
|
||||
template <> inline quint64 qbswap<quint64>(quint64 source)
|
||||
{
|
||||
return bswap_64(source);
|
||||
return __builtin_bswap64(source);
|
||||
}
|
||||
template <> inline quint32 qbswap<quint32>(quint32 source)
|
||||
{
|
||||
return bswap_32(source);
|
||||
}
|
||||
template <> inline quint16 qbswap<quint16>(quint16 source)
|
||||
{
|
||||
return bswap_16(source);
|
||||
return __builtin_bswap32(source);
|
||||
}
|
||||
#else
|
||||
template <> inline quint64 qbswap<quint64>(quint64 source)
|
||||
@ -311,14 +305,20 @@ template <> inline quint32 qbswap<quint32>(quint32 source)
|
||||
| ((source & 0x00ff0000) >> 8)
|
||||
| ((source & 0xff000000) >> 24);
|
||||
}
|
||||
|
||||
#endif // GCC & Clang intrinsics
|
||||
#if (defined(Q_CC_GNU) && Q_CC_GNU >= 408) || (defined(Q_CC_CLANG) && Q_CC_CLANG >= 302)
|
||||
template <> inline quint16 qbswap<quint16>(quint16 source)
|
||||
{
|
||||
return __builtin_bswap16(source);
|
||||
}
|
||||
#else
|
||||
template <> inline quint16 qbswap<quint16>(quint16 source)
|
||||
{
|
||||
return quint16( 0
|
||||
| ((source & 0x00ff) << 8)
|
||||
| ((source & 0xff00) >> 8) );
|
||||
}
|
||||
#endif // __GLIBC__
|
||||
#endif // GCC & Clang intrinsics
|
||||
|
||||
// signed specializations
|
||||
template <> inline qint64 qbswap<qint64>(qint64 source)
|
||||
|
@ -72,20 +72,17 @@
|
||||
# include "private/qcore_unix_p.h"
|
||||
#endif
|
||||
|
||||
#if !defined QT_NO_REGULAREXPRESSION && !defined(QT_BOOTSTRAPPED)
|
||||
#ifdef __has_include
|
||||
#if __has_include(<cxxabi.h>) && __has_include(<execinfo.h>)
|
||||
#define QLOGGING_HAVE_BACKTRACE
|
||||
#endif
|
||||
#elif defined(__GLIBCXX__) && defined(__GLIBC__) // (because older version of gcc don't have __has_include)
|
||||
#define QLOGGING_HAVE_BACKTRACE
|
||||
#ifndef __has_include
|
||||
# define __has_include(x) 0
|
||||
#endif
|
||||
|
||||
#ifdef QLOGGING_HAVE_BACKTRACE
|
||||
#include <qregularexpression.h>
|
||||
#include <cxxabi.h>
|
||||
#include <execinfo.h>
|
||||
#endif
|
||||
#if !defined QT_NO_REGULAREXPRESSION && !defined(QT_BOOTSTRAPPED)
|
||||
# if (defined(__GLIBC__) && defined(__GLIBCXX__)) || (__has_include(<cxxabi.h>) && __has_include(<execinfo.h>))
|
||||
# define QLOGGING_HAVE_BACKTRACE
|
||||
# include <qregularexpression.h>
|
||||
# include <cxxabi.h>
|
||||
# include <execinfo.h>
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
|
@ -1004,7 +1004,7 @@ QByteArray QIODevice::readAll()
|
||||
} else {
|
||||
// Read it all in one go.
|
||||
// If resize fails, don't read anything.
|
||||
if (readBytes + theSize - d->pos > INT_MAX)
|
||||
if (quint64(readBytes + theSize - d->pos) > QByteArray::MaxSize)
|
||||
return QByteArray();
|
||||
result.resize(int(readBytes + theSize - d->pos));
|
||||
readBytes += read(result.data() + readBytes, result.size() - readBytes);
|
||||
|
@ -52,17 +52,18 @@
|
||||
|
||||
#if defined(Q_OS_BSD4)
|
||||
# include <sys/mount.h>
|
||||
# include <sys/statvfs.h>
|
||||
#elif defined(Q_OS_ANDROID)
|
||||
# include <sys/mount.h>
|
||||
# include <sys/vfs.h>
|
||||
# include <mntent.h>
|
||||
#elif defined(Q_OS_QNX)
|
||||
# include <sys/statvfs.h>
|
||||
#elif defined(Q_OS_LINUX)
|
||||
# include <mntent.h>
|
||||
# include <sys/statvfs.h>
|
||||
#elif defined(Q_OS_SOLARIS)
|
||||
# include <sys/mnttab.h>
|
||||
#else
|
||||
# include <sys/statvfs.h>
|
||||
#endif
|
||||
|
||||
#if defined(Q_OS_BSD4)
|
||||
@ -118,7 +119,7 @@ public:
|
||||
inline QByteArray device() const;
|
||||
private:
|
||||
#if defined(Q_OS_BSD4)
|
||||
statfs *stat_buf;
|
||||
struct statfs *stat_buf;
|
||||
int entryCount;
|
||||
int currentIndex;
|
||||
#elif defined(Q_OS_SOLARIS)
|
||||
|
@ -653,7 +653,7 @@ private:
|
||||
static bool registerDebugStreamOperatorFunction(const QtPrivate::AbstractDebugStreamFunction *f, int type);
|
||||
#endif
|
||||
|
||||
#ifndef Q_NO_TEMPLATE_FRIENDS
|
||||
#if !defined(Q_NO_TEMPLATE_FRIENDS) && !defined(Q_CC_MSVC)
|
||||
#ifndef Q_QDOC
|
||||
template<typename T>
|
||||
friend bool qRegisterSequentialConverter();
|
||||
|
@ -450,7 +450,8 @@ int QThread::idealThreadCount() Q_DECL_NOTHROW
|
||||
// the rest: Linux, Solaris, AIX, Tru64
|
||||
cores = (int)sysconf(_SC_NPROCESSORS_ONLN);
|
||||
#endif
|
||||
|
||||
if (cores == -1)
|
||||
return 1;
|
||||
return cores;
|
||||
}
|
||||
|
||||
|
@ -123,7 +123,7 @@ int qFindByteArray(
|
||||
int qAllocMore(int alloc, int extra) Q_DECL_NOTHROW
|
||||
{
|
||||
Q_ASSERT(alloc >= 0 && extra >= 0);
|
||||
Q_ASSERT_X(alloc <= MaxAllocSize - extra, "qAllocMore", "Requested size is too large!");
|
||||
Q_ASSERT_X(uint(alloc) < QByteArray::MaxSize, "qAllocMore", "Requested size is too large!");
|
||||
|
||||
unsigned nalloc = qNextPowerOfTwo(alloc + extra);
|
||||
|
||||
@ -836,6 +836,15 @@ static inline char qToLower(char c)
|
||||
\sa QString, QBitArray
|
||||
*/
|
||||
|
||||
/*!
|
||||
\variable QByteArray::MaxSize
|
||||
\internal
|
||||
\since 5.4
|
||||
|
||||
The maximum size of a QByteArray, in bytes. Also applies to a the maximum
|
||||
storage size of QString and QVector, though not the number of elements.
|
||||
*/
|
||||
|
||||
/*!
|
||||
\enum QByteArray::Base64Option
|
||||
\since 5.2
|
||||
|
@ -173,6 +173,9 @@ private:
|
||||
typedef QTypedArrayData<char> Data;
|
||||
|
||||
public:
|
||||
// undocumented:
|
||||
static const quint64 MaxSize = (1 << 30) - sizeof(Data);
|
||||
|
||||
enum Base64Option {
|
||||
Base64Encoding = 0,
|
||||
Base64UrlEncoding = 1,
|
||||
|
@ -37,10 +37,6 @@
|
||||
#include "qelapsedtimer.h"
|
||||
#if defined(Q_OS_VXWORKS)
|
||||
#include "qfunctions_vxworks.h"
|
||||
#elif defined(Q_OS_QNX)
|
||||
#include <sys/neutrino.h>
|
||||
#include <sys/syspage.h>
|
||||
#include <inttypes.h>
|
||||
#else
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
@ -88,18 +84,7 @@ QT_BEGIN_NAMESPACE
|
||||
* see http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html
|
||||
*/
|
||||
|
||||
#if defined(Q_OS_QNX)
|
||||
static inline void qt_clock_gettime(clockid_t clock, struct timespec *ts)
|
||||
{
|
||||
// The standard POSIX clock calls only have 1ms accuracy on QNX. To get
|
||||
// higher accuracy, this platform-specific function must be used instead
|
||||
quint64 cycles_per_sec = SYSPAGE_ENTRY(qtime)->cycles_per_sec;
|
||||
quint64 cycles = ClockCycles();
|
||||
ts->tv_sec = cycles / cycles_per_sec;
|
||||
quint64 mod = cycles % cycles_per_sec;
|
||||
ts->tv_nsec = mod * Q_INT64_C(1000000000) / cycles_per_sec;
|
||||
}
|
||||
#elif !defined(CLOCK_REALTIME)
|
||||
#if !defined(CLOCK_REALTIME)
|
||||
# define CLOCK_REALTIME 0
|
||||
static inline void qt_clock_gettime(int, struct timespec *ts)
|
||||
{
|
||||
|
@ -29,7 +29,7 @@
|
||||
\module QtDBus
|
||||
\title Qt D-Bus C++ Classes
|
||||
\brief The Qt D-Bus module is a Unix-only library that you can use
|
||||
to perform Inter-Process Communication using the \l{D-Bus} protocol.
|
||||
to perform Inter-Process Communication using the \l{Qt D-Bus}{D-Bus} protocol.
|
||||
|
||||
\ingroup modules
|
||||
\qtvariable dbus
|
||||
@ -61,6 +61,6 @@
|
||||
directory. When installing Qt from source, this module is built when Qt's
|
||||
tools are built.
|
||||
|
||||
See the \l {D-Bus} page for detailed information on
|
||||
See the \l {Qt D-Bus}{D-Bus} page for detailed information on
|
||||
how to use this module.
|
||||
*/
|
||||
|
@ -84,14 +84,29 @@ bool qdbus_loadLibDBus()
|
||||
triedToLoadLibrary = true;
|
||||
|
||||
static int majorversions[] = { 3, 2, -1 };
|
||||
lib->unload();
|
||||
lib->setFileName(QLatin1String("dbus-1"));
|
||||
for (uint i = 0; i < sizeof(majorversions) / sizeof(majorversions[0]); ++i) {
|
||||
lib->setFileNameAndVersion(lib->fileName(), majorversions[i]);
|
||||
if (lib->load() && lib->resolve("dbus_connection_open_private"))
|
||||
return true;
|
||||
const QString baseNames[] = {
|
||||
#ifdef Q_OS_WIN
|
||||
QStringLiteral("dbus-1"),
|
||||
#endif
|
||||
QStringLiteral("libdbus-1")
|
||||
};
|
||||
|
||||
lib->unload();
|
||||
lib->unload();
|
||||
for (uint i = 0; i < sizeof(majorversions) / sizeof(majorversions[0]); ++i) {
|
||||
for (uint j = 0; j < sizeof(baseNames) / sizeof(baseNames[0]); ++j) {
|
||||
#ifdef Q_OS_WIN
|
||||
QString suffix;
|
||||
if (majorversions[i] != -1)
|
||||
suffix = QString::number(- majorversions[i]); // negative so it prepends the dash
|
||||
lib->setFileName(baseNames[j] + suffix);
|
||||
#else
|
||||
lib->setFileNameAndVersion(baseNames[j], majorversions[i]);
|
||||
#endif
|
||||
if (lib->load() && lib->resolve("dbus_connection_open_private"))
|
||||
return true;
|
||||
|
||||
lib->unload();
|
||||
}
|
||||
}
|
||||
|
||||
delete lib;
|
||||
|
@ -72,12 +72,18 @@ QDBusServer::QDBusServer(const QString &address, QObject *parent)
|
||||
|
||||
/*!
|
||||
Constructs a QDBusServer with the given \a parent. The server will listen
|
||||
for connections in \c {/tmp}.
|
||||
for connections in \c {/tmp} (on Unix systems) or on a TCP port bound to
|
||||
localhost (elsewhere).
|
||||
*/
|
||||
QDBusServer::QDBusServer(QObject *parent)
|
||||
: QObject(parent)
|
||||
{
|
||||
const QString address = QLatin1String("unix:tmpdir=/tmp");
|
||||
#ifdef Q_OS_UNIX
|
||||
// Use Unix sockets on Unix systems only
|
||||
static const char address[] = "unix:tmpdir=/tmp";
|
||||
#else
|
||||
static const char address[] = "tcp:";
|
||||
#endif
|
||||
|
||||
if (!qdbus_loadLibDBus()) {
|
||||
d = 0;
|
||||
@ -89,7 +95,7 @@ QDBusServer::QDBusServer(QObject *parent)
|
||||
this, SIGNAL(newConnection(QDBusConnection)));
|
||||
|
||||
QDBusErrorInternal error;
|
||||
d->setServer(q_dbus_server_listen(address.toUtf8().constData(), error), error);
|
||||
d->setServer(q_dbus_server_listen(address, error), error);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -314,7 +314,7 @@ bool QImageData::checkForAlphaPixels() const
|
||||
sharing}. QImage objects can also be streamed and compared.
|
||||
|
||||
\note If you would like to load QImage objects in a static build of Qt,
|
||||
refer to the \l{How To Create Qt Plugins#Static Plugins}{Plugin HowTo}.
|
||||
refer to the \l{How To Create Qt Plugins}{Plugin HowTo}.
|
||||
|
||||
\warning Painting on a QImage with the format
|
||||
QImage::Format_Indexed8 is not supported.
|
||||
|
@ -283,7 +283,6 @@ QMouseEvent::~QMouseEvent()
|
||||
|
||||
\sa Qt::MouseEventSource
|
||||
\sa QGraphicsSceneMouseEvent::source()
|
||||
\sa QGraphicsSceneMouseEvent::setSource()
|
||||
*/
|
||||
Qt::MouseEventSource QMouseEvent::source() const
|
||||
{
|
||||
@ -299,7 +298,6 @@ Qt::MouseEventSource QMouseEvent::source() const
|
||||
|
||||
\sa Qt::MouseEventFlag
|
||||
\sa QGraphicsSceneMouseEvent::flags()
|
||||
\sa QGraphicsSceneMouseEvent::setFlags()
|
||||
*/
|
||||
Qt::MouseEventFlags QMouseEvent::flags() const
|
||||
{
|
||||
|
@ -2159,6 +2159,9 @@ void QGuiApplicationPrivate::processTabletLeaveProximityEvent(QWindowSystemInter
|
||||
#ifndef QT_NO_GESTURES
|
||||
void QGuiApplicationPrivate::processGestureEvent(QWindowSystemInterfacePrivate::GestureEvent *e)
|
||||
{
|
||||
if (e->window.isNull())
|
||||
return;
|
||||
|
||||
QNativeGestureEvent ev(e->type, e->pos, e->pos, e->globalPos, e->realValue, e->sequenceId, e->intValue);
|
||||
ev.setTimestamp(e->timestamp);
|
||||
QGuiApplication::sendSpontaneousEvent(e->window, &ev);
|
||||
|
@ -519,7 +519,7 @@ void QOpenGLContext::setScreen(QScreen *screen)
|
||||
value type. These classes can be found in the QtPlatformHeaders module.
|
||||
|
||||
When create() is called with native handles set, the handles' ownership are
|
||||
not taken, meaning that destroy() will not destroy the native context.
|
||||
not taken, meaning that \c destroy() will not destroy the native context.
|
||||
|
||||
\note Some frameworks track the current context and surfaces internally.
|
||||
Making the adopted QOpenGLContext current via Qt will have no effect on such
|
||||
@ -583,9 +583,9 @@ QVariant QOpenGLContext::nativeHandle() const
|
||||
be used with makeCurrent(), swapBuffers(), etc.
|
||||
|
||||
\note If the context is already created, this function will first call
|
||||
destroy(), and then create a new OpenGL context.
|
||||
\c destroy(), and then create a new OpenGL context.
|
||||
|
||||
\sa makeCurrent(), destroy(), format()
|
||||
\sa makeCurrent(), format()
|
||||
*/
|
||||
bool QOpenGLContext::create()
|
||||
{
|
||||
@ -614,7 +614,7 @@ bool QOpenGLContext::create()
|
||||
destroying the underlying platform context frees any state associated with
|
||||
the context.
|
||||
|
||||
After destroy() has been called, you must call create() if you wish to
|
||||
After \c destroy() has been called, you must call create() if you wish to
|
||||
use the context again.
|
||||
|
||||
\note This implicitly calls doneCurrent() if the context is current.
|
||||
@ -659,10 +659,8 @@ void QOpenGLContext::destroy()
|
||||
/*!
|
||||
Destroys the QOpenGLContext object.
|
||||
|
||||
This implicitly calls destroy(), so if this is the current context for the
|
||||
This implicitly calls \c destroy(), so if this is the current context for the
|
||||
thread, doneCurrent() is also called.
|
||||
|
||||
\sa destroy()
|
||||
*/
|
||||
QOpenGLContext::~QOpenGLContext()
|
||||
{
|
||||
|
@ -119,9 +119,9 @@ QPlatformSystemTrayIcon::~QPlatformSystemTrayIcon()
|
||||
|
||||
/*!
|
||||
\fn void QPlatformSystemTrayIcon::showMessage(const QString &title, const QString &msg,
|
||||
const QIcon &icon, MessageIcon iconType, int secs)
|
||||
const QIcon &icon, MessageIcon iconType, int msecs)
|
||||
Shows a balloon message for the entry with the given \a title, message \a msg and \a icon for
|
||||
the time specified in \a secs. \a iconType is used as a hint for the implementing platform.
|
||||
the time specified in \a msecs. \a iconType is used as a hint for the implementing platform.
|
||||
\sa QSystemTrayIcon::showMessage()
|
||||
*/
|
||||
|
||||
|
@ -70,7 +70,7 @@ public:
|
||||
virtual void updateMenu(QPlatformMenu *menu) = 0;
|
||||
virtual QRect geometry() const = 0;
|
||||
virtual void showMessage(const QString &title, const QString &msg,
|
||||
const QIcon &icon, MessageIcon iconType, int secs) = 0;
|
||||
const QIcon &icon, MessageIcon iconType, int msecs) = 0;
|
||||
|
||||
virtual bool isSystemTrayAvailable() const = 0;
|
||||
virtual bool supportsMessages() const = 0;
|
||||
|
@ -88,7 +88,7 @@ public:
|
||||
Access to these parameters are useful when implementing custom user interface components, in that
|
||||
they allow the components to exhibit the same behaviour and feel as other components.
|
||||
|
||||
\sa QGuiApplication::styleHints(), QPlatformTheme
|
||||
\sa QGuiApplication::styleHints()
|
||||
*/
|
||||
QStyleHints::QStyleHints()
|
||||
: QObject(*new QStyleHintsPrivate(), 0)
|
||||
|
@ -2444,7 +2444,8 @@ void QWindowPrivate::setCursor(const QCursor *newCursor)
|
||||
hasCursor = false;
|
||||
}
|
||||
// Only attempt to set cursor and emit signal if there is an actual platform cursor
|
||||
if (q->screen()->handle()->cursor()) {
|
||||
QScreen* screen = q->screen();
|
||||
if (screen && screen->handle()->cursor()) {
|
||||
applyCursor();
|
||||
QEvent event(QEvent::CursorChange);
|
||||
QGuiApplication::sendEvent(q, &event);
|
||||
|
@ -2083,10 +2083,8 @@ int QPdfEnginePrivate::writeImage(const QByteArray &data, int width, int height,
|
||||
}
|
||||
if (maskObject > 0)
|
||||
xprintf("/Mask %d 0 R\n", maskObject);
|
||||
if (softMaskObject > 0) {
|
||||
if (softMaskObject > 0)
|
||||
xprintf("/SMask %d 0 R\n", softMaskObject);
|
||||
xprintf("/Decode [1 0 1 0 1 0]\n");
|
||||
}
|
||||
|
||||
int lenobj = requestObject();
|
||||
xprintf("/Length %d 0 R\n", lenobj);
|
||||
|
@ -1410,36 +1410,6 @@ QFontEngineFT::QGlyphSet *QFontEngineFT::loadTransformedGlyphSet(const QTransfor
|
||||
return gs;
|
||||
}
|
||||
|
||||
bool QFontEngineFT::loadGlyphs(QGlyphSet *gs, const glyph_t *glyphs, int num_glyphs,
|
||||
const QFixedPoint *positions,
|
||||
GlyphFormat format)
|
||||
{
|
||||
FT_Face face = 0;
|
||||
|
||||
for (int i = 0; i < num_glyphs; ++i) {
|
||||
QFixed spp = subPixelPositionForX(positions[i].x);
|
||||
Glyph *glyph = gs ? gs->getGlyph(glyphs[i], spp) : 0;
|
||||
if (glyph == 0 || glyph->format != format) {
|
||||
if (!face) {
|
||||
face = lockFace();
|
||||
FT_Matrix m = matrix;
|
||||
FT_Matrix_Multiply(&gs->transformationMatrix, &m);
|
||||
FT_Set_Transform(face, &m, 0);
|
||||
freetype->matrix = m;
|
||||
}
|
||||
if (!loadGlyph(gs, glyphs[i], spp, format)) {
|
||||
unlockFace();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (face)
|
||||
unlockFace();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void QFontEngineFT::getUnscaledGlyph(glyph_t glyph, QPainterPath *path, glyph_metrics_t *metrics)
|
||||
{
|
||||
FT_Face face = lockFace(Unscaled);
|
||||
|
@ -269,9 +269,6 @@ private:
|
||||
Glyph *loadGlyphFor(glyph_t g, QFixed subPixelPosition, GlyphFormat format, const QTransform &t);
|
||||
|
||||
QGlyphSet *loadTransformedGlyphSet(const QTransform &matrix);
|
||||
bool loadGlyphs(QGlyphSet *gs, const glyph_t *glyphs, int num_glyphs,
|
||||
const QFixedPoint *positions,
|
||||
GlyphFormat format = Format_Render);
|
||||
|
||||
QFontEngineFT(const QFontDef &fd);
|
||||
virtual ~QFontEngineFT();
|
||||
|
@ -70,14 +70,18 @@ public:
|
||||
, hintingPreference(other.hintingPreference)
|
||||
, thread(other.thread)
|
||||
{
|
||||
#ifndef QT_NO_DEBUG
|
||||
Q_ASSERT(fontEngine == 0 || thread == QThread::currentThread());
|
||||
#endif
|
||||
if (fontEngine != 0)
|
||||
fontEngine->ref.ref();
|
||||
}
|
||||
|
||||
~QRawFontPrivate()
|
||||
{
|
||||
#ifndef QT_NO_DEBUG
|
||||
Q_ASSERT(ref.load() == 0);
|
||||
#endif
|
||||
cleanUp();
|
||||
}
|
||||
|
||||
@ -89,27 +93,36 @@ public:
|
||||
|
||||
inline bool isValid() const
|
||||
{
|
||||
#ifndef QT_NO_DEBUG
|
||||
Q_ASSERT(fontEngine == 0 || thread == QThread::currentThread());
|
||||
#endif
|
||||
return fontEngine != 0;
|
||||
}
|
||||
|
||||
inline void setFontEngine(QFontEngine *engine)
|
||||
{
|
||||
#ifndef QT_NO_DEBUG
|
||||
Q_ASSERT(fontEngine == 0 || thread == QThread::currentThread());
|
||||
#endif
|
||||
if (fontEngine == engine)
|
||||
return;
|
||||
|
||||
if (fontEngine != 0) {
|
||||
if (!fontEngine->ref.deref())
|
||||
delete fontEngine;
|
||||
#ifndef QT_NO_DEBUG
|
||||
thread = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
fontEngine = engine;
|
||||
|
||||
if (fontEngine != 0) {
|
||||
fontEngine->ref.ref();
|
||||
Q_ASSERT(thread = QThread::currentThread()); // set only if assertions enabled
|
||||
#ifndef QT_NO_DEBUG
|
||||
thread = QThread::currentThread();
|
||||
Q_ASSERT(thread);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1402,6 +1402,9 @@ QNetworkCacheMetaData QNetworkReplyHttpImplPrivate::fetchCacheMetaData(const QNe
|
||||
if (hop_by_hop)
|
||||
continue;
|
||||
|
||||
if (header == "set-cookie")
|
||||
continue;
|
||||
|
||||
// for 4.6.0, we were planning to not store the date header in the
|
||||
// cached resource; through that we planned to reduce the number
|
||||
// of writes to disk when using a QNetworkDiskCache (i.e. don't
|
||||
|
@ -1024,7 +1024,10 @@ bool QHostAddress::isLoopback() const
|
||||
#ifndef QT_NO_DEBUG_STREAM
|
||||
QDebug operator<<(QDebug d, const QHostAddress &address)
|
||||
{
|
||||
d.maybeSpace() << "QHostAddress(" << address.toString() << ')';
|
||||
if (address == QHostAddress::Any)
|
||||
d.maybeSpace() << "QHostAddress(QHostAddress::Any)";
|
||||
else
|
||||
d.maybeSpace() << "QHostAddress(" << address.toString() << ')';
|
||||
return d.space();
|
||||
}
|
||||
#endif
|
||||
|
@ -116,7 +116,7 @@ void QHttpSocketEngine::setProxy(const QNetworkProxy &proxy)
|
||||
qintptr QHttpSocketEngine::socketDescriptor() const
|
||||
{
|
||||
Q_D(const QHttpSocketEngine);
|
||||
return d->socket ? d->socket->socketDescriptor() : 0;
|
||||
return d->socket ? d->socket->socketDescriptor() : -1;
|
||||
}
|
||||
|
||||
bool QHttpSocketEngine::isValid() const
|
||||
|
@ -641,8 +641,8 @@ bool QNativeSocketEngine::joinMulticastGroup(const QHostAddress &groupAddress,
|
||||
if (groupAddress.protocol() == QAbstractSocket::IPv4Protocol &&
|
||||
(d->socketProtocol == QAbstractSocket::IPv6Protocol ||
|
||||
d->socketProtocol == QAbstractSocket::AnyIPProtocol)) {
|
||||
qWarning("QAbstractSocket: cannot bind to QHostAddress::Any (or an IPv6 address) and join an IPv4 multicast group");
|
||||
qWarning("QAbstractSocket: bind to QHostAddress::AnyIPv4 instead if you want to do this");
|
||||
qWarning("QAbstractSocket: cannot bind to QHostAddress::Any (or an IPv6 address) and join an IPv4 multicast group;"
|
||||
" bind to QHostAddress::AnyIPv4 instead if you want to do this");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -39,10 +39,10 @@
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
|
||||
#include "qssl_p.h"
|
||||
#include "qsslcertificate.h"
|
||||
#include "qsslcertificate_p.h"
|
||||
|
||||
#include "qssl_p.h"
|
||||
#include "qsslkey.h"
|
||||
#include "qsslkey_p.h"
|
||||
#include "qsslcertificateextension.h"
|
||||
|
@ -31,9 +31,8 @@
|
||||
\brief The Qt OpenGL module offers classes that make it easy to
|
||||
use OpenGL in Qt applications.
|
||||
|
||||
\warning Apart from the \l{QGLWidget} class, this module should not be used
|
||||
anymore for new code. Please use the corresponding OpenGL classes in
|
||||
\l{Qt Gui}.
|
||||
\warning This module should not be used anymore for new code. Please
|
||||
use the corresponding OpenGL classes in \l{Qt Gui}.
|
||||
|
||||
OpenGL is a standard API for rendering 3D graphics. OpenGL only
|
||||
deals with 3D rendering and provides little or no support for GUI
|
||||
|
@ -34,9 +34,8 @@
|
||||
\brief The Qt OpenGL module offers classes that make it easy to
|
||||
use OpenGL in Qt applications.
|
||||
|
||||
\warning Apart from the \l{QGLWidget} class, this module should not be used
|
||||
anymore for new code. Please use the corresponding OpenGL classes in
|
||||
\l{Qt Gui}.
|
||||
\warning This module should not be used anymore for new code. Please
|
||||
use the corresponding OpenGL classes in \l{Qt Gui}.
|
||||
|
||||
OpenGL is a standard API for rendering 3D graphics. OpenGL only
|
||||
deals with 3D rendering and provides little or no support for GUI
|
||||
|
@ -366,14 +366,9 @@ void QCocoaMenu::syncMenuItem(QPlatformMenuItem *menuItem)
|
||||
}
|
||||
|
||||
bool wasMerged = cocoaItem->isMerged();
|
||||
NSMenu *oldMenu = m_nativeMenu;
|
||||
if (wasMerged) {
|
||||
QPlatformMenuItem::MenuRole role = cocoaItem->effectiveRole();
|
||||
if (role >= QPlatformMenuItem::ApplicationSpecificRole && role < QPlatformMenuItem::CutRole)
|
||||
oldMenu = [getMenuLoader() applicationMenu];
|
||||
}
|
||||
|
||||
NSMenu *oldMenu = wasMerged ? [getMenuLoader() applicationMenu] : m_nativeMenu;
|
||||
NSMenuItem *oldItem = [oldMenu itemWithTag:(NSInteger) cocoaItem];
|
||||
|
||||
if (cocoaItem->sync() != oldItem) {
|
||||
// native item was changed for some reason
|
||||
if (oldItem) {
|
||||
|
@ -256,8 +256,8 @@ NSMenuItem *QCocoaMenuItem::sync()
|
||||
if (depth == 3 || !menubar)
|
||||
break; // Menu item too deep in the hierarchy, or not connected to any menubar
|
||||
|
||||
MenuRole newDetectedRole = detectMenuRole(m_text);
|
||||
switch (newDetectedRole) {
|
||||
m_detectedRole = detectMenuRole(m_text);
|
||||
switch (m_detectedRole) {
|
||||
case QPlatformMenuItem::AboutRole:
|
||||
if (m_text.indexOf(QRegExp(QString::fromLatin1("qt$"), Qt::CaseInsensitive)) == -1)
|
||||
mergeItem = [loader aboutMenuItem];
|
||||
@ -271,15 +271,12 @@ NSMenuItem *QCocoaMenuItem::sync()
|
||||
mergeItem = [loader quitMenuItem];
|
||||
break;
|
||||
default:
|
||||
if (newDetectedRole >= CutRole && newDetectedRole < RoleCount && menubar)
|
||||
mergeItem = menubar->itemForRole(newDetectedRole);
|
||||
if (m_detectedRole >= CutRole && m_detectedRole < RoleCount && menubar)
|
||||
mergeItem = menubar->itemForRole(m_detectedRole);
|
||||
if (!m_text.isEmpty())
|
||||
m_textSynced = true;
|
||||
break;
|
||||
}
|
||||
|
||||
m_detectedRole = newDetectedRole;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -329,7 +329,8 @@ qreal QQnxScreen::refreshRate() const
|
||||
{
|
||||
screen_display_mode_t displayMode;
|
||||
int result = screen_get_display_property_pv(m_display, SCREEN_PROPERTY_MODE, reinterpret_cast<void **>(&displayMode));
|
||||
if (result != 0) {
|
||||
// Screen shouldn't really return 0 but it does so default to 60 or things break.
|
||||
if (result != 0 || displayMode.refresh == 0) {
|
||||
qWarning("QQnxScreen: Failed to query screen mode. Using default value of 60Hz");
|
||||
return 60.0;
|
||||
}
|
||||
|
@ -957,7 +957,8 @@ QList<int> QXcbKeyboard::possibleKeys(const QKeyEvent *event) const
|
||||
|
||||
QList<int> result;
|
||||
int baseQtKey = keysymToQtKey(sym, modifiers, lookupString(kb_state, keycode));
|
||||
result += (baseQtKey + modifiers); // The base key is _always_ valid, of course
|
||||
if (baseQtKey)
|
||||
result += (baseQtKey + modifiers);
|
||||
|
||||
xkb_mod_index_t shiftMod = xkb_keymap_mod_get_index(xkb_keymap, "Shift");
|
||||
xkb_mod_index_t altMod = xkb_keymap_mod_get_index(xkb_keymap, "Alt");
|
||||
|
@ -9,6 +9,5 @@ QT += core-private gui-private platformsupport-private xcb_qpa_lib-private
|
||||
|
||||
SOURCES = \
|
||||
qxcbmain.cpp
|
||||
|
||||
OTHER_FILES += xcb.json README
|
||||
|
||||
|
@ -39,6 +39,10 @@
|
||||
# define DC_COLLATE 22
|
||||
#endif
|
||||
|
||||
#if defined (Q_CC_MINGW)
|
||||
# pragma GCC diagnostic ignored "-Wsign-compare"
|
||||
#endif
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
#ifndef QT_NO_PRINTER
|
||||
|
@ -713,9 +713,8 @@
|
||||
|
||||
\snippet code/doc_src_sql-driver.cpp 31
|
||||
|
||||
the problem is usually that the plugin had the wrong \l{Deploying
|
||||
Plugins#The Build Key}{build key}. This might require removing an
|
||||
entry from the \l{Deploying Plugins#The Plugin Cache} {plugin cache}.
|
||||
the problem is usually that the plugin had the wrong build key.
|
||||
This might require removing an entry from the plugin cache.
|
||||
|
||||
\target development
|
||||
\section1 How to Write Your Own Database Driver
|
||||
|
@ -2719,6 +2719,13 @@ QString QTest::qFindTestData(const QString& base, const char *file, int line, co
|
||||
found = candidate;
|
||||
}
|
||||
|
||||
// 5. Try current directory
|
||||
if (found.isEmpty()) {
|
||||
QString candidate = QString::fromLatin1("%1/%2").arg(QDir::currentPath()).arg(base);
|
||||
if (QFileInfo(candidate).exists())
|
||||
found = candidate;
|
||||
}
|
||||
|
||||
if (found.isEmpty()) {
|
||||
QTest::qWarn(qPrintable(
|
||||
QString::fromLatin1("testdata %1 could not be located!").arg(base)),
|
||||
|
@ -136,7 +136,7 @@ QString CppCodeMarker::markedUpSynopsis(const Node *node,
|
||||
|
||||
if ((style == Detailed) && !node->parent()->name().isEmpty() &&
|
||||
(node->type() != Node::Property) && !node->isQmlNode())
|
||||
name.prepend(taggedNode(node->parent()) + "::​");
|
||||
name.prepend(taggedNode(node->parent()) + "::");
|
||||
|
||||
switch (node->type()) {
|
||||
case Node::Namespace:
|
||||
|
@ -1420,11 +1420,10 @@ void HtmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
|
||||
}
|
||||
if (!s->reimpMembers.isEmpty()) {
|
||||
QString name = QString("Reimplemented ") + (*s).name;
|
||||
QString ref = registerRef(name.toLower());
|
||||
// out() << "<hr />\n";
|
||||
out() << "<a name=\""
|
||||
<< registerRef(name.toLower())
|
||||
<< "\"></a>" << divNavTop << "\n";
|
||||
out() << "<h2>" << protectEnc(name) << "</h2>\n";
|
||||
out() << "<a name=\"" << ref << "\"></a>" << divNavTop << "\n";
|
||||
out() << "<h2 id=\"" << ref << "\">" << protectEnc(name) << "</h2>\n";
|
||||
generateSection(s->reimpMembers, inner, marker, CodeMarker::Summary);
|
||||
}
|
||||
|
||||
@ -2419,7 +2418,7 @@ void HtmlGenerator::generateTableOfContents(const Node *node,
|
||||
else if (sections && (node->isClass() || node->isNamespace() || node->isQmlType())) {
|
||||
QList<Section>::ConstIterator s = sections->constBegin();
|
||||
while (s != sections->constEnd()) {
|
||||
if (!s->members.isEmpty() || !s->reimpMembers.isEmpty()) {
|
||||
if (!s->members.isEmpty()) {
|
||||
out() << "<li class=\"level"
|
||||
<< sectionNumber.size()
|
||||
<< "\"><a href=\"#"
|
||||
@ -2427,6 +2426,15 @@ void HtmlGenerator::generateTableOfContents(const Node *node,
|
||||
<< "\">" << (*s).name
|
||||
<< "</a></li>\n";
|
||||
}
|
||||
if (!s->reimpMembers.isEmpty()) {
|
||||
QString ref = QString("Reimplemented ") + (*s).pluralMember;
|
||||
out() << "<li class=\"level"
|
||||
<< sectionNumber.size()
|
||||
<< "\"><a href=\"#"
|
||||
<< registerRef(ref.toLower())
|
||||
<< "\">" << QString("Reimplemented ") + (*s).name
|
||||
<< "</a></li>\n";
|
||||
}
|
||||
++s;
|
||||
}
|
||||
out() << "<li class=\"level"
|
||||
|
@ -972,6 +972,7 @@ private:
|
||||
QColorShowLabel *lab;
|
||||
bool rgbOriginal;
|
||||
QColorDialog *colorDialog;
|
||||
QGridLayout *gl;
|
||||
|
||||
friend class QColorDialog;
|
||||
friend class QColorDialogPrivate;
|
||||
@ -1099,7 +1100,7 @@ QColorShower::QColorShower(QColorDialog *parent)
|
||||
curCol = qRgb(255, 255, 255);
|
||||
curQColor = Qt::white;
|
||||
|
||||
QGridLayout *gl = new QGridLayout(this);
|
||||
gl = new QGridLayout(this);
|
||||
gl->setMargin(gl->spacing());
|
||||
lab = new QColorShowLabel(this);
|
||||
|
||||
@ -1277,10 +1278,16 @@ QColorShower::QColorShower(QColorDialog *parent)
|
||||
#else
|
||||
htEd->setReadOnly(true);
|
||||
#endif
|
||||
htEd->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed);
|
||||
|
||||
lblHtml->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
|
||||
#if defined(QT_SMALL_COLORDIALOG)
|
||||
gl->addWidget(lblHtml, 5, 0);
|
||||
gl->addWidget(htEd, 5, 1, 1, /*colspan=*/ 2);
|
||||
#else
|
||||
gl->addWidget(lblHtml, 5, 1);
|
||||
gl->addWidget(htEd, 5, 2);
|
||||
gl->addWidget(htEd, 5, 2, 1, /*colspan=*/ 3);
|
||||
#endif
|
||||
|
||||
connect(hEd, SIGNAL(valueChanged(int)), this, SLOT(hsvEd()));
|
||||
connect(sEd, SIGNAL(valueChanged(int)), this, SLOT(hsvEd()));
|
||||
@ -1742,7 +1749,9 @@ void QColorDialogPrivate::initWidgets()
|
||||
lp->hide();
|
||||
#else
|
||||
lp->setFixedWidth(20);
|
||||
pickLay->addSpacing(10);
|
||||
pickLay->addWidget(lp);
|
||||
pickLay->addStretch();
|
||||
#endif
|
||||
|
||||
QObject::connect(cp, SIGNAL(newCol(int,int)), lp, SLOT(setCol(int,int)));
|
||||
@ -1751,6 +1760,7 @@ void QColorDialogPrivate::initWidgets()
|
||||
rightLay->addStretch();
|
||||
|
||||
cs = new QColorShower(q);
|
||||
pickLay->setMargin(cs->gl->margin());
|
||||
QObject::connect(cs, SIGNAL(newCol(QRgb)), q, SLOT(_q_newColorTypedIn(QRgb)));
|
||||
QObject::connect(cs, SIGNAL(currentColorChanged(QColor)),
|
||||
q, SIGNAL(currentColorChanged(QColor)));
|
||||
@ -1760,6 +1770,7 @@ void QColorDialogPrivate::initWidgets()
|
||||
topLay->addWidget(cs);
|
||||
#else
|
||||
rightLay->addWidget(cs);
|
||||
leftLay->addSpacing(cs->gl->margin());
|
||||
#endif
|
||||
|
||||
buttons = new QDialogButtonBox(q);
|
||||
|
@ -627,7 +627,7 @@ void QStyle::drawItemPixmap(QPainter *painter, const QRect &rect, int alignment,
|
||||
indicator or button bevel.
|
||||
|
||||
\omitvalue PE_IndicatorViewItemCheck
|
||||
\value PE_FrameStatusBar Frame
|
||||
\value PE_FrameStatusBar Obsolete. Use PE_FrameStatusBarItem instead.
|
||||
|
||||
\value PE_PanelButtonCommand Button used to initiate an action, for
|
||||
example, a QPushButton.
|
||||
|
@ -525,7 +525,7 @@ Qt::Orientation QProgressBar::orientation() const
|
||||
\property QProgressBar::invertedAppearance
|
||||
\brief whether or not a progress bar shows its progress inverted
|
||||
|
||||
If this property is \c false, the progress bar grows in the other
|
||||
If this property is \c true, the progress bar grows in the other
|
||||
direction (e.g. from right to left). By default, the progress bar
|
||||
is not inverted.
|
||||
|
||||
|
@ -593,13 +593,14 @@ void QScrollBar::mousePressEvent(QMouseEvent *e)
|
||||
d->clickOffset = sliderLength / 2;
|
||||
}
|
||||
const int initialDelay = 500; // default threshold
|
||||
d->activateControl(d->pressedControl, initialDelay);
|
||||
QElapsedTimer time;
|
||||
time.start();
|
||||
d->activateControl(d->pressedControl, initialDelay);
|
||||
repaint(style()->subControlRect(QStyle::CC_ScrollBar, &opt, d->pressedControl, this));
|
||||
if (time.elapsed() >= initialDelay && d->repeatActionTimer.isActive()) {
|
||||
// It took more than 500ms (the initial timer delay) to process the repaint(), we
|
||||
// therefore need to restart the timer in case we have a pending mouse release event;
|
||||
// It took more than 500ms (the initial timer delay) to process
|
||||
// the control activation and repaint(), we therefore need
|
||||
// to restart the timer in case we have a pending mouse release event;
|
||||
// otherwise we'll get a timer event right before the release event,
|
||||
// causing the repeat action to be invoked twice on a single mouse click.
|
||||
// 50ms is the default repeat time (see activateControl/setRepeatAction).
|
||||
|
@ -279,6 +279,23 @@ void QWidgetLineControl::clear()
|
||||
separate();
|
||||
finishChange(priorState, /*update*/false, /*edited*/false);
|
||||
}
|
||||
/*!
|
||||
\internal
|
||||
|
||||
Undoes the previous operation.
|
||||
*/
|
||||
|
||||
void QWidgetLineControl::undo()
|
||||
{
|
||||
// Undo works only for clearing the line when in any of password the modes
|
||||
if (m_echoMode == QLineEdit::Normal) {
|
||||
internalUndo();
|
||||
finishChange(-1, true);
|
||||
} else {
|
||||
cancelPasswordEchoTimer();
|
||||
clear();
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
\internal
|
||||
@ -1278,12 +1295,6 @@ void QWidgetLineControl::internalUndo(int until)
|
||||
cancelPasswordEchoTimer();
|
||||
internalDeselect();
|
||||
|
||||
// Undo works only for clearing the line when in any of password the modes
|
||||
if (m_echoMode != QLineEdit::Normal) {
|
||||
clear();
|
||||
return;
|
||||
}
|
||||
|
||||
while (m_undoState && m_undoState > until) {
|
||||
Command& cmd = m_history[--m_undoState];
|
||||
switch (cmd.type) {
|
||||
|
@ -245,7 +245,7 @@ public:
|
||||
|
||||
void insert(const QString &);
|
||||
void clear();
|
||||
void undo() { internalUndo(); finishChange(-1, true); }
|
||||
void undo();
|
||||
void redo() { internalRedo(); finishChange(); }
|
||||
void selectWordAtPos(int);
|
||||
|
||||
|
@ -1,37 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.qtproject.qt5.android.tests"
|
||||
android:versionCode="1"
|
||||
android:versionName="1.0">
|
||||
<uses-sdk android:minSdkVersion="4" />
|
||||
<application android:label="@string/app_name" android:name="org.qtproject.qt5.android.QtNative">
|
||||
<activity android:label="@string/app_name" android:name="org.qtproject.qt5.android.QtActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
</application>
|
||||
<supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_SURFACE_FLINGER"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
|
||||
<uses-permission android:name="android.permission.BLUETOOTH"/>
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
|
||||
<uses-permission android:name="android.permission.CAMERA"/>
|
||||
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
|
||||
<uses-permission android:name="android.permission.INJECT_EVENTS"/>
|
||||
<uses-permission android:name="android.permission.NFC"/>
|
||||
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
|
||||
<uses-permission android:name="android.permission.SET_ORIENTATION"/>
|
||||
<uses-permission android:name="android.permission.STATUS_BAR"/>
|
||||
<uses-permission android:name="android.permission.VIBRATE"/>
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK"/>
|
||||
<uses-permission android:name="android.permission.WRITE_CALENDAR"/>
|
||||
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
|
||||
</manifest>
|
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
>
|
||||
<TextView
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:id="@+id/textView"
|
||||
/>
|
||||
</LinearLayout>
|
@ -1,21 +0,0 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<resources>
|
||||
<array name="qt_libs">
|
||||
<item>gnustl_shared</item>
|
||||
<item>Qt5Core</item>
|
||||
<item>Qt5Gui</item>
|
||||
<item>Qt5Widgets</item>
|
||||
<item>Qt5Test</item>
|
||||
<item>Qt5OpenGL</item>
|
||||
<item>Qt5Network</item>
|
||||
<item>Qt5Script</item>
|
||||
<item>Qt5Sql</item>
|
||||
<item>Qt5Xml</item>
|
||||
<item>Qt5ScriptTools</item>
|
||||
<item>Qt5Svg</item>
|
||||
<item>Qt5XmlPatterns</item>
|
||||
<item>Qt5Declarative</item>
|
||||
<item>Qt5WebKit</item>
|
||||
</array>
|
||||
<array name="bundled_libs"/>
|
||||
</resources>
|
@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">Quadruplor</string>
|
||||
</resources>
|
@ -1,367 +0,0 @@
|
||||
#!/usr/bin/perl -w
|
||||
#############################################################################
|
||||
##
|
||||
## Copyright (C) 2012-2013 BogDan Vatra <bogdan@kde.org>
|
||||
## Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
|
||||
## Contact: http://www.qt-project.org/legal
|
||||
##
|
||||
## This file is part of the test suite of the Qt Toolkit.
|
||||
##
|
||||
## $QT_BEGIN_LICENSE:LGPL21$
|
||||
## 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 or version 3 as published by the Free
|
||||
## Software Foundation and appearing in the file LICENSE.LGPLv21 and
|
||||
## LICENSE.LGPLv3 included in the packaging of this file. Please review the
|
||||
## following information to ensure the GNU Lesser General Public License
|
||||
## requirements will be met: https://www.gnu.org/licenses/lgpl.html and
|
||||
## 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.
|
||||
##
|
||||
## $QT_END_LICENSE$
|
||||
##
|
||||
#############################################################################
|
||||
|
||||
use Cwd;
|
||||
use Cwd 'abs_path';
|
||||
use File::Basename;
|
||||
use File::Temp 'tempdir';
|
||||
use File::Path 'remove_tree';
|
||||
use Getopt::Long;
|
||||
use Pod::Usage;
|
||||
|
||||
### default options
|
||||
my @stack = cwd;
|
||||
my $device_serial=""; # "-s device_serial";
|
||||
my $packageName="org.qtproject.qt5.android.tests";
|
||||
my $intentName="$packageName/org.qtproject.qt5.android.QtActivity";
|
||||
my $jobs = 4;
|
||||
my $testsubset = "";
|
||||
my $man = 0;
|
||||
my $help = 0;
|
||||
my $make_clean = 0;
|
||||
my $deploy_qt = 0;
|
||||
my $time_out=400;
|
||||
my $android_sdk_dir = "$ENV{'ANDROID_SDK_ROOT'}";
|
||||
my $android_ndk_dir = "$ENV{'ANDROID_NDK_ROOT'}";
|
||||
my $ant_tool = `which ant`;
|
||||
chomp $ant_tool;
|
||||
my $strip_tool="";
|
||||
my $readelf_tool="";
|
||||
GetOptions('h|help' => \$help
|
||||
, man => \$man
|
||||
, 's|serial=s' => \$device_serial
|
||||
, 't|test=s' => \$testsubset
|
||||
, 'c|clean' => \$make_clean
|
||||
, 'd|deploy' => \$deploy_qt
|
||||
, 'j|jobs=i' => \$jobs
|
||||
, 'sdk=s' => \$android_sdk_dir
|
||||
, 'ndk=s' => \$android_ndk_dir
|
||||
, 'ant=s' => \$ant_tool
|
||||
, 'strip=s' => \$strip_tool
|
||||
, 'readelf=s' => \$readelf_tool
|
||||
, 'testcase=s' => \$testcase
|
||||
) or pod2usage(2);
|
||||
pod2usage(1) if $help;
|
||||
pod2usage(-verbose => 2) if $man;
|
||||
|
||||
my $adb_tool="$android_sdk_dir/platform-tools/adb";
|
||||
system("$adb_tool devices") == 0 or die "No device found, please plug/start at least one device/emulator\n"; # make sure we have at least on device attached
|
||||
|
||||
$device_serial = "-s $device_serial" if ($device_serial);
|
||||
$testsubset="/$testsubset" if ($testsubset);
|
||||
|
||||
$strip_tool="$android_ndk_dir/toolchains/arm-linux-androideabi-4.7/prebuilt/linux-x86/bin/arm-linux-androideabi-strip" unless($strip_tool);
|
||||
$readelf_tool="$android_ndk_dir/toolchains/arm-linux-androideabi-4.7/prebuilt/linux-x86/bin/arm-linux-androideabi-readelf" unless($readelf_tool);
|
||||
$readelf_tool="$readelf_tool -d -w ";
|
||||
|
||||
sub dir
|
||||
{
|
||||
# print "@stack\n";
|
||||
}
|
||||
|
||||
sub pushd ($)
|
||||
{
|
||||
unless ( chdir $_[0] )
|
||||
{
|
||||
warn "Error: $!\n";
|
||||
return;
|
||||
}
|
||||
unshift @stack, cwd;
|
||||
dir;
|
||||
}
|
||||
|
||||
sub popd ()
|
||||
{
|
||||
@stack > 1 and shift @stack;
|
||||
chdir $stack[0];
|
||||
dir;
|
||||
}
|
||||
|
||||
|
||||
sub waitForProcess
|
||||
{
|
||||
my $process=shift;
|
||||
my $action=shift;
|
||||
my $timeout=shift;
|
||||
my $sleepPeriod=shift;
|
||||
$sleepPeriod=1 if !defined($sleepPeriod);
|
||||
print "Waiting for $process ".$timeout*$sleepPeriod." seconds to";
|
||||
print $action?" start...\n":" die...\n";
|
||||
while ($timeout--)
|
||||
{
|
||||
my $output = `$adb_tool $device_serial shell ps 2>&1`; # get current processes
|
||||
#FIXME check why $output is not matching m/.*S $process\n/ or m/.*S $process$/ (eol)
|
||||
my $res=($output =~ m/.*S $process/)?1:0; # check the procress
|
||||
if ($action == $res)
|
||||
{
|
||||
print "... succeed\n";
|
||||
return 1;
|
||||
}
|
||||
sleep($sleepPeriod);
|
||||
print "timeount in ".$timeout*$sleepPeriod." seconds\n"
|
||||
}
|
||||
print "... failed\n";
|
||||
return 0;
|
||||
}
|
||||
|
||||
my $src_dir_qt=abs_path(dirname($0)."/../../..");
|
||||
my $quadruplor_dir="$src_dir_qt/tests/auto/android";
|
||||
my $qmake_path="$src_dir_qt/bin/qmake";
|
||||
my $tests_dir="$src_dir_qt/tests$testsubset";
|
||||
my $temp_dir=tempdir(CLEANUP => 1);
|
||||
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
|
||||
my $output_dir=$stack[0]."/".(1900+$year)."-$mon-$mday-$hour:$min";
|
||||
mkdir($output_dir);
|
||||
my $sdk_api=0;
|
||||
my $output = `$adb_tool $device_serial shell getprop`; # get device properties
|
||||
if ($output =~ m/.*\[ro.build.version.sdk\]: \[(\d+)\]/)
|
||||
{
|
||||
$sdk_api=int($1);
|
||||
$sdk_api=5 if ($sdk_api>5 && $sdk_api<8);
|
||||
$sdk_api=9 if ($sdk_api>9);
|
||||
}
|
||||
|
||||
sub reinstallQuadruplor
|
||||
{
|
||||
pushd($quadruplor_dir);
|
||||
system("$android_sdk_dir/tools/android update project -p . -t android-10")==0 or die "Can't update project ...\n";
|
||||
system("$ant_tool uninstall clean debug install")==0 or die "Can't install Quadruplor\n";
|
||||
system("$adb_tool $device_serial shell am start -n $intentName"); # create application folders
|
||||
waitForProcess($packageName,1,10);
|
||||
waitForProcess($packageName,0,20);
|
||||
popd();
|
||||
}
|
||||
sub killProcess
|
||||
{
|
||||
reinstallQuadruplor;
|
||||
# #### it seems I'm too idiot to use perl regexp
|
||||
# my $process=shift;
|
||||
# my $output = `$adb_tool $device_serial shell ps 2>&1`; # get current processes
|
||||
# $output =~ s/\r//g; # replace all "\r" with ""
|
||||
# chomp($output);
|
||||
# print $output;
|
||||
# if ($output =~ m/^.*_\d+\s+(\d+).*S $process/) # check the procress
|
||||
# {
|
||||
# print("Killing $process PID:$1\n");
|
||||
# system("$adb_tool $device_serial shell kill $1");
|
||||
# waitForProcess($process,0,20);
|
||||
# }
|
||||
# else
|
||||
# {
|
||||
# print("Can't kill the process $process\n");
|
||||
# }
|
||||
}
|
||||
|
||||
|
||||
sub startTest
|
||||
{
|
||||
my $libs = shift;
|
||||
my $mainLib = shift;
|
||||
my $openGL = ((shift)?"true":"false");
|
||||
system("$adb_tool $device_serial shell am start -n $intentName --ez needsOpenGl $openGL --es extra_libs \"$libs\" --es lib_name \"$mainLib\""); # start intent
|
||||
#wait to start
|
||||
return 0 unless(waitForProcess($packageName,1,10));
|
||||
#wait to stop
|
||||
unless(waitForProcess($packageName,0,$time_out,5))
|
||||
{
|
||||
killProcess($packageName);
|
||||
return 1;
|
||||
}
|
||||
my $output_file = shift;
|
||||
system("$adb_tool $device_serial pull /data/data/$packageName/app_files/output.xml $output_dir/$output_file");
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub needsOpenGl
|
||||
{
|
||||
my $app=$readelf_tool.shift.' |grep -e "^.*(NEEDED).*Shared library: \[libQtOpenGL\.so\]$"';
|
||||
my $res=`$app`;
|
||||
chomp $res;
|
||||
return $res;
|
||||
}
|
||||
|
||||
########### delpoy qt libs ###########
|
||||
if ($deploy_qt)
|
||||
{
|
||||
|
||||
pushd($src_dir_qt);
|
||||
mkdir("$temp_dir/lib");
|
||||
my @libs=`find lib -name *.so`; # libs must be handled diferently
|
||||
foreach (@libs)
|
||||
{
|
||||
chomp;
|
||||
print ("cp -L $_ $temp_dir/lib\n");
|
||||
system("cp -L $_ $temp_dir/lib");
|
||||
}
|
||||
system("cp -L $android_ndk_dir/sources/cxx-stl/gnu-libstdc++/4.7/libs/armeabi-v7a/libgnustl_shared.so $temp_dir/lib");
|
||||
system("cp -a plugins $temp_dir");
|
||||
system("cp -a imports $temp_dir");
|
||||
system("cp -a qml $temp_dir");
|
||||
pushd($temp_dir);
|
||||
system("find -name *.so | xargs $strip_tool --strip-unneeded");
|
||||
popd;
|
||||
system("$adb_tool $device_serial shell rm -r /data/local/tmp/qt"); # remove old qt libs
|
||||
system("$adb_tool $device_serial push $temp_dir /data/local/tmp/qt"); # copy newer qt libs
|
||||
popd;
|
||||
}
|
||||
|
||||
########### build & install quadruplor ###########
|
||||
reinstallQuadruplor;
|
||||
|
||||
########### build qt tests and benchmarks ###########
|
||||
pushd($tests_dir);
|
||||
print "Building $tests_dir \n";
|
||||
system("make distclean") if ($make_clean);
|
||||
system("$qmake_path CONFIG-=QTDIR_build -r") == 0 or die "Can't run qmake\n"; #exec qmake
|
||||
system("make -j$jobs") == 0 or warn "Can't build all tests\n"; #exec make
|
||||
|
||||
my $testsFiles = "";
|
||||
if ($testcase) {
|
||||
$testsFiles=`find . -name libtst_$testcase.so`; # only tests
|
||||
} else {
|
||||
$testsFiles=`find . -name libtst_*.so`; # only tests
|
||||
}
|
||||
|
||||
foreach (split("\n",$testsFiles))
|
||||
{
|
||||
chomp; #remove white spaces
|
||||
pushd(abs_path(dirname($_))); # cd to application dir
|
||||
system("make INSTALL_ROOT=$temp_dir install"); # install the application to temp dir
|
||||
system("$adb_tool $device_serial shell rm -r /data/data/$packageName/app_files/*"); # remove old data
|
||||
system("$adb_tool $device_serial push $temp_dir /data/data/$packageName/app_files"); # copy
|
||||
my $application=basename(cwd);
|
||||
my $output_name=dirname($_);
|
||||
$output_name =~ s/\.//; # remove first "." character
|
||||
$output_name =~ s/\///; # remove first "/" character
|
||||
$output_name =~ s/\//_/g; # replace all "/" with "_"
|
||||
$output_name=$application unless($output_name);
|
||||
$time_out=5*60/5; # 5 minutes time out for a normal test
|
||||
if (-e "$temp_dir/libtst_bench_$application.so")
|
||||
{
|
||||
$time_out=5*60/5; # 10 minutes for a benchmark
|
||||
$application = "bench_$application";
|
||||
}
|
||||
|
||||
if (-e "$temp_dir/libtst_$application.so")
|
||||
{
|
||||
if (needsOpenGl("$temp_dir/libtst_$application.so"))
|
||||
{
|
||||
startTest("/data/local/tmp/qt/plugins/platforms/android/libqtforandroidGL.so", "/data/data/$packageName/app_files/libtst_$application.so", 1
|
||||
, "$output_name.xml") or warn "Can't run $application ...\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
startTest("/data/local/tmp/qt/plugins/platforms/android/libqtforandroid.so", "/data/data/$packageName/app_files/libtst_$application.so", 0
|
||||
, "$output_name.xml") or warn "Can't run $application stopping tests ...\n";
|
||||
}
|
||||
}
|
||||
else
|
||||
{ #ups this test application doesn't respect name convention
|
||||
warn "$application test application doesn't respect name convention please fix it !\n";
|
||||
}
|
||||
popd();
|
||||
remove_tree( $temp_dir, {keep_root => 1} );
|
||||
}
|
||||
popd();
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
Script to run all qt tests/benchmarks to an android device/emulator
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
runtests.pl [options]
|
||||
|
||||
=head1 OPTIONS
|
||||
|
||||
=over 8
|
||||
|
||||
=item B<-s --serial = serial>
|
||||
|
||||
Device serial number. May be empty if only one device is attached.
|
||||
|
||||
=item B<-t --test = test_subset>
|
||||
|
||||
Tests subset (e.g. benchmarks, auto, auto/qbuffer, etc.).
|
||||
|
||||
=item B<-d --deploy>
|
||||
|
||||
Deploy current qt libs.
|
||||
|
||||
=item B<-c --clean>
|
||||
|
||||
Clean tests before building them.
|
||||
|
||||
=item B<-j --jobs = number>
|
||||
|
||||
Make jobs when building tests.
|
||||
|
||||
=item B<--sdk = sdk_path>
|
||||
|
||||
Android SDK path.
|
||||
|
||||
=item B<--ndk = ndk_path>
|
||||
|
||||
Android NDK path.
|
||||
|
||||
=item B<--ant = ant_tool_path>
|
||||
|
||||
Ant tool path.
|
||||
|
||||
=item B<--strip = strip_tool_path>
|
||||
|
||||
Android strip tool path, used to deploy qt libs.
|
||||
|
||||
=item B<--readelf = readelf_tool_path>
|
||||
|
||||
Android readelf tool path, used to check if a test application uses qt OpenGL.
|
||||
|
||||
=item B<-h --help>
|
||||
|
||||
Print a brief help message and exits.
|
||||
|
||||
=item B<--man>
|
||||
|
||||
Prints the manual page and exits.
|
||||
|
||||
=back
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
B<This program> will run all qt tests/benchmarks to an android device/emulator.
|
||||
|
||||
=cut
|
@ -1,330 +0,0 @@
|
||||
/*
|
||||
Copyright (c) 2012, BogDan Vatra <bogdan@kde.org>
|
||||
Contact: http://www.qt-project.org/legal
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. 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.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
||||
*/
|
||||
|
||||
package org.qtproject.qt5.android;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
|
||||
import org.qtproject.qt5.android.tests.R;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.res.Configuration;
|
||||
import android.graphics.Rect;
|
||||
import android.os.Bundle;
|
||||
import android.text.method.MetaKeyKeyListener;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.util.Log;
|
||||
import android.view.KeyCharacterMap;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
|
||||
public class QtActivity extends Activity {
|
||||
private int m_id =- 1;
|
||||
private boolean softwareKeyboardIsVisible = false;
|
||||
private long m_metaState;
|
||||
private int m_lastChar = 0;
|
||||
private boolean m_fullScreen = false;
|
||||
private boolean m_started = false;
|
||||
private QtSurface m_surface = null;
|
||||
private boolean m_usesGL = false;
|
||||
private void loadQtLibs(String[] libs, String environment, String params, String mainLib, String nativeLibDir) throws Exception
|
||||
{
|
||||
QtNative.loadQtLibraries(libs);
|
||||
// start application
|
||||
|
||||
final String envPaths = "NECESSITAS_API_LEVEL=2\tHOME=" + getDir("files", MODE_WORLD_WRITEABLE | MODE_WORLD_READABLE).getAbsolutePath() +
|
||||
"\tTMPDIR=" + getDir("files", MODE_WORLD_WRITEABLE | MODE_WORLD_READABLE).getAbsolutePath() +
|
||||
"\tCACHE_PATH=" + getDir("files", MODE_WORLD_WRITEABLE | MODE_WORLD_READABLE).getAbsolutePath();
|
||||
if (environment != null && environment.length() > 0)
|
||||
environment = envPaths + "\t" + environment;
|
||||
else
|
||||
environment = envPaths;
|
||||
|
||||
try {
|
||||
Thread.sleep(5000);
|
||||
} catch (InterruptedException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
QtNative.startApplication(params, environment, mainLib, nativeLibDir);
|
||||
m_surface.applicationStarted(m_usesGL);
|
||||
m_started = true;
|
||||
}
|
||||
|
||||
private boolean m_quitApp = true;
|
||||
private Process m_debuggerProcess = null; // debugger process
|
||||
|
||||
private void startApp(final boolean firstStart)
|
||||
{
|
||||
try {
|
||||
String qtLibs[] = getResources().getStringArray(R.array.qt_libs);
|
||||
ArrayList<String> libraryList = new ArrayList<String>();
|
||||
for (int i = 0; i < qtLibs.length; i++)
|
||||
libraryList.add("/data/local/tmp/qt/lib/lib" + qtLibs[i] + ".so");
|
||||
|
||||
String mainLib = null;
|
||||
String nativeLibDir = null;
|
||||
if (getIntent().getExtras() != null) {
|
||||
if (getIntent().getExtras().containsKey("extra_libs")) {
|
||||
String extra_libs = getIntent().getExtras().getString("extra_libs");
|
||||
for (String lib : extra_libs.split(":"))
|
||||
libraryList.add(lib);
|
||||
}
|
||||
if (getIntent().getExtras().containsKey("lib_name")) {
|
||||
mainLib = getIntent().getExtras().getString("lib_name");
|
||||
libraryList.add(mainLib);
|
||||
int slash = mainLib.lastIndexOf("/");
|
||||
if (slash >= 0) {
|
||||
nativeLibDir = mainLib.substring(0, slash+1);
|
||||
mainLib = mainLib.substring(slash+1+3, mainLib.length()-3); //remove lib and .so
|
||||
} else {
|
||||
nativeLibDir = "";
|
||||
}
|
||||
}
|
||||
|
||||
if (getIntent().getExtras().containsKey("needsOpenGl"))
|
||||
m_usesGL = getIntent().getExtras().getBoolean("needsOpenGl");
|
||||
} else {
|
||||
try {
|
||||
Thread.sleep(5000);
|
||||
} catch (InterruptedException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
finish();
|
||||
System.exit(0);
|
||||
}
|
||||
String[] libs = new String[libraryList.size()];
|
||||
libs = libraryList.toArray(libs);
|
||||
loadQtLibs(libs
|
||||
,"QT_QPA_EGLFS_HIDECURSOR=1\tQML2_IMPORT_PATH=/data/local/tmp/qt/qml\tQML_IMPORT_PATH=/data/local/tmp/qt/imports\tQT_PLUGIN_PATH=/data/local/tmp/qt/plugins"
|
||||
, "-xml\t-silent\t-o\toutput.xml", mainLib, nativeLibDir);
|
||||
} catch (Exception e) {
|
||||
Log.e(QtNative.QtTAG, "Can't create main activity", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
getDir("files", MODE_WORLD_WRITEABLE | MODE_WORLD_READABLE);
|
||||
requestWindowFeature(Window.FEATURE_NO_TITLE);
|
||||
m_quitApp = true;
|
||||
QtNative.setMainActivity(this);
|
||||
if (null == getLastNonConfigurationInstance()) {
|
||||
DisplayMetrics metrics = new DisplayMetrics();
|
||||
getWindowManager().getDefaultDisplay().getMetrics(metrics);
|
||||
QtNative.setApplicationDisplayMetrics(metrics.widthPixels, metrics.heightPixels,
|
||||
metrics.widthPixels, metrics.heightPixels,
|
||||
metrics.xdpi, metrics.ydpi);
|
||||
}
|
||||
m_surface = new QtSurface(this, m_id);
|
||||
setContentView(m_surface);
|
||||
if (null == getLastNonConfigurationInstance())
|
||||
startApp(true);
|
||||
}
|
||||
|
||||
public QtSurface getQtSurface()
|
||||
{
|
||||
return m_surface;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object onRetainNonConfigurationInstance()
|
||||
{
|
||||
super.onRetainNonConfigurationInstance();
|
||||
m_quitApp = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy()
|
||||
{
|
||||
QtNative.setMainActivity(null);
|
||||
super.onDestroy();
|
||||
if (m_quitApp) {
|
||||
Log.i(QtNative.QtTAG, "onDestroy");
|
||||
if (m_debuggerProcess != null)
|
||||
m_debuggerProcess.destroy();
|
||||
System.exit(0);// FIXME remove it or find a better way
|
||||
}
|
||||
QtNative.setMainActivity(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume()
|
||||
{
|
||||
// fire all lostActions
|
||||
synchronized (QtNative.m_mainActivityMutex) {
|
||||
Iterator<Runnable> itr = QtNative.getLostActions().iterator();
|
||||
while (itr.hasNext())
|
||||
runOnUiThread(itr.next());
|
||||
if (m_started) {
|
||||
QtNative.clearLostActions();
|
||||
QtNative.updateWindow();
|
||||
}
|
||||
}
|
||||
super.onResume();
|
||||
}
|
||||
|
||||
public void redrawWindow(int left, int top, int right, int bottom)
|
||||
{
|
||||
m_surface.drawBitmap(new Rect(left, top, right, bottom));
|
||||
}
|
||||
|
||||
public void setFullScreen(boolean enterFullScreen)
|
||||
{
|
||||
if (m_fullScreen == enterFullScreen)
|
||||
return;
|
||||
if (m_fullScreen = enterFullScreen)
|
||||
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
||||
else
|
||||
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSaveInstanceState(Bundle outState)
|
||||
{
|
||||
super.onSaveInstanceState(outState);
|
||||
outState.putBoolean("FullScreen", m_fullScreen);
|
||||
outState.putBoolean("Started", m_started);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onRestoreInstanceState(Bundle savedInstanceState)
|
||||
{
|
||||
super.onRestoreInstanceState(savedInstanceState);
|
||||
setFullScreen(savedInstanceState.getBoolean("FullScreen"));
|
||||
m_started = savedInstanceState.getBoolean("Started");
|
||||
if (m_started)
|
||||
m_surface.applicationStarted(true);
|
||||
}
|
||||
|
||||
public void showSoftwareKeyboard()
|
||||
{
|
||||
softwareKeyboardIsVisible = true;
|
||||
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
|
||||
}
|
||||
|
||||
public void resetSoftwareKeyboard()
|
||||
{
|
||||
}
|
||||
|
||||
public void hideSoftwareKeyboard()
|
||||
{
|
||||
if (softwareKeyboardIsVisible) {
|
||||
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
imm.toggleSoftInput(0, 0);
|
||||
}
|
||||
softwareKeyboardIsVisible = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean dispatchKeyEvent(KeyEvent event)
|
||||
{
|
||||
if (m_started && event.getAction() == KeyEvent.ACTION_MULTIPLE &&
|
||||
event.getCharacters() != null &&
|
||||
event.getCharacters().length() == 1 &&
|
||||
event.getKeyCode() == 0) {
|
||||
Log.i(QtNative.QtTAG, "dispatchKeyEvent at MULTIPLE with one character: " + event.getCharacters());
|
||||
QtNative.keyDown(0, event.getCharacters().charAt(0), event.getMetaState());
|
||||
QtNative.keyUp(0, event.getCharacters().charAt(0), event.getMetaState());
|
||||
}
|
||||
|
||||
return super.dispatchKeyEvent(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onKeyDown(int keyCode, KeyEvent event)
|
||||
{
|
||||
if (!m_started)
|
||||
return false;
|
||||
m_metaState = MetaKeyKeyListener.handleKeyDown(m_metaState, keyCode, event);
|
||||
int c = event.getUnicodeChar(MetaKeyKeyListener.getMetaState(m_metaState));
|
||||
int lc = c;
|
||||
m_metaState = MetaKeyKeyListener.adjustMetaAfterKeypress(m_metaState);
|
||||
|
||||
if ((c & KeyCharacterMap.COMBINING_ACCENT) != 0) {
|
||||
c = c & KeyCharacterMap.COMBINING_ACCENT_MASK;
|
||||
int composed = KeyEvent.getDeadChar(m_lastChar, c);
|
||||
c = composed;
|
||||
}
|
||||
m_lastChar = lc;
|
||||
if (keyCode != KeyEvent.KEYCODE_BACK)
|
||||
QtNative.keyDown(keyCode, c, event.getMetaState());
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onKeyUp(int keyCode, KeyEvent event)
|
||||
{
|
||||
if (!m_started)
|
||||
return false;
|
||||
m_metaState = MetaKeyKeyListener.handleKeyUp(m_metaState, keyCode, event);
|
||||
QtNative.keyUp(keyCode, event.getUnicodeChar(), event.getMetaState());
|
||||
return true;
|
||||
}
|
||||
|
||||
public void onConfigurationChanged(Configuration newConfig) {
|
||||
super.onConfigurationChanged(newConfig);
|
||||
}
|
||||
|
||||
/* public boolean onCreateOptionsMenu(Menu menu)
|
||||
{
|
||||
QtNative.createOptionsMenu(menu);
|
||||
try {
|
||||
return onPrepareOptionsMenu(menu);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean onPrepareOptionsMenu(Menu menu)
|
||||
{
|
||||
QtNative.prepareOptionsMenu(menu);
|
||||
try {
|
||||
return (Boolean) onPrepareOptionsMenu(menu);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean onOptionsItemSelected(MenuItem item)
|
||||
{
|
||||
return QtNative.optionsItemSelected(item.getGroupId(), item.getItemId());
|
||||
}*/
|
||||
}
|
@ -1,209 +0,0 @@
|
||||
/*
|
||||
Copyright (c) 2012, BogDan Vatra <bogdan@kde.org>
|
||||
Contact: http://www.qt-project.org/legal
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. 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.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
||||
*/
|
||||
|
||||
package org.qtproject.qt5.android;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.text.Editable;
|
||||
import android.text.InputFilter;
|
||||
import android.util.Log;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.View;
|
||||
import android.view.inputmethod.BaseInputConnection;
|
||||
import android.view.inputmethod.CompletionInfo;
|
||||
import android.view.inputmethod.ExtractedText;
|
||||
import android.view.inputmethod.ExtractedTextRequest;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
|
||||
class QtExtractedText
|
||||
{
|
||||
public int partialEndOffset;
|
||||
public int partialStartOffset;
|
||||
public int selectionEnd;
|
||||
public int selectionStart;
|
||||
public int startOffset;
|
||||
public String text;
|
||||
}
|
||||
|
||||
class QtNativeInputConnection
|
||||
{
|
||||
static native boolean commitText(String text, int newCursorPosition);
|
||||
static native boolean commitCompletion(String text, int position);
|
||||
static native boolean deleteSurroundingText(int leftLength, int rightLength);
|
||||
static native boolean finishComposingText();
|
||||
static native int getCursorCapsMode(int reqModes);
|
||||
static native QtExtractedText getExtractedText(int hintMaxChars, int hintMaxLines, int flags);
|
||||
static native String getSelectedText(int flags);
|
||||
static native String getTextAfterCursor(int length, int flags);
|
||||
static native String getTextBeforeCursor(int length, int flags);
|
||||
static native boolean setComposingText(String text, int newCursorPosition);
|
||||
static native boolean setSelection(int start, int end);
|
||||
static native boolean selectAll();
|
||||
static native boolean cut();
|
||||
static native boolean copy();
|
||||
static native boolean copyURL();
|
||||
static native boolean paste();
|
||||
}
|
||||
|
||||
public class QtInputConnection extends BaseInputConnection
|
||||
{
|
||||
private static final int ID_SELECT_ALL = android.R.id.selectAll;
|
||||
private static final int ID_START_SELECTING_TEXT = android.R.id.startSelectingText;
|
||||
private static final int ID_STOP_SELECTING_TEXT = android.R.id.stopSelectingText;
|
||||
private static final int ID_CUT = android.R.id.cut;
|
||||
private static final int ID_COPY = android.R.id.copy;
|
||||
private static final int ID_PASTE = android.R.id.paste;
|
||||
private static final int ID_COPY_URL = android.R.id.copyUrl;
|
||||
private static final int ID_SWITCH_INPUT_METHOD = android.R.id.switchInputMethod;
|
||||
private static final int ID_ADD_TO_DICTIONARY = android.R.id.addToDictionary;
|
||||
View m_view;
|
||||
|
||||
public QtInputConnection(View targetView)
|
||||
{
|
||||
super(targetView, true);
|
||||
m_view = targetView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean beginBatchEdit()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean endBatchEdit()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean commitCompletion(CompletionInfo text)
|
||||
{
|
||||
return QtNativeInputConnection.commitCompletion(text.getText().toString(), text.getPosition());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean commitText(CharSequence text, int newCursorPosition)
|
||||
{
|
||||
return QtNativeInputConnection.commitText(text.toString(), newCursorPosition);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean deleteSurroundingText(int leftLength, int rightLength)
|
||||
{
|
||||
return QtNativeInputConnection.deleteSurroundingText(leftLength, rightLength);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean finishComposingText()
|
||||
{
|
||||
return QtNativeInputConnection.finishComposingText();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCursorCapsMode(int reqModes)
|
||||
{
|
||||
return QtNativeInputConnection.getCursorCapsMode(reqModes);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ExtractedText getExtractedText(ExtractedTextRequest request, int flags)
|
||||
{
|
||||
QtExtractedText qExtractedText = QtNativeInputConnection.getExtractedText(request.hintMaxChars, request.hintMaxLines, flags);
|
||||
ExtractedText extractedText = new ExtractedText();
|
||||
extractedText.partialEndOffset = qExtractedText.partialEndOffset;
|
||||
extractedText.partialStartOffset = qExtractedText.partialStartOffset;
|
||||
extractedText.selectionEnd = qExtractedText.selectionEnd;
|
||||
extractedText.selectionStart = qExtractedText.selectionStart;
|
||||
extractedText.startOffset = qExtractedText.startOffset;
|
||||
extractedText.text = qExtractedText.text;
|
||||
return extractedText;
|
||||
}
|
||||
|
||||
public CharSequence getSelectedText(int flags)
|
||||
{
|
||||
return QtNativeInputConnection.getSelectedText(flags);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence getTextAfterCursor(int length, int flags)
|
||||
{
|
||||
return QtNativeInputConnection.getTextAfterCursor(length, flags);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence getTextBeforeCursor(int length, int flags)
|
||||
{
|
||||
return QtNativeInputConnection.getTextBeforeCursor(length, flags);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean performContextMenuAction(int id)
|
||||
{
|
||||
switch (id) {
|
||||
case ID_SELECT_ALL:
|
||||
return QtNativeInputConnection.selectAll();
|
||||
case ID_COPY:
|
||||
return QtNativeInputConnection.copy();
|
||||
case ID_COPY_URL:
|
||||
return QtNativeInputConnection.copyURL();
|
||||
case ID_CUT:
|
||||
return QtNativeInputConnection.cut();
|
||||
case ID_PASTE:
|
||||
return QtNativeInputConnection.paste();
|
||||
|
||||
case ID_SWITCH_INPUT_METHOD:
|
||||
InputMethodManager imm = (InputMethodManager)m_view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
if (imm != null) {
|
||||
imm.showInputMethodPicker();
|
||||
}
|
||||
return true;
|
||||
|
||||
case ID_ADD_TO_DICTIONARY:
|
||||
// TODO
|
||||
// String word = m_editable.subSequence(0, m_editable.length()).toString();
|
||||
// if (word != null) {
|
||||
// Intent i = new Intent("com.android.settings.USER_DICTIONARY_INSERT");
|
||||
// i.putExtra("word", word);
|
||||
// i.setFlags(i.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
// m_view.getContext().startActivity(i);
|
||||
// }
|
||||
return true;
|
||||
}
|
||||
return super.performContextMenuAction(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setComposingText(CharSequence text, int newCursorPosition) {
|
||||
return QtNativeInputConnection.setComposingText(text.toString(), newCursorPosition);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setSelection(int start, int end) {
|
||||
return QtNativeInputConnection.setSelection(start, end);
|
||||
}
|
||||
}
|
@ -1,471 +0,0 @@
|
||||
/*
|
||||
Copyright (c) 2012, BogDan Vatra <bogdan@kde.org>
|
||||
Contact: http://www.qt-project.org/legal
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. 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.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
||||
*/
|
||||
|
||||
package org.qtproject.qt5.android;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.Application;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.util.Log;
|
||||
import android.view.ContextMenu;
|
||||
import android.view.Menu;
|
||||
import android.view.MotionEvent;
|
||||
|
||||
public class QtNative extends Application
|
||||
{
|
||||
private static QtActivity m_mainActivity = null;
|
||||
private static QtSurface m_mainView = null;
|
||||
public static Object m_mainActivityMutex = new Object(); // mutex used to synchronize runnable operations
|
||||
|
||||
public static final String QtTAG = "Qt JAVA"; // string used for Log.x
|
||||
private static ArrayList<Runnable> m_lostActions = new ArrayList<Runnable>(); // a list containing all actions which could not be performed (e.g. the main activity is destroyed, etc.)
|
||||
private static boolean m_started = false;
|
||||
private static int m_displayMetricsScreenWidthPixels = 0;
|
||||
private static int m_displayMetricsScreenHeightPixels = 0;
|
||||
private static int m_displayMetricsDesktopWidthPixels = 0;
|
||||
private static int m_displayMetricsDesktopHeightPixels = 0;
|
||||
private static double m_displayMetricsXDpi = .0;
|
||||
private static double m_displayMetricsYDpi = .0;
|
||||
private static int m_oldx, m_oldy;
|
||||
private static final int m_moveThreshold = 0;
|
||||
|
||||
public static ClassLoader classLoader()
|
||||
{
|
||||
return m_mainActivity.getClassLoader();
|
||||
}
|
||||
|
||||
public static Activity activity()
|
||||
{
|
||||
return m_mainActivity;
|
||||
}
|
||||
|
||||
public static QtSurface mainView()
|
||||
{
|
||||
return m_mainView;
|
||||
}
|
||||
|
||||
public static void openURL(String url)
|
||||
{
|
||||
Uri uri = Uri.parse(url);
|
||||
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
|
||||
activity().startActivity(intent);
|
||||
}
|
||||
|
||||
// this method loads full path libs
|
||||
public static void loadQtLibraries(String[] libraries)
|
||||
{
|
||||
if (libraries == null)
|
||||
return;
|
||||
|
||||
for (int i = 0; i < libraries.length; i++) {
|
||||
try {
|
||||
File f = new File(libraries[i]);
|
||||
if (f.exists())
|
||||
System.load(libraries[i]);
|
||||
} catch (SecurityException e) {
|
||||
Log.i(QtTAG, "Can't load '" + libraries[i] + "'", e);
|
||||
} catch (Exception e) {
|
||||
Log.i(QtTAG, "Can't load '" + libraries[i] + "'", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// this method loads bundled libs by name.
|
||||
public static void loadBundledLibraries(String[] libraries)
|
||||
{
|
||||
for (int i = 0; i < libraries.length; i++) {
|
||||
try {
|
||||
System.loadLibrary(libraries[i]);
|
||||
} catch (UnsatisfiedLinkError e) {
|
||||
Log.i(QtTAG, "Can't load '" + libraries[i] + "'", e);
|
||||
} catch (SecurityException e) {
|
||||
Log.i(QtTAG, "Can't load '" + libraries[i] + "'", e);
|
||||
} catch (Exception e) {
|
||||
Log.i(QtTAG, "Can't load '" + libraries[i] + "'", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void setMainActivity(QtActivity qtMainActivity)
|
||||
{
|
||||
synchronized (m_mainActivityMutex) {
|
||||
m_mainActivity = qtMainActivity;
|
||||
}
|
||||
}
|
||||
public static void setMainView(QtSurface qtSurface)
|
||||
{
|
||||
synchronized (m_mainActivityMutex) {
|
||||
m_mainView = qtSurface;
|
||||
}
|
||||
}
|
||||
|
||||
static public ArrayList<Runnable> getLostActions()
|
||||
{
|
||||
return m_lostActions;
|
||||
}
|
||||
|
||||
static public void clearLostActions()
|
||||
{
|
||||
m_lostActions.clear();
|
||||
}
|
||||
|
||||
private static boolean runAction(Runnable action)
|
||||
{
|
||||
synchronized (m_mainActivityMutex) {
|
||||
if (m_mainActivity == null)
|
||||
m_lostActions.add(action);
|
||||
else
|
||||
m_mainActivity.runOnUiThread(action);
|
||||
return m_mainActivity != null;
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean startApplication(String params, String environment, String mainLibrary, String nativeLibraryDir) throws Exception
|
||||
{
|
||||
File f = new File(nativeLibraryDir+"lib"+mainLibrary+".so");
|
||||
if (!f.exists())
|
||||
throw new Exception("Can't find main library '" + mainLibrary + "'");
|
||||
|
||||
if (params == null)
|
||||
params = "-platform\tandroid";
|
||||
|
||||
boolean res = false;
|
||||
synchronized (m_mainActivityMutex) {
|
||||
res = startQtAndroidPlugin();
|
||||
setDisplayMetrics(m_displayMetricsScreenWidthPixels,
|
||||
m_displayMetricsScreenHeightPixels,
|
||||
m_displayMetricsDesktopWidthPixels,
|
||||
m_displayMetricsDesktopHeightPixels,
|
||||
m_displayMetricsXDpi,
|
||||
m_displayMetricsYDpi,
|
||||
1.0);
|
||||
startQtApplication(f.getAbsolutePath()+"\t"+params, environment);
|
||||
m_started = true;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
public static void setApplicationDisplayMetrics(int screenWidthPixels,
|
||||
int screenHeightPixels, int desktopWidthPixels,
|
||||
int desktopHeightPixels, double XDpi, double YDpi)
|
||||
{
|
||||
/* Fix buggy dpi report */
|
||||
if (XDpi < android.util.DisplayMetrics.DENSITY_LOW)
|
||||
XDpi = android.util.DisplayMetrics.DENSITY_LOW;
|
||||
if (YDpi < android.util.DisplayMetrics.DENSITY_LOW)
|
||||
YDpi = android.util.DisplayMetrics.DENSITY_LOW;
|
||||
|
||||
synchronized (m_mainActivityMutex) {
|
||||
if (m_started) {
|
||||
setDisplayMetrics(screenWidthPixels, screenHeightPixels, desktopWidthPixels, desktopHeightPixels, XDpi, YDpi, 1.0);
|
||||
} else {
|
||||
m_displayMetricsScreenWidthPixels = screenWidthPixels;
|
||||
m_displayMetricsScreenHeightPixels = screenHeightPixels;
|
||||
m_displayMetricsDesktopWidthPixels = desktopWidthPixels;
|
||||
m_displayMetricsDesktopHeightPixels = desktopHeightPixels;
|
||||
m_displayMetricsXDpi = XDpi;
|
||||
m_displayMetricsYDpi = YDpi;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void pauseApplication()
|
||||
{
|
||||
synchronized (m_mainActivityMutex) {
|
||||
if (m_started)
|
||||
pauseQtApp();
|
||||
}
|
||||
}
|
||||
|
||||
public static void resumeApplication()
|
||||
{
|
||||
synchronized (m_mainActivityMutex) {
|
||||
if (m_started) {
|
||||
resumeQtApp();
|
||||
updateWindow();
|
||||
}
|
||||
}
|
||||
}
|
||||
// application methods
|
||||
public static native void startQtApplication(String params, String env);
|
||||
public static native void pauseQtApp();
|
||||
public static native void resumeQtApp();
|
||||
public static native boolean startQtAndroidPlugin();
|
||||
public static native void quitQtAndroidPlugin();
|
||||
public static native void terminateQt();
|
||||
// application methods
|
||||
|
||||
private static void quitApp()
|
||||
{
|
||||
m_mainActivity.finish();
|
||||
}
|
||||
|
||||
private static void redrawSurface(final int left, final int top, final int right, final int bottom )
|
||||
{
|
||||
runAction(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
m_mainActivity.redrawWindow(left, top, right, bottom);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTerminate()
|
||||
{
|
||||
if (m_started)
|
||||
terminateQt();
|
||||
super.onTerminate();
|
||||
}
|
||||
|
||||
|
||||
static public void sendTouchEvent(MotionEvent event, int id)
|
||||
{
|
||||
switch (event.getAction()) {
|
||||
case MotionEvent.ACTION_UP:
|
||||
mouseUp(id,(int) event.getX(), (int) event.getY());
|
||||
break;
|
||||
|
||||
case MotionEvent.ACTION_DOWN:
|
||||
mouseDown(id,(int) event.getX(), (int) event.getY());
|
||||
m_oldx = (int) event.getX();
|
||||
m_oldy = (int) event.getY();
|
||||
break;
|
||||
|
||||
case MotionEvent.ACTION_MOVE:
|
||||
int dx = (int) (event.getX() - m_oldx);
|
||||
int dy = (int) (event.getY() - m_oldy);
|
||||
if (Math.abs(dx) > m_moveThreshold || Math.abs(dy) > m_moveThreshold) {
|
||||
mouseMove(id,(int) event.getX(), (int) event.getY());
|
||||
m_oldx = (int) event.getX();
|
||||
m_oldy = (int) event.getY();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static public void sendTrackballEvent(MotionEvent event, int id)
|
||||
{
|
||||
switch (event.getAction()) {
|
||||
case MotionEvent.ACTION_UP:
|
||||
mouseUp(id, (int) event.getX(), (int) event.getY());
|
||||
break;
|
||||
|
||||
case MotionEvent.ACTION_DOWN:
|
||||
mouseDown(id, (int) event.getX(), (int) event.getY());
|
||||
m_oldx = (int) event.getX();
|
||||
m_oldy = (int) event.getY();
|
||||
break;
|
||||
|
||||
case MotionEvent.ACTION_MOVE:
|
||||
int dx = (int) (event.getX() - m_oldx);
|
||||
int dy = (int) (event.getY() - m_oldy);
|
||||
if (Math.abs(dx) > 5 || Math.abs(dy) > 5) {
|
||||
mouseMove(id, (int) event.getX(), (int) event.getY());
|
||||
m_oldx = (int) event.getX();
|
||||
m_oldy = (int) event.getY();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private static void updateSelection(final int selStart, final int selEnd, final int candidatesStart, final int candidatesEnd)
|
||||
{
|
||||
}
|
||||
|
||||
private static void showSoftwareKeyboard(final int x, final int y
|
||||
, final int width, final int height
|
||||
, final int inputHints )
|
||||
{
|
||||
runAction(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
m_mainActivity.showSoftwareKeyboard();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static void resetSoftwareKeyboard()
|
||||
{
|
||||
runAction(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
m_mainActivity.resetSoftwareKeyboard();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static void hideSoftwareKeyboard()
|
||||
{
|
||||
runAction(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
m_mainActivity.hideSoftwareKeyboard();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static boolean isSoftwareKeyboardVisible()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
private static void setFullScreen(final boolean fullScreen)
|
||||
{
|
||||
runAction(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
m_mainActivity.setFullScreen(fullScreen);
|
||||
updateWindow();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static void registerClipboardManager()
|
||||
{
|
||||
}
|
||||
|
||||
private static void setClipboardText(String text)
|
||||
{
|
||||
}
|
||||
|
||||
private static boolean hasClipboardText()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
private static String getClipboardText()
|
||||
{
|
||||
return "Qt";
|
||||
}
|
||||
|
||||
private static void openContextMenu()
|
||||
{
|
||||
}
|
||||
|
||||
private static void closeContextMenu()
|
||||
{
|
||||
}
|
||||
|
||||
private static void resetOptionsMenu()
|
||||
{
|
||||
}
|
||||
|
||||
// screen methods
|
||||
public static native void setDisplayMetrics(int screenWidthPixels,
|
||||
int screenHeightPixels,
|
||||
int desktopWidthPixels,
|
||||
int desktopHeightPixels,
|
||||
double XDpi,
|
||||
double YDpi,
|
||||
double scaledDensity);
|
||||
public static native void handleOrientationChanged(int newOrientation);
|
||||
// screen methods
|
||||
|
||||
private static void showOptionsMenu()
|
||||
{
|
||||
runAction(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (m_mainActivity != null)
|
||||
m_mainActivity.openOptionsMenu();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static void hideOptionsMenu()
|
||||
{
|
||||
runAction(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (m_mainActivity != null)
|
||||
m_mainActivity.closeOptionsMenu();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static void showContextMenu()
|
||||
{
|
||||
runAction(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (m_mainActivity != null)
|
||||
m_mainActivity.openContextMenu(m_mainView);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static void hideContextMenu()
|
||||
{
|
||||
runAction(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (m_mainActivity != null)
|
||||
m_mainActivity.closeContextMenu();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// pointer methods
|
||||
public static native void mouseDown(int winId, int x, int y);
|
||||
public static native void mouseUp(int winId, int x, int y);
|
||||
public static native void mouseMove(int winId, int x, int y);
|
||||
public static native void touchBegin(int winId);
|
||||
public static native void touchAdd(int winId, int pointerId, int action, boolean primary, int x, int y, float size, float pressure);
|
||||
public static native void touchEnd(int winId, int action);
|
||||
public static native void longPress(int winId, int x, int y);
|
||||
// pointer methods
|
||||
|
||||
// keyboard methods
|
||||
public static native void keyDown(int key, int unicode, int modifier);
|
||||
public static native void keyUp(int key, int unicode, int modifier);
|
||||
// keyboard methods
|
||||
|
||||
// surface methods
|
||||
public static native void destroySurface();
|
||||
public static native void setSurface(Object surface);
|
||||
public static native void lockSurface();
|
||||
public static native void unlockSurface();
|
||||
// surface methods
|
||||
|
||||
// window methods
|
||||
public static native void updateWindow();
|
||||
// window methods
|
||||
|
||||
// menu methods
|
||||
public static native boolean onPrepareOptionsMenu(Menu menu);
|
||||
public static native boolean onOptionsItemSelected(int itemId, boolean checked);
|
||||
public static native void onOptionsMenuClosed(Menu menu);
|
||||
|
||||
public static native void onCreateContextMenu(ContextMenu menu);
|
||||
public static native boolean onContextItemSelected(int itemId, boolean checked);
|
||||
public static native void onContextMenuClosed(Menu menu);
|
||||
// menu methods
|
||||
}
|
@ -1,163 +0,0 @@
|
||||
/*
|
||||
Copyright (c) 2012, BogDan Vatra <bogdan@kde.org>
|
||||
Contact: http://www.qt-project.org/legal
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. 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.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
||||
*/
|
||||
|
||||
package org.qtproject.qt5.android;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.PixelFormat;
|
||||
import android.graphics.Rect;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.util.Log;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.SurfaceHolder;
|
||||
import android.view.SurfaceView;
|
||||
|
||||
public class QtSurface extends SurfaceView implements SurfaceHolder.Callback
|
||||
{
|
||||
private Bitmap m_bitmap=null;
|
||||
private boolean m_started = false;
|
||||
private boolean m_usesGL = false;
|
||||
public QtSurface(Context context, int id)
|
||||
{
|
||||
super(context);
|
||||
setFocusable(true);
|
||||
getHolder().addCallback(this);
|
||||
getHolder().setType(SurfaceHolder.SURFACE_TYPE_GPU);
|
||||
setId(id);
|
||||
}
|
||||
|
||||
public void applicationStarted(boolean usesGL)
|
||||
{
|
||||
m_started = true;
|
||||
m_usesGL = usesGL;
|
||||
if (getWidth() < 1 || getHeight() < 1)
|
||||
return;
|
||||
if (m_usesGL) {
|
||||
QtNative.setSurface(getHolder().getSurface());
|
||||
} else {
|
||||
QtNative.lockSurface();
|
||||
QtNative.setSurface(null);
|
||||
m_bitmap=Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.RGB_565);
|
||||
QtNative.setSurface(m_bitmap);
|
||||
QtNative.unlockSurface();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void surfaceCreated(SurfaceHolder holder)
|
||||
{
|
||||
DisplayMetrics metrics = new DisplayMetrics();
|
||||
((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(metrics);
|
||||
QtNative.setApplicationDisplayMetrics(metrics.widthPixels,
|
||||
metrics.heightPixels, getWidth(), getHeight(), metrics.xdpi, metrics.ydpi);
|
||||
|
||||
if (m_usesGL)
|
||||
holder.setFormat(PixelFormat.RGBA_8888);
|
||||
else
|
||||
holder.setFormat(PixelFormat.RGB_565);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
|
||||
{
|
||||
Log.i(QtNative.QtTAG,"surfaceChanged: "+width+","+height);
|
||||
if (width < 1 || height < 1)
|
||||
return;
|
||||
|
||||
DisplayMetrics metrics = new DisplayMetrics();
|
||||
((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(metrics);
|
||||
QtNative.setApplicationDisplayMetrics(metrics.widthPixels,
|
||||
metrics.heightPixels, width, height, metrics.xdpi, metrics.ydpi);
|
||||
|
||||
if (!m_started)
|
||||
return;
|
||||
|
||||
if (m_usesGL) {
|
||||
QtNative.setSurface(holder.getSurface());
|
||||
} else {
|
||||
QtNative.lockSurface();
|
||||
QtNative.setSurface(null);
|
||||
m_bitmap=Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
|
||||
QtNative.setSurface(m_bitmap);
|
||||
QtNative.unlockSurface();
|
||||
QtNative.updateWindow();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void surfaceDestroyed(SurfaceHolder holder)
|
||||
{
|
||||
Log.i(QtNative.QtTAG,"surfaceDestroyed ");
|
||||
if (m_usesGL) {
|
||||
QtNative.destroySurface();
|
||||
} else {
|
||||
if (!m_started)
|
||||
return;
|
||||
|
||||
QtNative.lockSurface();
|
||||
QtNative.setSurface(null);
|
||||
QtNative.unlockSurface();
|
||||
}
|
||||
}
|
||||
|
||||
public void drawBitmap(Rect rect)
|
||||
{
|
||||
if (!m_started)
|
||||
return;
|
||||
QtNative.lockSurface();
|
||||
if (null != m_bitmap) {
|
||||
try {
|
||||
Canvas cv=getHolder().lockCanvas(rect);
|
||||
cv.drawBitmap(m_bitmap, rect, rect, null);
|
||||
getHolder().unlockCanvasAndPost(cv);
|
||||
} catch (Exception e) {
|
||||
Log.e(QtNative.QtTAG, "Can't create main activity", e);
|
||||
}
|
||||
}
|
||||
QtNative.unlockSurface();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent event)
|
||||
{
|
||||
if (!m_started)
|
||||
return false;
|
||||
QtNative.sendTouchEvent(event, getId());
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTrackballEvent(MotionEvent event)
|
||||
{
|
||||
if (!m_started)
|
||||
return false;
|
||||
QtNative.sendTrackballEvent(event, getId());
|
||||
return true;
|
||||
}
|
||||
}
|
@ -24,9 +24,18 @@ ios: SUBDIRS = corelib gui
|
||||
wince*: SUBDIRS -= printsupport
|
||||
cross_compile: SUBDIRS -= tools
|
||||
!qtHaveModule(opengl): SUBDIRS -= opengl
|
||||
!unix|embedded|!qtHaveModule(dbus): SUBDIRS -= dbus
|
||||
!qtHaveModule(gui): SUBDIRS -= gui cmake
|
||||
!qtHaveModule(widgets): SUBDIRS -= widgets
|
||||
!qtHaveModule(printsupport): SUBDIRS -= printsupport
|
||||
!qtHaveModule(concurrent): SUBDIRS -= concurrent
|
||||
!qtHaveModule(network): SUBDIRS -= network
|
||||
|
||||
# Disable the QtDBus tests if we can't connect to the session bus
|
||||
qtHaveModule(dbus) {
|
||||
!system("dbus-send --type=signal / local.AutotestCheck.Hello"): {
|
||||
warning("QtDBus is enabled but session bus is not available. Please check the installation.")
|
||||
SUBDIRS -= dbus
|
||||
}
|
||||
} else {
|
||||
SUBDIRS -= dbus
|
||||
}
|
||||
|
@ -39,8 +39,12 @@
|
||||
|
||||
#include <private/qabstractanimation_p.h>
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
static const char winTimerError[] = "On windows, consistent timing is not working properly due to bad timer resolution";
|
||||
#if defined(Q_OS_WIN) || defined(Q_OS_ANDROID)
|
||||
# define BAD_TIMER_RESOLUTION
|
||||
#endif
|
||||
|
||||
#ifdef BAD_TIMER_RESOLUTION
|
||||
static const char timerError[] = "On this platform, consistent timing is not working properly due to bad timer resolution";
|
||||
#endif
|
||||
|
||||
class TestablePauseAnimation : public QPauseAnimation
|
||||
@ -140,17 +144,17 @@ void tst_QPauseAnimation::noTimerUpdates()
|
||||
animation.start();
|
||||
QTest::qWait(animation.totalDuration() + 100);
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
#ifdef BAD_TIMER_RESOLUTION
|
||||
if (animation.state() != QAbstractAnimation::Stopped)
|
||||
QEXPECT_FAIL("", winTimerError, Abort);
|
||||
QEXPECT_FAIL("", timerError, Abort);
|
||||
#endif
|
||||
|
||||
QVERIFY(animation.state() == QAbstractAnimation::Stopped);
|
||||
const int expectedLoopCount = 1 + loopCount;
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
#ifdef BAD_TIMER_RESOLUTION
|
||||
if (animation.m_updateCurrentTimeCount != expectedLoopCount)
|
||||
QEXPECT_FAIL("", winTimerError, Abort);
|
||||
QEXPECT_FAIL("", timerError, Abort);
|
||||
#endif
|
||||
QCOMPARE(animation.m_updateCurrentTimeCount, expectedLoopCount);
|
||||
}
|
||||
@ -169,41 +173,41 @@ void tst_QPauseAnimation::multiplePauseAnimations()
|
||||
animation2.start();
|
||||
QTest::qWait(animation.totalDuration() + 100);
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
#ifdef BAD_TIMER_RESOLUTION
|
||||
if (animation.state() != QAbstractAnimation::Stopped)
|
||||
QEXPECT_FAIL("", winTimerError, Abort);
|
||||
QEXPECT_FAIL("", timerError, Abort);
|
||||
#endif
|
||||
QVERIFY(animation.state() == QAbstractAnimation::Stopped);
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
#ifdef BAD_TIMER_RESOLUTION
|
||||
if (animation2.state() != QAbstractAnimation::Running)
|
||||
QEXPECT_FAIL("", winTimerError, Abort);
|
||||
QEXPECT_FAIL("", timerError, Abort);
|
||||
#endif
|
||||
QVERIFY(animation2.state() == QAbstractAnimation::Running);
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
#ifdef BAD_TIMER_RESOLUTION
|
||||
if (animation.m_updateCurrentTimeCount != 2)
|
||||
QEXPECT_FAIL("", winTimerError, Abort);
|
||||
QEXPECT_FAIL("", timerError, Abort);
|
||||
#endif
|
||||
QCOMPARE(animation.m_updateCurrentTimeCount, 2);
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
#ifdef BAD_TIMER_RESOLUTION
|
||||
if (animation2.m_updateCurrentTimeCount != 2)
|
||||
QEXPECT_FAIL("", winTimerError, Abort);
|
||||
QEXPECT_FAIL("", timerError, Abort);
|
||||
#endif
|
||||
QCOMPARE(animation2.m_updateCurrentTimeCount, 2);
|
||||
|
||||
QTest::qWait(550);
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
#ifdef BAD_TIMER_RESOLUTION
|
||||
if (animation2.state() != QAbstractAnimation::Stopped)
|
||||
QEXPECT_FAIL("", winTimerError, Abort);
|
||||
QEXPECT_FAIL("", timerError, Abort);
|
||||
#endif
|
||||
QVERIFY(animation2.state() == QAbstractAnimation::Stopped);
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
#ifdef BAD_TIMER_RESOLUTION
|
||||
if (animation2.m_updateCurrentTimeCount != 3)
|
||||
QEXPECT_FAIL("", winTimerError, Abort);
|
||||
QEXPECT_FAIL("", timerError, Abort);
|
||||
#endif
|
||||
QCOMPARE(animation2.m_updateCurrentTimeCount, 3);
|
||||
}
|
||||
@ -232,9 +236,9 @@ void tst_QPauseAnimation::pauseAndPropertyAnimations()
|
||||
|
||||
QTest::qWait(animation.totalDuration() + 100);
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
#ifdef BAD_TIMER_RESOLUTION
|
||||
if (animation.state() != QAbstractAnimation::Stopped)
|
||||
QEXPECT_FAIL("", winTimerError, Abort);
|
||||
QEXPECT_FAIL("", timerError, Abort);
|
||||
#endif
|
||||
QVERIFY(animation.state() == QAbstractAnimation::Stopped);
|
||||
QVERIFY(pause.state() == QAbstractAnimation::Stopped);
|
||||
@ -253,9 +257,9 @@ void tst_QPauseAnimation::pauseResume()
|
||||
animation.start();
|
||||
QTRY_COMPARE(animation.state(), QAbstractAnimation::Stopped);
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
#ifdef BAD_TIMER_RESOLUTION
|
||||
if (animation.m_updateCurrentTimeCount < 3)
|
||||
QEXPECT_FAIL("", winTimerError, Abort);
|
||||
QEXPECT_FAIL("", timerError, Abort);
|
||||
#endif
|
||||
QVERIFY2(animation.m_updateCurrentTimeCount >= 3, qPrintable(
|
||||
QString::fromLatin1("animation.m_updateCurrentTimeCount = %1").arg(animation.m_updateCurrentTimeCount)));
|
||||
@ -408,39 +412,39 @@ void tst_QPauseAnimation::multipleSequentialGroups()
|
||||
// measure...
|
||||
QTest::qWait(group.totalDuration() + 500);
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
#ifdef BAD_TIMER_RESOLUTION
|
||||
if (group.state() != QAbstractAnimation::Stopped)
|
||||
QEXPECT_FAIL("", winTimerError, Abort);
|
||||
QEXPECT_FAIL("", timerError, Abort);
|
||||
#endif
|
||||
QVERIFY(group.state() == QAbstractAnimation::Stopped);
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
#ifdef BAD_TIMER_RESOLUTION
|
||||
if (subgroup1.state() != QAbstractAnimation::Stopped)
|
||||
QEXPECT_FAIL("", winTimerError, Abort);
|
||||
QEXPECT_FAIL("", timerError, Abort);
|
||||
#endif
|
||||
QVERIFY(subgroup1.state() == QAbstractAnimation::Stopped);
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
#ifdef BAD_TIMER_RESOLUTION
|
||||
if (subgroup2.state() != QAbstractAnimation::Stopped)
|
||||
QEXPECT_FAIL("", winTimerError, Abort);
|
||||
QEXPECT_FAIL("", timerError, Abort);
|
||||
#endif
|
||||
QVERIFY(subgroup2.state() == QAbstractAnimation::Stopped);
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
#ifdef BAD_TIMER_RESOLUTION
|
||||
if (subgroup3.state() != QAbstractAnimation::Stopped)
|
||||
QEXPECT_FAIL("", winTimerError, Abort);
|
||||
QEXPECT_FAIL("", timerError, Abort);
|
||||
#endif
|
||||
QVERIFY(subgroup3.state() == QAbstractAnimation::Stopped);
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
#ifdef BAD_TIMER_RESOLUTION
|
||||
if (subgroup4.state() != QAbstractAnimation::Stopped)
|
||||
QEXPECT_FAIL("", winTimerError, Abort);
|
||||
QEXPECT_FAIL("", timerError, Abort);
|
||||
#endif
|
||||
QVERIFY(subgroup4.state() == QAbstractAnimation::Stopped);
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
#ifdef BAD_TIMER_RESOLUTION
|
||||
if (pause5.m_updateCurrentTimeCount != 4)
|
||||
QEXPECT_FAIL("", winTimerError, Abort);
|
||||
QEXPECT_FAIL("", timerError, Abort);
|
||||
#endif
|
||||
QCOMPARE(pause5.m_updateCurrentTimeCount, 4);
|
||||
}
|
||||
|
@ -40,6 +40,9 @@
|
||||
class tst_qmessagehandler : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
tst_qmessagehandler();
|
||||
|
||||
public slots:
|
||||
void initTestCase();
|
||||
|
||||
@ -92,6 +95,12 @@ void customMsgHandler(QtMsgType type, const char *msg)
|
||||
s_message = QString::fromLocal8Bit(msg);
|
||||
}
|
||||
|
||||
tst_qmessagehandler::tst_qmessagehandler()
|
||||
{
|
||||
// ensure it's unset, otherwise we'll have trouble
|
||||
qputenv("QT_MESSAGE_PATTERN", "");
|
||||
}
|
||||
|
||||
void tst_qmessagehandler::initTestCase()
|
||||
{
|
||||
m_appDir = QFINDTESTDATA("app");
|
||||
@ -756,6 +765,12 @@ void tst_qmessagehandler::qMessagePattern_data()
|
||||
<< "A DEBUG qDebug "
|
||||
<< "A qWarning ");
|
||||
|
||||
QTest::newRow("pid") << "%{pid}: %{message}"
|
||||
<< true << QList<QByteArray>(); // can't match anything, just test validity
|
||||
QTest::newRow("threadid") << "ThreadId:%{threadid}: %{message}"
|
||||
<< true << (QList<QByteArray>()
|
||||
<< "ThreadId:0x");
|
||||
|
||||
// This test won't work when midnight is too close... wait a bit
|
||||
while (QTime::currentTime() > QTime(23, 59, 30))
|
||||
QTest::qWait(10000);
|
||||
@ -811,6 +826,7 @@ void tst_qmessagehandler::qMessagePattern()
|
||||
process.start(appExe);
|
||||
QVERIFY2(process.waitForStarted(), qPrintable(
|
||||
QString::fromLatin1("Could not start %1: %2").arg(appExe, process.errorString())));
|
||||
QByteArray pid = QByteArray::number(process.processId());
|
||||
process.waitForFinished();
|
||||
|
||||
QByteArray output = process.readAllStandardError();
|
||||
@ -825,6 +841,8 @@ void tst_qmessagehandler::qMessagePattern()
|
||||
QVERIFY(output.contains(e));
|
||||
}
|
||||
}
|
||||
if (pattern.startsWith("%{pid}"))
|
||||
QVERIFY2(output.startsWith('"' + pid), "PID: " + pid + "\noutput:\n" + output);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
44
tests/auto/corelib/io/qdir/android_testdata.qrc
Normal file
44
tests/auto/corelib/io/qdir/android_testdata.qrc
Normal file
@ -0,0 +1,44 @@
|
||||
<RCC>
|
||||
<qresource prefix="/android_testdata">
|
||||
<file>tst_qdir.cpp</file>
|
||||
<file>entrylist/file</file>
|
||||
<file>entrylist/directory/dummy</file>
|
||||
<file>searchdir/subdir1/picker.png</file>
|
||||
<file>searchdir/subdir2/picker.png</file>
|
||||
<file>testData/empty</file>
|
||||
<file>testdir/dir/tmp/empty</file>
|
||||
<file>testdir/dir/qdir.pro</file>
|
||||
<file>testdir/dir/qrc_qdir.cpp</file>
|
||||
<file>testdir/dir/tst_qdir.cpp</file>
|
||||
<file>testdir/spaces/foo. bar</file>
|
||||
<file>testdir/spaces/foo.bar</file>
|
||||
<file>types/a</file>
|
||||
<file>types/a.a</file>
|
||||
<file>types/a.b</file>
|
||||
<file>types/a.c</file>
|
||||
<file>types/b</file>
|
||||
<file>types/b.a</file>
|
||||
<file>types/b.b</file>
|
||||
<file>types/b.c</file>
|
||||
<file>types/c</file>
|
||||
<file>types/c.a</file>
|
||||
<file>types/c.b</file>
|
||||
<file>types/c.c</file>
|
||||
<file>types/d/dummy</file>
|
||||
<file>types/d.a/dummy</file>
|
||||
<file>types/d.c/dummy</file>
|
||||
<file>types/d.b/dummy</file>
|
||||
<file>types/e/dummy</file>
|
||||
<file>types/e.a/dummy</file>
|
||||
<file>types/e.c/dummy</file>
|
||||
<file>types/f/dummy</file>
|
||||
<file>types/f.a/dummy</file>
|
||||
<file>types/f.b/dummy</file>
|
||||
<file>types/f.c/dummy</file>
|
||||
<file>types/e.b/dummy</file>
|
||||
<file>resources/entryList/file1.data</file>
|
||||
<file>resources/entryList/file2.data</file>
|
||||
<file>resources/entryList/file3.data</file>
|
||||
<file>resources/entryList/file4.nothing</file>
|
||||
</qresource>
|
||||
</RCC>
|
@ -6,3 +6,7 @@ RESOURCES += qdir.qrc
|
||||
|
||||
TESTDATA += testdir testData searchdir resources entrylist types tst_qdir.cpp
|
||||
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
|
||||
|
||||
android:!android-no-sdk {
|
||||
RESOURCES += android_testdata.qrc
|
||||
}
|
||||
|
@ -214,8 +214,35 @@ private:
|
||||
Q_DECLARE_METATYPE(tst_QDir::UncHandling)
|
||||
|
||||
tst_QDir::tst_QDir()
|
||||
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK)
|
||||
: m_dataPath(QStandardPaths::writableLocation(QStandardPaths::CacheLocation))
|
||||
#else
|
||||
: m_dataPath(QFileInfo(QFINDTESTDATA("testData")).absolutePath())
|
||||
#endif
|
||||
{
|
||||
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK)
|
||||
QString resourceSourcePath = QStringLiteral(":/android_testdata/");
|
||||
QDirIterator it(resourceSourcePath, QDirIterator::Subdirectories);
|
||||
while (it.hasNext()) {
|
||||
it.next();
|
||||
|
||||
QFileInfo fileInfo = it.fileInfo();
|
||||
|
||||
if (!fileInfo.isDir()) {
|
||||
QString destination = m_dataPath + QLatin1Char('/') + fileInfo.filePath().mid(resourceSourcePath.length());
|
||||
QFileInfo destinationFileInfo(destination);
|
||||
if (!destinationFileInfo.exists()) {
|
||||
QDir().mkpath(destinationFileInfo.path());
|
||||
if (!QFile::copy(fileInfo.filePath(), destination))
|
||||
qWarning("Failed to copy %s", qPrintable(fileInfo.filePath()));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (!QDir::setCurrent(m_dataPath))
|
||||
qWarning("Couldn't set current path to %s", qPrintable(m_dataPath));
|
||||
#endif
|
||||
}
|
||||
|
||||
void tst_QDir::init()
|
||||
@ -2028,6 +2055,8 @@ void tst_QDir::equalityOperator_data()
|
||||
//need a path in the root directory that is unlikely to be a symbolic link.
|
||||
#if defined (Q_OS_WIN)
|
||||
QString pathinroot("c:/windows/..");
|
||||
#elif defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK)
|
||||
QString pathinroot("/system/..");
|
||||
#else
|
||||
QString pathinroot("/usr/..");
|
||||
#endif
|
||||
|
@ -119,8 +119,34 @@ private slots:
|
||||
|
||||
void tst_QDirIterator::initTestCase()
|
||||
{
|
||||
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK)
|
||||
QString testdata_dir = QStandardPaths::writableLocation(QStandardPaths::CacheLocation);
|
||||
QString resourceSourcePath = QStringLiteral(":/");
|
||||
QDirIterator it(resourceSourcePath, QDirIterator::Subdirectories);
|
||||
while (it.hasNext()) {
|
||||
it.next();
|
||||
|
||||
QFileInfo fileInfo = it.fileInfo();
|
||||
|
||||
if (!fileInfo.isDir()) {
|
||||
QString destination = testdata_dir + QLatin1Char('/') + fileInfo.filePath().mid(resourceSourcePath.length());
|
||||
QFileInfo destinationFileInfo(destination);
|
||||
if (!destinationFileInfo.exists()) {
|
||||
QDir().mkpath(destinationFileInfo.path());
|
||||
if (!QFile::copy(fileInfo.filePath(), destination))
|
||||
qWarning("Failed to copy %s", qPrintable(fileInfo.filePath()));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
testdata_dir += QStringLiteral("/entrylist");
|
||||
#else
|
||||
|
||||
// chdir into testdata directory, then find testdata by relative paths.
|
||||
QString testdata_dir = QFileInfo(QFINDTESTDATA("entrylist")).absolutePath();
|
||||
#endif
|
||||
|
||||
QVERIFY2(QDir::setCurrent(testdata_dir), qPrintable("Could not chdir to " + testdata_dir));
|
||||
|
||||
QFile::remove("entrylist/entrylist1.lnk");
|
||||
|
8
tests/auto/corelib/io/qfileinfo/android_testdata.qrc
Normal file
8
tests/auto/corelib/io/qfileinfo/android_testdata.qrc
Normal file
@ -0,0 +1,8 @@
|
||||
<RCC>
|
||||
<qresource prefix="/android_testdata">
|
||||
<file>resources/file1</file>
|
||||
<file>resources/file1.ext1</file>
|
||||
<file>resources/file1.ext1.ext2</file>
|
||||
<file>tst_qfileinfo.cpp</file>
|
||||
</qresource>
|
||||
</RCC>
|
@ -8,3 +8,7 @@ TESTDATA += qfileinfo.qrc qfileinfo.pro tst_qfileinfo.cpp resources/file1 resour
|
||||
|
||||
win32*:!wince*:!winrt:LIBS += -ladvapi32 -lnetapi32
|
||||
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
|
||||
|
||||
android:!android-no-sdk: {
|
||||
RESOURCES += android_testdata.qrc
|
||||
}
|
||||
|
@ -272,9 +272,32 @@ private:
|
||||
|
||||
void tst_QFileInfo::initTestCase()
|
||||
{
|
||||
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK)
|
||||
QString dataPath = QStandardPaths::writableLocation(QStandardPaths::CacheLocation);
|
||||
QString resourceSourcePath = QStringLiteral(":/android_testdata");
|
||||
QDirIterator it(resourceSourcePath, QDirIterator::Subdirectories);
|
||||
while (it.hasNext()) {
|
||||
it.next();
|
||||
|
||||
QFileInfo fileInfo = it.fileInfo();
|
||||
if (!fileInfo.isDir()) {
|
||||
QString destination = dataPath + QLatin1Char('/') + fileInfo.filePath().mid(resourceSourcePath.length());
|
||||
QFileInfo destinationFileInfo(destination);
|
||||
if (!destinationFileInfo.exists()) {
|
||||
QDir().mkpath(destinationFileInfo.path());
|
||||
if (!QFile::copy(fileInfo.filePath(), destination))
|
||||
qWarning("Failed to copy %s", qPrintable(fileInfo.filePath()));
|
||||
}
|
||||
}
|
||||
}
|
||||
m_sourceFile = dataPath + QStringLiteral("/tst_qfileinfo.cpp");
|
||||
m_resourcesDir = dataPath + QStringLiteral("/resources");
|
||||
#else
|
||||
m_sourceFile = QFINDTESTDATA("tst_qfileinfo.cpp");
|
||||
QVERIFY(!m_sourceFile.isEmpty());
|
||||
m_resourcesDir = QFINDTESTDATA("resources");
|
||||
#endif
|
||||
|
||||
QVERIFY(!m_sourceFile.isEmpty());
|
||||
QVERIFY(!m_resourcesDir.isEmpty());
|
||||
QVERIFY(m_dir.isValid());
|
||||
QVERIFY(QDir::setCurrent(m_dir.path()));
|
||||
@ -1137,7 +1160,11 @@ void tst_QFileInfo::fileTimes()
|
||||
QEXPECT_FAIL("simple", "WinCE only stores date of access data, not the time", Continue);
|
||||
#elif defined(Q_OS_QNX)
|
||||
QEXPECT_FAIL("", "QNX uses the noatime filesystem option", Continue);
|
||||
#elif defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK)
|
||||
if (fileInfo.lastRead() <= beforeRead)
|
||||
QEXPECT_FAIL("", "Android may use relatime or noatime on mounts", Continue);
|
||||
#endif
|
||||
|
||||
QVERIFY(fileInfo.lastRead() > beforeRead);
|
||||
QVERIFY(fileInfo.lastModified() > beforeWrite);
|
||||
QVERIFY(fileInfo.lastModified() < beforeRead);
|
||||
|
@ -87,6 +87,10 @@ tst_QFileSystemWatcher::tst_QFileSystemWatcher()
|
||||
m_tempDirPattern += QLatin1Char('/');
|
||||
m_tempDirPattern += QStringLiteral("tst_qfilesystemwatcherXXXXXX");
|
||||
#endif // QT_NO_FILESYSTEMWATCHER
|
||||
|
||||
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK)
|
||||
QDir::setCurrent(QStandardPaths::writableLocation(QStandardPaths::CacheLocation));
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef QT_NO_FILESYSTEMWATCHER
|
||||
|
5
tests/auto/corelib/io/qiodevice/android_testdata.qrc
Normal file
5
tests/auto/corelib/io/qiodevice/android_testdata.qrc
Normal file
@ -0,0 +1,5 @@
|
||||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<file>tst_qiodevice.cpp</file>
|
||||
</qresource>
|
||||
</RCC>
|
@ -6,3 +6,8 @@ SOURCES = tst_qiodevice.cpp
|
||||
TESTDATA += tst_qiodevice.cpp
|
||||
MOC_DIR=tmp
|
||||
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
|
||||
|
||||
android:!android-no-sdk: {
|
||||
RESOURCES += \
|
||||
android_testdata.qrc
|
||||
}
|
||||
|
@ -62,6 +62,10 @@ private slots:
|
||||
|
||||
void tst_QIODevice::initTestCase()
|
||||
{
|
||||
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK)
|
||||
QVERIFY(QFileInfo(QStringLiteral("./tst_qiodevice.cpp")).exists()
|
||||
|| QFile::copy(QStringLiteral(":/tst_qiodevice.cpp"), QStringLiteral("./tst_qiodevice.cpp")));
|
||||
#endif
|
||||
}
|
||||
|
||||
// Testing get/set functions
|
||||
|
@ -66,7 +66,9 @@ public:
|
||||
|
||||
void tst_QLockFile::initTestCase()
|
||||
{
|
||||
#ifdef QT_NO_PROCESS
|
||||
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK)
|
||||
QSKIP("This test requires deploying and running external console applications");
|
||||
#elif defined(QT_NO_PROCESS)
|
||||
QSKIP("This test requires QProcess support");
|
||||
#else
|
||||
// chdir to our testdata path and execute helper apps relative to that.
|
||||
|
@ -0,0 +1,5 @@
|
||||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<file>qtlogging.ini</file>
|
||||
</qresource>
|
||||
</RCC>
|
@ -6,3 +6,8 @@ QT = core core-private testlib
|
||||
|
||||
SOURCES += tst_qloggingregistry.cpp
|
||||
OTHER_FILES += qtlogging.ini
|
||||
|
||||
android:!android-no-sdk: {
|
||||
RESOURCES += \
|
||||
android_testdata.qrc
|
||||
}
|
||||
|
21
tests/auto/corelib/io/qresourceengine/android_testdata.qrc
Normal file
21
tests/auto/corelib/io/qresourceengine/android_testdata.qrc
Normal file
@ -0,0 +1,21 @@
|
||||
<RCC>
|
||||
<qresource prefix="/android_testdata">
|
||||
<file>runtime_resource.rcc</file>
|
||||
<file>parentdir.txt</file>
|
||||
<file>testqrc/blahblah.txt</file>
|
||||
<file>testqrc/currentdir.txt</file>
|
||||
<file>testqrc/currentdir2.txt</file>
|
||||
<file>testqrc/search_file.txt</file>
|
||||
<file>testqrc/aliasdir/aliasdir.txt</file>
|
||||
<file>testqrc/aliasdir/compressme.txt</file>
|
||||
<file>testqrc/otherdir/otherdir.txt</file>
|
||||
<file>testqrc/searchpath1/search_file.txt</file>
|
||||
<file>testqrc/searchpath2/search_file.txt</file>
|
||||
<file>testqrc/subdir/subdir.txt</file>
|
||||
<file>testqrc/test/test/test2.txt</file>
|
||||
<file>testqrc/test/test/test1.txt</file>
|
||||
<file>testqrc/test/german.txt</file>
|
||||
<file>testqrc/test/testdir.txt</file>
|
||||
<file>testqrc/test/testdir2.txt</file>
|
||||
</qresource>
|
||||
</RCC>
|
@ -16,3 +16,7 @@ TESTDATA += \
|
||||
testqrc/*
|
||||
GENERATED_TESTDATA = $${runtime_resource.target}
|
||||
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
|
||||
|
||||
android:!android-no-sdk {
|
||||
RESOURCES += android_testdata.qrc
|
||||
}
|
||||
|
@ -40,7 +40,13 @@ class tst_QResourceEngine: public QObject
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
tst_QResourceEngine() : m_runtimeResourceRcc(QFINDTESTDATA("runtime_resource.rcc")) {}
|
||||
tst_QResourceEngine()
|
||||
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK)
|
||||
: m_runtimeResourceRcc(QFileInfo(QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + QStringLiteral("/runtime_resource.rcc")).absoluteFilePath())
|
||||
#else
|
||||
: m_runtimeResourceRcc(QFINDTESTDATA("runtime_resource.rcc"))
|
||||
#endif
|
||||
{}
|
||||
|
||||
private slots:
|
||||
void initTestCase();
|
||||
@ -62,6 +68,29 @@ private:
|
||||
|
||||
void tst_QResourceEngine::initTestCase()
|
||||
{
|
||||
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK)
|
||||
QString sourcePath(QStringLiteral(":/android_testdata/"));
|
||||
QString dataPath(QStandardPaths::writableLocation(QStandardPaths::CacheLocation));
|
||||
|
||||
QDirIterator it(sourcePath, QDirIterator::Subdirectories);
|
||||
while (it.hasNext()) {
|
||||
it.next();
|
||||
|
||||
QFileInfo fileInfo = it.fileInfo();
|
||||
if (!fileInfo.isDir()) {
|
||||
QString destination(dataPath + QLatin1Char('/') + fileInfo.filePath().mid(sourcePath.length()));
|
||||
QFileInfo destinationFileInfo(destination);
|
||||
if (!destinationFileInfo.exists()) {
|
||||
QVERIFY(QDir().mkpath(destinationFileInfo.path()));
|
||||
QVERIFY(QFile::copy(fileInfo.filePath(), destination));
|
||||
QVERIFY(QFileInfo(destination).exists());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QVERIFY(QDir::setCurrent(dataPath));
|
||||
#endif
|
||||
|
||||
QVERIFY(!m_runtimeResourceRcc.isEmpty());
|
||||
QVERIFY(QResource::registerResource(m_runtimeResourceRcc));
|
||||
QVERIFY(QResource::registerResource(m_runtimeResourceRcc, "/secondary_root/"));
|
||||
@ -85,16 +114,25 @@ void tst_QResourceEngine::checkStructure_data()
|
||||
|
||||
QFileInfo info;
|
||||
|
||||
QStringList rootContents;
|
||||
rootContents << QLatin1String("aliasdir")
|
||||
<< QLatin1String("otherdir")
|
||||
<< QLatin1String("qt-project.org")
|
||||
<< QLatin1String("runtime_resource")
|
||||
<< QLatin1String("searchpath1")
|
||||
<< QLatin1String("searchpath2")
|
||||
<< QLatin1String("secondary_root")
|
||||
<< QLatin1String("test")
|
||||
<< QLatin1String("withoutslashes");
|
||||
|
||||
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK)
|
||||
rootContents.insert(1, QLatin1String("android_testdata"));
|
||||
#endif
|
||||
|
||||
QTest::newRow("root dir") << QString(":/")
|
||||
<< QString()
|
||||
<< (QStringList() << "search_file.txt")
|
||||
<< (QStringList() << QLatin1String("aliasdir") << QLatin1String("otherdir")
|
||||
<< QLatin1String("qt-project.org")
|
||||
<< QLatin1String("runtime_resource")
|
||||
<< QLatin1String("searchpath1") << QLatin1String("searchpath2")
|
||||
<< QLatin1String("secondary_root")
|
||||
<< QLatin1String("test")
|
||||
<< QLatin1String("withoutslashes"))
|
||||
<< rootContents
|
||||
<< QLocale::c()
|
||||
<< qlonglong(0);
|
||||
|
||||
|
@ -472,7 +472,7 @@ void tst_qstandardpaths::testAllWritableLocations()
|
||||
QString loc = QStandardPaths::writableLocation(location);
|
||||
if (loc.size() > 1) // workaround for unlikely case of locations that return '/'
|
||||
QCOMPARE(loc.endsWith(QLatin1Char('/')), false);
|
||||
QVERIFY(loc.contains(QLatin1Char('/')));
|
||||
QVERIFY(loc.isEmpty() || loc.contains(QLatin1Char('/')));
|
||||
QVERIFY(!loc.contains(QLatin1Char('\\')));
|
||||
}
|
||||
|
||||
|
@ -237,7 +237,11 @@ void tst_QTemporaryDir::nonWritableCurrentDir()
|
||||
};
|
||||
ChdirOnReturn cor(QDir::currentPath());
|
||||
|
||||
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK)
|
||||
QDir::setCurrent("/data");
|
||||
#else
|
||||
QDir::setCurrent("/home");
|
||||
#endif
|
||||
// QTemporaryDir("tempXXXXXX") is probably a bad idea in any app
|
||||
// where the current dir could anything...
|
||||
QTemporaryDir dir("tempXXXXXX");
|
||||
|
@ -269,7 +269,12 @@ void tst_QTemporaryFile::nonWritableCurrentDir()
|
||||
};
|
||||
ChdirOnReturn cor(QDir::currentPath());
|
||||
|
||||
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK)
|
||||
QDir::setCurrent("/data");
|
||||
#else
|
||||
QDir::setCurrent("/home");
|
||||
#endif
|
||||
|
||||
// QTemporaryFile("tempXXXXXX") is probably a bad idea in any app
|
||||
// where the current dir could anything...
|
||||
QTemporaryFile file("tempXXXXXX");
|
||||
|
@ -1,10 +1,11 @@
|
||||
TARGET = tst_qtjson
|
||||
TARGET = tst_json
|
||||
QT = core testlib
|
||||
CONFIG -= app_bundle
|
||||
CONFIG += testcase
|
||||
CONFIG += parallel_test
|
||||
|
||||
TESTDATA += test.json test.bjson test3.json test2.json
|
||||
!android:TESTDATA += test.json test.bjson test3.json test2.json
|
||||
else:RESOURCES += json.qrc
|
||||
|
||||
SOURCES += tst_qtjson.cpp
|
||||
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
|
||||
|
9
tests/auto/corelib/json/json.qrc
Normal file
9
tests/auto/corelib/json/json.qrc
Normal file
@ -0,0 +1,9 @@
|
||||
<!DOCTYPE RCC><RCC version="1.0">
|
||||
<qresource prefix="/">
|
||||
<file>bom.json</file>
|
||||
<file>test2.json</file>
|
||||
<file>test3.json</file>
|
||||
<file>test.json</file>
|
||||
<file>test.bjson</file>
|
||||
</qresource>
|
||||
</RCC>
|
@ -44,14 +44,14 @@ QString valueSpy;
|
||||
|
||||
Q_DECLARE_METATYPE(QDBusConnection::RegisterOptions)
|
||||
|
||||
class MyServer : public QDBusServer
|
||||
class MyServer : public QDBusServer, protected QDBusContext
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_CLASSINFO("D-Bus Interface", "org.qtproject.autotests.qmyserver")
|
||||
|
||||
public:
|
||||
MyServer(QString addr = "unix:tmpdir=/tmp", QObject* parent = 0)
|
||||
: QDBusServer(addr, parent),
|
||||
MyServer(QObject* parent = 0)
|
||||
: QDBusServer(parent),
|
||||
m_conn("none"),
|
||||
obj(NULL)
|
||||
{
|
||||
@ -67,6 +67,8 @@ public:
|
||||
public slots:
|
||||
QString address() const
|
||||
{
|
||||
if (!QDBusServer::isConnected())
|
||||
sendErrorReply(QDBusServer::lastError().name(), QDBusServer::lastError().message());
|
||||
return QDBusServer::address();
|
||||
}
|
||||
|
||||
@ -161,6 +163,7 @@ int main(int argc, char *argv[])
|
||||
con.registerObject(objectPath, &server, QDBusConnection::ExportAllSlots);
|
||||
|
||||
printf("ready.\n");
|
||||
fflush(stdout);
|
||||
|
||||
return app.exec();
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
SOURCES = qmyserver.cpp
|
||||
HEADERS = ../myobject.h
|
||||
TARGET = qmyserver
|
||||
DESTDIR = ./
|
||||
QT = core dbus
|
||||
CONFIG -= app_bundle
|
||||
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
|
||||
|
@ -2,6 +2,7 @@ CONFIG += testcase
|
||||
SOURCES += ../tst_qdbusabstractadaptor.cpp
|
||||
HEADERS += ../myobject.h
|
||||
TARGET = ../tst_qdbusabstractadaptor
|
||||
DESTDIR = ./
|
||||
|
||||
QT = core core-private dbus testlib
|
||||
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
|
||||
|
@ -491,12 +491,14 @@ void tst_QDBusAbstractAdaptor::initTestCase()
|
||||
commonInit();
|
||||
|
||||
// start peer server
|
||||
#ifdef Q_OS_WIN
|
||||
proc.start("qmyserver");
|
||||
#else
|
||||
proc.start("./qmyserver/qmyserver");
|
||||
#endif
|
||||
QVERIFY(proc.waitForStarted());
|
||||
#ifdef Q_OS_WIN
|
||||
# define EXE ".exe"
|
||||
#else
|
||||
# define EXE ""
|
||||
#endif
|
||||
proc.start(QFINDTESTDATA("qmyserver/qmyserver" EXE));
|
||||
QVERIFY2(proc.waitForStarted(), qPrintable(proc.errorString()));
|
||||
QVERIFY(proc.waitForReadyRead());
|
||||
|
||||
WaitForQMyServer w;
|
||||
QVERIFY(w.ok());
|
||||
|
@ -38,13 +38,13 @@ static const char serviceName[] = "org.qtproject.autotests.qpinger";
|
||||
static const char objectPath[] = "/org/qtproject/qpinger";
|
||||
//static const char *interfaceName = serviceName;
|
||||
|
||||
class PingerServer : public QDBusServer
|
||||
class PingerServer : public QDBusServer, protected QDBusContext
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_CLASSINFO("D-Bus Interface", "org.qtproject.autotests.qpinger")
|
||||
public:
|
||||
PingerServer(QString addr = "unix:tmpdir=/tmp", QObject* parent = 0)
|
||||
: QDBusServer(addr, parent),
|
||||
PingerServer(QObject* parent = 0)
|
||||
: QDBusServer(parent),
|
||||
m_conn("none")
|
||||
{
|
||||
connect(this, SIGNAL(newConnection(QDBusConnection)), SLOT(handleConnection(QDBusConnection)));
|
||||
@ -54,6 +54,8 @@ public:
|
||||
public slots:
|
||||
QString address() const
|
||||
{
|
||||
if (!QDBusServer::isConnected())
|
||||
sendErrorReply(QDBusServer::lastError().name(), QDBusServer::lastError().message());
|
||||
return QDBusServer::address();
|
||||
}
|
||||
|
||||
@ -116,6 +118,7 @@ int main(int argc, char *argv[])
|
||||
con.registerObject(objectPath, &server, QDBusConnection::ExportAllSlots);
|
||||
|
||||
printf("ready.\n");
|
||||
fflush(stdout);
|
||||
|
||||
return app.exec();
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
SOURCES = qpinger.cpp ../interface.cpp
|
||||
HEADERS = ../interface.h
|
||||
TARGET = qpinger
|
||||
DESTDIR = ./
|
||||
CONFIG -= app_bundle
|
||||
CONFIG += console
|
||||
QT = core dbus
|
||||
|
@ -3,6 +3,7 @@ SOURCES += ../tst_qdbusabstractinterface.cpp ../interface.cpp
|
||||
HEADERS += ../interface.h
|
||||
|
||||
TARGET = ../tst_qdbusabstractinterface
|
||||
DESTDIR = ./
|
||||
|
||||
QT = core testlib
|
||||
QT += dbus
|
||||
|
@ -51,6 +51,7 @@ class tst_QDBusAbstractInterface: public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
Interface targetObj;
|
||||
QString peerAddress;
|
||||
|
||||
Pinger getPinger(QString service = "", const QString &path = "/")
|
||||
{
|
||||
@ -81,6 +82,7 @@ public:
|
||||
|
||||
private slots:
|
||||
void initTestCase();
|
||||
void cleanupTestCase();
|
||||
|
||||
void init();
|
||||
void cleanup();
|
||||
@ -223,24 +225,20 @@ void tst_QDBusAbstractInterface::initTestCase()
|
||||
QDBusConnection con = QDBusConnection::sessionBus();
|
||||
QVERIFY(con.isConnected());
|
||||
con.registerObject("/", &targetObj, QDBusConnection::ExportScriptableContents);
|
||||
}
|
||||
|
||||
void tst_QDBusAbstractInterface::init()
|
||||
{
|
||||
QDBusConnection con = QDBusConnection::sessionBus();
|
||||
QVERIFY(con.isConnected());
|
||||
|
||||
// verify service isn't registered by something else
|
||||
// (e.g. a left over qpinger from a previous test run)
|
||||
QVERIFY(!con.interface()->isServiceRegistered(serviceName));
|
||||
|
||||
// start peer server
|
||||
#ifdef Q_OS_WIN
|
||||
proc.start("qpinger");
|
||||
#else
|
||||
proc.start("./qpinger/qpinger");
|
||||
#endif
|
||||
QVERIFY(proc.waitForStarted());
|
||||
#ifdef Q_OS_WIN
|
||||
# define EXE ".exe"
|
||||
#else
|
||||
# define EXE ""
|
||||
#endif
|
||||
proc.start(QFINDTESTDATA("qpinger/qpinger" EXE));
|
||||
QVERIFY2(proc.waitForStarted(), qPrintable(proc.errorString()));
|
||||
QVERIFY(proc.waitForReadyRead());
|
||||
|
||||
// verify service is now registered
|
||||
QTRY_VERIFY(con.interface()->isServiceRegistered(serviceName));
|
||||
@ -249,10 +247,33 @@ void tst_QDBusAbstractInterface::init()
|
||||
QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "address");
|
||||
QDBusMessage rpl = con.call(req);
|
||||
QVERIFY(rpl.type() == QDBusMessage::ReplyMessage);
|
||||
QString address = rpl.arguments().at(0).toString();
|
||||
peerAddress = rpl.arguments().at(0).toString();
|
||||
}
|
||||
|
||||
void tst_QDBusAbstractInterface::cleanupTestCase()
|
||||
{
|
||||
// Kill peer, resetting the object exported by a separate process
|
||||
#ifdef Q_OS_WIN
|
||||
proc.kill(); // non-GUI processes don't respond to QProcess::terminate()
|
||||
#else
|
||||
proc.terminate();
|
||||
#endif
|
||||
QVERIFY(proc.waitForFinished() || proc.state() == QProcess::NotRunning);
|
||||
|
||||
// Wait until the service is certainly not registered
|
||||
QDBusConnection con = QDBusConnection::sessionBus();
|
||||
if (con.isConnected()) {
|
||||
QTRY_VERIFY(!con.interface()->isServiceRegistered(serviceName));
|
||||
}
|
||||
}
|
||||
|
||||
void tst_QDBusAbstractInterface::init()
|
||||
{
|
||||
QDBusConnection con = QDBusConnection::sessionBus();
|
||||
QVERIFY(con.isConnected());
|
||||
|
||||
// connect to peer server
|
||||
QDBusConnection peercon = QDBusConnection::connectToPeer(address, "peer");
|
||||
QDBusConnection peercon = QDBusConnection::connectToPeer(peerAddress, "peer");
|
||||
QVERIFY(peercon.isConnected());
|
||||
|
||||
QDBusMessage req2 = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "isConnected");
|
||||
@ -265,20 +286,13 @@ void tst_QDBusAbstractInterface::cleanup()
|
||||
{
|
||||
QDBusConnection::disconnectFromPeer("peer");
|
||||
|
||||
// Kill peer, resetting the object exported by a separate process
|
||||
proc.terminate();
|
||||
QVERIFY(proc.waitForFinished() || proc.state() == QProcess::NotRunning);
|
||||
|
||||
// Reset the object exported by this process
|
||||
targetObj.m_stringProp = QString();
|
||||
targetObj.m_variantProp = QDBusVariant();
|
||||
targetObj.m_complexProp = RegisteredType();
|
||||
|
||||
// Wait until the service is certainly not registered
|
||||
QDBusConnection con = QDBusConnection::sessionBus();
|
||||
if (con.isConnected()) {
|
||||
QTRY_VERIFY(!con.interface()->isServiceRegistered(serviceName));
|
||||
}
|
||||
QDBusMessage resetCall = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "reset");
|
||||
QVERIFY(QDBusConnection::sessionBus().call(resetCall).type() == QDBusMessage::ReplyMessage);
|
||||
}
|
||||
|
||||
void tst_QDBusAbstractInterface::makeVoidCall()
|
||||
|
@ -296,7 +296,7 @@ void tst_QDBusConnection::connectToPeer()
|
||||
QVERIFY(con.lastError().isValid());
|
||||
}
|
||||
|
||||
QDBusServer server("unix:tmpdir=/tmp", 0);
|
||||
QDBusServer server;
|
||||
|
||||
{
|
||||
QDBusConnection con = QDBusConnection::connectToPeer(
|
||||
@ -381,9 +381,7 @@ class MyServer : public QDBusServer
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
MyServer(QString path, QString addr, QObject* parent) : QDBusServer(addr, parent),
|
||||
m_path(path),
|
||||
m_connections()
|
||||
MyServer(QString path) : m_path(path), m_connections()
|
||||
{
|
||||
connect(this, SIGNAL(newConnection(QDBusConnection)), SLOT(handleConnection(QDBusConnection)));
|
||||
}
|
||||
@ -446,7 +444,7 @@ void tst_QDBusConnection::registerObjectPeer()
|
||||
{
|
||||
QFETCH(QString, path);
|
||||
|
||||
MyServer server(path, "unix:tmpdir=/tmp", 0);
|
||||
MyServer server(path);
|
||||
|
||||
QDBusConnection::connectToPeer(server.address(), "beforeFoo");
|
||||
|
||||
@ -594,8 +592,7 @@ class MyServer2 : public QDBusServer
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
MyServer2(QString addr, QObject* parent) : QDBusServer(addr, parent),
|
||||
m_conn("none")
|
||||
MyServer2() : m_conn("none")
|
||||
{
|
||||
connect(this, SIGNAL(newConnection(QDBusConnection)), SLOT(handleConnection(QDBusConnection)));
|
||||
}
|
||||
@ -620,7 +617,7 @@ private:
|
||||
|
||||
void tst_QDBusConnection::registerObjectPeer2()
|
||||
{
|
||||
MyServer2 server("unix:tmpdir=/tmp", 0);
|
||||
MyServer2 server;
|
||||
QDBusConnection con = QDBusConnection::connectToPeer(server.address(), "foo");
|
||||
QCoreApplication::processEvents();
|
||||
QVERIFY(con.isConnected());
|
||||
@ -775,7 +772,7 @@ void tst_QDBusConnection::registerQObjectChildren()
|
||||
|
||||
void tst_QDBusConnection::registerQObjectChildrenPeer()
|
||||
{
|
||||
MyServer2 server("unix:tmpdir=/tmp", 0);
|
||||
MyServer2 server;
|
||||
QDBusConnection con = QDBusConnection::connectToPeer(server.address(), "foo");
|
||||
QCoreApplication::processEvents();
|
||||
QVERIFY(con.isConnected());
|
||||
|
@ -51,8 +51,8 @@ class tst_QDBusConnectionNoBus : public QObject
|
||||
public:
|
||||
tst_QDBusConnectionNoBus()
|
||||
{
|
||||
::setenv("DBUS_SESSION_BUS_ADDRESS", "unix:abstract=/tmp/does_not_exist", 1);
|
||||
::setenv("QT_SIMULATE_DBUS_LIBFAIL", "1", 1);
|
||||
qputenv("DBUS_SESSION_BUS_ADDRESS", "unix:abstract=/tmp/does_not_exist");
|
||||
qputenv("QT_SIMULATE_DBUS_LIBFAIL", "1");
|
||||
}
|
||||
|
||||
private slots:
|
||||
|
@ -42,14 +42,14 @@ static const char objectPath[] = "/org/qtproject/qmyserver";
|
||||
int MyObject::callCount = 0;
|
||||
QVariantList MyObject::callArgs;
|
||||
|
||||
class MyServer : public QDBusServer
|
||||
class MyServer : public QDBusServer, protected QDBusContext
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_CLASSINFO("D-Bus Interface", "org.qtproject.autotests.qmyserver")
|
||||
|
||||
public:
|
||||
MyServer(QString addr = "unix:tmpdir=/tmp", QObject* parent = 0)
|
||||
: QDBusServer(addr, parent),
|
||||
MyServer(QObject* parent = 0)
|
||||
: QDBusServer(parent),
|
||||
m_conn("none")
|
||||
{
|
||||
connect(this, SIGNAL(newConnection(QDBusConnection)), SLOT(handleConnection(QDBusConnection)));
|
||||
@ -58,6 +58,8 @@ public:
|
||||
public slots:
|
||||
QString address() const
|
||||
{
|
||||
if (!QDBusServer::isConnected())
|
||||
sendErrorReply(QDBusServer::lastError().name(), QDBusServer::lastError().message());
|
||||
return QDBusServer::address();
|
||||
}
|
||||
|
||||
@ -140,6 +142,7 @@ int main(int argc, char *argv[])
|
||||
con.registerObject(objectPath, &server, QDBusConnection::ExportAllSlots);
|
||||
|
||||
printf("ready.\n");
|
||||
fflush(stdout);
|
||||
|
||||
return app.exec();
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
SOURCES = qmyserver.cpp
|
||||
HEADERS = ../myobject.h
|
||||
TARGET = qmyserver
|
||||
DESTDIR = ./
|
||||
QT = core dbus
|
||||
CONFIG -= app_bundle
|
||||
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
|
||||
|
@ -2,6 +2,7 @@ CONFIG += testcase
|
||||
SOURCES += ../tst_qdbusinterface.cpp
|
||||
HEADERS += ../myobject.h
|
||||
TARGET = ../tst_qdbusinterface
|
||||
DESTDIR = ./
|
||||
|
||||
QT = core core-private dbus testlib
|
||||
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
|
||||
|
@ -266,13 +266,14 @@ void tst_QDBusInterface::initTestCase()
|
||||
| QDBusConnection::ExportAllSlots
|
||||
| QDBusConnection::ExportAllInvokables);
|
||||
|
||||
// start peer server
|
||||
#ifdef Q_OS_WIN
|
||||
proc.start("qmyserver");
|
||||
#else
|
||||
proc.start("./qmyserver/qmyserver");
|
||||
#endif
|
||||
QVERIFY(proc.waitForStarted());
|
||||
#ifdef Q_OS_WIN
|
||||
# define EXE ".exe"
|
||||
#else
|
||||
# define EXE ""
|
||||
#endif
|
||||
proc.start(QFINDTESTDATA("qmyserver/qmyserver" EXE));
|
||||
QVERIFY2(proc.waitForStarted(), qPrintable(proc.errorString()));
|
||||
QVERIFY(proc.waitForReadyRead());
|
||||
|
||||
WaitForQMyServer w;
|
||||
QVERIFY(w.ok());
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user