From 6f6d94acaefc202e2a922ff2ea672afa64490c4e Mon Sep 17 00:00:00 2001
From: Sami Merila <sami.merila@nokia.com>
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 <qt-info@nokia.com>
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<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
 
-- 
cgit v0.12


From d704e61a8ac1fa9ff4aff05cc5d9bd94a777d04e Mon Sep 17 00:00:00 2001
From: Sami Merila <sami.merila@nokia.com>
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 <qt-info@nokia.com>
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<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
 
-- 
cgit v0.12


From 001c01e91d9c6cc724a374fcb8371a0551b21958 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
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