diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/kernel/qsharedmemory.cpp | 26 | ||||
-rw-r--r-- | src/corelib/kernel/qsharedmemory_p.h | 12 | ||||
-rw-r--r-- | src/corelib/kernel/qsharedmemory_symbian.cpp | 50 | ||||
-rw-r--r-- | src/corelib/kernel/qsharedmemory_unix.cpp | 44 | ||||
-rw-r--r-- | src/corelib/kernel/qsharedmemory_win.cpp | 63 | ||||
-rw-r--r-- | src/corelib/kernel/qsystemsemaphore_p.h | 8 | ||||
-rw-r--r-- | src/corelib/kernel/qsystemsemaphore_symbian.cpp | 49 | ||||
-rw-r--r-- | src/corelib/kernel/qsystemsemaphore_unix.cpp | 52 | ||||
-rw-r--r-- | src/corelib/kernel/qsystemsemaphore_win.cpp | 17 | ||||
-rw-r--r-- | src/gui/embedded/qkbd_qws.cpp | 2 | ||||
-rw-r--r-- | src/gui/embedded/qkbdum_qws.cpp | 2 | ||||
-rw-r--r-- | src/gui/embedded/qwindowsystem_qws.cpp | 26 | ||||
-rw-r--r-- | src/gui/embedded/qwssharedmemory.cpp | 120 | ||||
-rw-r--r-- | src/gui/embedded/qwssharedmemory_p.h | 34 | ||||
-rw-r--r-- | src/gui/kernel/qapplication_qws.cpp | 24 | ||||
-rw-r--r-- | src/gui/kernel/qsessionmanager_qws.cpp | 3 | ||||
-rw-r--r-- | src/gui/painting/qwindowsurface_qws.cpp | 72 | ||||
-rw-r--r-- | src/plugins/accessible/widgets/qaccessiblewidgets.cpp | 113 |
18 files changed, 376 insertions, 341 deletions
diff --git a/src/corelib/kernel/qsharedmemory.cpp b/src/corelib/kernel/qsharedmemory.cpp index acb6044..2882279 100644 --- a/src/corelib/kernel/qsharedmemory.cpp +++ b/src/corelib/kernel/qsharedmemory.cpp @@ -247,14 +247,14 @@ void QSharedMemory::setNativeKey(const QString &key) if (isAttached()) detach(); d->cleanHandle(); - d->key = QString(); + d->key.clear(); d->nativeKey = key; } bool QSharedMemoryPrivate::initKey() { - if (!cleanHandle()) - return false; + cleanHandle(); + #ifndef QT_NO_SYSTEMSEMAPHORE systemSemaphore.setKey(QString(), 1); systemSemaphore.setKey(key, 1); @@ -285,7 +285,7 @@ bool QSharedMemoryPrivate::initKey() return false; } #endif - errorString = QString(); + errorString.clear(); error = QSharedMemory::NoError; return true; } @@ -342,28 +342,24 @@ bool QSharedMemory::create(int size, AccessMode mode) if (!d->initKey()) return false; + if (size <= 0) { + d->error = QSharedMemory::InvalidSize; + d->errorString = QSharedMemory::tr("%1: create size is less then 0").arg(QLatin1String("QSharedMemory::create")); + return false; + } + #ifndef QT_NO_SYSTEMSEMAPHORE #ifndef Q_OS_WIN // Take ownership and force set initialValue because the semaphore // might have already existed from a previous crash. d->systemSemaphore.setKey(d->key, 1, QSystemSemaphore::Create); #endif -#endif - QString function = QLatin1String("QSharedMemory::create"); -#ifndef QT_NO_SYSTEMSEMAPHORE QSharedMemoryLocker lock(this); - if (!d->key.isNull() && !d->tryLocker(&lock, function)) + if (!d->key.isNull() && !d->tryLocker(&lock, QLatin1String("QSharedMemory::create"))) return false; #endif - if (size <= 0) { - d->error = QSharedMemory::InvalidSize; - d->errorString = - QSharedMemory::tr("%1: create size is less then 0").arg(function); - return false; - } - if (!d->create(size)) return false; diff --git a/src/corelib/kernel/qsharedmemory_p.h b/src/corelib/kernel/qsharedmemory_p.h index d5fafef..21b8612 100644 --- a/src/corelib/kernel/qsharedmemory_p.h +++ b/src/corelib/kernel/qsharedmemory_p.h @@ -70,12 +70,12 @@ namespace QSharedMemoryPrivate #include "private/qobject_p.h" #ifdef Q_OS_WIN -#include <qt_windows.h> +# include <qt_windows.h> #elif defined(Q_OS_SYMBIAN) -#include <e32std.h> -#include <sys/types.h> +# include <e32std.h> +# include <sys/types.h> #else -#include <sys/sem.h> +# include <sys/types.h> #endif QT_BEGIN_NAMESPACE @@ -139,7 +139,7 @@ public: key_t handle(); #endif bool initKey(); - bool cleanHandle(); + void cleanHandle(); bool create(int size); bool attach(QSharedMemory::AccessMode mode); bool detach(); @@ -151,7 +151,7 @@ public: #endif #ifndef QT_NO_SYSTEMSEMAPHORE - bool tryLocker(QSharedMemoryLocker *locker, const QString function) { + inline bool tryLocker(QSharedMemoryLocker *locker, const QString &function) { if (!locker->lock()) { errorString = QSharedMemory::tr("%1: unable to lock").arg(function); error = QSharedMemory::LockError; diff --git a/src/corelib/kernel/qsharedmemory_symbian.cpp b/src/corelib/kernel/qsharedmemory_symbian.cpp index fdd513a..cd1567a 100644 --- a/src/corelib/kernel/qsharedmemory_symbian.cpp +++ b/src/corelib/kernel/qsharedmemory_symbian.cpp @@ -41,19 +41,21 @@ #include "qsharedmemory.h" #include "qsharedmemory_p.h" -#include "qsystemsemaphore.h" + #include "qcore_symbian_p.h" #include <qdebug.h> -QT_BEGIN_NAMESPACE - #ifndef QT_NO_SHAREDMEMORY #define QSHAREDMEMORY_DEBUG -QSharedMemoryPrivate::QSharedMemoryPrivate() : QObjectPrivate(), - memory(0), size(0), error(QSharedMemory::NoError), - systemSemaphore(QString()), lockedByMe(false) +QT_BEGIN_NAMESPACE + +QSharedMemoryPrivate::QSharedMemoryPrivate() + : QObjectPrivate(), memory(0), size(0), error(QSharedMemory::NoError), +#ifndef QT_NO_SYSTEMSEMAPHORE + systemSemaphore(QString()), lockedByMe(false) +#endif { } @@ -61,6 +63,7 @@ void QSharedMemoryPrivate::setErrorString(const QString &function, TInt errorCod { if (errorCode == KErrNone) return; + switch (errorCode) { case KErrAlreadyExists: error = QSharedMemory::AlreadyExists; @@ -88,40 +91,43 @@ void QSharedMemoryPrivate::setErrorString(const QString &function, TInt errorCod #if defined QSHAREDMEMORY_DEBUG qDebug() << errorString << "key" << key; #endif + break; } } key_t QSharedMemoryPrivate::handle() { + // don't allow making handles on empty keys + if (nativeKey.isEmpty()) { + error = QSharedMemory::KeyError; + errorString = QSharedMemory::tr("%1: key is empty").arg(QLatin1String("QSharedMemory::handle")); + return 0; + } + // Not really cost effective to check here if shared memory is attachable, as it requires // exactly the same call as attaching, so always assume handle is valid and return failure // from attach. return 1; } -bool QSharedMemoryPrivate::cleanHandle() +void QSharedMemoryPrivate::cleanHandle() { chunk.Close(); - return true; } bool QSharedMemoryPrivate::create(int size) { - QString function = QLatin1String("QSharedMemory::create"); - if (nativeKey.isEmpty()) { - error = QSharedMemory::KeyError; - errorString = QSharedMemory::tr("%1: key error").arg(function); + if (!handle()) return false; - } TPtrC ptr(qt_QString2TPtrC(nativeKey)); TInt err = chunk.CreateGlobal(ptr, size, size); - setErrorString(function, err); - - if (err != KErrNone) + if (err != KErrNone) { + setErrorString(QLatin1String("QSharedMemory::create"), err); return false; + } // Zero out the created chunk Mem::FillZ(chunk.Base(), chunk.Size()); @@ -133,12 +139,8 @@ bool QSharedMemoryPrivate::attach(QSharedMemory::AccessMode /* mode */) { // Grab a pointer to the memory block if (!chunk.Handle()) { - QString function = QLatin1String("QSharedMemory::handle"); - if (nativeKey.isEmpty()) { - error = QSharedMemory::KeyError; - errorString = QSharedMemory::tr("%1: unable to make key").arg(function); + if (!handle()) return false; - } TPtrC ptr(qt_QString2TPtrC(nativeKey)); @@ -147,7 +149,7 @@ bool QSharedMemoryPrivate::attach(QSharedMemory::AccessMode /* mode */) err = chunk.OpenGlobal(ptr, false); if (err != KErrNone) { - setErrorString(function, err); + setErrorString(QLatin1String("QSharedMemory::attach"), err); return false; } } @@ -168,6 +170,6 @@ bool QSharedMemoryPrivate::detach() return true; } -#endif //QT_NO_SHAREDMEMORY - QT_END_NAMESPACE + +#endif //QT_NO_SHAREDMEMORY diff --git a/src/corelib/kernel/qsharedmemory_unix.cpp b/src/corelib/kernel/qsharedmemory_unix.cpp index 2bbda49..e991ce9 100644 --- a/src/corelib/kernel/qsharedmemory_unix.cpp +++ b/src/corelib/kernel/qsharedmemory_unix.cpp @@ -43,25 +43,26 @@ #include "qsharedmemory.h" #include "qsharedmemory_p.h" -#include "qsystemsemaphore.h" -#include <qdir.h> -#include <qdebug.h> -#include <errno.h> +#include <qdebug.h> +#include <qfile.h> #ifndef QT_NO_SHAREDMEMORY #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> -#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> -#endif //QT_NO_SHAREDMEMORY +#endif // QT_NO_SHAREDMEMORY +#include <errno.h> #include "private/qcore_unix_p.h" #ifndef QT_NO_SHAREDMEMORY + +//#define QSHAREDMEMORY_DEBUG + QT_BEGIN_NAMESPACE QSharedMemoryPrivate::QSharedMemoryPrivate() @@ -78,6 +79,7 @@ void QSharedMemoryPrivate::setErrorString(const QString &function) // EINVAL is handled in functions so they can give better error strings switch (errno) { case EACCES: + case EPERM: errorString = QSharedMemory::tr("%1: permission denied").arg(function); error = QSharedMemory::PermissionDenied; break; @@ -98,9 +100,10 @@ void QSharedMemoryPrivate::setErrorString(const QString &function) default: errorString = QSharedMemory::tr("%1: unknown error %2").arg(function).arg(errno); error = QSharedMemory::UnknownError; -#if defined QSHAREDMEMORY_DEBUG +#ifdef QSHAREDMEMORY_DEBUG qDebug() << errorString << "key" << key << "errno" << errno << EINVAL; #endif + break; } } @@ -117,21 +120,21 @@ key_t QSharedMemoryPrivate::handle() // don't allow making handles on empty keys if (nativeKey.isEmpty()) { - errorString = QSharedMemory::tr("%1: key is empty").arg(QLatin1String("QSharedMemory::handle:")); + errorString = QSharedMemory::tr("%1: key is empty").arg(QLatin1String("QSharedMemory::handle")); error = QSharedMemory::KeyError; return 0; } // ftok requires that an actual file exists somewhere if (!QFile::exists(nativeKey)) { - errorString = QSharedMemory::tr("%1: UNIX key file doesn't exist").arg(QLatin1String("QSharedMemory::handle:")); + errorString = QSharedMemory::tr("%1: UNIX key file doesn't exist").arg(QLatin1String("QSharedMemory::handle")); error = QSharedMemory::NotFound; return 0; } unix_key = ftok(QFile::encodeName(nativeKey).constData(), 'Q'); if (-1 == unix_key) { - errorString = QSharedMemory::tr("%1: ftok failed").arg(QLatin1String("QSharedMemory::handle:")); + errorString = QSharedMemory::tr("%1: ftok failed").arg(QLatin1String("QSharedMemory::handle")); error = QSharedMemory::KeyError; unix_key = 0; } @@ -149,20 +152,20 @@ key_t QSharedMemoryPrivate::handle() -1 error 0 already existed 1 created - */ +*/ int QSharedMemoryPrivate::createUnixKeyFile(const QString &fileName) { if (QFile::exists(fileName)) return 0; int fd = qt_safe_open(QFile::encodeName(fileName).constData(), - O_EXCL | O_CREAT | O_RDWR, 0640); + O_EXCL | O_CREAT | O_RDWR, 0640); if (-1 == fd) { if (errno == EEXIST) return 0; return -1; } else { - close(fd); + qt_safe_close(fd); } return 1; } @@ -170,25 +173,21 @@ int QSharedMemoryPrivate::createUnixKeyFile(const QString &fileName) #ifndef QT_NO_SHAREDMEMORY -bool QSharedMemoryPrivate::cleanHandle() +void QSharedMemoryPrivate::cleanHandle() { unix_key = 0; - return true; } bool QSharedMemoryPrivate::create(int size) { // build file if needed - bool createdFile = false; int built = createUnixKeyFile(nativeKey); if (built == -1) { - errorString = QSharedMemory::tr("%1: unable to make key").arg(QLatin1String("QSharedMemory::handle:")); + errorString = QSharedMemory::tr("%1: unable to make key").arg(QLatin1String("QSharedMemory::create")); error = QSharedMemory::KeyError; return false; } - if (built == 1) { - createdFile = true; - } + bool createdFile = built == 1; // get handle if (!handle()) { @@ -202,7 +201,7 @@ bool QSharedMemoryPrivate::create(int size) QString function = QLatin1String("QSharedMemory::create"); switch (errno) { case EINVAL: - errorString = QSharedMemory::tr("%1: system-imposed size restrictions").arg(QLatin1String("QSharedMemory::handle")); + errorString = QSharedMemory::tr("%1: system-imposed size restrictions").arg(function); error = QSharedMemory::InvalidSize; break; default: @@ -280,7 +279,7 @@ bool QSharedMemoryPrivate::detach() if (shmid_ds.shm_nattch == 0) { // mark for removal if (-1 == shmctl(id, IPC_RMID, &shmid_ds)) { - setErrorString(QLatin1String("QSharedMemory::remove")); + setErrorString(QLatin1String("QSharedMemory::detach")); switch (errno) { case EINVAL: return true; @@ -296,7 +295,6 @@ bool QSharedMemoryPrivate::detach() return true; } - QT_END_NAMESPACE #endif // QT_NO_SHAREDMEMORY diff --git a/src/corelib/kernel/qsharedmemory_win.cpp b/src/corelib/kernel/qsharedmemory_win.cpp index 3cc14fe..567214e 100644 --- a/src/corelib/kernel/qsharedmemory_win.cpp +++ b/src/corelib/kernel/qsharedmemory_win.cpp @@ -41,24 +41,30 @@ #include "qsharedmemory.h" #include "qsharedmemory_p.h" -#include "qsystemsemaphore.h" -#include <qdebug.h> -QT_BEGIN_NAMESPACE +#include <qdebug.h> #ifndef QT_NO_SHAREDMEMORY -QSharedMemoryPrivate::QSharedMemoryPrivate() : QObjectPrivate(), - memory(0), size(0), error(QSharedMemory::NoError), - systemSemaphore(QString()), lockedByMe(false), hand(0) +//#define QSHAREDMEMORY_DEBUG + +QT_BEGIN_NAMESPACE + +QSharedMemoryPrivate::QSharedMemoryPrivate() + : QObjectPrivate(), memory(0), size(0), error(QSharedMemory::NoError), +#ifndef QT_NO_SYSTEMSEMAPHORE + systemSemaphore(QString()), lockedByMe(false), +#endif + hand(0) { } void QSharedMemoryPrivate::setErrorString(const QString &function) { - BOOL windowsError = GetLastError(); + DWORD windowsError = GetLastError(); if (windowsError == 0) return; + switch (windowsError) { case ERROR_ALREADY_EXISTS: error = QSharedMemory::AlreadyExists; @@ -89,19 +95,20 @@ void QSharedMemoryPrivate::setErrorString(const QString &function) default: errorString = QSharedMemory::tr("%1: unknown error %2").arg(function).arg(windowsError); error = QSharedMemory::UnknownError; -#if defined QSHAREDMEMORY_DEBUG +#ifdef QSHAREDMEMORY_DEBUG qDebug() << errorString << "key" << key; #endif + break; } } HANDLE QSharedMemoryPrivate::handle() { if (!hand) { - QString function = QLatin1String("QSharedMemory::handle"); + // don't allow making handles on empty keys if (nativeKey.isEmpty()) { error = QSharedMemory::KeyError; - errorString = QSharedMemory::tr("%1: unable to make key").arg(function); + errorString = QSharedMemory::tr("%1: key is empty").arg(QLatin1String("QSharedMemory::handle")); return false; } #ifndef Q_OS_WINCE @@ -111,43 +118,34 @@ HANDLE QSharedMemoryPrivate::handle() // attach as it seems. hand = CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, 0, (wchar_t*)nativeKey.utf16()); #endif - if (!hand) { - setErrorString(function); - return false; - } + if (!hand) + setErrorString(QLatin1String("QSharedMemory::handle")); } + return hand; } -bool QSharedMemoryPrivate::cleanHandle() +void QSharedMemoryPrivate::cleanHandle() { - if (hand != 0 && !CloseHandle(hand)) { - hand = 0; + if (hand != 0 && !CloseHandle(hand)) setErrorString(QLatin1String("QSharedMemory::cleanHandle")); - return false; - } hand = 0; - return true; } bool QSharedMemoryPrivate::create(int size) { - QString function = QLatin1String("QSharedMemory::create"); if (nativeKey.isEmpty()) { error = QSharedMemory::KeyError; - errorString = QSharedMemory::tr("%1: key error").arg(function); + errorString = QSharedMemory::tr("%1: key is empty").arg(QLatin1String("QSharedMemory::create")); return false; } // Create the file mapping. hand = CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, size, (wchar_t*)nativeKey.utf16()); - setErrorString(function); + setErrorString(QLatin1String("QSharedMemory::create")); // hand is valid when it already exists unlike unix so explicitly check - if (error == QSharedMemory::AlreadyExists || !hand) - return false; - - return true; + return !(error == QSharedMemory::AlreadyExists || !hand); } bool QSharedMemoryPrivate::attach(QSharedMemory::AccessMode mode) @@ -167,7 +165,7 @@ bool QSharedMemoryPrivate::attach(QSharedMemory::AccessMode mode) // Windows doesn't set an error code on this one, // it should only be a kernel memory error. error = QSharedMemory::UnknownError; - errorString = QSharedMemory::tr("%1: size query failed").arg(QLatin1String("QSharedMemory::attach: ")); + errorString = QSharedMemory::tr("%1: size query failed").arg(QLatin1String("QSharedMemory::attach")); return false; } size = info.RegionSize; @@ -186,10 +184,11 @@ bool QSharedMemoryPrivate::detach() size = 0; // close handle - return cleanHandle(); -} - -#endif //QT_NO_SHAREDMEMORY + cleanHandle(); + return true; +} QT_END_NAMESPACE + +#endif // QT_NO_SHAREDMEMORY diff --git a/src/corelib/kernel/qsystemsemaphore_p.h b/src/corelib/kernel/qsystemsemaphore_p.h index d4e86e8..3e5f737 100644 --- a/src/corelib/kernel/qsystemsemaphore_p.h +++ b/src/corelib/kernel/qsystemsemaphore_p.h @@ -59,7 +59,7 @@ #include "qsharedmemory_p.h" #ifndef Q_OS_WINCE -# include <sys/types.h> +# include <sys/types.h> #endif #ifdef Q_OS_SYMBIAN @@ -70,11 +70,10 @@ QT_BEGIN_NAMESPACE class QSystemSemaphorePrivate { - public: QSystemSemaphorePrivate(); - QString makeKeyFileName() + inline QString makeKeyFileName() const { return QSharedMemoryPrivate::makePlatformSafeKey(key, QLatin1String("qipc_systemsem_")); } @@ -101,10 +100,10 @@ public: #elif defined(Q_OS_SYMBIAN) RSemaphore semaphore; #else + key_t unix_key; int semaphore; bool createdFile; bool createdSemaphore; - key_t unix_key; #endif QString errorString; QSystemSemaphore::SystemSemaphoreError error; @@ -115,4 +114,3 @@ QT_END_NAMESPACE #endif // QT_NO_SYSTEMSEMAPHORE #endif // QSYSTEMSEMAPHORE_P_H - diff --git a/src/corelib/kernel/qsystemsemaphore_symbian.cpp b/src/corelib/kernel/qsystemsemaphore_symbian.cpp index 96c19af..bb60df7 100644 --- a/src/corelib/kernel/qsystemsemaphore_symbian.cpp +++ b/src/corelib/kernel/qsystemsemaphore_symbian.cpp @@ -46,29 +46,32 @@ #include "qcore_symbian_p.h" #include <e32cmn.h> -QT_BEGIN_NAMESPACE #ifndef QT_NO_SYSTEMSEMAPHORE +//#define QSYSTEMSEMAPHORE_DEBUG + +QT_BEGIN_NAMESPACE + QSystemSemaphorePrivate::QSystemSemaphorePrivate() : - error(QSystemSemaphore::NoError) + error(QSystemSemaphore::NoError) { } void QSystemSemaphorePrivate::setErrorString(const QString &function, int err) { - if (err == KErrNone){ + if (err == KErrNone) return; - } + switch(err){ case KErrAlreadyExists: errorString = QCoreApplication::tr("%1: already exists", "QSystemSemaphore").arg(function); error = QSystemSemaphore::AlreadyExists; - break; + break; case KErrNotFound: errorString = QCoreApplication::tr("%1: does not exist", "QSystemSemaphore").arg(function); error = QSystemSemaphore::NotFound; - break; + break; case KErrNoMemory: case KErrInUse: errorString = QCoreApplication::tr("%1: out of resources", "QSystemSemaphore").arg(function); @@ -77,22 +80,21 @@ void QSystemSemaphorePrivate::setErrorString(const QString &function, int err) case KErrPermissionDenied: errorString = QCoreApplication::tr("%1: permission denied", "QSystemSemaphore").arg(function); error = QSystemSemaphore::PermissionDenied; - break; -default: - errorString = QCoreApplication::tr("%1: unknown error %2", "QSystemSemaphore").arg(function).arg(err); - error = QSystemSemaphore::UnknownError; - } - -#if defined QSYSTEMSEMAPHORE_DEBUG + break; + default: + errorString = QCoreApplication::tr("%1: unknown error %2", "QSystemSemaphore").arg(function).arg(err); + error = QSystemSemaphore::UnknownError; +#ifdef QSYSTEMSEMAPHORE_DEBUG qDebug() << errorString << "key" << key; #endif + break; + } } int QSystemSemaphorePrivate::handle(QSystemSemaphore::AccessMode) { - if (semaphore.Handle()) { + if (semaphore.Handle()) return semaphore.Handle(); - } // don't allow making handles on empty keys if (key.isEmpty()) @@ -106,12 +108,13 @@ int QSystemSemaphorePrivate::handle(QSystemSemaphore::AccessMode) while (err != KErrNoMemory && err != KErrNone && tryCount-- >= 0) { err = semaphore.CreateGlobal(name, initialValue, EOwnerProcess); if (err != KErrNoMemory && err != KErrNone) - err = semaphore.OpenGlobal(name,EOwnerProcess); + err = semaphore.OpenGlobal(name, EOwnerProcess); } - if (err){ - setErrorString(QLatin1String("QSystemSemaphore::handle"),err); + if (err) { + setErrorString(QLatin1String("QSystemSemaphore::handle"), err); return 0; } + return semaphore.Handle(); } @@ -125,14 +128,14 @@ bool QSystemSemaphorePrivate::modifySemaphore(int count) if (0 == handle()) return false; - if (count > 0) { + if (count > 0) semaphore.Signal(count); - } else { + else semaphore.Wait(); - } + return true; } -#endif //QT_NO_SYSTEMSEMAPHORE - QT_END_NAMESPACE + +#endif // QT_NO_SYSTEMSEMAPHORE diff --git a/src/corelib/kernel/qsystemsemaphore_unix.cpp b/src/corelib/kernel/qsystemsemaphore_unix.cpp index 5e533e7..704afaf 100644 --- a/src/corelib/kernel/qsystemsemaphore_unix.cpp +++ b/src/corelib/kernel/qsystemsemaphore_unix.cpp @@ -42,9 +42,9 @@ #include "qsystemsemaphore.h" #include "qsystemsemaphore_p.h" +#include <qcoreapplication.h> #include <qdebug.h> #include <qfile.h> -#include <qcoreapplication.h> #ifndef QT_NO_SYSTEMSEMAPHORE @@ -62,11 +62,13 @@ #define EIDRM EINVAL #endif +//#define QSYSTEMSEMAPHORE_DEBUG + QT_BEGIN_NAMESPACE QSystemSemaphorePrivate::QSystemSemaphorePrivate() : - semaphore(-1), createdFile(false), - createdSemaphore(false), unix_key(-1), error(QSystemSemaphore::NoError) + unix_key(-1), semaphore(-1), createdFile(false), + createdSemaphore(false), error(QSystemSemaphore::NoError) { } @@ -95,33 +97,33 @@ void QSystemSemaphorePrivate::setErrorString(const QString &function) default: errorString = QCoreApplication::translate("QSystemSemaphore", "%1: unknown error %2").arg(function).arg(errno); error = QSystemSemaphore::UnknownError; -#if defined QSYSTEMSEMAPHORE_DEBUG +#ifdef QSYSTEMSEMAPHORE_DEBUG qDebug() << errorString << "key" << key << "errno" << errno << EINVAL; #endif + break; } } /*! \internal - Setup unix_key - */ + Initialise the semaphore +*/ key_t QSystemSemaphorePrivate::handle(QSystemSemaphore::AccessMode mode) { - if (key.isEmpty()){ - errorString = QCoreApplication::tr("%1: key is empty", "QSystemSemaphore").arg(QLatin1String("QSystemSemaphore::handle:")); + if (-1 != unix_key) + return unix_key; + + if (key.isEmpty()) { + errorString = QCoreApplication::tr("%1: key is empty", "QSystemSemaphore").arg(QLatin1String("QSystemSemaphore::handle")); error = QSystemSemaphore::KeyError; return -1; } // ftok requires that an actual file exists somewhere - if (-1 != unix_key) - return unix_key; - - // Create the file needed for ftok int built = QSharedMemoryPrivate::createUnixKeyFile(fileName); if (-1 == built) { - errorString = QCoreApplication::tr("%1: unable to make key", "QSystemSemaphore").arg(QLatin1String("QSystemSemaphore::handle:")); + errorString = QCoreApplication::tr("%1: unable to make key", "QSystemSemaphore").arg(QLatin1String("QSystemSemaphore::handle")); error = QSystemSemaphore::KeyError; return -1; } @@ -130,7 +132,7 @@ key_t QSystemSemaphorePrivate::handle(QSystemSemaphore::AccessMode mode) // Get the unix key for the created file unix_key = ftok(QFile::encodeName(fileName).constData(), 'Q'); if (-1 == unix_key) { - errorString = QCoreApplication::tr("%1: ftok failed", "QSystemSemaphore").arg(QLatin1String("QSystemSemaphore::handle:")); + errorString = QCoreApplication::tr("%1: ftok failed", "QSystemSemaphore").arg(QLatin1String("QSystemSemaphore::handle")); error = QSystemSemaphore::KeyError; return -1; } @@ -145,17 +147,16 @@ key_t QSystemSemaphorePrivate::handle(QSystemSemaphore::AccessMode mode) cleanHandle(); return -1; } + if (mode == QSystemSemaphore::Create) { + createdSemaphore = true; + createdFile = true; + } } else { createdSemaphore = true; // Force cleanup of file, it is possible that it can be left over from a crash createdFile = true; } - if (mode == QSystemSemaphore::Create) { - createdSemaphore = true; - createdFile = true; - } - // Created semaphore so initialize its value. if (createdSemaphore && initialValue >= 0) { qt_semun init_op; @@ -173,8 +174,8 @@ key_t QSystemSemaphorePrivate::handle(QSystemSemaphore::AccessMode mode) /*! \internal - Cleanup the unix_key - */ + Clean up the semaphore +*/ void QSystemSemaphorePrivate::cleanHandle() { unix_key = -1; @@ -189,8 +190,8 @@ void QSystemSemaphorePrivate::cleanHandle() if (-1 != semaphore) { if (-1 == semctl(semaphore, 0, IPC_RMID, 0)) { setErrorString(QLatin1String("QSystemSemaphore::cleanHandle")); -#if defined QSYSTEMSEMAPHORE_DEBUG - qDebug() << QLatin1String("QSystemSemaphore::cleanHandle semctl failed."); +#ifdef QSYSTEMSEMAPHORE_DEBUG + qDebug("QSystemSemaphore::cleanHandle semctl failed."); #endif } semaphore = -1; @@ -201,7 +202,7 @@ void QSystemSemaphorePrivate::cleanHandle() /*! \internal - */ +*/ bool QSystemSemaphorePrivate::modifySemaphore(int count) { if (-1 == handle()) @@ -223,7 +224,7 @@ bool QSystemSemaphorePrivate::modifySemaphore(int count) return modifySemaphore(count); } setErrorString(QLatin1String("QSystemSemaphore::modifySemaphore")); -#if defined QSYSTEMSEMAPHORE_DEBUG +#ifdef QSYSTEMSEMAPHORE_DEBUG qDebug() << QLatin1String("QSystemSemaphore::modify failed") << count << semctl(semaphore, 0, GETVAL) << errno << EIDRM << EINVAL; #endif return false; @@ -232,7 +233,6 @@ bool QSystemSemaphorePrivate::modifySemaphore(int count) return true; } - QT_END_NAMESPACE #endif // QT_NO_SYSTEMSEMAPHORE diff --git a/src/corelib/kernel/qsystemsemaphore_win.cpp b/src/corelib/kernel/qsystemsemaphore_win.cpp index 30cab7e..0e9d645 100644 --- a/src/corelib/kernel/qsystemsemaphore_win.cpp +++ b/src/corelib/kernel/qsystemsemaphore_win.cpp @@ -44,18 +44,20 @@ #include "qcoreapplication.h" #include <qdebug.h> -QT_BEGIN_NAMESPACE - #ifndef QT_NO_SYSTEMSEMAPHORE +//#define QSYSTEMSEMAPHORE_DEBUG + +QT_BEGIN_NAMESPACE + QSystemSemaphorePrivate::QSystemSemaphorePrivate() : - semaphore(0), error(QSystemSemaphore::NoError) + semaphore(0), error(QSystemSemaphore::NoError) { } void QSystemSemaphorePrivate::setErrorString(const QString &function) { - BOOL windowsError = GetLastError(); + DWORD windowsError = GetLastError(); if (windowsError == 0) return; @@ -72,9 +74,10 @@ void QSystemSemaphorePrivate::setErrorString(const QString &function) default: errorString = QCoreApplication::translate("QSystemSemaphore", "%1: unknown error %2").arg(function).arg(windowsError); error = QSystemSemaphore::UnknownError; -#if defined QSYSTEMSEMAPHORE_DEBUG +#ifdef QSYSTEMSEMAPHORE_DEBUG qDebug() << errorString << "key" << key; #endif + break; } } @@ -110,7 +113,7 @@ bool QSystemSemaphorePrivate::modifySemaphore(int count) return false; if (count > 0) { - if (0 == ReleaseSemaphore(semaphore, count, 0)) { + if (0 == ReleaseSemaphore(semaphore, count, 0)) { setErrorString(QLatin1String("QSystemSemaphore::modifySemaphore")); #if defined QSYSTEMSEMAPHORE_DEBUG qDebug() << QLatin1String("QSystemSemaphore::modifySemaphore ReleaseSemaphore failed"); @@ -130,6 +133,6 @@ bool QSystemSemaphorePrivate::modifySemaphore(int count) return true; } -#endif //QT_NO_SYSTEMSEMAPHORE +#endif // QT_NO_SYSTEMSEMAPHORE QT_END_NAMESPACE diff --git a/src/gui/embedded/qkbd_qws.cpp b/src/gui/embedded/qkbd_qws.cpp index 77ae47b..5edc4d9 100644 --- a/src/gui/embedded/qkbd_qws.cpp +++ b/src/gui/embedded/qkbd_qws.cpp @@ -225,7 +225,7 @@ bool QWSKbPrivate::loadKeymap(const QString &file) ds >> qmap_magic >> qmap_version >> qmap_keymap_size >> qmap_keycompose_size; if (ds.status() != QDataStream::Ok || qmap_magic != QWSKeyboard::FileMagic || qmap_version != 1 || qmap_keymap_size == 0) { - qWarning("'%s' is ot a valid.qmap keymap file.", qPrintable(file)); + qWarning("'%s' is not a valid .qmap keymap file.", qPrintable(file)); return false; } diff --git a/src/gui/embedded/qkbdum_qws.cpp b/src/gui/embedded/qkbdum_qws.cpp index 4fbe03e..97561b5 100644 --- a/src/gui/embedded/qkbdum_qws.cpp +++ b/src/gui/embedded/qkbdum_qws.cpp @@ -40,7 +40,6 @@ ****************************************************************************/ #include "qkbdum_qws.h" -#include "qvfbhdr.h" #if !defined(QT_NO_QWS_KEYBOARD) && !defined(QT_NO_QWS_KBD_UM) @@ -55,6 +54,7 @@ #include <qwindowsystem_qws.h> #include <qsocketnotifier.h> #include "qplatformdefs.h" +#include "qvfbhdr.h" QT_BEGIN_NAMESPACE diff --git a/src/gui/embedded/qwindowsystem_qws.cpp b/src/gui/embedded/qwindowsystem_qws.cpp index 0e4e27c..36802a8 100644 --- a/src/gui/embedded/qwindowsystem_qws.cpp +++ b/src/gui/embedded/qwindowsystem_qws.cpp @@ -2494,7 +2494,7 @@ QWSWindow *QWSServer::windowAt(const QPoint& pos) } #ifndef QT_NO_QWS_KEYBOARD -static int keyUnicode(int keycode) +static inline int keyUnicode(int keycode) { int code = 0xffff; @@ -2550,18 +2550,16 @@ void QWSServer::sendKeyEvent(int unicode, int keycode, Qt::KeyboardModifiers mod void QWSServerPrivate::sendKeyEventUnfiltered(int unicode, int keycode, Qt::KeyboardModifiers modifiers, bool isPress, bool autoRepeat) { + QWSWindow *win = keyboardGrabber ? keyboardGrabber : qwsServerPrivate->focusw; - QWSKeyEvent event; - QWSWindow *win = keyboardGrabber ? keyboardGrabber : - qwsServerPrivate->focusw; - - event.simpleData.window = win ? win->winId() : 0; - - event.simpleData.unicode = #ifndef QT_NO_QWS_KEYBOARD - unicode < 0 ? keyUnicode(keycode) : + if (unicode < 0) + unicode = keyUnicode(keycode); #endif - unicode; + + QWSKeyEvent event; + event.simpleData.window = win ? win->winId() : 0; + event.simpleData.unicode = unicode; event.simpleData.keycode = keycode; event.simpleData.modifiers = modifiers; event.simpleData.is_press = isPress; @@ -4127,11 +4125,11 @@ void QWSServer::processKeyEvent(int unicode, int keycode, Qt::KeyboardModifiers #endif // If we press a key and it's going to be blocked, wake up the screen - if ( block && isPress ) - qwsServerPrivate->_q_screenSaverWake(); - - if ( block ) + if (block) { + if (isPress) + qwsServerPrivate->_q_screenSaverWake(); return; + } if (keyFilters) { for (int i = 0; i < keyFilters->size(); ++i) { diff --git a/src/gui/embedded/qwssharedmemory.cpp b/src/gui/embedded/qwssharedmemory.cpp index 66bedee..a677626 100644 --- a/src/gui/embedded/qwssharedmemory.cpp +++ b/src/gui/embedded/qwssharedmemory.cpp @@ -43,51 +43,51 @@ #if !defined(QT_NO_QWS_MULTIPROCESS) +#include <sys/types.h> +#include <sys/ipc.h> #include <sys/shm.h> +//#define QT_SHM_DEBUG + QT_BEGIN_NAMESPACE QWSSharedMemory::QWSSharedMemory() - : shmBase(0), shmSize(0), character(0), shmId(-1), key(-1) + : shmId(-1), shmBase(0), shmSize(0) { } - QWSSharedMemory::~QWSSharedMemory() { detach(); } -/* - man page says: - On Linux, it is possible to attach a shared memory segment even if it - is already marked to be deleted. However, POSIX.1-2001 does not spec- - ify this behaviour and many other implementations do not support it. -*/ - bool QWSSharedMemory::create(int size) { if (shmId != -1) detach(); - shmId = shmget(IPC_PRIVATE, size, IPC_CREAT|0600); + shmId = shmget(IPC_PRIVATE, size, IPC_CREAT | 0600); if (shmId == -1) { #ifdef QT_SHM_DEBUG - perror("QWSSharedMemory::create allocating shared memory"); + perror("QWSSharedMemory::create():"); qWarning("Error allocating shared memory of size %d", size); #endif return false; } - shmBase = shmat(shmId,0,0); + shmBase = shmat(shmId, 0, 0); + // On Linux, it is possible to attach a shared memory segment even if it + // is already marked to be deleted. However, POSIX.1-2001 does not specify + // this behaviour and many other implementations do not support it. shmctl(shmId, IPC_RMID, 0); - if (shmBase == (void*)-1) { + if (shmBase == (void*)-1 || !shmBase) { #ifdef QT_SHM_DEBUG - perror("QWSSharedMemory::create attaching to shared memory"); + perror("QWSSharedMemory::create():"); qWarning("Error attaching to shared memory id %d", shmId); #endif - shmBase = 0; + detach(); return false; } + return true; } @@ -95,91 +95,49 @@ bool QWSSharedMemory::attach(int id) { if (shmId == id) return id != -1; - if (shmId != -1) - detach(); - shmBase = shmat(id,0,0); - if (shmBase == (void*)-1) { + detach(); + + if (id == -1) + return false; + + shmId = id; + shmBase = shmat(shmId, 0, 0); + if (shmBase == (void*)-1 || !shmBase) { #ifdef QT_SHM_DEBUG - perror("QWSSharedMemory::attach attaching to shared memory"); - qWarning("Error attaching to shared memory 0x%x of size %d", - id, size()); + perror("QWSSharedMemory::attach():"); + qWarning("Error attaching to shared memory id %d", shmId); #endif - shmBase = 0; + detach(); return false; } - shmId = id; + return true; } - -void QWSSharedMemory::detach () +void QWSSharedMemory::detach() { - if (!shmBase) - return; - shmdt (shmBase); + if (shmBase && shmBase != (void*)-1) + shmdt(shmBase); shmBase = 0; shmSize = 0; shmId = -1; } -void QWSSharedMemory::setPermissions (mode_t mode) +int QWSSharedMemory::size() const { - struct shmid_ds shm; - shmctl (shmId, IPC_STAT, &shm); - shm.shm_perm.mode = mode; - shmctl (shmId, IPC_SET, &shm); -} - -int QWSSharedMemory::size () const -{ - struct shmid_ds shm; - shmctl (shmId, IPC_STAT, &shm); - return shm.shm_segsz; -} + if (shmId == -1) + return 0; + if (!shmSize) { + struct shmid_ds shm; + shmctl(shmId, IPC_STAT, &shm); + const_cast<QWSSharedMemory *>(this)->shmSize = shm.shm_segsz; + } -// old API - - - -QWSSharedMemory::QWSSharedMemory (int size, const QString &filename, char c) -{ - shmSize = size; - shmFile = filename; - shmBase = 0; - shmId = -1; - character = c; - key = ftok (shmFile.toLatin1().constData(), c); -} - - - -bool QWSSharedMemory::create () -{ - shmId = shmget (key, shmSize, IPC_CREAT | 0666); - return (shmId != -1); -} - -void QWSSharedMemory::destroy () -{ - if (shmId != -1) - shmctl(shmId, IPC_RMID, 0); -} - -bool QWSSharedMemory::attach () -{ - if (shmId == -1) - shmId = shmget (key, shmSize, 0); - - shmBase = shmat (shmId, 0, 0); - if ((long)shmBase == -1) - shmBase = 0; - - return (long)shmBase != 0; + return shmSize; } - QT_END_NAMESPACE #endif // QT_NO_QWS_MULTIPROCESS diff --git a/src/gui/embedded/qwssharedmemory_p.h b/src/gui/embedded/qwssharedmemory_p.h index 31e69c4..f3ce241 100644 --- a/src/gui/embedded/qwssharedmemory_p.h +++ b/src/gui/embedded/qwssharedmemory_p.h @@ -53,49 +53,31 @@ // We mean it. // -#include "qplatformdefs.h" -#include "QtCore/qstring.h" +#include <qplatformdefs.h> QT_BEGIN_NAMESPACE #if !defined(QT_NO_QWS_MULTIPROCESS) -class QWSSharedMemory { +class QWSSharedMemory +{ public: - QWSSharedMemory(); ~QWSSharedMemory(); - void setPermissions(mode_t mode); - int size() const; - void *address() { return shmBase; } - - int id() const { return shmId; } - - void detach(); - bool create(int size); bool attach(int id); + void detach(); - //bool create(int size, const QString &filename, char c = 'Q'); - //bool attach(const QString &filename, char c = 'Q'); -// old API - - QWSSharedMemory(int, const QString &, char c = 'Q'); - void * base() { return address(); } - - bool create(); - void destroy(); + int id() const { return shmId; } - bool attach(); + void *address() const { return shmBase; } + int size() const; private: + int shmId; void *shmBase; int shmSize; - QString shmFile; - char character; - int shmId; - key_t key; }; #endif // QT_NO_QWS_MULTIPROCESS diff --git a/src/gui/kernel/qapplication_qws.cpp b/src/gui/kernel/qapplication_qws.cpp index 14f7790..1197c77 100644 --- a/src/gui/kernel/qapplication_qws.cpp +++ b/src/gui/kernel/qapplication_qws.cpp @@ -112,19 +112,6 @@ #include <qvfbhdr.h> -#ifndef QT_NO_QWS_MULTIPROCESS -#ifdef QT_NO_QSHM -#include <sys/ipc.h> -#include <sys/shm.h> -#ifndef Q_OS_DARWIN -# include <sys/sem.h> -#endif -#include <sys/socket.h> -#else -#include "private/qwssharedmemory_p.h" -#endif -#endif - QT_BEGIN_NAMESPACE #ifndef QT_NO_DIRECTPAINTER @@ -230,7 +217,7 @@ QString qws_dataDir() qFatal("Qt for Embedded Linux data directory has incorrect permissions: %s", dataDir.constData()); #endif - result.append("/"); + result.append(QLatin1Char('/')); return result; } @@ -3565,13 +3552,8 @@ bool QETWidget::translateKeyEvent(const QWSKeyEvent *event, bool grab) /* grab i QEvent::KeyPress : QEvent::KeyRelease; bool autor = event->simpleData.is_auto_repeat; QString text; - char ascii = 0; - if (event->simpleData.unicode) { - QChar ch(event->simpleData.unicode); - if (ch.unicode() != 0xffff) - text += ch; - ascii = ch.toLatin1(); - } + if (event->simpleData.unicode && event->simpleData.unicode != 0xffff) + text += QChar(event->simpleData.unicode); code = event->simpleData.keycode; #if defined QT3_SUPPORT && !defined(QT_NO_SHORTCUT) diff --git a/src/gui/kernel/qsessionmanager_qws.cpp b/src/gui/kernel/qsessionmanager_qws.cpp index efe688e..e437635 100644 --- a/src/gui/kernel/qsessionmanager_qws.cpp +++ b/src/gui/kernel/qsessionmanager_qws.cpp @@ -43,6 +43,9 @@ #ifndef QT_NO_SESSIONMANAGER +#include <qapplication.h> +#include <private/qobject_p.h> + QT_BEGIN_NAMESPACE class QSessionManagerPrivate : public QObjectPrivate diff --git a/src/gui/painting/qwindowsurface_qws.cpp b/src/gui/painting/qwindowsurface_qws.cpp index c52f864..7e8cf9b 100644 --- a/src/gui/painting/qwindowsurface_qws.cpp +++ b/src/gui/painting/qwindowsurface_qws.cpp @@ -806,6 +806,10 @@ QWSMemorySurface::QWSMemorySurface(QWidget *w) QWSMemorySurface::~QWSMemorySurface() { +#ifndef QT_NO_QWS_MULTIPROCESS + if (memlock != QWSDisplay::Data::getClientLock()) + delete memlock; +#endif } @@ -852,9 +856,9 @@ void QWSMemorySurface::setLock(int lockId) { if (memlock && memlock->id() == lockId) return; - delete memlock; + if (memlock != QWSDisplay::Data::getClientLock()) + delete memlock; memlock = (lockId == -1 ? 0 : new QWSLock(lockId)); - return; } #endif // QT_NO_QWS_MULTIPROCESS @@ -946,37 +950,39 @@ void QWSLocalMemSurface::setGeometry(const QRect &rect) } uchar *deleteLater = 0; - // In case of a Hide event we need to delete the memory after sending the - // event to the server in order to let the server animate the event. - if (size.isEmpty()) { - deleteLater = mem; - mem = 0; - } if (img.size() != size) { - delete[] mem; if (size.isEmpty()) { + if (memsize) { + // In case of a Hide event we need to delete the memory after sending the + // event to the server in order to let the server animate the event. + deleteLater = mem; + memsize = 0; + } mem = 0; img = QImage(); } else { const QImage::Format format = preferredImageFormat(win); const int bpl = nextMulOf4(bytesPerPixel(format) * size.width()); - const int memsize = bpl * size.height(); - mem = new uchar[memsize]; + const int imagesize = bpl * size.height(); + if (memsize < imagesize) { + delete[] mem; + memsize = imagesize; + mem = new uchar[memsize]; + } img = QImage(mem, size.width(), size.height(), bpl, format); setImageMetrics(img, win); } } QWSWindowSurface::setGeometry(rect); + delete[] deleteLater; } QByteArray QWSLocalMemSurface::permanentState() const { - QByteArray array; - array.resize(sizeof(uchar*) + 3 * sizeof(int) + - sizeof(SurfaceFlags)); + QByteArray array(sizeof(uchar*) + 3 * sizeof(int) + sizeof(SurfaceFlags), Qt::Uninitialized); char *ptr = array.data(); @@ -997,6 +1003,11 @@ QByteArray QWSLocalMemSurface::permanentState() const void QWSLocalMemSurface::setPermanentState(const QByteArray &data) { + if (memsize) { + delete[] mem; + memsize = 0; + } + int width; int height; QImage::Format format; @@ -1023,6 +1034,10 @@ void QWSLocalMemSurface::setPermanentState(const QByteArray &data) void QWSLocalMemSurface::releaseSurface() { + if (memsize) { + delete[] mem; + memsize = 0; + } mem = 0; img = QImage(); } @@ -1064,17 +1079,15 @@ bool QWSSharedMemSurface::setMemory(int memId) void QWSSharedMemSurface::setDirectRegion(const QRegion &r, int id) { QWSMemorySurface::setDirectRegion(r, id); - if(mem.address()) + if (mem.address()) *(uint *)mem.address() = id; } const QRegion QWSSharedMemSurface::directRegion() const { - QWSSharedMemory *cmem = const_cast<QWSSharedMemory *>(&mem); - if (cmem->address() && ((int*)cmem->address())[0] == directRegionId()) + if (mem.address() && *(uint *)mem.address() == uint(directRegionId()) return QWSMemorySurface::directRegion(); - else - return QRegion(); + return QRegion(); } #endif @@ -1117,8 +1130,6 @@ void QWSSharedMemSurface::setGeometry(const QRect &rect) mem.detach(); img = QImage(); } else { - mem.detach(); - QWidget *win = window(); const QImage::Format format = preferredImageFormat(win); const int bpl = nextMulOf4(bytesPerPixel(format) * size.width()); @@ -1127,9 +1138,12 @@ void QWSSharedMemSurface::setGeometry(const QRect &rect) #else const int imagesize = bpl * size.height(); #endif - if (!mem.create(imagesize)) { - perror("QWSSharedMemSurface::setGeometry allocating shared memory"); - qFatal("Error creating shared memory of size %d", imagesize); + if (mem.size() < imagesize) { + mem.detach(); + if (!mem.create(imagesize)) { + perror("QWSSharedMemSurface::setGeometry allocating shared memory"); + qFatal("Error creating shared memory of size %d", imagesize); + } } #ifdef QT_QWS_CLIENTBLIT *((uint *)mem.address()) = 0; @@ -1147,8 +1161,7 @@ void QWSSharedMemSurface::setGeometry(const QRect &rect) QByteArray QWSSharedMemSurface::permanentState() const { - QByteArray array; - array.resize(6 * sizeof(int)); + QByteArray array(6 * sizeof(int), Qt::Uninitialized); int *ptr = reinterpret_cast<int*>(array.data()); @@ -1222,8 +1235,8 @@ bool QWSOnScreenSurface::isValid() const QByteArray QWSOnScreenSurface::permanentState() const { - QByteArray array; - array.resize(sizeof(int)); + QByteArray array(sizeof(int), Qt::Uninitialized); + int *ptr = reinterpret_cast<int*>(array.data()); ptr[0] = QApplication::desktop()->screenNumber(window()); return array; @@ -1263,8 +1276,7 @@ QWSYellowSurface::~QWSYellowSurface() QByteArray QWSYellowSurface::permanentState() const { - QByteArray array; - array.resize(2 * sizeof(int)); + QByteArray array(2 * sizeof(int), Qt::Uninitialized); int *ptr = reinterpret_cast<int*>(array.data()); ptr[0] = surfaceSize.width(); diff --git a/src/plugins/accessible/widgets/qaccessiblewidgets.cpp b/src/plugins/accessible/widgets/qaccessiblewidgets.cpp index 34f5be9..c62624b 100644 --- a/src/plugins/accessible/widgets/qaccessiblewidgets.cpp +++ b/src/plugins/accessible/widgets/qaccessiblewidgets.cpp @@ -1316,11 +1316,112 @@ void QAccessibleTextEdit::addSelection(int startOffset, int endOffset) QString QAccessibleTextEdit::attributes(int offset, int *startOffset, int *endOffset) { - // TODO - wait for a definition of attributes - Q_UNUSED(offset); - Q_UNUSED(startOffset); - Q_UNUSED(endOffset); - return QString(); + /* The list of attributes can be found at: + http://linuxfoundation.org/collaborate/workgroups/accessibility/iaccessible2/textattributes + */ + + if (offset >= characterCount()) { + *startOffset = -1; + *endOffset = -1; + return QString(); + } + + QMap<QString, QString> attrs; + + QTextCursor cursor = textEdit()->textCursor(); + + //cursor.charFormat returns the format of the previous character + cursor.setPosition(offset + 1); + QTextCharFormat charFormat = cursor.charFormat(); + + cursor.setPosition(offset); + QTextBlockFormat blockFormat = cursor.blockFormat(); + + QTextCharFormat charFormatComp; + QTextBlockFormat blockFormatComp; + + *startOffset = offset; + cursor.setPosition(*startOffset); + while (*startOffset > 0) { + charFormatComp = cursor.charFormat(); + cursor.setPosition(*startOffset - 1); + blockFormatComp = cursor.blockFormat(); + if ((charFormat == charFormatComp) && (blockFormat == blockFormatComp)) + (*startOffset)--; + else + break; + } + + int limit = characterCount() + 1; + *endOffset = offset + 1; + cursor.setPosition(*endOffset); + while (*endOffset < limit) { + blockFormatComp = cursor.blockFormat(); + cursor.setPosition(*endOffset + 1); + charFormatComp = cursor.charFormat(); + if ((charFormat == charFormatComp) && (cursor.blockFormat() == blockFormatComp)) + (*endOffset)++; + else + break; + } + + QString family = charFormat.fontFamily(); + if (!family.isEmpty()) { + family = family.replace('\\',"\\\\"); + family = family.replace(':',"\\:"); + family = family.replace(',',"\\,"); + family = family.replace('=',"\\="); + family = family.replace(';',"\\;"); + family = family.replace('\"',"\\\""); + attrs["font-family"] = '"'+family+'"'; + } + + int fontSize = int(charFormat.fontPointSize()); + if (fontSize) + attrs["font-size"] = QString::number(fontSize).append("pt"); + + //Different weight values are not handled + attrs["font-weight"] = (charFormat.fontWeight() > QFont::Normal) ? "bold" : "normal"; + + QFont::Style style = charFormat.font().style(); + attrs["font-style"] = (style == QFont::StyleItalic) ? "italic" : ((style == QFont::StyleOblique) ? "oblique": "normal"); + + attrs["text-underline-style"] = charFormat.font().underline() ? "solid" : "none"; + + QTextCharFormat::VerticalAlignment alignment = charFormat.verticalAlignment(); + attrs["text-position"] = (alignment == QTextCharFormat::AlignSubScript) ? "sub" : ((alignment == QTextCharFormat::AlignSuperScript) ? "super" : "baseline" ); + + QBrush background = charFormat.background(); + if (background.style() == Qt::SolidPattern) { + attrs["background-color"] = QString("rgb(%1,%2,%3)").arg(background.color().red()).arg(background.color().green()).arg(background.color().blue()); + } + + QBrush foreground = charFormat.foreground(); + if (foreground.style() == Qt::SolidPattern) { + attrs["color"] = QString("rgb(%1,%2,%3)").arg(foreground.color().red()).arg(foreground.color().green()).arg(foreground.color().blue()); + } + + switch (blockFormat.alignment() & (Qt::AlignLeft | Qt::AlignRight | Qt::AlignHCenter | Qt::AlignJustify)) { + case Qt::AlignLeft: + attrs["text-align"] = "left"; + break; + case Qt::AlignRight: + attrs["text-align"] = "right"; + break; + case Qt::AlignHCenter: + attrs["text-align"] = "center"; + break; + case Qt::AlignJustify: + attrs["text-align"] = "left"; + break; + } + + QString result; + foreach (const QString &attributeName, attrs.keys()) { + result.append(attributeName).append(':').append(attrs[attributeName]).append(';'); + } + + return result; } int QAccessibleTextEdit::cursorPosition() @@ -1435,9 +1536,9 @@ QString QAccessibleTextEdit::textAtOffset(int offset, BoundaryType boundaryType, if (offset >= characterCount()) return QString(); + cursor.setPosition(offset); switch (boundaryType) { case CharBoundary: - cursor.setPosition(offset); *startOffset = cursor.position(); cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor); *endOffset = cursor.position(); |