summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--library/qpeapplication.cpp142
-rw-r--r--library/qpeapplication.h11
2 files changed, 110 insertions, 43 deletions
diff --git a/library/qpeapplication.cpp b/library/qpeapplication.cpp
index 9286f9f..149e6bb 100644
--- a/library/qpeapplication.cpp
+++ b/library/qpeapplication.cpp
@@ -13,15 +13,13 @@
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** 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>
#include <linux/limits.h> // needed for some toolchains (PATH_MAX)
#include <qfile.h>
#ifdef Q_WS_QWS
@@ -48,12 +46,13 @@
#include <qdragobject.h>
#include <qtextcodec.h>
#include <qevent.h>
#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
#include "qpeapplication.h"
#include "qpestyle.h"
#include "styleinterface.h"
@@ -114,12 +113,13 @@ public:
bool notbusysent : 1;
bool preloaded : 1;
bool forceshow : 1;
bool nomaximize : 1;
bool keep_running : 1;
+ QStringList langs;
QString appName;
struct QCopRec
{
QCopRec( const QCString &ch, const QCString &msg,
const QByteArray &d ) :
channel( ch ), message( msg ), data( d )
@@ -127,13 +127,16 @@ public:
QCString channel;
QCString message;
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 )
{
qcopq.append( new QCopRec( ch, msg, data ) );
}
@@ -263,14 +266,12 @@ public:
else {
lib->unload();
delete lib;
}
}
}
- QString styleName;
- QString decorationName;
};
class ResourceMimeFactory : public QMimeSourceFactory
{
public:
ResourceMimeFactory() : resImage( 0 )
@@ -660,14 +661,14 @@ QPEApplication::QPEApplication( int & argc, char **argv, Type t )
initApp( argc, argv );
#endif
// qwsSetDecoration( new QPEDecoration() );
#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");
installTranslation( lang + "/libqpe.qm" );
installTranslation( lang + "/" + d->appName + ".qm" );
@@ -739,12 +740,16 @@ void QPEApplication::initApp( int argc, char **argv )
argc-=1;
}
}
/* 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
static QPtrDict<void>* inputMethodDict = 0;
static void createInputMethodDict()
@@ -1308,51 +1313,109 @@ 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
if ( msg == "quit()" ) {
tryQuit();
@@ -1399,16 +1462,17 @@ void QPEApplication::pidMessage( const QCString& msg, const QByteArray& data)
stream >> doc;
QWidget *mw = mainWidget();
if ( !mw )
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;
emit appMessage( msg, data);
if ( d->keep_running ) {
d->notbusysent = FALSE;
diff --git a/library/qpeapplication.h b/library/qpeapplication.h
index 770ea23..343e0b9 100644
--- a/library/qpeapplication.h
+++ b/library/qpeapplication.h
@@ -110,12 +110,15 @@ signals:
private slots:
void systemMessage( const QCString &msg, const QByteArray &data );
void pidMessage( const QCString &msg, const QByteArray &data );
void removeSenderFromStylusDict();
void hideOrQuit();
+private:
+ inline QWidget *nextWidget( QWidgetList*, QWidget* );
+
protected:
bool qwsEventFilter( QWSEvent * );
void internalSetStyle( const QString &style );
void prepareForTermination(bool willrestart);
virtual void restart();
virtual void shutdown();
@@ -188,17 +191,17 @@ inline Transformation DegToTrans ( int d )
*/
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
}
#endif