diff options
-rw-r--r-- | examples/xml/saxbookmarks/main.cpp | 2 | ||||
-rw-r--r-- | src/corelib/kernel/qcore_symbian_p.cpp | 9 | ||||
-rw-r--r-- | src/gui/dialogs/qdialog.cpp | 4 | ||||
-rw-r--r-- | src/gui/kernel/qapplication.cpp | 4 | ||||
-rw-r--r-- | src/gui/kernel/qapplication_p.h | 1 | ||||
-rw-r--r-- | src/gui/kernel/qapplication_s60.cpp | 44 | ||||
-rw-r--r-- | src/gui/kernel/qt_s60_p.h | 3 | ||||
-rw-r--r-- | src/gui/kernel/qwidget_s60.cpp | 84 | ||||
-rw-r--r-- | src/s60installs/bwins/QtGuiu.def | 3 | ||||
-rw-r--r-- | src/s60installs/eabi/QtGuiu.def | 3 |
10 files changed, 98 insertions, 59 deletions
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 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); } } 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); 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<CEikAppUi *>(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<QSymbianControl *>(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<CAknAppUi*>(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<QWidget> 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<CEikAppUi *>(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<CAknAppUi *>(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<CAknAppUi *>(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<QSymbianControl *>(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 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<enum Qt::KeyboardModifier> 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 |