From d4a2ce8ad5be6633f0e5c5a74eaa8b9c32c02ba8 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 18 Apr 2011 15:40:26 +0300 Subject: Do not modify window size for fullscreen windows in setGeometry_sys Minimum sizes of widgets can cause windows to expand beyond screen limits in QWidgetPrivate::setGeometry_sys. Normally this is not noticeable as the window size is forced in various places to the clientRect, but there are certain sequences where the size set in setGeometry_sys is the final one, resulting in too large windows. Removed the modification of window size in setGeometry_sys for fullscreen windows for which the correct size is already requested. Task-number: QTBUG-18749 Reviewed-by: Sami Merila --- src/gui/kernel/qwidget_s60.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/gui/kernel/qwidget_s60.cpp b/src/gui/kernel/qwidget_s60.cpp index 5630706..ada85ce 100644 --- a/src/gui/kernel/qwidget_s60.cpp +++ b/src/gui/kernel/qwidget_s60.cpp @@ -239,7 +239,16 @@ void QWidgetPrivate::setGeometry_sys(int x, int y, int w, int h, bool isMove) if (w != oldSize.width() || h != oldSize.height()) data.window_state &= ~Qt::WindowMaximized; - if (extra) { // any size restrictions? + bool checkExtra = true; + if (q->isWindow() && (data.window_state & Qt::WindowFullScreen)) { + // Do not modity window size for fullscreen windows, if requested + // size is already equal to clientRect. + TRect r = static_cast(S60->appUi())->ClientRect(); + if (w == r.Width() && h == r.Height()) + checkExtra = false; + } + + if (checkExtra && extra) { // any size restrictions? w = qMin(w,extra->maxw); h = qMin(h,extra->maxh); w = qMax(w,extra->minw); -- cgit v0.12 From e9040d183dce6188ae9d1493167cb7247a6d4a7b Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 3 May 2011 16:50:46 +0300 Subject: Do not allow fullscreen/maximized windows to expand beyond client rect Automatic layouting of widgets still managed to layout maximized and fullscreen windows larger than client rect in Symbian in some cases. Fixed by limiting window dimensions to client area boundaries in setGeometry_sys if the window is maximized or fullscreen. Task-number: QTBUG-5697 Reviewed-by: Sami Merila --- src/gui/kernel/qwidget_s60.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/gui/kernel/qwidget_s60.cpp b/src/gui/kernel/qwidget_s60.cpp index ada85ce..e437579 100644 --- a/src/gui/kernel/qwidget_s60.cpp +++ b/src/gui/kernel/qwidget_s60.cpp @@ -235,19 +235,21 @@ void QWidgetPrivate::setGeometry_sys(int x, int y, int w, int h, bool isMove) QSize oldSize(q->size()); QRect oldGeom(data.crect); - // Lose maximized status if deliberate resize - if (w != oldSize.width() || h != oldSize.height()) - data.window_state &= ~Qt::WindowMaximized; - bool checkExtra = true; - if (q->isWindow() && (data.window_state & Qt::WindowFullScreen)) { - // Do not modity window size for fullscreen windows, if requested - // size is already equal to clientRect. + if (q->isWindow() && (data.window_state & (Qt::WindowFullScreen | Qt::WindowMaximized))) { + // Do not allow fullscreen/maximized windows to expand beyond client rect TRect r = static_cast(S60->appUi())->ClientRect(); + w = qMin(w, r.Width()); + h = qMin(h, r.Height()); + if (w == r.Width() && h == r.Height()) checkExtra = false; } + // Lose maximized status if deliberate resize + if (w != oldSize.width() || h != oldSize.height()) + data.window_state &= ~Qt::WindowMaximized; + if (checkExtra && extra) { // any size restrictions? w = qMin(w,extra->maxw); h = qMin(h,extra->maxh); -- cgit v0.12 From 15b44c1ea04c3beebe4d7f6d9f45b81127c3c8f9 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 11 Aug 2011 11:49:38 +0300 Subject: Fix clientRect usage in QWidgetPrivate::setGeometry_sys() S60->clientRect() should be used these days for getting S60 client rect, so fix the old fashined usage that was in cherry-picked commit. Task-number: QTTH-1306 Reviewed-by: TrustMe --- src/gui/kernel/qwidget_s60.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/kernel/qwidget_s60.cpp b/src/gui/kernel/qwidget_s60.cpp index e437579..c490572 100644 --- a/src/gui/kernel/qwidget_s60.cpp +++ b/src/gui/kernel/qwidget_s60.cpp @@ -238,7 +238,7 @@ void QWidgetPrivate::setGeometry_sys(int x, int y, int w, int h, bool isMove) bool checkExtra = true; if (q->isWindow() && (data.window_state & (Qt::WindowFullScreen | Qt::WindowMaximized))) { // Do not allow fullscreen/maximized windows to expand beyond client rect - TRect r = static_cast(S60->appUi())->ClientRect(); + TRect r = S60->clientRect(); w = qMin(w, r.Width()); h = qMin(h, r.Height()); -- cgit v0.12 From 1dc0a2ccd645abd26b13fd67313a03bbc722a74d Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 12 Aug 2011 15:29:20 +0300 Subject: Fix softkeys cleanup QSoftKeyManager's keyedActions and softKeyCommandActions hashes were not properly cleaned up, resulting in randomly incorrect softkeys as already deleted cached actions were assigned to softkeys if the new action happened to be in the same address as the previously deleted action. Two bugs related to this were fixed: 1) qobject_cast can't be used in "destroyed" signal handler, as the cast will return NULL pointer in this case. Changed the cast to static_cast, which is safe here as the pointer is only used as a hash key. 2) If softkey action was created with QSoftKeyManager::createAction instead of QSoftKeyManager::createKeyedAction, the "destroyed" signal was not connected to cleanupHash slot, leaving such actions in softKeyCommandActions hash after deletion. Ensured the signal was connected properly in both cases. Task-number: QTTH-1442, QTBUG-20214 Reviewed-by: Gareth Stockwell --- src/gui/kernel/qsoftkeymanager.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/gui/kernel/qsoftkeymanager.cpp b/src/gui/kernel/qsoftkeymanager.cpp index 2700bbb..80e6ec6 100644 --- a/src/gui/kernel/qsoftkeymanager.cpp +++ b/src/gui/kernel/qsoftkeymanager.cpp @@ -126,8 +126,10 @@ QAction *QSoftKeyManager::createAction(StandardSoftKey standardKey, QWidget *act default: break; }; - if (key != 0) + if (key != 0) { QSoftKeyManager::instance()->d_func()->softKeyCommandActions.insert(action, key); + connect(action, SIGNAL(destroyed(QObject*)), QSoftKeyManager::instance(), SLOT(cleanupHash(QObject*))); + } #endif QAction::SoftKeyRole softKeyRole = QAction::NoSoftKey; switch (standardKey) { @@ -160,7 +162,13 @@ QAction *QSoftKeyManager::createKeyedAction(StandardSoftKey standardKey, Qt::Key QScopedPointer action(createAction(standardKey, actionWidget)); connect(action.data(), SIGNAL(triggered()), QSoftKeyManager::instance(), SLOT(sendKeyEvent())); + +#if defined(Q_WS_S60) && !defined(SYMBIAN_VERSION_9_4) && !defined(SYMBIAN_VERSION_9_3) && !defined(SYMBIAN_VERSION_9_2) + // Don't connect destroyed slot if is was already connected in createAction + if (!(QSoftKeyManager::instance()->d_func()->softKeyCommandActions.contains(action.data()))) +#endif connect(action.data(), SIGNAL(destroyed(QObject*)), QSoftKeyManager::instance(), SLOT(cleanupHash(QObject*))); + QSoftKeyManager::instance()->d_func()->keyedActions.insert(action.data(), key); return action.take(); #endif //QT_NO_ACTION @@ -169,7 +177,9 @@ QAction *QSoftKeyManager::createKeyedAction(StandardSoftKey standardKey, Qt::Key void QSoftKeyManager::cleanupHash(QObject *obj) { Q_D(QSoftKeyManager); - QAction *action = qobject_cast(obj); + // Can't use qobject_cast in destroyed() signal handler as that'll return NULL, + // so use static_cast instead. Since the pointer is only used as a hash key, it is safe. + QAction *action = static_cast(obj); d->keyedActions.remove(action); #if defined(Q_WS_S60) && !defined(SYMBIAN_VERSION_9_4) && !defined(SYMBIAN_VERSION_9_3) && !defined(SYMBIAN_VERSION_9_2) d->softKeyCommandActions.remove(action); -- cgit v0.12