From 6f6d94acaefc202e2a922ff2ea672afa64490c4e Mon Sep 17 00:00:00 2001 From: Sami Merila Date: Fri, 14 Oct 2011 12:56:53 +0300 Subject: Maximized dialogs are incorrectly positioned after layout switch The native side seems to return StaCon pane height as zero in Belle. If no StaCon pane height is available, try to fetch Status Pane height and use that one. Task-number: QTBUG-22022 Reviewed-by: Miikka Heikkinen --- src/gui/dialogs/qdialog.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/gui/dialogs/qdialog.cpp b/src/gui/dialogs/qdialog.cpp index 2fb6c67..d2211af 100644 --- a/src/gui/dialogs/qdialog.cpp +++ b/src/gui/dialogs/qdialog.cpp @@ -909,6 +909,10 @@ bool QDialog::symbianAdjustedPosition() AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EStatusPane, statusPaneRect); } else { AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EStaconTop, statusPaneRect); + // In some native layouts, StaCon is not used. Try to fetch the status pane + // height from StatusPane component. + if (statusPaneRect.IsEmpty()) + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EStatusPane, statusPaneRect); } p.setX(0); -- cgit v0.12 From 18afea90f84fdf44a2b3890716bf6d6a74b7446d Mon Sep 17 00:00:00 2001 From: mread Date: Fri, 14 Oct 2011 11:12:45 +0100 Subject: Early construction of status pane and softkeys for Symbian boosted apps QtAppBooster can partially start apps and hide them in the background before they are requested by the user. This gives an apparently faster start for these apps. Qt is now detecting these app starts and bringing the construction of the status pane and softkeys forward so that they happen in the background. This cuts their construction time off the time between the user clicking on the app and it being ready to use. On a Nokia E7, this gain was measured at an average of 127ms. Task-number: QT-4933 Reviewed-by: Sami Merila --- src/gui/kernel/qapplication.cpp | 4 ++ src/gui/kernel/qapplication_p.h | 1 + src/gui/kernel/qapplication_s60.cpp | 44 +++++++++++++++++++ src/gui/kernel/qt_s60_p.h | 3 ++ src/gui/kernel/qwidget_s60.cpp | 84 ++++++++++++++----------------------- 5 files changed, 83 insertions(+), 53 deletions(-) diff --git a/src/gui/kernel/qapplication.cpp b/src/gui/kernel/qapplication.cpp index 15d37c3..35a9559 100644 --- a/src/gui/kernel/qapplication.cpp +++ b/src/gui/kernel/qapplication.cpp @@ -874,6 +874,10 @@ void QApplicationPrivate::construct( if (qt_is_gui_used) qt_guiPlatformPlugin(); #endif + +#ifdef Q_OS_SYMBIAN + symbianHandleLiteModeStartup(); +#endif } #if defined(Q_WS_X11) diff --git a/src/gui/kernel/qapplication_p.h b/src/gui/kernel/qapplication_p.h index e1252a9..0756d6c 100644 --- a/src/gui/kernel/qapplication_p.h +++ b/src/gui/kernel/qapplication_p.h @@ -561,6 +561,7 @@ public: int symbianProcessWsEvent(const QSymbianEvent *symbianEvent); int symbianHandleCommand(const QSymbianEvent *symbianEvent); int symbianResourceChange(const QSymbianEvent *symbianEvent); + void symbianHandleLiteModeStartup(); void _q_aboutToQuit(); #endif diff --git a/src/gui/kernel/qapplication_s60.cpp b/src/gui/kernel/qapplication_s60.cpp index 03da630..7d198ce 100644 --- a/src/gui/kernel/qapplication_s60.cpp +++ b/src/gui/kernel/qapplication_s60.cpp @@ -201,6 +201,32 @@ bool QS60Data::setRecursiveDecorationsVisibility(QWidget *window, Qt::WindowStat } #endif +void QS60Data::createStatusPaneAndCBA() +{ + CEikAppUi *ui = static_cast(S60->appUi()); + MEikAppUiFactory *factory = CEikonEnv::Static()->AppUiFactory(); + QT_TRAP_THROWING( + factory->CreateResourceIndependentFurnitureL(ui); + CEikButtonGroupContainer *cba = CEikButtonGroupContainer::NewL(CEikButtonGroupContainer::ECba, + CEikButtonGroupContainer::EHorizontal, ui, R_AVKON_SOFTKEYS_EMPTY_WITH_IDS); + CEikButtonGroupContainer *oldCba = factory->SwapButtonGroup(cba); + Q_ASSERT(!oldCba); + S60->setButtonGroupContainer(cba); + CEikMenuBar *menuBar = new(ELeave) CEikMenuBar; + menuBar->ConstructL(ui, 0, R_AVKON_MENUPANE_EMPTY); + menuBar->SetMenuType(CEikMenuBar::EMenuOptions); + S60->appUi()->AddToStackL(menuBar, ECoeStackPriorityMenu, ECoeStackFlagRefusesFocus); + CEikMenuBar *oldMenu = factory->SwapMenuBar(menuBar); + Q_ASSERT(!oldMenu); + ) + if (S60->statusPane()) { + // Use QDesktopWidget as the status pane observer to proxy for the AppUi. + // Can't use AppUi directly because it privately inherits from MEikStatusPaneObserver. + QSymbianControl *desktopControl = static_cast(QApplication::desktop()->winId()); + S60->statusPane()->SetObserver(desktopControl); + } +} + void QS60Data::controlVisibilityChanged(CCoeControl *control, bool visible) { if (QWidgetPrivate::mapper && QWidgetPrivate::mapper->contains(control)) { @@ -2580,6 +2606,24 @@ int QApplicationPrivate::symbianResourceChange(const QSymbianEvent *symbianEvent return ret; } +void QApplicationPrivate::symbianHandleLiteModeStartup() +{ + if (QCoreApplication::arguments().contains(QLatin1String("--startup-lite"))) { + if (!QApplication::testAttribute(Qt::AA_S60DontConstructApplicationPanes) + && !S60->buttonGroupContainer() && !S60->statusPane()) { + // hide and force this app to the background before creating screen furniture to avoid flickers + CAknAppUi *appui = static_cast(CCoeEnv::Static()->AppUi()); + if (appui) + appui->HideApplicationFromFSW(ETrue); + CCoeEnv::Static()->RootWin().SetOrdinalPosition(-1); + S60->createStatusPaneAndCBA(); + if (S60->statusPane()) { + S60->setStatusPaneAndButtonGroupVisibility(false, false); + } + } + } +} + #ifndef QT_NO_WHEELEVENT int QApplication::wheelScrollLines() { diff --git a/src/gui/kernel/qt_s60_p.h b/src/gui/kernel/qt_s60_p.h index 96b8141..5ad5b00 100644 --- a/src/gui/kernel/qt_s60_p.h +++ b/src/gui/kernel/qt_s60_p.h @@ -163,6 +163,7 @@ public: int partial_keyboardAutoTranslation : 1; int partialKeyboardOpen : 1; int handleStatusPaneResizeNotifications : 1; + int screenFurnitureFullyCreated : 1; QApplication::QS60MainApplicationFactory s60ApplicationFactory; // typedef'ed pointer type QPointer splitViewLastWidget; @@ -198,6 +199,7 @@ public: static inline void setButtonGroupContainer(CEikButtonGroupContainer* newCba); static void setStatusPaneAndButtonGroupVisibility(bool statusPaneVisible, bool buttonGroupVisible); static bool setRecursiveDecorationsVisibility(QWidget *window, Qt::WindowStates newState); + static void createStatusPaneAndCBA(); #endif static void controlVisibilityChanged(CCoeControl *control, bool visible); static TRect clientRect(); @@ -365,6 +367,7 @@ inline QS60Data::QS60Data() partial_keyboardAutoTranslation(1), partialKeyboardOpen(0), handleStatusPaneResizeNotifications(1), + screenFurnitureFullyCreated(0), s60ApplicationFactory(0) #ifdef Q_OS_SYMBIAN ,s60InstalledTrapHandler(0) diff --git a/src/gui/kernel/qwidget_s60.cpp b/src/gui/kernel/qwidget_s60.cpp index 00661ae..396c306 100644 --- a/src/gui/kernel/qwidget_s60.cpp +++ b/src/gui/kernel/qwidget_s60.cpp @@ -505,63 +505,41 @@ void QWidgetPrivate::show_sys() #ifdef Q_WS_S60 // Lazily initialize the S60 screen furniture when the first window is shown. if (q->isWindow() && !QApplication::testAttribute(Qt::AA_S60DontConstructApplicationPanes) - && !S60->buttonGroupContainer() && !S60->statusPane()) { - - if (!q->testAttribute(Qt::WA_DontShowOnScreen)) { - - // Create the status pane and CBA here - CEikAppUi *ui = static_cast(S60->appUi()); - MEikAppUiFactory *factory = CEikonEnv::Static()->AppUiFactory(); - - QT_TRAP_THROWING( - factory->CreateResourceIndependentFurnitureL(ui); - - CEikButtonGroupContainer *cba = CEikButtonGroupContainer::NewL(CEikButtonGroupContainer::ECba, - CEikButtonGroupContainer::EHorizontal,ui,R_AVKON_SOFTKEYS_EMPTY_WITH_IDS); - if (isFullscreen && !cbaRequested) - cba->MakeVisible(false); - - CEikButtonGroupContainer *oldCba = factory->SwapButtonGroup(cba); - Q_ASSERT(!oldCba); - S60->setButtonGroupContainer(cba); - - // If the creation of the first widget is delayed, for example by doing it - // inside the event loop, S60 somehow "forgets" to set the visibility of the - // toolbar (the three middle softkeys) when you flip the phone over, so we - // need to do it ourselves to avoid a "hole" in the application, even though - // Qt itself does not use the toolbar directly.. - CAknAppUi *appui = dynamic_cast(CEikonEnv::Static()->AppUi()); - if (appui) { - CAknToolbar *toolbar = appui->PopupToolbar(); - if (toolbar && !toolbar->IsVisible()) - toolbar->SetToolbarVisibility(ETrue); - } + && !q->testAttribute(Qt::WA_DontShowOnScreen) && !S60->screenFurnitureFullyCreated) { + // Create the status pane and CBA here if not yet done. These could be created earlier + // if application was launched in "App-Lite" version + if (!S60->buttonGroupContainer() && !S60->statusPane()) + S60->createStatusPaneAndCBA(); + + if (S60->buttonGroupContainer()) { + if (isFullscreen && !cbaRequested) + S60->buttonGroupContainer()->MakeVisible(false); + } + + // If the creation of the first widget is delayed, for example by doing it + // inside the event loop, S60 somehow "forgets" to set the visibility of the + // toolbar (the three middle softkeys) when you flip the phone over, so we + // need to do it ourselves to avoid a "hole" in the application, even though + // Qt itself does not use the toolbar directly.. + CAknAppUi *appui = dynamic_cast(CEikonEnv::Static()->AppUi()); + if (appui) { + CAknToolbar *toolbar = appui->PopupToolbar(); + if (toolbar && !toolbar->IsVisible()) + toolbar->SetToolbarVisibility(ETrue); + } - CEikMenuBar *menuBar = new(ELeave) CEikMenuBar; - menuBar->ConstructL(ui, 0, R_AVKON_MENUPANE_EMPTY); - menuBar->SetMenuType(CEikMenuBar::EMenuOptions); - S60->appUi()->AddToStackL(menuBar,ECoeStackPriorityMenu,ECoeStackFlagRefusesFocus); - - CEikMenuBar *oldMenu = factory->SwapMenuBar(menuBar); - Q_ASSERT(!oldMenu); - ) - - if (S60->statusPane()) { - // Use QDesktopWidget as the status pane observer to proxy for the AppUi. - // Can't use AppUi directly because it privately inherits from MEikStatusPaneObserver. - QSymbianControl *desktopControl = static_cast(QApplication::desktop()->winId()); - S60->statusPane()->SetObserver(desktopControl); - if (isFullscreen) { - const bool cbaVisible = S60->buttonGroupContainer() && S60->buttonGroupContainer()->IsVisible(); - S60->setStatusPaneAndButtonGroupVisibility(false, cbaVisible); - if (cbaVisible) { - // Fix window dimensions as without screen furniture they will have - // defaulted to full screen dimensions initially. - id->handleClientAreaChange(); - } + if (S60->statusPane()) { + if (isFullscreen) { + const bool cbaVisible = S60->buttonGroupContainer() && S60->buttonGroupContainer()->IsVisible(); + S60->setStatusPaneAndButtonGroupVisibility(false, cbaVisible); + if (cbaVisible) { + // Fix window dimensions as without screen furniture they will have + // defaulted to full screen dimensions initially. + id->handleClientAreaChange(); } } } + S60->screenFurnitureFullyCreated = true; } #endif -- cgit v0.12 From d704e61a8ac1fa9ff4aff05cc5d9bd94a777d04e Mon Sep 17 00:00:00 2001 From: Sami Merila Date: Fri, 14 Oct 2011 13:58:16 +0300 Subject: Show SaxBookmarks as maximized in Symbian Previously, SaxBookmarks was always shown as fullscreen app to allow filedialog to show up properly(QFileDialog requires a lot screen space). However, lately Qt for symbian was changed to use native file dialogs as a default. Therefore, the example app can nowadays shown as maximized. Task-number: QTBUG-21776 Reviewed-by: TrustMe --- examples/xml/saxbookmarks/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/xml/saxbookmarks/main.cpp b/examples/xml/saxbookmarks/main.cpp index 5d70ec8..ba0e1db 100644 --- a/examples/xml/saxbookmarks/main.cpp +++ b/examples/xml/saxbookmarks/main.cpp @@ -47,7 +47,7 @@ int main(int argc, char *argv[]) QApplication app(argc, argv); MainWindow mainWin; #if defined(Q_OS_SYMBIAN) - mainWin.showFullScreen(); + mainWin.showMaximized(); #else mainWin.show(); #endif -- cgit v0.12 From 5ad1d248aa02eb30dd4699b071f56fcef1412c94 Mon Sep 17 00:00:00 2001 From: mread Date: Fri, 14 Oct 2011 13:33:17 +0100 Subject: QtGui def file update For the addition of QApplicationPrivate::symbianHandleLiteModeStartup. Two other unfrozen functions also added. Task-number: QT-4933 Reviewed-by: TrustMe --- src/s60installs/bwins/QtGuiu.def | 3 +++ src/s60installs/eabi/QtGuiu.def | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/s60installs/bwins/QtGuiu.def b/src/s60installs/bwins/QtGuiu.def index 16de776..335b94f 100644 --- a/src/s60installs/bwins/QtGuiu.def +++ b/src/s60installs/bwins/QtGuiu.def @@ -13983,4 +13983,7 @@ EXPORTS ?qt_static_metacall@QShortcut@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13982 NONAME ; void QShortcut::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) ?endOfLine@QTextEngine@@AAEHH@Z @ 13983 NONAME ; int QTextEngine::endOfLine(int) ?queryKeyboardModifiers@QApplication@@SA?AV?$QFlags@W4KeyboardModifier@Qt@@@@XZ @ 13984 NONAME ; class QFlags QApplication::queryKeyboardModifiers(void) + ?resetFontEngineCache@QTextEngine@@QAEXXZ @ 13985 NONAME ; void QTextEngine::resetFontEngineCache(void) + ?symbianHandleLiteModeStartup@QApplicationPrivate@@QAEXXZ @ 13986 NONAME ; void QApplicationPrivate::symbianHandleLiteModeStartup(void) + ?_q_cleanupWinIds@QWidgetPrivate@@QAEXXZ @ 13987 NONAME ; void QWidgetPrivate::_q_cleanupWinIds(void) diff --git a/src/s60installs/eabi/QtGuiu.def b/src/s60installs/eabi/QtGuiu.def index 4133773..3606f9c 100644 --- a/src/s60installs/eabi/QtGuiu.def +++ b/src/s60installs/eabi/QtGuiu.def @@ -12796,4 +12796,7 @@ EXPORTS _ZTV20QBlittablePixmapData @ 12795 NONAME _Zls6QDebugPK13QSymbianEvent @ 12796 NONAME _ZN12QApplication22queryKeyboardModifiersEv @ 12797 NONAME + _ZN11QTextEngine20resetFontEngineCacheEv @ 12798 NONAME + _ZN14QWidgetPrivate16_q_cleanupWinIdsEv @ 12799 NONAME + _ZN19QApplicationPrivate28symbianHandleLiteModeStartupEv @ 12800 NONAME -- cgit v0.12 From 001c01e91d9c6cc724a374fcb8371a0551b21958 Mon Sep 17 00:00:00 2001 From: Shane Kearns Date: Mon, 17 Oct 2011 15:47:42 +0100 Subject: Symbian - Change working directory of applications in ROM Working directory (as opposed to applicationDirPath) was on the Z drive before, change it to be the same. Task-Number: QTBUG-22024 Reviewed-By: mread --- src/corelib/kernel/qcore_symbian_p.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/corelib/kernel/qcore_symbian_p.cpp b/src/corelib/kernel/qcore_symbian_p.cpp index 57ae2af..4f953a7 100644 --- a/src/corelib/kernel/qcore_symbian_p.cpp +++ b/src/corelib/kernel/qcore_symbian_p.cpp @@ -121,18 +121,17 @@ public: TInt err = iFs.CreatePrivatePath(sysdrive); if (err != KErrNone && err != KErrAlreadyExists) qWarning("Failed to create private path on system drive."); - //BC with 4.7: set working directory to same drive as application TFileName pfn = RProcess().FileName(); TInt drive; if (pfn.Length() > 0 && iFs.CharToDrive(pfn[0], drive) == KErrNone) { - // for system drive or rom based apps, leave the path on system drive + //BC with 4.7: create private path on application drive (except rom or system drive which is done above) if (drive != sysdrive && drive != EDriveZ) { err = iFs.CreatePrivatePath(drive); - if (err == KErrNone || err == KErrAlreadyExists) - iFs.SetSessionToPrivate(drive); - else + if (err != KErrNone && err != KErrAlreadyExists) qWarning("Failed to create private path on application drive."); } + //BC with 4.7: set working directory to same drive as application + iFs.SetSessionToPrivate(drive); } } -- cgit v0.12