-rw-r--r-- | library/qpeapplication.cpp | 162 | ||||
-rw-r--r-- | library/qpeapplication.h | 3 |
2 files changed, 75 insertions, 90 deletions
diff --git a/library/qpeapplication.cpp b/library/qpeapplication.cpp index bf353d4..86aa53d 100644 --- a/library/qpeapplication.cpp +++ b/library/qpeapplication.cpp @@ -117,54 +117,54 @@ public: 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 ) { } QCString channel; QCString message; QByteArray data; }; QWidget* qpe_main_widget; - QGuardedPtr<QWidget> lastWidget; + QGuardedPtr<QWidget> lastraised; 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 ) ); } void sendQCopQ() { QCopRec * r; #ifndef QT_NO_COP for ( QListIterator<QCopRec> it( qcopq ); ( r = it.current() ); ++it ) QCopChannel::sendLocally( r->channel, r->message, r->data ); #endif qcopq.clear(); } - static void show_mx(QWidget* mw, bool nomaximize) + static void show_mx(QWidget* mw, bool nomaximize, const QString & = QString::null ) { // ugly hack, remove that later after finding a sane solution // Addendum: Only Sharp currently has models with high resolution but (physically) small displays, // so this is only useful if QT_QWS_SIMPAD is NOT defined. E.g. SIMpad has 800x600 but has // a (physically) large enough display to use the small icons #ifndef QT_QWS_SIMPAD if ( QPEApplication::desktop() ->width() >= 600 && ( mw->inherits("QMainWindow") || mw->isA("QMainWindow") ) ) { ( ( QMainWindow* ) mw )->setUsesBigPixmaps( true ); } #endif if ( mw->layout() && mw->inherits("QDialog") ) { QPEApplication::showDialog((QDialog*)mw, nomaximize); } else { @@ -691,53 +691,56 @@ QPEApplication::QPEApplication( int & argc, char **argv, Type t ) } installEventFilter( this ); QPEMenuToolFocusManager::initialize(); #ifdef QT_NO_QWS_CURSOR // if we have no cursor, probably don't want tooltips QToolTip::setEnabled( FALSE ); #endif } #ifdef QTOPIA_INTERNAL_INITAPP void QPEApplication::initApp( int argc, char **argv ) { + bool initial = pidChannel; // was set to 0 in the initializer delete pidChannel; d->keep_running = TRUE; d->preloaded = FALSE; d->forceshow = FALSE; QCString channel = QCString(argv[0]); channel.replace(QRegExp(".*/"),""); d->appName = channel; #if QT_VERSION > 235 qt_fbdpy->setIdentity( channel ); // In Qt/E 2.3.6 #endif channel = "QPE/Application/" + channel; pidChannel = new QCopChannel( channel, this); connect( pidChannel, SIGNAL(received(const QCString &, const QByteArray &)), this, SLOT(pidMessage(const QCString &, const QByteArray &))); - processQCopFile(); - d->keep_running = d->qcopq.isEmpty(); + if (!initial) { + processQCopFile(); + d->keep_running = d->qcopq.isEmpty(); + } for (int a=0; a<argc; a++) { if ( qstrcmp(argv[a],"-preload")==0 ) { argv[a] = argv[a+1]; a++; d->preloaded = TRUE; argc-=1; } else if ( qstrcmp(argv[a],"-preload-show")==0 ) { argv[a] = argv[a+1]; a++; d->preloaded = TRUE; d->forceshow = TRUE; argc-=1; } } @@ -1349,123 +1352,108 @@ void QPEApplication::systemMessage( const QCString& msg, const QByteArray& data qwsServer->processKeyEvent( unicode, scan, ControlButton, FALSE, FALSE ); } } else if ( msg == "newChannel(QString)") { QString myChannel = "QPE/Application/" + d->appName; QString channel; stream >> channel; if (channel == myChannel) { processQCopFile(); d->sendQCopQ(); } } #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; - - 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; + bool r=FALSE; + + // 1. Raise the main widget + 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.. +#ifndef QT_NO_COP + QCopEnvelope e("QPE/System", "fastAppShowing(QString)"); + e << d->appName; +#endif + } + + d->show_mx(top,d->nomaximize, d->appName); + top->raise(); + } + + QWidget *topm = activeModalWidget(); + + // 2. Raise any parentless widgets (except top and topm, as they + // are raised before and after this loop). Order from most + // recently raised as deepest to least recently as top, so + // that repeated calls cycle through widgets. + QWidgetList *list = topLevelWidgets(); + if ( list ) { + bool foundlast = FALSE; + QWidget* topsub = 0; + if ( d->lastraised ) { + for (QWidget* w = list->first(); w; w = list->next()) { + if ( !w->parentWidget() && w != topm && w->isVisible() && !w->isDesktop() ) { + if ( w == d->lastraised ) + foundlast = TRUE; + if ( foundlast ) { + w->raise(); + topsub = w; + } + } + } + } + for (QWidget* w = list->first(); w; w = list->next()) { + if ( !w->parentWidget() && w != topm && w->isVisible() && !w->isDesktop() ) { + if ( w == d->lastraised ) + break; + w->raise(); + topsub = w; + } + } + d->lastraised = topsub; + delete list; } - if (!r && d->preloaded ) { - QCopEnvelope e("QPE/System", "fastAppShowing(QString)"); - e << d->appName; + // 3. Raise the active modal widget. + if ( topm && topm != top ) { + topm->show(); + topm->raise(); + // If we haven't already handled the fastAppShowing message + if (!top && d->preloaded) { +#ifndef QT_NO_COP + QCopEnvelope e("QPE/System", "fastAppShowing(QString)"); + e << d->appName; +#endif + } + r = FALSE; } return r; } void QPEApplication::pidMessage( const QCString& msg, const QByteArray& data) { #ifdef Q_WS_QWS if ( msg == "quit()" ) { tryQuit(); } else if ( msg == "quitIfInvisible()" ) { if ( d->qpe_main_widget && !d->qpe_main_widget->isVisible() ) quit(); diff --git a/library/qpeapplication.h b/library/qpeapplication.h index 69e0058..729cf2b 100644 --- a/library/qpeapplication.h +++ b/library/qpeapplication.h @@ -102,35 +102,32 @@ signals: void clockChanged( bool pm ); void micChanged( bool muted ); void volumeChanged( bool muted ); void appMessage( const QCString& msg, const QByteArray& data); void weekChanged( bool startOnMonday ); void dateFormatChanged( DateFormat ); void flush(); void reload(); /* linkChanged signal */ private slots: void systemMessage( const QCString &msg, const QByteArray &data ); void pidMessage( const QCString &msg, const QByteArray &data ); void removeSenderFromStylusDict(); void hideOrQuit(); -private: - QWidget *nextWidget( QWidgetList*, QWidget* ); - protected: bool qwsEventFilter( QWSEvent * ); void internalSetStyle( const QString &style ); void prepareForTermination(bool willrestart); virtual void restart(); virtual void shutdown(); bool eventFilter( QObject *, QEvent * ); void timerEvent( QTimerEvent * ); bool raiseAppropriateWindow(); virtual void tryQuit(); #if QT_VERSION > 233 virtual void polish ( QWidget * ); // this is actually implemented in qt_override.cpp (!) #endif private: #ifndef QT_NO_TRANSLATION void installTranslation( const QString& baseName ); |