summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--library/qpeapplication.cpp162
-rw-r--r--library/qpeapplication.h3
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 );