From d8fadaf4f510803983d0b8b99994fd70e770ccab Mon Sep 17 00:00:00 2001
From: zecke <zecke>
Date: Fri, 29 Aug 2003 06:52:04 +0000
Subject: -IF the app is visible and has more than once topLevel widget

iterate over the list and activate the next one.
-Install translation in .qm
-Add an else again ( was lost in a merge )
---
diff --git a/library/qpeapplication.cpp b/library/qpeapplication.cpp
index 9286f9f..149e6bb 100644
--- a/library/qpeapplication.cpp
+++ b/library/qpeapplication.cpp
@@ -16,9 +16,7 @@
 ** Contact info@trolltech.com if any conditions of this licensing are
 ** not clear to you.
 **
-** $Id$
-**
-**********************************************************************/
+*/
 #define QTOPIA_INTERNAL_LANGLIST
 #include <stdlib.h>
 #include <unistd.h>
@@ -51,6 +49,7 @@
 #include <qtooltip.h>
 #include <qsignal.h>
 #include <qmainwindow.h>
+#include <qwidgetlist.h>
 
 #if defined(Q_WS_QWS) && !defined(QT_NO_COP)
 #define QTOPIA_INTERNAL_INITAPP
@@ -117,6 +116,7 @@ public:
 	bool nomaximize   : 1;
 	bool keep_running : 1;
 
+        QStringList langs;
 	QString appName;
 	struct QCopRec
 	{
@@ -130,7 +130,10 @@ public:
 		QByteArray data;
 	};
 	QWidget* qpe_main_widget;
+        QGuardedPtr<QWidget> lastWidget;
 	QList<QCopRec> qcopq;
+        QString styleName;
+	QString decorationName;
 
 	void enqueueQCop( const QCString &ch, const QCString &msg,
 	                  const QByteArray &data )
@@ -266,8 +269,6 @@ public:
 			}
 		}
 	}
-	QString styleName;
-	QString decorationName;
 };
 
 class ResourceMimeFactory : public QMimeSourceFactory
@@ -663,8 +664,8 @@ QPEApplication::QPEApplication( int & argc, char **argv, Type t )
 
 #ifndef QT_NO_TRANSLATION
 
