summaryrefslogtreecommitdiffstats
path: root/src/gui/kernel
diff options
context:
space:
mode:
authorJason Barron <jbarron@trolltech.com>2009-08-04 11:17:47 (GMT)
committerJason Barron <jbarron@trolltech.com>2009-08-04 11:17:47 (GMT)
commitbe212bf108e71ba3b5b75802b1f4de6613ba315c (patch)
treec541ad12e8698f04e8fe386c2e1b94e8baca6c1b /src/gui/kernel
parent67ae1b0dac175f48875507f3187ed49276a29ddf (diff)
parente6bb00250b321b149dd80259dc4f479088d5949b (diff)
downloadQt-be212bf108e71ba3b5b75802b1f4de6613ba315c.zip
Qt-be212bf108e71ba3b5b75802b1f4de6613ba315c.tar.gz
Qt-be212bf108e71ba3b5b75802b1f4de6613ba315c.tar.bz2
Merge commit 'origin/master'
Conflicts: src/corelib/global/qglobal.h src/corelib/kernel/qmetatype.cpp src/corelib/kernel/qobject.cpp src/corelib/thread/qthread_unix.cpp src/gui/graphicsview/qgraphicssceneevent.h src/gui/itemviews/qheaderview.h src/gui/kernel/qapplication_qws.cpp src/gui/kernel/qgesture.h src/gui/kernel/qgesturerecognizer.h src/gui/painting/qpaintengine_raster.cpp src/network/access/qhttpnetworkreply.cpp src/network/access/qnetworkcookie.h src/network/socket/qnativesocketengine_unix.cpp
Diffstat (limited to 'src/gui/kernel')
-rw-r--r--src/gui/kernel/kernel.pri12
-rw-r--r--src/gui/kernel/qaction.cpp2
-rw-r--r--src/gui/kernel/qaction.h2
-rw-r--r--src/gui/kernel/qactiongroup.h2
-rw-r--r--src/gui/kernel/qapplication.cpp33
-rw-r--r--src/gui/kernel/qapplication.h2
-rw-r--r--src/gui/kernel/qapplication_qws.cpp12
-rw-r--r--src/gui/kernel/qapplication_s60.cpp49
-rw-r--r--src/gui/kernel/qapplication_win.cpp2
-rw-r--r--src/gui/kernel/qboxlayout.cpp29
-rw-r--r--src/gui/kernel/qboxlayout.h2
-rw-r--r--src/gui/kernel/qclipboard.h2
-rw-r--r--src/gui/kernel/qclipboard_s60.cpp29
-rw-r--r--src/gui/kernel/qdesktopwidget.h2
-rw-r--r--src/gui/kernel/qdesktopwidget_x11.cpp2
-rw-r--r--src/gui/kernel/qdnd_s60.cpp14
-rw-r--r--src/gui/kernel/qdnd_x11.cpp2
-rw-r--r--src/gui/kernel/qdrag.h2
-rw-r--r--src/gui/kernel/qeventdispatcher_glib_qws_p.h2
-rw-r--r--src/gui/kernel/qeventdispatcher_mac_p.h2
-rw-r--r--src/gui/kernel/qeventdispatcher_qws_p.h2
-rw-r--r--src/gui/kernel/qeventdispatcher_s60.cpp2
-rw-r--r--src/gui/kernel/qeventdispatcher_x11_p.h2
-rw-r--r--src/gui/kernel/qformlayout.h2
-rw-r--r--src/gui/kernel/qgesture.h2
-rw-r--r--src/gui/kernel/qgridlayout.h2
-rw-r--r--src/gui/kernel/qguieventdispatcher_glib_p.h2
-rw-r--r--src/gui/kernel/qkeymapper_mac.cpp10
-rw-r--r--src/gui/kernel/qkeymapper_p.h4
-rw-r--r--src/gui/kernel/qkeymapper_win.cpp9
-rw-r--r--src/gui/kernel/qkeysequence.cpp4
-rw-r--r--src/gui/kernel/qlayout.h2
-rw-r--r--src/gui/kernel/qsessionmanager.h2
-rw-r--r--src/gui/kernel/qshortcut.h2
-rw-r--r--src/gui/kernel/qshortcutmap_p.h2
-rw-r--r--src/gui/kernel/qsound.h2
-rw-r--r--src/gui/kernel/qsound_s60.cpp40
-rw-r--r--src/gui/kernel/qstackedlayout.h2
-rw-r--r--src/gui/kernel/qt_s60_p.h16
-rw-r--r--src/gui/kernel/qwidget.cpp98
-rw-r--r--src/gui/kernel/qwidget.h2
-rw-r--r--src/gui/kernel/qwidget_mac.mm6
-rw-r--r--src/gui/kernel/qwidget_p.h7
-rw-r--r--src/gui/kernel/qwidget_qws.cpp9
-rw-r--r--src/gui/kernel/qwidget_s60.cpp97
-rw-r--r--src/gui/kernel/qwidget_win.cpp6
-rw-r--r--src/gui/kernel/qwidget_x11.cpp6
-rw-r--r--src/gui/kernel/qwidgetaction.h2
-rw-r--r--src/gui/kernel/qx11embed_x11.cpp2
-rw-r--r--src/gui/kernel/qx11embed_x11.h4
50 files changed, 327 insertions, 225 deletions
diff --git a/src/gui/kernel/kernel.pri b/src/gui/kernel/kernel.pri
index 530b146..1766ecd 100644
--- a/src/gui/kernel/kernel.pri
+++ b/src/gui/kernel/kernel.pri
@@ -107,7 +107,7 @@ symbian {
kernel/qclipboard_s60.cpp\
kernel/qdnd_s60.cpp \
kernel/qsound_s60.cpp
-
+
HEADERS += \
kernel/qt_s60_p.h \
kernel/qeventdispatcher_s60_p.h
@@ -191,7 +191,7 @@ embedded {
qcocoaview_mac_p.h \
qcocoaapplication_mac_p.h \
qcocoaapplicationdelegate_mac_p.h \
- qmultitouch_mac_p.h
+ qmultitouch_mac_p.h
OBJECTIVE_SOURCES += \
kernel/qcursor_mac.mm \
@@ -209,7 +209,7 @@ embedded {
kernel/qt_cocoa_helpers_mac.mm \
kernel/qdesktopwidget_mac.mm \
kernel/qeventdispatcher_mac.mm \
- kernel/qcocoawindowcustomthemeframe_mac.mm \
+ kernel/qcocoawindowcustomthemeframe_mac.mm \
kernel/qmultitouch_mac.mm \
HEADERS += \
@@ -218,10 +218,10 @@ embedded {
kernel/qcocoaapplicationdelegate_mac_p.h \
kernel/qeventdispatcher_mac_p.h
- MENU_NIB.files = mac/qt_menu.nib
- MENU_NIB.path = Resources
+ MENU_NIB.files = mac/qt_menu.nib
+ MENU_NIB.path = Resources
MENU_NIB.version = Versions
- QMAKE_BUNDLE_DATA += MENU_NIB
+ QMAKE_BUNDLE_DATA += MENU_NIB
RESOURCES += mac/macresources.qrc
LIBS += -framework AppKit
diff --git a/src/gui/kernel/qaction.cpp b/src/gui/kernel/qaction.cpp
index afe6269..53cbc64 100644
--- a/src/gui/kernel/qaction.cpp
+++ b/src/gui/kernel/qaction.cpp
@@ -1414,7 +1414,7 @@ QAction::MenuRole QAction::menuRole() const
This indicates what softkey action this action is. Usually used on mobile
platforms to map QActions to hardware keys.
-
+
The softkey role can be changed any time.
*/
void QAction::setSoftKeyRole(SoftKeyRole softKeyRole)
diff --git a/src/gui/kernel/qaction.h b/src/gui/kernel/qaction.h
index 68f88c5..ef32a33 100644
--- a/src/gui/kernel/qaction.h
+++ b/src/gui/kernel/qaction.h
@@ -64,7 +64,7 @@ class QGraphicsWidget;
class Q_GUI_EXPORT QAction : public QObject
{
Q_OBJECT
- Q_DECLARE_PRIVATE(QAction)
+ Q_DECLARE_SCOPED_PRIVATE(QAction)
Q_ENUMS(MenuRole)
Q_ENUMS(SoftKeyRole)
diff --git a/src/gui/kernel/qactiongroup.h b/src/gui/kernel/qactiongroup.h
index e42c2e5..07bdbda 100644
--- a/src/gui/kernel/qactiongroup.h
+++ b/src/gui/kernel/qactiongroup.h
@@ -57,7 +57,7 @@ class QActionGroupPrivate;
class Q_GUI_EXPORT QActionGroup : public QObject
{
Q_OBJECT
- Q_DECLARE_PRIVATE(QActionGroup)
+ Q_DECLARE_SCOPED_PRIVATE(QActionGroup)
Q_PROPERTY(bool exclusive READ isExclusive WRITE setExclusive)
Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)
diff --git a/src/gui/kernel/qapplication.cpp b/src/gui/kernel/qapplication.cpp
index 7acba93..7aeab39 100644
--- a/src/gui/kernel/qapplication.cpp
+++ b/src/gui/kernel/qapplication.cpp
@@ -850,7 +850,7 @@ extern int qUnregisterGuiStateMachine();
void QApplicationPrivate::initialize()
{
QWidgetPrivate::mapper = new QWidgetMapper;
- QWidgetPrivate::uncreatedWidgets = new QWidgetSet;
+ QWidgetPrivate::allWidgets = new QWidgetSet;
if (qt_appType != QApplication::Tty)
(void) QApplication::style(); // trigger creation of application style
// trigger registering of QVariant's GUI types
@@ -994,23 +994,13 @@ QApplication::~QApplication()
qt_clipboard = 0;
#endif
- // delete widget mapper
- if (QWidgetPrivate::mapper) {
- QWidgetMapper * myMapper = QWidgetPrivate::mapper;
- QWidgetPrivate::mapper = 0;
- for (QWidgetMapper::ConstIterator it = myMapper->constBegin();
- it != myMapper->constEnd(); ++it) {
- register QWidget *w = *it;
- if (!w->parent()) // window
- w->destroy(true, true);
- }
- delete myMapper;
- }
+ delete QWidgetPrivate::mapper;
+ QWidgetPrivate::mapper = 0;
- // delete uncreated widgets
- if (QWidgetPrivate::uncreatedWidgets) {
- QWidgetSet *mySet = QWidgetPrivate::uncreatedWidgets;
- QWidgetPrivate::uncreatedWidgets = 0;
+ // delete all widgets
+ if (QWidgetPrivate::allWidgets) {
+ QWidgetSet *mySet = QWidgetPrivate::allWidgets;
+ QWidgetPrivate::allWidgets = 0;
for (QWidgetSet::ConstIterator it = mySet->constBegin(); it != mySet->constEnd(); ++it) {
register QWidget *w = *it;
if (!w->parent()) // window
@@ -2036,12 +2026,9 @@ QWidgetList QApplication::topLevelWidgets()
QWidgetList QApplication::allWidgets()
{
- QWidgetList list;
- if (QWidgetPrivate::mapper)
- list += QWidgetPrivate::mapper->values();
- if (QWidgetPrivate::uncreatedWidgets)
- list += QWidgetPrivate::uncreatedWidgets->toList();
- return list;
+ if (QWidgetPrivate::allWidgets)
+ return QWidgetPrivate::allWidgets->toList();
+ return QWidgetList();
}
/*!
diff --git a/src/gui/kernel/qapplication.h b/src/gui/kernel/qapplication.h
index fcb3a7c..88a01fe 100644
--- a/src/gui/kernel/qapplication.h
+++ b/src/gui/kernel/qapplication.h
@@ -363,7 +363,7 @@ public:
private:
Q_DISABLE_COPY(QApplication)
- Q_DECLARE_PRIVATE(QApplication)
+ Q_DECLARE_SCOPED_PRIVATE(QApplication)
friend class QGraphicsWidget;
friend class QGraphicsScene;
diff --git a/src/gui/kernel/qapplication_qws.cpp b/src/gui/kernel/qapplication_qws.cpp
index 0f41025..e4e7951 100644
--- a/src/gui/kernel/qapplication_qws.cpp
+++ b/src/gui/kernel/qapplication_qws.cpp
@@ -680,7 +680,7 @@ void QWSDisplay::Data::sendSynchronousCommand(QWSCommand & cmd)
int QWSDisplay::Data::takeId()
{
int unusedIdCount = unused_identifiers.count();
- if (unusedIdCount == 10)
+ if (unusedIdCount <= 10)
create(15);
if (unusedIdCount == 0) {
create(1); // Make sure we have an incoming id to wait for, just in case we're recursive
@@ -3773,4 +3773,14 @@ void QApplicationPrivate::initializeMultitouch_sys()
void QApplicationPrivate::cleanupMultitouch_sys()
{ }
+/* \internal
+ This is used to clean up the qws server
+ in case the QApplication constructor threw an exception
+*/
+QWSServerCleaner::~QWSServerCleaner()
+{
+ if (qwsServer && qws_single_process)
+ QWSServer::closedown();
+}
+
QT_END_NAMESPACE
diff --git a/src/gui/kernel/qapplication_s60.cpp b/src/gui/kernel/qapplication_s60.cpp
index d47747f..c831dad 100644
--- a/src/gui/kernel/qapplication_s60.cpp
+++ b/src/gui/kernel/qapplication_s60.cpp
@@ -76,13 +76,18 @@ QT_BEGIN_NAMESPACE
static bool appNoGrab = false; // Grabbing enabled
#endif
-Q_GUI_EXPORT QS60Data *qt_s60Data = 0;
+Q_GLOBAL_STATIC(QS60Data, qt_s60Data);
extern bool qt_sendSpontaneousEvent(QObject*,QEvent*);
extern QDesktopWidget *qt_desktopWidget; // qapplication.cpp
QWidget *qt_button_down = 0; // widget got last button-down
+QS60Data* qGlobalS60Data()
+{
+ return qt_s60Data();
+}
+
bool qt_nograb() // application no-grab option
{
#if defined(QT_DEBUG)
@@ -119,7 +124,7 @@ private:
QS60Beep::~QS60Beep()
{
- delete iToneUtil;
+ delete iToneUtil;
}
QS60Beep* QS60Beep::NewL(TInt aFrequency, TTimeIntervalMicroSeconds aDuration)
@@ -148,7 +153,7 @@ void QS60Beep::Play()
iState=EBeepPrepared;
}
}
-
+
iToneUtil->Play();
iState=EBeepPlaying;
}
@@ -290,7 +295,7 @@ void QLongTapTimer::PointerEventL(const TPointerEvent& event)
Cancel();
m_event = event;
if (event.iType == TPointerEvent::EButton1Down)
- {
+ {
m_pressedCoordinates = QPoint(event.iPosition.iX,event.iPosition.iY);
// must be same as KLongTapDelay in aknlongtapdetector.h
After(800000);
@@ -361,7 +366,7 @@ void QSymbianControl::HandlePointerEventL(const TPointerEvent& pEvent)
}
if (type == QMouseEvent::None)
return;
-
+
// store events for later sending/saving
QWidget *alienWidget;
typedef QPair<QWidget*,QMouseEvent> Event;
@@ -370,7 +375,7 @@ void QSymbianControl::HandlePointerEventL(const TPointerEvent& pEvent)
QPoint widgetPos = QPoint(pEvent.iPosition.iX, pEvent.iPosition.iY);
TPoint controlScreenPos = PositionRelativeToScreen();
QPoint globalPos = QPoint(controlScreenPos.iX, controlScreenPos.iY) + widgetPos;
-
+
if (type == QEvent::MouseButtonPress || type == QEvent::MouseButtonDblClick)
{
// get the button press target
@@ -401,7 +406,7 @@ void QSymbianControl::HandlePointerEventL(const TPointerEvent& pEvent)
events.append(Event(S60->lastPointerEventTarget,mEventLeave));
}
QMouseEvent mEventEnter(QEvent::Enter, alienWidget->mapFromGlobal(globalPos), globalPos,
- button, QApplicationPrivate::mouse_buttons, mapToQtModifiers(pEvent.iModifiers));
+ button, QApplicationPrivate::mouse_buttons, mapToQtModifiers(pEvent.iModifiers));
events.append(Event(alienWidget,mEventEnter));
}
@@ -441,7 +446,7 @@ void QSymbianControl::sendMouseEvent(QWidget *widget, QMouseEvent *mEvent)
TKeyResponse QSymbianControl::OfferKeyEventL(const TKeyEvent& keyEvent, TEventCode type)
{
TKeyResponse r = EKeyWasNotConsumed;
- QT_TRANSLATE_EXCEPTION_TO_SYMBIAN_LEAVE(r = OfferKeyEvent(keyEvent, type));
+ QT_TRYCATCH_LEAVING(r = OfferKeyEvent(keyEvent, type));
return r;
}
@@ -667,14 +672,14 @@ void QSymbianControl::HandleResourceChange(int resourceType)
{
switch (resourceType) {
case KInternalStatusPaneChange:
- qwidget->d_func()->setWindowIcon_sys(true);
- break;
+ qwidget->d_func()->setWindowIcon_sys(true);
+ break;
case KUidValueCoeFontChangeEvent:
// font change event
break;
#ifdef Q_WS_S60
case KEikDynamicLayoutVariantSwitch:
- {
+ {
if (qwidget->isFullScreen()) {
SetExtentToWholeScreen();
} else if (qwidget->isMaximized()) {
@@ -706,8 +711,6 @@ TTypeUid::Ptr QSymbianControl::MopSupplyObject(TTypeUid id)
void qt_init(QApplicationPrivate * /* priv */, int)
{
- S60 = new QS60Data;
-
#ifdef QT_NO_DEBUG
if (!qgetenv("QT_S60_AUTO_FLUSH_WSERV").isEmpty())
#endif
@@ -723,12 +726,6 @@ void qt_init(QApplicationPrivate * /* priv */, int)
TSecureId securId = me.SecureId();
S60->uid = securId.operator TUid();
- // New code to configure the window group name such that window server knows the associated application's UID
- CApaWindowGroupName *wgn = CApaWindowGroupName::NewL(S60->wsSession());
- wgn->SetAppUid(S60->uid);
- User::LeaveIfError(wgn->SetWindowGroupName((S60->windowGroup())));
- delete wgn;
-
/*
### Commented out for now as parameter handling not needed in SOS(yet). Code below will break testlib with -o flag
int argc = priv->argc;
@@ -947,10 +944,10 @@ void QApplication::beep()
QS60Beep* beep=NULL;
TRAPD(err, beep=QS60Beep::NewL(frequency, duration));
if(!err) {
- beep->Play();
+ beep->Play();
}
delete beep;
- beep=NULL;
+ beep=NULL;
}
int QApplication::s60ProcessEvent(TWsEvent *event)
@@ -1084,8 +1081,8 @@ void QApplication::symbianResourceChange(int type)
case KEikDynamicLayoutVariantSwitch:
{
if (S60)
- S60->updateScreenSize();
-
+ S60->updateScreenSize();
+
#ifndef QT_NO_STYLE_S60
QS60Style *s60Style = 0;
@@ -1099,7 +1096,7 @@ void QApplication::symbianResourceChange(int type)
if (s60Style)
s60Style->handleDynamicLayoutVariantSwitch();
-#endif
+#endif
}
break;
@@ -1107,7 +1104,7 @@ void QApplication::symbianResourceChange(int type)
case KAknsMessageSkinChange:
if (QS60Style *s60Style = qobject_cast<QS60Style*>(QApplication::style()))
s60Style->handleSkinChange();
- break;
+ break;
#endif
#endif // Q_WS_S60
default:
@@ -1178,5 +1175,3 @@ void QSessionManager::cancel()
}
#endif //QT_NO_SESSIONMANAGER
QT_END_NAMESPACE
-
-
diff --git a/src/gui/kernel/qapplication_win.cpp b/src/gui/kernel/qapplication_win.cpp
index d5c820c..8eeac65 100644
--- a/src/gui/kernel/qapplication_win.cpp
+++ b/src/gui/kernel/qapplication_win.cpp
@@ -1098,7 +1098,7 @@ static void qWinProcessConfigRequests() // perform requests in qu
class QGuiEventDispatcherWin32 : public QEventDispatcherWin32
{
- Q_DECLARE_PRIVATE(QEventDispatcherWin32)
+ Q_DECLARE_SCOPED_PRIVATE(QEventDispatcherWin32)
public:
QGuiEventDispatcherWin32(QObject *parent = 0);
bool processEvents(QEventLoop::ProcessEventsFlags flags);
diff --git a/src/gui/kernel/qboxlayout.cpp b/src/gui/kernel/qboxlayout.cpp
index 23d20ff..a7802af 100644
--- a/src/gui/kernel/qboxlayout.cpp
+++ b/src/gui/kernel/qboxlayout.cpp
@@ -925,9 +925,15 @@ void QBoxLayout::insertSpacing(int index, int size)
else
b = QLayoutPrivate::createSpacerItem(this, 0, size, QSizePolicy::Minimum, QSizePolicy::Fixed);
- QBoxLayoutItem *it = new QBoxLayoutItem(b);
- it->magic = true;
- d->list.insert(index, it);
+ QT_TRY {
+ QBoxLayoutItem *it = new QBoxLayoutItem(b);
+ it->magic = true;
+ d->list.insert(index, it);
+
+ } QT_CATCH(...) {
+ delete b;
+ QT_RETHROW;
+ }
invalidate();
}
@@ -1027,8 +1033,21 @@ void QBoxLayout::insertWidget(int index, QWidget *widget, int stretch,
index = d->list.count();
QWidgetItem *b = QLayoutPrivate::createWidgetItem(this, widget);
b->setAlignment(alignment);
- QBoxLayoutItem *it = new QBoxLayoutItem(b, stretch);
- d->list.insert(index, it);
+
+ QBoxLayoutItem *it;
+ QT_TRY{
+ it = new QBoxLayoutItem(b, stretch);
+ } QT_CATCH(...) {
+ delete b;
+ QT_RETHROW;
+ }
+
+ QT_TRY{
+ d->list.insert(index, it);
+ } QT_CATCH(...) {
+ delete it;
+ QT_RETHROW;
+ }
invalidate();
}
diff --git a/src/gui/kernel/qboxlayout.h b/src/gui/kernel/qboxlayout.h
index f463c31..c399b8d 100644
--- a/src/gui/kernel/qboxlayout.h
+++ b/src/gui/kernel/qboxlayout.h
@@ -60,7 +60,7 @@ class QBoxLayoutPrivate;
class Q_GUI_EXPORT QBoxLayout : public QLayout
{
Q_OBJECT
- Q_DECLARE_PRIVATE(QBoxLayout)
+ Q_DECLARE_SCOPED_PRIVATE(QBoxLayout)
public:
enum Direction { LeftToRight, RightToLeft, TopToBottom, BottomToTop,
Down = TopToBottom, Up = BottomToTop };
diff --git a/src/gui/kernel/qclipboard.h b/src/gui/kernel/qclipboard.h
index 8241812..68fbf33 100644
--- a/src/gui/kernel/qclipboard.h
+++ b/src/gui/kernel/qclipboard.h
@@ -62,7 +62,7 @@ class QClipboardPrivate;
class Q_GUI_EXPORT QClipboard : public QObject
{
Q_OBJECT
- Q_DECLARE_PRIVATE(QClipboard)
+ Q_DECLARE_SCOPED_PRIVATE(QClipboard)
private:
QClipboard(QObject *parent);
~QClipboard();
diff --git a/src/gui/kernel/qclipboard_s60.cpp b/src/gui/kernel/qclipboard_s60.cpp
index db5e7f3..5536438 100644
--- a/src/gui/kernel/qclipboard_s60.cpp
+++ b/src/gui/kernel/qclipboard_s60.cpp
@@ -76,10 +76,10 @@ public:
QMimeData* source()
{ return src; }
bool connected()
- { return connection; }
+ { return connection; }
void clear();
RFs fsSession();
-
+
private:
QMimeData* src;
@@ -134,7 +134,7 @@ static QClipboardData *clipboardData()
delete internalCbData;
internalCbData = 0;
}
- else
+ else
{
qAddPostRoutine(cleanupClipboardData);
}
@@ -143,8 +143,10 @@ static QClipboardData *clipboardData()
return internalCbData;
}
-void writeToStream(const QMimeData* aData, RWriteStream& aStream)
+void writeToStreamLX(const QMimeData* aData, RWriteStream& aStream)
{
+ // This function both leaves and throws exceptions. There must be no destructor
+ // dependencies between cleanup styles, and no cleanup stack dependencies on stacked objects.
QStringList headers = aData->formats();
aStream << TCardinality(headers.count());
for (QStringList::const_iterator iter= headers.constBegin();iter != headers.constEnd();iter++)
@@ -159,13 +161,15 @@ void writeToStream(const QMimeData* aData, RWriteStream& aStream)
aStream << TCardinality(ba.size());
aStream.WriteL(reinterpret_cast<const uchar*>(ba.constData()),ba.size());
CleanupStack::PopAndDestroy(stringData);
- }
+ }
}
-void readFromStream(QMimeData* aData,RReadStream& aStream)
+void readFromStreamLX(QMimeData* aData,RReadStream& aStream)
{
+ // This function both leaves and throws exceptions. There must be no destructor
+ // dependencies between cleanup styles, and no cleanup stack dependencies on stacked objects.
TCardinality mimeTypeCount;
- aStream >> mimeTypeCount;
+ aStream >> mimeTypeCount;
for (int i = 0; i< mimeTypeCount;i++)
{
// mime type
@@ -173,6 +177,7 @@ void readFromStream(QMimeData* aData,RReadStream& aStream)
aStream >> mimeTypeSize;
HBufC* mimeTypeBuf = HBufC::NewLC(aStream,mimeTypeSize);
QString mimeType = QString::fromUtf16(mimeTypeBuf->Des().Ptr(),mimeTypeBuf->Length());
+ CleanupStack::PopAndDestroy(mimeTypeBuf);
// mime data
TCardinality dataSize;
aStream >> dataSize;
@@ -182,8 +187,6 @@ void readFromStream(QMimeData* aData,RReadStream& aStream)
ba.data_ptr()->size = dataSize;
qDebug() << "paste from clipboard mime: " << mimeType << " data: " << ba;
aData->setData(mimeType,ba);
- CleanupStack::PopAndDestroy(mimeTypeBuf);
-
}
}
@@ -210,14 +213,14 @@ const QMimeData* QClipboard::mimeData(Mode mode) const
RStoreReadStream stream;
TStreamId stid = (cb->StreamDictionary()).At(KQtCbDataStream);
stream.OpenLC(cb->Store(),stid);
- readFromStream(d->source(),stream);
+ QT_TRYCATCH_LEAVING(readFromStreamLX(d->source(),stream));
CleanupStack::PopAndDestroy(2,cb);
return d->source();
});
if (err != KErrNone){
qDebug()<< "clipboard is empty/err: " << err;
}
-
+
}
return 0;
}
@@ -235,7 +238,7 @@ void QClipboard::setMimeData(QMimeData* src, Mode mode)
CClipboard* cb = CClipboard::NewForWritingLC(fs);
RStoreWriteStream stream;
TStreamId stid = stream.CreateLC(cb->Store());
- writeToStream(src,stream);
+ QT_TRYCATCH_LEAVING(writeToStreamLX(src,stream));
d->setSource(src);
stream.CommitL();
(cb->StreamDictionary()).AssignL(KQtCbDataStream,stid);
@@ -246,7 +249,7 @@ void QClipboard::setMimeData(QMimeData* src, Mode mode)
qDebug()<< "clipboard write err :" << err;
}
}
- emitChanged(QClipboard::Clipboard);
+ emitChanged(QClipboard::Clipboard);
}
bool QClipboard::supportsMode(Mode mode) const
diff --git a/src/gui/kernel/qdesktopwidget.h b/src/gui/kernel/qdesktopwidget.h
index a21ae9d..785f6c4 100644
--- a/src/gui/kernel/qdesktopwidget.h
+++ b/src/gui/kernel/qdesktopwidget.h
@@ -96,7 +96,7 @@ protected:
private:
Q_DISABLE_COPY(QDesktopWidget)
- Q_DECLARE_PRIVATE(QDesktopWidget)
+ Q_DECLARE_SCOPED_PRIVATE(QDesktopWidget)
friend class QApplication;
friend class QApplicationPrivate;
diff --git a/src/gui/kernel/qdesktopwidget_x11.cpp b/src/gui/kernel/qdesktopwidget_x11.cpp
index 1555fc0..5bc4c0c 100644
--- a/src/gui/kernel/qdesktopwidget_x11.cpp
+++ b/src/gui/kernel/qdesktopwidget_x11.cpp
@@ -197,7 +197,7 @@ void QDesktopWidgetPrivate::init()
if (screens) {
// leaks QWidget* pointers on purpose, can't delete them as pointer escapes
- screens = (QWidget**) realloc(screens, j * sizeof(QWidget*));
+ screens = q_check_ptr((QWidget**) realloc(screens, j * sizeof(QWidget*)));
if (j > screenCount)
memset(&screens[screenCount], 0, (j-screenCount) * sizeof(QWidget*));
}
diff --git a/src/gui/kernel/qdnd_s60.cpp b/src/gui/kernel/qdnd_s60.cpp
index c459f8f..c7656b0 100644
--- a/src/gui/kernel/qdnd_s60.cpp
+++ b/src/gui/kernel/qdnd_s60.cpp
@@ -94,8 +94,8 @@ class QShapedPixmapWidget
public:
QShapedPixmapWidget(RWsSession aWsSession,RWindowTreeNode* aNode)
{
- sprite = RWsSprite(aWsSession);
- cursorSprite.iBitmap = 0;
+ sprite = RWsSprite(aWsSession);
+ cursorSprite.iBitmap = 0;
cursorSprite.iMaskBitmap = 0;
cursorSprite.iInvertMask = EFalse;
cursorSprite.iOffset = TPoint(0,0);
@@ -127,8 +127,8 @@ public:
//### heaplock centralized.
QImage temp = pm.toImage();
QSize size = pm.size();
- temp.bits();
- CFbsBitmap *curbm = new (ELeave) CFbsBitmap();
+ temp.bits();
+ CFbsBitmap *curbm = q_check_ptr(new CFbsBitmap()); // CBase derived object needs check on new
curbm->Create(TSize(size.width(),size.height()),EColor16MA);
curbm->LockHeap(ETrue);
memcpy((uchar*)curbm->DataAddress(),temp.bits(),temp.numBytes());
@@ -188,7 +188,7 @@ bool QDragManager::eventFilter(QObject *o, QEvent *e)
switch(e->type()) {
case QEvent::MouseButtonPress:
{
- }
+ }
case QEvent::MouseMove:
{
if (!object) { //#### this should not happen
@@ -211,7 +211,7 @@ bool QDragManager::eventFilter(QObject *o, QEvent *e)
if (!cw)
return true;
TPoint windowPos = cw->effectiveWinId()->PositionRelativeToScreen();
- qt_symbian_dnd_deco->sprite.SetPosition(TPoint(me->globalX()- windowPos.iX,me->globalY()- windowPos.iY));
+ qt_symbian_dnd_deco->sprite.SetPosition(TPoint(me->globalX()- windowPos.iX,me->globalY()- windowPos.iY));
while (cw && !cw->acceptDrops() && !cw->isWindow())
cw = cw->parentWidget();
@@ -318,7 +318,7 @@ Qt::DropAction QDragManager::drag(QDrag *o)
object->d_func()->target = 0;
TPoint windowPos = source()->effectiveWinId()->PositionRelativeToScreen();
qt_symbian_dnd_deco->sprite.SetPosition(TPoint(QCursor::pos().x()- windowPos.iX ,QCursor::pos().y() - windowPos.iY));
-
+
QPoint hotspot = drag_object->hotSpot();
qt_symbian_dnd_deco->cursorSprite.iOffset = TPoint(- hotspot.x(),- hotspot.y());
qt_symbian_dnd_deco->sprite.UpdateMember(0,qt_symbian_dnd_deco->cursorSprite);
diff --git a/src/gui/kernel/qdnd_x11.cpp b/src/gui/kernel/qdnd_x11.cpp
index 7b445ea..410d1a9 100644
--- a/src/gui/kernel/qdnd_x11.cpp
+++ b/src/gui/kernel/qdnd_x11.cpp
@@ -316,7 +316,7 @@ static XdndData xdnd_data = { 0, 0 };
class QExtraWidget : public QWidget
{
- Q_DECLARE_PRIVATE(QWidget)
+ Q_DECLARE_SCOPED_PRIVATE(QWidget)
public:
inline QWExtra* extraData();
inline QTLWExtra* topData();
diff --git a/src/gui/kernel/qdrag.h b/src/gui/kernel/qdrag.h
index b49d82a..7e54b51 100644
--- a/src/gui/kernel/qdrag.h
+++ b/src/gui/kernel/qdrag.h
@@ -61,7 +61,7 @@ class QDragManager;
class Q_GUI_EXPORT QDrag : public QObject
{
Q_OBJECT
- Q_DECLARE_PRIVATE(QDrag)
+ Q_DECLARE_SCOPED_PRIVATE(QDrag)
public:
explicit QDrag(QWidget *dragSource);
~QDrag();
diff --git a/src/gui/kernel/qeventdispatcher_glib_qws_p.h b/src/gui/kernel/qeventdispatcher_glib_qws_p.h
index 826661e..f0751be 100644
--- a/src/gui/kernel/qeventdispatcher_glib_qws_p.h
+++ b/src/gui/kernel/qeventdispatcher_glib_qws_p.h
@@ -62,7 +62,7 @@ class QWSEventDispatcherGlibPrivate;
class QWSEventDispatcherGlib : public QEventDispatcherGlib
{
Q_OBJECT
- Q_DECLARE_PRIVATE(QWSEventDispatcherGlib)
+ Q_DECLARE_SCOPED_PRIVATE(QWSEventDispatcherGlib)
public:
explicit QWSEventDispatcherGlib(QObject *parent = 0);
diff --git a/src/gui/kernel/qeventdispatcher_mac_p.h b/src/gui/kernel/qeventdispatcher_mac_p.h
index 88663c6..1986c4c 100644
--- a/src/gui/kernel/qeventdispatcher_mac_p.h
+++ b/src/gui/kernel/qeventdispatcher_mac_p.h
@@ -108,7 +108,7 @@ class QEventDispatcherMacPrivate;
class QEventDispatcherMac : public QAbstractEventDispatcher
{
Q_OBJECT
- Q_DECLARE_PRIVATE(QEventDispatcherMac)
+ Q_DECLARE_SCOPED_PRIVATE(QEventDispatcherMac)
public:
explicit QEventDispatcherMac(QObject *parent = 0);
diff --git a/src/gui/kernel/qeventdispatcher_qws_p.h b/src/gui/kernel/qeventdispatcher_qws_p.h
index b83fa10..982ed58 100644
--- a/src/gui/kernel/qeventdispatcher_qws_p.h
+++ b/src/gui/kernel/qeventdispatcher_qws_p.h
@@ -62,7 +62,7 @@ class QEventDispatcherQWSPrivate;
class QEventDispatcherQWS : public QEventDispatcherUNIX
{
Q_OBJECT
- Q_DECLARE_PRIVATE(QEventDispatcherQWS)
+ Q_DECLARE_SCOPED_PRIVATE(QEventDispatcherQWS)
public:
explicit QEventDispatcherQWS(QObject *parent = 0);
diff --git a/src/gui/kernel/qeventdispatcher_s60.cpp b/src/gui/kernel/qeventdispatcher_s60.cpp
index 51878df..2fea8a4 100644
--- a/src/gui/kernel/qeventdispatcher_s60.cpp
+++ b/src/gui/kernel/qeventdispatcher_s60.cpp
@@ -76,7 +76,7 @@ bool QEventDispatcherS60::processEvents ( QEventLoop::ProcessEventsFlags flags )
m_noInputEvents = oldNoInputEventsValue;
} QT_CATCH (const std::exception& ex) {
#ifndef QT_NO_EXCEPTIONS
- CActiveScheduler::Current()->Error(qt_translateExceptionToSymbianError(ex));
+ CActiveScheduler::Current()->Error(qt_exception2SymbianError(ex));
#endif
}
diff --git a/src/gui/kernel/qeventdispatcher_x11_p.h b/src/gui/kernel/qeventdispatcher_x11_p.h
index 9a54c36..b4c553d 100644
--- a/src/gui/kernel/qeventdispatcher_x11_p.h
+++ b/src/gui/kernel/qeventdispatcher_x11_p.h
@@ -62,7 +62,7 @@ class QEventDispatcherX11Private;
class QEventDispatcherX11 : public QEventDispatcherUNIX
{
Q_OBJECT
- Q_DECLARE_PRIVATE(QEventDispatcherX11)
+ Q_DECLARE_SCOPED_PRIVATE(QEventDispatcherX11)
public:
explicit QEventDispatcherX11(QObject *parent = 0);
diff --git a/src/gui/kernel/qformlayout.h b/src/gui/kernel/qformlayout.h
index b560e85..0143711 100644
--- a/src/gui/kernel/qformlayout.h
+++ b/src/gui/kernel/qformlayout.h
@@ -56,7 +56,7 @@ class Q_GUI_EXPORT QFormLayout : public QLayout
{
Q_OBJECT
Q_ENUMS(FormStyle FieldGrowthPolicy RowWrapPolicy ItemRole)
- Q_DECLARE_PRIVATE(QFormLayout)
+ Q_DECLARE_SCOPED_PRIVATE(QFormLayout)
Q_PROPERTY(FieldGrowthPolicy fieldGrowthPolicy READ fieldGrowthPolicy WRITE setFieldGrowthPolicy RESET resetFieldGrowthPolicy)
Q_PROPERTY(RowWrapPolicy rowWrapPolicy READ rowWrapPolicy WRITE setRowWrapPolicy RESET resetRowWrapPolicy)
Q_PROPERTY(Qt::Alignment labelAlignment READ labelAlignment WRITE setLabelAlignment RESET resetLabelAlignment)
diff --git a/src/gui/kernel/qgesture.h b/src/gui/kernel/qgesture.h
index 1cd9cae..8390d11 100644
--- a/src/gui/kernel/qgesture.h
+++ b/src/gui/kernel/qgesture.h
@@ -60,7 +60,7 @@ class QGesturePrivate;
class Q_GUI_EXPORT QGesture : public QObject
{
Q_OBJECT
- Q_DECLARE_PRIVATE(QGesture)
+ Q_DECLARE_SCOPED_PRIVATE(QGesture)
Q_PROPERTY(Qt::GestureState state READ state)
diff --git a/src/gui/kernel/qgridlayout.h b/src/gui/kernel/qgridlayout.h
index 89a04a4..2b5299e 100644
--- a/src/gui/kernel/qgridlayout.h
+++ b/src/gui/kernel/qgridlayout.h
@@ -60,7 +60,7 @@ class QGridLayoutPrivate;
class Q_GUI_EXPORT QGridLayout : public QLayout
{
Q_OBJECT
- Q_DECLARE_PRIVATE(QGridLayout)
+ Q_DECLARE_SCOPED_PRIVATE(QGridLayout)
QDOC_PROPERTY(int horizontalSpacing READ horizontalSpacing WRITE setHorizontalSpacing)
QDOC_PROPERTY(int verticalSpacing READ verticalSpacing WRITE setVerticalSpacing)
diff --git a/src/gui/kernel/qguieventdispatcher_glib_p.h b/src/gui/kernel/qguieventdispatcher_glib_p.h
index 65d233e..8543836 100644
--- a/src/gui/kernel/qguieventdispatcher_glib_p.h
+++ b/src/gui/kernel/qguieventdispatcher_glib_p.h
@@ -62,7 +62,7 @@ class QGuiEventDispatcherGlibPrivate;
class QGuiEventDispatcherGlib : public QEventDispatcherGlib
{
Q_OBJECT
- Q_DECLARE_PRIVATE(QGuiEventDispatcherGlib)
+ Q_DECLARE_SCOPED_PRIVATE(QGuiEventDispatcherGlib)
public:
explicit QGuiEventDispatcherGlib(QObject *parent = 0);
diff --git a/src/gui/kernel/qkeymapper_mac.cpp b/src/gui/kernel/qkeymapper_mac.cpp
index 8eee665..ad293bd 100644
--- a/src/gui/kernel/qkeymapper_mac.cpp
+++ b/src/gui/kernel/qkeymapper_mac.cpp
@@ -563,7 +563,7 @@ QKeyMapperPrivate::QKeyMapperPrivate()
QKeyMapperPrivate::~QKeyMapperPrivate()
{
- clearMappings();
+ deleteLayouts();
}
bool
@@ -658,7 +658,7 @@ QKeyMapperPrivate::updateKeyboard()
}
void
-QKeyMapperPrivate::clearMappings()
+QKeyMapperPrivate::deleteLayouts()
{
keyboard_mode = NullMode;
for (int i = 0; i < 255; ++i) {
@@ -667,6 +667,12 @@ QKeyMapperPrivate::clearMappings()
keyLayout[i] = 0;
}
}
+}
+
+void
+QKeyMapperPrivate::clearMappings()
+{
+ deleteLayouts();
updateKeyboard();
}
diff --git a/src/gui/kernel/qkeymapper_p.h b/src/gui/kernel/qkeymapper_p.h
index ba1fcfe..6c12b0f 100644
--- a/src/gui/kernel/qkeymapper_p.h
+++ b/src/gui/kernel/qkeymapper_p.h
@@ -85,7 +85,7 @@ public:
private:
friend QKeyMapperPrivate *qt_keymapper_private();
- Q_DECLARE_PRIVATE(QKeyMapper)
+ Q_DECLARE_SCOPED_PRIVATE(QKeyMapper)
Q_DISABLE_COPY(QKeyMapper)
};
@@ -161,6 +161,7 @@ public:
bool translateKeyEvent(QWidget *receiver, const MSG &msg, bool grab);
void updatePossibleKeyCodes(unsigned char *kbdBuffer, quint32 scancode, quint32 vk_key);
bool isADeadKey(unsigned int vk_key, unsigned int modifiers);
+ void deleteLayouts();
KeyboardLayoutItem *keyLayout[256];
@@ -189,6 +190,7 @@ public:
bool updateKeyboard();
void updateKeyMap(EventHandlerCallRef, EventRef, void *);
bool translateKeyEvent(QWidget *, EventHandlerCallRef, EventRef, void *, bool);
+ void deleteLayouts();
enum { NullMode, UnicodeMode, OtherMode } keyboard_mode;
union {
diff --git a/src/gui/kernel/qkeymapper_win.cpp b/src/gui/kernel/qkeymapper_win.cpp
index 0998631..bd55411 100644
--- a/src/gui/kernel/qkeymapper_win.cpp
+++ b/src/gui/kernel/qkeymapper_win.cpp
@@ -582,10 +582,10 @@ QKeyMapperPrivate::QKeyMapperPrivate()
QKeyMapperPrivate::~QKeyMapperPrivate()
{
- clearMappings();
+ deleteLayouts();
}
-void QKeyMapperPrivate::clearMappings()
+void QKeyMapperPrivate::deleteLayouts()
{
for (int i = 0; i < 255; ++i) {
if (keyLayout[i]) {
@@ -593,6 +593,11 @@ void QKeyMapperPrivate::clearMappings()
keyLayout[i] = 0;
}
}
+}
+
+void QKeyMapperPrivate::clearMappings()
+{
+ deleteLayouts();
/* MAKELCID()'s first argument is a WORD, and GetKeyboardLayout()
* returns a DWORD. */
diff --git a/src/gui/kernel/qkeysequence.cpp b/src/gui/kernel/qkeysequence.cpp
index 6563dae..e2a5b27 100644
--- a/src/gui/kernel/qkeysequence.cpp
+++ b/src/gui/kernel/qkeysequence.cpp
@@ -753,7 +753,9 @@ QKeySequence::QKeySequence(StandardKey key)
*/
QKeySequence::QKeySequence()
{
- d = new QKeySequencePrivate();
+ static QKeySequencePrivate shared_empty;
+ d = &shared_empty;
+ d->ref.ref();
}
/*!
diff --git a/src/gui/kernel/qlayout.h b/src/gui/kernel/qlayout.h
index 4f46c1d..ec95ca8 100644
--- a/src/gui/kernel/qlayout.h
+++ b/src/gui/kernel/qlayout.h
@@ -89,7 +89,7 @@ class QLayoutPrivate;
class Q_GUI_EXPORT QLayout : public QObject, public QLayoutItem
{
Q_OBJECT
- Q_DECLARE_PRIVATE(QLayout)
+ Q_DECLARE_SCOPED_PRIVATE(QLayout)
Q_ENUMS(SizeConstraint)
Q_PROPERTY(int margin READ margin WRITE setMargin)
diff --git a/src/gui/kernel/qsessionmanager.h b/src/gui/kernel/qsessionmanager.h
index f27dbaa..0a55d0c 100644
--- a/src/gui/kernel/qsessionmanager.h
+++ b/src/gui/kernel/qsessionmanager.h
@@ -60,7 +60,7 @@ class QSessionManagerPrivate;
class Q_GUI_EXPORT QSessionManager : public QObject
{
Q_OBJECT
- Q_DECLARE_PRIVATE(QSessionManager)
+ Q_DECLARE_SCOPED_PRIVATE(QSessionManager)
QSessionManager(QApplication *app, QString &id, QString &key);
~QSessionManager();
public:
diff --git a/src/gui/kernel/qshortcut.h b/src/gui/kernel/qshortcut.h
index c81ce7c..7b79faa 100644
--- a/src/gui/kernel/qshortcut.h
+++ b/src/gui/kernel/qshortcut.h
@@ -57,7 +57,7 @@ class QShortcutPrivate;
class Q_GUI_EXPORT QShortcut : public QObject
{
Q_OBJECT
- Q_DECLARE_PRIVATE(QShortcut)
+ Q_DECLARE_SCOPED_PRIVATE(QShortcut)
Q_PROPERTY(QKeySequence key READ key WRITE setKey)
Q_PROPERTY(QString whatsThis READ whatsThis WRITE setWhatsThis)
Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)
diff --git a/src/gui/kernel/qshortcutmap_p.h b/src/gui/kernel/qshortcutmap_p.h
index 8962ac7..53a39ec 100644
--- a/src/gui/kernel/qshortcutmap_p.h
+++ b/src/gui/kernel/qshortcutmap_p.h
@@ -74,7 +74,7 @@ class QObject;
class QShortcutMap
{
- Q_DECLARE_PRIVATE(QShortcutMap)
+ Q_DECLARE_SCOPED_PRIVATE(QShortcutMap)
public:
QShortcutMap();
~QShortcutMap();
diff --git a/src/gui/kernel/qsound.h b/src/gui/kernel/qsound.h
index 22cfdde..eeef047 100644
--- a/src/gui/kernel/qsound.h
+++ b/src/gui/kernel/qsound.h
@@ -82,7 +82,7 @@ public:
static inline QT3_SUPPORT bool available() { return isAvailable(); }
#endif
private:
- Q_DECLARE_PRIVATE(QSound)
+ Q_DECLARE_SCOPED_PRIVATE(QSound)
friend class QAuServer;
};
diff --git a/src/gui/kernel/qsound_s60.cpp b/src/gui/kernel/qsound_s60.cpp
index c9eedf5..75458ec 100644
--- a/src/gui/kernel/qsound_s60.cpp
+++ b/src/gui/kernel/qsound_s60.cpp
@@ -65,22 +65,22 @@ public:
void play();
void stop();
-
+
inline QSound* sound() const { return m_sound; }
-
+
public: // from MMdaAudioPlayerCallback
void MapcInitComplete(TInt aError, const TTimeIntervalMicroSeconds& aDuration);
- void MapcPlayComplete(TInt aError);
+ void MapcPlayComplete(TInt aError);
private:
QSound *m_sound;
- QAuServerS60 *m_server;
+ QAuServerS60 *m_server;
bool m_prepared;
- bool m_playCalled;
- CMdaAudioPlayerUtility* m_playUtility;
+ bool m_playCalled;
+ CMdaAudioPlayerUtility* m_playUtility;
};
-
+
class QAuServerS60 : public QAuServer
{
public:
@@ -103,11 +103,11 @@ public:
}
bool okay() { return true; }
-
+
protected:
- void playCompleted(QAuBucketS60* bucket, int error)
+ void playCompleted(QAuBucketS60* bucket, int error)
{
- QSound *sound = bucket->sound();
+ QSound *sound = bucket->sound();
if(!error) {
// We need to handle repeats by ourselves, since with Symbian API we don't
// know how many loops have been played when user asks it
@@ -119,14 +119,14 @@ protected:
// in order that QSound::isFinished will return true;
while(decLoop(sound)) {}
}
- }
+ }
protected:
QAuBucketS60* bucket( QSound *s )
{
return (QAuBucketS60*)QAuServer::bucket( s );
}
-
+
friend class QAuBucketS60;
};
@@ -160,32 +160,32 @@ void QAuBucketS60::play()
{
if(m_prepared) {
// OpenFileL call is completed we can start playing immediately
- m_playUtility->Play();
+ m_playUtility->Play();
} else {
m_playCalled = true;
}
-
+
}
void QAuBucketS60::stop()
{
m_playCalled = false;
- m_playUtility->Stop();
+ m_playUtility->Stop();
}
void QAuBucketS60::MapcPlayComplete(TInt aError)
{
m_server->playCompleted(this, aError);
}
-
-void QAuBucketS60::MapcInitComplete(TInt aError, const TTimeIntervalMicroSeconds& /*aDuration*/)
+
+void QAuBucketS60::MapcInitComplete(TInt aError, const TTimeIntervalMicroSeconds& /*aDuration*/)
{
if(aError) {
m_server->playCompleted(this, aError);
} else {
- m_prepared = true;
+ m_prepared = true;
if(m_playCalled){
- play();
+ play();
}
}
}
@@ -196,7 +196,7 @@ QAuBucketS60::~QAuBucketS60()
m_playUtility->Stop();
m_playUtility->Close();
}
-
+
delete m_playUtility;
}
diff --git a/src/gui/kernel/qstackedlayout.h b/src/gui/kernel/qstackedlayout.h
index d14b2ab..ab215fa 100644
--- a/src/gui/kernel/qstackedlayout.h
+++ b/src/gui/kernel/qstackedlayout.h
@@ -55,7 +55,7 @@ class QStackedLayoutPrivate;
class Q_GUI_EXPORT QStackedLayout : public QLayout
{
Q_OBJECT
- Q_DECLARE_PRIVATE(QStackedLayout)
+ Q_DECLARE_SCOPED_PRIVATE(QStackedLayout)
Q_ENUMS(StackingMode)
Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentChanged)
Q_PROPERTY(StackingMode stackingMode READ stackingMode WRITE setStackingMode)
diff --git a/src/gui/kernel/qt_s60_p.h b/src/gui/kernel/qt_s60_p.h
index bcbe48f..f6dd2e1 100644
--- a/src/gui/kernel/qt_s60_p.h
+++ b/src/gui/kernel/qt_s60_p.h
@@ -73,18 +73,13 @@
#include <akncontext.h> // CAknContextPane
#include <eikspane.h> // CEikStatusPane
#endif
-
+
QT_BEGIN_NAMESPACE
-// Application internal HandleResourceChangeL events,
+// Application internal HandleResourceChangeL events,
// system evens seems to start with 0x10
const TInt KInternalStatusPaneChange = 0x50000000;
-struct QS60Data;
-extern QS60Data *qt_s60Data;
-
-#define S60 qt_s60Data
-
class QS60Data
{
public:
@@ -114,10 +109,13 @@ public:
#endif
};
+QS60Data* qGlobalS60Data();
+#define S60 qGlobalS60Data()
+
class QAbstractLongTapObserver
{
public:
- virtual void HandleLongTapEventL( const TPoint& aPenEventLocation,
+ virtual void HandleLongTapEventL( const TPoint& aPenEventLocation,
const TPoint& aPenEventScreenLocation ) = 0;
};
class QLongTapTimer;
@@ -241,7 +239,7 @@ inline CEikButtonGroupContainer* QS60Data::buttonGroupContainer()
static inline QFont qt_TFontSpec2QFontL(const TFontSpec &fontSpec)
{
return QFont(
- qt_TDesC2QStringL(fontSpec.iTypeface.iName),
+ qt_TDesC2QString(fontSpec.iTypeface.iName),
fontSpec.iHeight / KTwipsPerPoint,
fontSpec.iFontStyle.StrokeWeight() == EStrokeWeightNormal ? QFont::Normal : QFont::Bold,
fontSpec.iFontStyle.Posture() == EPostureItalic
diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp
index d7c89a6..e990358 100644
--- a/src/gui/kernel/qwidget.cpp
+++ b/src/gui/kernel/qwidget.cpp
@@ -896,22 +896,22 @@ void QWidget::setAutoFillBackground(bool enabled)
\endlist
\sa QEvent, QPainter, QGridLayout, QBoxLayout
-
+
\section1 SoftKeys
\since 4.6
\preliminary
- Softkeys API is a platform independent way of mapping actions to (hardware)keys
+ Softkeys API is a platform independent way of mapping actions to (hardware)keys
and toolbars provided by the underlying platform.
-
- There are three major use cases supported. First one is a mobile device
+
+ There are three major use cases supported. First one is a mobile device
with keypad navigation and no touch ui. Second use case is a mobile
- device with touch ui. Third use case is desktop. For now the softkey API is
+ device with touch ui. Third use case is desktop. For now the softkey API is
only implemented for Series60.
-
- QActions are set to widget(s) via softkey API. Actions in focused widget are
+
+ QActions are set to widget(s) via softkey API. Actions in focused widget are
mapped to native toolbar or hardware keys. Even though the API allows to set
- any amount of widgets there might be physical restrictions to amount of
+ any amount of widgets there might be physical restrictions to amount of
softkeys that can be used by the device.
\o Series60: For series60 menu button is automatically mapped to left
@@ -919,11 +919,11 @@ void QWidget::setAutoFillBackground(bool enabled)
\sa softKeys()
\sa setSoftKey()
-
+
*/
-QWidgetMapper *QWidgetPrivate::mapper = 0; // widget with wid
-QWidgetSet *QWidgetPrivate::uncreatedWidgets = 0; // widgets with no wid
+QWidgetMapper *QWidgetPrivate::mapper = 0; // widget with wid
+QWidgetSet *QWidgetPrivate::allWidgets = 0; // widgets with no wid
/*****************************************************************************
@@ -969,7 +969,7 @@ struct QWidgetExceptionCleaner
static inline void cleanup(QWidget *that, QWidgetPrivate *d)
{
#ifndef QT_NO_EXCEPTIONS
- QWidgetPrivate::uncreatedWidgets->remove(that);
+ QWidgetPrivate::allWidgets->remove(that);
if (d->focus_next != that) {
if (d->focus_next)
d->focus_next->d_func()->focus_prev = d->focus_prev;
@@ -1121,8 +1121,8 @@ void QWidgetPrivate::init(QWidget *parentWidget, Qt::WindowFlags f)
if (QApplication::type() == QApplication::Tty)
qFatal("QWidget: Cannot create a QWidget when no GUI is being used");
- Q_ASSERT(uncreatedWidgets);
- uncreatedWidgets->insert(q);
+ Q_ASSERT(allWidgets);
+ allWidgets->insert(q);
QWidget *desktopWidget = 0;
if (parentWidget && parentWidget->windowType() == Qt::Desktop) {
@@ -1415,15 +1415,31 @@ QWidget::~QWidget()
}
#endif
- clearFocus();
+ QT_TRY {
+ clearFocus();
+ } QT_CATCH(...) {
+ // swallow this problem because we are in a destructor
+ }
d->setDirtyOpaqueRegion();
- if (isWindow() && isVisible() && internalWinId())
- d->close_helper(QWidgetPrivate::CloseNoEvent);
+ if (isWindow() && isVisible() && internalWinId()) {
+ QT_TRY {
+ d->close_helper(QWidgetPrivate::CloseNoEvent);
+ } QT_CATCH(...) {
+ // if we're out of memory, at least hide the window.
+ QT_TRY {
+ hide();
+ } QT_CATCH(...) {
+ // and if that also doesn't work, then give up
+ }
+ }
+ }
+
#if defined(Q_WS_WIN) || defined(Q_WS_X11)
- else if (!internalWinId() && isVisible())
+ else if (!internalWinId() && isVisible()) {
qApp->d_func()->sendSyntheticEnterLeave(this);
+ }
#endif
if (QWidgetBackingStore *bs = d->maybeBackingStore()) {
@@ -1449,12 +1465,15 @@ QWidget::~QWidget()
QApplication::removePostedEvents(this);
- destroy(); // platform-dependent cleanup
-
+ QT_TRY {
+ destroy(); // platform-dependent cleanup
+ } QT_CATCH(...) {
+ // if this fails we can't do anything about it but at least we are not allowed to throw.
+ }
--QWidgetPrivate::instanceCounter;
- if (QWidgetPrivate::uncreatedWidgets) // might have been deleted by ~QApplication
- QWidgetPrivate::uncreatedWidgets->remove(this);
+ if (QWidgetPrivate::allWidgets) // might have been deleted by ~QApplication
+ QWidgetPrivate::allWidgets->remove(this);
QEvent e(QEvent::Destroy);
QCoreApplication::sendEvent(this, &e);
@@ -1474,7 +1493,6 @@ void QWidgetPrivate::setWinId(WId id) // set widget identifier
bool userDesktopWidget = qt_desktopWidget != 0 && qt_desktopWidget != q && q->windowType() == Qt::Desktop;
if (mapper && data.winid && !userDesktopWidget) {
mapper->remove(data.winid);
- uncreatedWidgets->insert(q);
}
data.winid = id;
@@ -1483,7 +1501,6 @@ void QWidgetPrivate::setWinId(WId id) // set widget identifier
#endif
if (mapper && id && !userDesktopWidget) {
mapper->insert(data.winid, q);
- uncreatedWidgets->remove(q);
}
}
@@ -4681,8 +4698,9 @@ void QWidget::setCursor(const QCursor &cursor)
#endif
{
d->createExtra();
+ QCursor *newCursor = new QCursor(cursor);
delete d->extra->curs;
- d->extra->curs = new QCursor(cursor);
+ d->extra->curs = newCursor;
}
setAttribute(Qt::WA_SetCursor);
d->setCursor_sys(cursor);
@@ -5383,6 +5401,17 @@ QString QWidget::windowTitle() const
return QString();
}
+/*!
+ Returns a modified window title with the [*] place holder
+ replaced according to the rules described in QWidget::setWindowTitle
+
+ This function assumes that "[*]" can be quoted by another
+ "[*]", so it will replace two place holders by one and
+ a single last one by either "*" or nothing depending on
+ the modified flag.
+
+ \internal
+*/
QString qt_setWindowTitle_helperHelper(const QString &title, const QWidget *widget)
{
Q_ASSERT(widget);
@@ -5394,16 +5423,21 @@ QString qt_setWindowTitle_helperHelper(const QString &title, const QWidget *widg
QString cap = title;
#endif
- QString placeHolder(QLatin1String("[*]"));
+ if (cap.isEmpty())
+ return cap;
+
+ QLatin1String placeHolder("[*]");
+ int placeHolderLength = 3; // QLatin1String doesn't have length()
int index = cap.indexOf(placeHolder);
+ // here the magic begins
while (index != -1) {
- index += placeHolder.length();
+ index += placeHolderLength;
int count = 1;
while (cap.indexOf(placeHolder, index) == index) {
++count;
- index += placeHolder.length();
+ index += placeHolderLength;
}
if (count%2) { // odd number of [*] -> replace last one
@@ -5418,7 +5452,7 @@ QString qt_setWindowTitle_helperHelper(const QString &title, const QWidget *widg
index = cap.indexOf(placeHolder, index);
}
- cap.replace(QLatin1String("[*][*]"), QLatin1String("[*]"));
+ cap.replace(QLatin1String("[*][*]"), placeHolder);
return cap;
}
@@ -5756,7 +5790,7 @@ void QWidget::setFocus(Qt::FocusReason reason)
if (!isEnabled())
return;
-
+
QWidget *f = this;
while (f->d_func()->extra && f->d_func()->extra->focus_proxy)
f = f->d_func()->extra->focus_proxy;
@@ -11639,7 +11673,7 @@ void QWidget::clearMask()
/*!
\preliminary
\since 4.6
-
+
Returns the (possibly empty) list of this widget's softkeys.
Returned list cannot be changed. Softkeys should be added
and removed via method called setSoftKeys
@@ -11660,7 +11694,7 @@ const QList<QAction*>& QWidget::softKeys() const
/*!
\preliminary
\since 4.6
-
+
Sets the softkey \a softkey to this widget's list of softkeys,
Setting 0 as softkey will clear all the existing softkeys set
to the widget
diff --git a/src/gui/kernel/qwidget.h b/src/gui/kernel/qwidget.h
index c73f633..c5c10b6 100644
--- a/src/gui/kernel/qwidget.h
+++ b/src/gui/kernel/qwidget.h
@@ -142,7 +142,7 @@ class QWidgetPrivate;
class Q_GUI_EXPORT QWidget : public QObject, public QPaintDevice
{
Q_OBJECT
- Q_DECLARE_PRIVATE(QWidget)
+ Q_DECLARE_SCOPED_PRIVATE(QWidget)
Q_PROPERTY(bool modal READ isModal)
Q_PROPERTY(Qt::WindowModality windowModality READ windowModality WRITE setWindowModality)
diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm
index 78df09d..070110d 100644
--- a/src/gui/kernel/qwidget_mac.mm
+++ b/src/gui/kernel/qwidget_mac.mm
@@ -2556,7 +2556,11 @@ void QWidget::destroy(bool destroyWindow, bool destroySubWindows)
qt_mac_destructWindow(window);
}
}
- d->setWinId(0);
+ QT_TRY {
+ d->setWinId(0);
+ } QT_CATCH (const std::bad_alloc &) {
+ // swallow - destructors must not throw
+ }
}
}
diff --git a/src/gui/kernel/qwidget_p.h b/src/gui/kernel/qwidget_p.h
index 1d9689e..1122154 100644
--- a/src/gui/kernel/qwidget_p.h
+++ b/src/gui/kernel/qwidget_p.h
@@ -490,10 +490,11 @@ public:
QWidgetItemV2 *widgetItem;
QPaintEngine *extraPaintEngine;
mutable const QMetaObject *polished;
- // All widgets are initially added into the uncreatedWidgets set. Once
- // they receive a window id they are removed and added to the mapper
+ // All widgets are added into the allWidgets set. Once
+ // they receive a window id they are also added to the mapper.
+ // This should just ensure that all widgets are deleted by QApplication
static QWidgetMapper *mapper;
- static QWidgetSet *uncreatedWidgets;
+ static QWidgetSet *allWidgets;
#if !defined(QT_NO_IM)
QPointer<QInputContext> ic;
Qt::InputMethodHints imHints;
diff --git a/src/gui/kernel/qwidget_qws.cpp b/src/gui/kernel/qwidget_qws.cpp
index 4ded5cf..eacf656 100644
--- a/src/gui/kernel/qwidget_qws.cpp
+++ b/src/gui/kernel/qwidget_qws.cpp
@@ -298,11 +298,16 @@ void QWidget::destroy(bool destroyWindow, bool destroySubWindows)
d->hide_sys();
}
if (destroyWindow && isWindow()) {
- d->extra->topextra->backingStore->windowSurface->setGeometry(QRect());
+ if (d->extra && d->extra->topextra && d->extra->topextra->backingStore)
+ d->extra->topextra->backingStore->windowSurface->setGeometry(QRect());
qwsDisplay()->destroyRegion(internalWinId());
}
}
- d->setWinId(0);
+ QT_TRY {
+ d->setWinId(0);
+ } QT_CATCH (const std::bad_alloc &) {
+ // swallow - destructors must not throw
+ }
}
}
diff --git a/src/gui/kernel/qwidget_s60.cpp b/src/gui/kernel/qwidget_s60.cpp
index 5b05e55..ddd2f4c 100644
--- a/src/gui/kernel/qwidget_s60.cpp
+++ b/src/gui/kernel/qwidget_s60.cpp
@@ -89,7 +89,7 @@ void QWidgetPrivate::setSoftKeys_sys(const QList<QAction*> &softkeys)
return;
}
CEikButtonGroupContainer* nativeContainer = S60->buttonGroupContainer();
- nativeContainer->SetCommandSetL(R_AVKON_SOFTKEYS_EMPTY_WITH_IDS);
+ QT_TRAP_THROWING(nativeContainer->SetCommandSetL(R_AVKON_SOFTKEYS_EMPTY_WITH_IDS));
int position = -1;
int command;
@@ -137,12 +137,12 @@ void QWidgetPrivate::setSoftKeys_sys(const QList<QAction*> &softkeys)
if (position != -1) {
TPtrC text = qt_QString2TPtrC(softKeyAction->text());
- nativeContainer->SetCommandL(position, command, text);
+ QT_TRAP_THROWING(nativeContainer->SetCommandL(position, command, text));
}
}
if (needsExitButton)
- nativeContainer->SetCommandL(2, EAknSoftkeyExit, qt_QString2TPtrC(QObject::tr("Exit")));
+ QT_TRAP_THROWING(nativeContainer->SetCommandL(2, EAknSoftkeyExit, qt_QString2TPtrC(QObject::tr("Exit"))));
nativeContainer->DrawDeferred(); // 3.1 needs an extra invitation
#else
@@ -310,9 +310,17 @@ void QWidgetPrivate::create_sys(WId window, bool /* initializeWindow */, bool de
} else if (topLevel) {
if (!q->testAttribute(Qt::WA_Moved) && !q->testAttribute(Qt::WA_DontShowOnScreen))
data.crect.moveTopLeft(QPoint(clientRect.iTl.iX, clientRect.iTl.iY));
- QSymbianControl *control= new QSymbianControl(q);
- control->ConstructL(true,desktop);
+ QSymbianControl *control= q_check_ptr(new QSymbianControl(q));
+ QT_TRAP_THROWING(control->ConstructL(true,desktop));
if (!desktop) {
+ TInt stackingFlags;
+ if ((q->windowType() & Qt::Popup) == Qt::Popup) {
+ stackingFlags = ECoeStackFlagRefusesAllKeys | ECoeStackFlagRefusesFocus;
+ } else {
+ stackingFlags = ECoeStackFlagStandard;
+ }
+ control->ControlEnv()->AppUi()->AddToStackL(control, ECoeStackPriorityDefault, stackingFlags);
+
QTLWExtra *topExtra = topData();
topExtra->rwindow = control->DrawableWindow();
// Request mouse move events.
@@ -340,10 +348,19 @@ void QWidgetPrivate::create_sys(WId window, bool /* initializeWindow */, bool de
control->SetRect(TRect(TPoint(x, y), TSize(w, h)));
} else if (q->testAttribute(Qt::WA_NativeWindow) || paintOnScreen()) { // create native child widget
QSymbianControl *control = new QSymbianControl(q);
- control->ConstructL(!parentWidget);
+ QT_TRAP_THROWING(control->ConstructL(!parentWidget));
+
+ TInt stackingFlags;
+ if ((q->windowType() & Qt::Popup) == Qt::Popup) {
+ stackingFlags = ECoeStackFlagRefusesAllKeys | ECoeStackFlagRefusesFocus;
+ } else {
+ stackingFlags = ECoeStackFlagStandard;
+ }
+ control->ControlEnv()->AppUi()->AddToStackL(control, ECoeStackPriorityDefault, stackingFlags);
+
setWinId(control);
WId parentw = parentWidget->effectiveWinId();
- control->SetContainerWindowL(*parentw);
+ QT_TRAP_THROWING(control->SetContainerWindowL(*parentw));
q->setAttribute(Qt::WA_WState_Created);
int x, y, w, h;
@@ -378,17 +395,11 @@ void QWidgetPrivate::show_sys()
WId id = q->internalWinId();
if (!extra->topextra->activated) {
- id->ActivateL();
+ QT_TRAP_THROWING(id->ActivateL());
extra->topextra->activated = 1;
}
- TInt stackingFlags;
- if ((q->windowType() & Qt::Popup) == Qt::Popup) {
- stackingFlags = ECoeStackFlagRefusesAllKeys | ECoeStackFlagRefusesFocus;
- } else {
- stackingFlags = ECoeStackFlagStandard;
- }
- id->ControlEnv()->AppUi()->AddToStackL(id, ECoeStackPriorityDefault, stackingFlags);
id->MakeVisible(true);
+ id->SetFocus(true);
// Force setting of the icon after window is made visible,
// this is needed even WA_SetWindowIcon is not set, as in that case we need
@@ -406,10 +417,9 @@ void QWidgetPrivate::hide_sys()
deactivateWidgetCleanup();
WId id = q->internalWinId();
if (q->isWindow() && id) {
- if(id->IsFocused()) // Avoid unnecessry calls to FocusChanged()
+ if(id->IsFocused()) // Avoid unnecessary calls to FocusChanged()
id->SetFocus(false);
id->MakeVisible(false);
- id->ControlEnv()->AppUi()->RemoveFromStack(id);
if (QWidgetBackingStore *bs = maybeBackingStore())
bs->releaseBuffer();
} else {
@@ -544,7 +554,8 @@ void QWidgetPrivate::setParent_sys(QWidget *parent, Qt::WindowFlags f)
// destroyed when emitting the child remove event below. See QWorkspace.
if (wasCreated && old_winid) {
old_winid->MakeVisible(false);
- old_winid->ControlEnv()->AppUi()->RemoveFromStack(old_winid);
+ if(old_winid->IsFocused()) // Avoid unnecessary calls to FocusChanged()
+ old_winid->SetFocus(false);
old_winid->SetParent(0);
}
@@ -608,9 +619,9 @@ void QWidgetPrivate::s60UpdateIsOpaque()
}
}
-CFbsBitmap* qt_pixmapToNativeBitmapL(QPixmap pixmap, bool invert)
+CFbsBitmap* qt_pixmapToNativeBitmap(QPixmap pixmap, bool invert)
{
- CFbsBitmap* fbsBitmap = new(ELeave)CFbsBitmap;
+ CFbsBitmap* fbsBitmap = q_check_ptr(new CFbsBitmap); // CBase derived object needs check on new
TSize size(pixmap.size().width(), pixmap.size().height());
TDisplayMode mode(EColor16MU);
@@ -621,7 +632,7 @@ CFbsBitmap* qt_pixmapToNativeBitmapL(QPixmap pixmap, bool invert)
// Will fix later on when native pixmap is implemented
switch(pixmap.depth()) {
case 1:
- mode = EGray2;
+ mode = EGray2;
break;
case 4:
mode = EColor16;
@@ -646,12 +657,12 @@ CFbsBitmap* qt_pixmapToNativeBitmapL(QPixmap pixmap, bool invert)
break;
}
- User::LeaveIfError(fbsBitmap->Create(size, mode));
+ qt_throwIfError(fbsBitmap->Create(size, mode));
fbsBitmap->LockHeap();
QImage image = pixmap.toImage();
if(invert)
- image.invertPixels();
+ image.invertPixels();
int height = pixmap.size().height();
for(int i=0;i<height;i++ )
@@ -695,26 +706,26 @@ void QWidgetPrivate::setWindowIcon_sys(bool forceReset)
// Convert to CFbsBitmp
// TODO: When QPixmap is adapted to use native CFbsBitmap,
// it could be set directly to context pane
- CFbsBitmap* nBitmap = qt_pixmapToNativeBitmapL(pm, false);
- CFbsBitmap* nMask = qt_pixmapToNativeBitmapL(mask, true);
+ CFbsBitmap* nBitmap = qt_pixmapToNativeBitmap(pm, false);
+ CFbsBitmap* nMask = qt_pixmapToNativeBitmap(mask, true);
contextPane->SetPicture(nBitmap,nMask);
} else {
// Icon set to null -> set context pane picture to default
- contextPane->SetPictureToDefaultL();
+ QT_TRAP_THROWING(contextPane->SetPictureToDefaultL());
}
} else {
// Context pane does not exist, try setting small icon to title pane
TRect titlePaneRect;
TBool found = AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::ETitlePane, titlePaneRect );
- CAknTitlePane* titlePane = S60->titlePane();
+ CAknTitlePane* titlePane = S60->titlePane();
if (found && titlePane) { // We have title pane with valid metrics
- // The API to get title_pane graphics size is not public -> assume square space based
+ // The API to get title_pane graphics size is not public -> assume square space based
// on titlebar font height. CAknBitmap would be optimum, wihtout setting the size, since
// then title pane would automatically scale the bitmap. Unfortunately it is not public API
const CFont * font = AknLayoutUtils::FontFromId(EAknLogicalFontTitleFont);
TSize iconSize(font->HeightInPixels(), font->HeightInPixels());
-
+
QIcon icon = q->windowIcon();
if (!icon.isNull()) {
// Valid icon -> set it as an title pane small picture
@@ -729,8 +740,8 @@ void QWidgetPrivate::setWindowIcon_sys(bool forceReset)
// Convert to CFbsBitmp
// TODO: When QPixmap is adapted to use native CFbsBitmap,
// it could be set directly to context pane
- CFbsBitmap* nBitmap = qt_pixmapToNativeBitmapL(pm, false);
- CFbsBitmap* nMask = qt_pixmapToNativeBitmapL(mask, true);
+ CFbsBitmap* nBitmap = qt_pixmapToNativeBitmap(pm, false);
+ CFbsBitmap* nMask = qt_pixmapToNativeBitmap(mask, true);
titlePane->SetSmallPicture( nBitmap, nMask, ETrue );
} else {
@@ -739,7 +750,7 @@ void QWidgetPrivate::setWindowIcon_sys(bool forceReset)
}
}
}
-
+
#else
Q_UNUSED(forceReset)
#endif
@@ -752,8 +763,12 @@ void QWidgetPrivate::setWindowTitle_sys(const QString &caption)
if (q->isWindow()) {
Q_ASSERT(q->testAttribute(Qt::WA_WState_Created));
CAknTitlePane* titlePane = S60->titlePane();
- if(titlePane)
- titlePane->SetTextL(qt_QString2TPtrC(caption));
+ if(titlePane) {
+ if(caption.isEmpty())
+ titlePane->SetTextToDefaultL();
+ else
+ QT_TRAP_THROWING(titlePane->SetTextL(qt_QString2TPtrC(caption)));
+ }
}
#else
Q_UNUSED(caption)
@@ -1028,14 +1043,16 @@ void QWidget::setWindowState(Qt::WindowStates newstate)
if (newstate & Qt::WindowMinimized) {
if (isVisible()) {
WId id = effectiveWinId();
+ if(id->IsFocused()) // Avoid unnecessary calls to FocusChanged()
+ id->SetFocus(false);
id->MakeVisible(false);
- id->ControlEnv()->AppUi()->RemoveFromStack(id);
}
} else {
if (isVisible()) {
WId id = effectiveWinId();
id->MakeVisible(true);
- id->ControlEnv()->AppUi()->AddToStackL(id);
+ if(!id->IsFocused()) // Avoid unnecessary calls to FocusChanged()
+ id->SetFocus(true);
}
const QRect normalGeometry = geometry();
const QRect r = top->normalGeometry;
@@ -1100,11 +1117,17 @@ void QWidget::destroy(bool destroyWindow, bool destroySubWindows)
if (wid) {
QWidget *widget = QWidget::find(wid);
QApplication::setActiveWindow(widget);
+ // Reset global window title for focusing window
+ widget->d_func()->setWindowTitle_sys(widget->windowTitle());
}
}
- d->setWinId(0);
+ QT_TRY {
+ d->setWinId(0);
+ } QT_CATCH (const std::bad_alloc &) {
+ // swallow - destructors must not throw
+ }
}
}
diff --git a/src/gui/kernel/qwidget_win.cpp b/src/gui/kernel/qwidget_win.cpp
index b11b661..d5ce40b 100644
--- a/src/gui/kernel/qwidget_win.cpp
+++ b/src/gui/kernel/qwidget_win.cpp
@@ -558,7 +558,11 @@ void QWidget::destroy(bool destroyWindow, bool destroySubWindows)
}
#endif
- d->setWinId(0);
+ QT_TRY {
+ d->setWinId(0);
+ } QT_CATCH (const std::bad_alloc &) {
+ // swallow - destructors must not throw
+ }
}
}
diff --git a/src/gui/kernel/qwidget_x11.cpp b/src/gui/kernel/qwidget_x11.cpp
index 2a3d2f3..2bb3626 100644
--- a/src/gui/kernel/qwidget_x11.cpp
+++ b/src/gui/kernel/qwidget_x11.cpp
@@ -1008,7 +1008,11 @@ void QWidget::destroy(bool destroyWindow, bool destroySubWindows)
if (destroyWindow)
qt_XDestroyWindow(this, X11->display, data->winid);
}
- d->setWinId(0);
+ QT_TRY {
+ d->setWinId(0);
+ } QT_CATCH (const std::bad_alloc &) {
+ // swallow - destructors must not throw
+ }
extern void qPRCleanup(QWidget *widget); // from qapplication_x11.cpp
if (testAttribute(Qt::WA_WState_Reparented))
diff --git a/src/gui/kernel/qwidgetaction.h b/src/gui/kernel/qwidgetaction.h
index 4ec489e..a39b281 100644
--- a/src/gui/kernel/qwidgetaction.h
+++ b/src/gui/kernel/qwidgetaction.h
@@ -57,7 +57,7 @@ class QWidgetActionPrivate;
class Q_GUI_EXPORT QWidgetAction : public QAction
{
Q_OBJECT
- Q_DECLARE_PRIVATE(QWidgetAction)
+ Q_DECLARE_SCOPED_PRIVATE(QWidgetAction)
public:
explicit QWidgetAction(QObject *parent);
diff --git a/src/gui/kernel/qx11embed_x11.cpp b/src/gui/kernel/qx11embed_x11.cpp
index 359434e..cce28c4 100644
--- a/src/gui/kernel/qx11embed_x11.cpp
+++ b/src/gui/kernel/qx11embed_x11.cpp
@@ -270,7 +270,7 @@ const int XButtonRelease = ButtonRelease;
// need to to inspect window()'s embedded state.
class QHackWidget : public QWidget
{
- Q_DECLARE_PRIVATE(QWidget)
+ Q_DECLARE_SCOPED_PRIVATE(QWidget)
public:
QTLWExtra* topData() { return d_func()->topData(); }
};
diff --git a/src/gui/kernel/qx11embed_x11.h b/src/gui/kernel/qx11embed_x11.h
index 8659ed6..0d67c23 100644
--- a/src/gui/kernel/qx11embed_x11.h
+++ b/src/gui/kernel/qx11embed_x11.h
@@ -80,7 +80,7 @@ protected:
void resizeEvent(QResizeEvent *);
private:
- Q_DECLARE_PRIVATE(QX11EmbedWidget)
+ Q_DECLARE_SCOPED_PRIVATE(QX11EmbedWidget)
Q_DISABLE_COPY(QX11EmbedWidget)
};
@@ -121,7 +121,7 @@ protected:
bool event(QEvent *);
private:
- Q_DECLARE_PRIVATE(QX11EmbedContainer)
+ Q_DECLARE_SCOPED_PRIVATE(QX11EmbedContainer)
Q_DISABLE_COPY(QX11EmbedContainer)
};