-	QStringList langs = Global::languageList();
-	for ( QStringList::ConstIterator it = langs.begin(); it != langs.end(); ++it ) {
+	d->langs = Global::languageList();
+	for ( QStringList::ConstIterator it = d->langs.begin(); it != d->langs.end(); ++it ) {
 		QString lang = *it;
 
                 installTranslation( lang + "/libopie.qm");
@@ -742,6 +743,10 @@ void QPEApplication::initApp( int argc, char **argv )
 
     /* overide stored arguments */
     setArgs(argc, argv);
+
+    /* install translation here */
+    for ( QStringList::ConstIterator it = d->langs.begin(); it != d->langs.end(); ++it )
+        installTranslation( (*it) + "/" + d->appName + ".qm" );
 }
 #endif
 
@@ -1311,45 +1316,103 @@ void QPEApplication::systemMessage( const QCString& msg, const QByteArray& data
 #endif
 }
 
+#include <qmetaobject.h>
+
+QWidget *QPEApplication::nextWidget(QWidgetList* list,  QWidget* _wid) {
+    QWidget *next = 0;
+    if ( list->isEmpty() || list->count() == 1 )
+        next = _wid;
+    else{
+        QWidget* wid;
+        uint idx   = list->findRef( _wid );
+        uint count = list->count();
+
+        /* one time through the list hacky we may not start with idx but end with it*/
+        for (uint i = (idx + 1)%count; true; i=(i+1)%count ) {
+            wid = list->at(i);
+            if ( wid == _wid ) {
+                next = _wid;
+                break;
+            }else if ((( wid->inherits("QMainWindow") ||
+                        wid->inherits("QDialog") ) &&
+                      wid != qApp->desktop() && !wid->isHidden() ) ||
+                      ( wid == mainWidget() || wid == d->qpe_main_widget ) ){
+                next = wid;
+                break;
+            }
+        }
+    }
+
+    delete list;
+    return next;
+}
 /*!
   \internal
 */
+// ########## raise()ing main window should raise and set active
+// ########## it and then all childen. This belongs in Qt/Embedded
+/*
+ * slightly change in behaviour to kill the need of modality in Opie
+ * If any of the topLevelWidgets !isFullyObscured we highlight the next
+ * top level window
+ * 1)If visible and not modal we iterate over the list of top level widgets
+ * 2)If modal we we make the modal and its parent toplevel widget visible if available
+ * 3)else make topLevel visible
+ *
+ * send qcop if necessary and save current visible widget if not modal
+ */
 bool QPEApplication::raiseAppropriateWindow()
 {
-	bool r = FALSE;
-	// ########## raise()ing main window should raise and set active
-	// ########## it and then all childen. This belongs in Qt/Embedded
-	QWidget *top = d->qpe_main_widget;
-	if ( !top )
-		top = mainWidget();
-	if ( top && d->keep_running ) {
-		if ( top->isVisible() )
-			r = TRUE;
-		else if (d->preloaded) {
-			// We are preloaded and not visible.. pretend we just started..
-			QCopEnvelope e("QPE/System", "fastAppShowing(QString)");
-			e << d->appName;
-		}
+    bool r = FALSE;
+
+    QWidget *top = d->qpe_main_widget ? d->qpe_main_widget : mainWidget();
+    /* 1. */
+    if ( ( top && (top->isVisible() ) || ( d->lastWidget && d->lastWidget->isVisible() ) ) &&
+         !activeModalWidget() ) {
+        r = TRUE;
+        /*wid will be valid and topLevelWidgets will be deleted properly.. */
+        QWidget *wid = nextWidget( topLevelWidgets(),
+                                   d->lastWidget ? (QWidget*)d->lastWidget : top  );
+        /* keep the size window got but not for root*/
+        if ( top == wid )
+            d->show_mx(top, d->nomaximize );
+        else
+            wid->show();
+
+        wid->raise();
+        wid->setActiveWindow();
+        d->lastWidget = wid;
+    }else if ( activeModalWidget() ) {
+        QWidget*  mod = activeModalWidget();
+        /* get the parent of the modal and its topLevelWidget as background widget */
+        QWidget*  par = activeModalWidget()->parentWidget() ? activeModalWidget()->parentWidget()->topLevelWidget() : 0;
+        if (par ) {
+            if (par == top )
+                d->show_mx(par, d->nomaximize );
+            else
+                par->show();
+            par->raise();
+            par->setActiveWindow();
+        }
+        mod->show();
+        mod->raise();
+        mod->setActiveWindow();
+    }else if (top){
+        d->show_mx(top, d->nomaximize );
+        top->raise();
+        top->setActiveWindow();
+        d->lastWidget = top;
+    }
 
-		d->show_mx(top, d->nomaximize);
-		top->raise();
-		top->setActiveWindow();
-	}
-	QWidget *topm = activeModalWidget();
-	if ( topm && topm != top ) {
-		topm->show();
-		topm->raise();
-		topm->setActiveWindow();
-		// If we haven't already handled the fastAppShowing message
-		if (!top && d->preloaded) {
-			QCopEnvelope e("QPE/System", "fastAppShowing(QString)");
-			e << d->appName;
-		}
-		r = FALSE;
-	}
-	return r;
+    if (!r && d->preloaded ) {
+        QCopEnvelope e("QPE/System", "fastAppShowing(QString)");
+        e << d->appName;
+    }
+
+    return r;
 }
 
+
 void QPEApplication::pidMessage( const QCString& msg, const QByteArray& data)
 {
 #ifdef Q_WS_QWS
@@ -1402,10 +1465,11 @@ void QPEApplication::pidMessage( const QCString& msg, const QByteArray& data)
 			mw = d->qpe_main_widget;
 		if ( mw )
 			Global::setDocument( mw, doc );
+
 	} else if ( msg == "QPEProcessQCop()" ) {
             processQCopFile();
             d->sendQCopQ();
-        }
+        }else
         {
             bool p = d->keep_running;
             d->keep_running = FALSE;
diff --git a/library/qpeapplication.h b/library/qpeapplication.h
index 770ea23..343e0b9 100644
--- a/library/qpeapplication.h
+++ b/library/qpeapplication.h
@@ -113,6 +113,9 @@ private slots:
     void removeSenderFromStylusDict();
     void hideOrQuit();
 
+private:
+    inline QWidget *nextWidget( QWidgetList*, QWidget* );
+
 protected:
     bool qwsEventFilter( QWSEvent * );
     void internalSetStyle( const QString &style );
@@ -191,13 +194,13 @@ inline void QPEApplication::setCurrentRotation( int r )
 {
     // setTransformation has been introduced in Qt/Embedded 2.3.4 snapshots
     // for compatibility with the SharpROM use fallback to setDefaultTransformation()
-    #if QT_VERSION > 233
+#if QT_VERSION > 233
     Transformation e = DegToTrans( r );
-    setenv( "QWS_DISPLAY", QString( "Transformed:Rot%1:0" ).arg( r ).latin1(), 1 );
+    ::setenv( "QWS_DISPLAY", QString( "Transformed:Rot%1:0" ).arg( r ).latin1(), 1 );
     qApp->desktop()->qwsDisplay()->setTransformation( e );
-    #else
+#else
     setDefaultRotation( r );
-    #endif
+#endif
 }
 
 
--
cgit v0.9.0.2