author | zecke <zecke> | 2002-09-10 12:09:49 (UTC) |
---|---|---|
committer | zecke <zecke> | 2002-09-10 12:09:49 (UTC) |
commit | 6b77a1cdb9536b1c135eb86d53a6b2c22c19b0a4 (patch) (side-by-side diff) | |
tree | 6ebc93c6432f4ed9d00ef1448b6a047ef522a79a /library/qpeapplication.cpp | |
parent | d10cddb3c9ce75bc90b14add14bc133737fe35aa (diff) | |
download | opie-6b77a1cdb9536b1c135eb86d53a6b2c22c19b0a4.zip opie-6b77a1cdb9536b1c135eb86d53a6b2c22c19b0a4.tar.gz opie-6b77a1cdb9536b1c135eb86d53a6b2c22c19b0a4.tar.bz2 |
Qtopia1-6 merge
still to test
bic changes to be resolved
more changes to be made?
-rw-r--r-- | library/qpeapplication.cpp | 605 |
1 files changed, 357 insertions, 248 deletions
diff --git a/library/qpeapplication.cpp b/library/qpeapplication.cpp index 8aae786..3ca6d73 100644 --- a/library/qpeapplication.cpp +++ b/library/qpeapplication.cpp @@ -1,6 +1,6 @@ /********************************************************************** -** Copyright (C) 2000 Trolltech AS. All rights reserved. +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** -** This file is part of Qtopia Environment. +** This file is part of the Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the @@ -46,4 +46,5 @@ #include <qdialog.h> #include <qdragobject.h> +#include <qtextcodec.h> #include <qevent.h> #include <qtooltip.h> @@ -65,11 +66,18 @@ #include "global.h" #include "resource.h" +#if QT_VERSION <= 230 && defined(QT_NO_CODECS) +#include "qutfcodec.h" +#endif #include "config.h" +#include "network.h" +#ifdef QWS #include "fontmanager.h" -#include "fontdatabase.h" +#endif #include "alarmserver.h" #include "applnk.h" #include "qpemenubar.h" +#include "textcodecinterface.h" +#include "imagecodecinterface.h" #include <unistd.h> @@ -79,6 +87,5 @@ -class QPEApplicationData -{ +class QPEApplicationData { public: QPEApplicationData() : presstimer( 0 ), presswidget( 0 ), rightpressed( FALSE ), @@ -93,15 +100,13 @@ public: QWidget* presswidget; QPoint presspos; - bool rightpressed; + bool rightpressed : 1; // AEH why not use uint foobar :1; if it's tt style -zecke int kbgrabber; - bool kbregrab; - bool notbusysent; + bool kbregrab : 1; + bool notbusysent : 1; QString appName; - struct QCopRec - { + struct QCopRec { QCopRec( const QCString &ch, const QCString &msg, const QByteArray &d ) : - channel( ch ), message( msg ), data( d ) - { } + channel( ch ), message( msg ), data( d ) { } QCString channel; @@ -109,9 +114,9 @@ public: QByteArray data; }; - bool preloaded; - bool forceshow; - bool nomaximize; + bool preloaded : 1; + bool forceshow : 1; + bool nomaximize : 1; QWidget* qpe_main_widget; - bool keep_running; + bool keep_running : 1; QList<QCopRec> qcopq; @@ -121,15 +126,112 @@ public: qcopq.append( new QCopRec( ch, msg, data ) ); } - void sendQCopQ() - { + 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) { + if ( mw->layout() && mw->inherits("QDialog") ) { + QPEApplication::showDialog((QDialog*)mw,nomaximize); + } else { +#ifdef Q_WS_QWS + if ( !nomaximize ) + mw->showMaximized(); + else +#endif + mw->show(); + } + } + static bool setWidgetCaptionFromAppName( QWidget* /*mw*/, const QString& /*appName*/, const QString& /*appsPath*/ ) + { + /* + // This works but disable it for now until it is safe to apply + // What is does is scan the .desktop files of all the apps for + // the applnk that has the corresponding argv[0] as this program + // then it uses the name stored in the .desktop file as the caption + // for the main widget. This saves duplicating translations for + // the app name in the program and in the .desktop files. + + AppLnkSet apps( appsPath ); -class ResourceMimeFactory : public QMimeSourceFactory + QList<AppLnk> appsList = apps.children(); + for ( QListIterator<AppLnk> it(appsList); it.current(); ++it ) { + if ( (*it)->exec() == appName ) { + mw->setCaption( (*it)->name() ); + return TRUE; + } + } + */ + return FALSE; + } + + + void show(QWidget* mw, bool nomax) + { + setWidgetCaptionFromAppName( mw, appName, QPEApplication::qpeDir() + "apps" ); + nomaximize = nomax; + qpe_main_widget = mw; +#ifndef QT_NO_COP + sendQCopQ(); +#endif + if ( preloaded ) { + if(forceshow) + show_mx(mw,nomax); + } else if ( keep_running ) { + show_mx(mw,nomax); + } + } + + void loadTextCodecs() { + QString path = QPEApplication::qpeDir() + "/plugins/textcodecs"; + QDir dir( path, "lib*.so" ); + QStringList list = dir.entryList(); + QStringList::Iterator it; + for ( it = list.begin(); it != list.end(); ++it ) { + TextCodecInterface *iface = 0; + QLibrary *lib = new QLibrary( path + "/" + *it ); + if ( lib->queryInterface( IID_QtopiaTextCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) { + QValueList<int> mibs = iface->mibEnums(); + for (QValueList<int>::ConstIterator i=mibs.begin(); i!=mibs.end(); ++i) { + (void)iface->createForMib(*i); + // ### it exists now; need to remember if we can delete it + } + } else { + lib->unload(); + delete lib; + } + } + } + + void loadImageCodecs() + { + QString path = QPEApplication::qpeDir() + "/plugins/imagecodecs"; + QDir dir( path, "lib*.so" ); + QStringList list = dir.entryList(); + QStringList::Iterator it; + for ( it = list.begin(); it != list.end(); ++it ) { + ImageCodecInterface *iface = 0; + QLibrary *lib = new QLibrary( path + "/" + *it ); + if ( lib->queryInterface( IID_QtopiaImageCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) { + QStringList formats = iface->keys(); + for (QStringList::ConstIterator i=formats.begin(); i!=formats.end(); ++i) { + (void)iface->installIOHandler(*i); + // ### it exists now; need to remember if we can delete it + } + } else { + lib->unload(); + delete lib; + } + } + } + QString styleName; + QString decorationName; +}; + +class ResourceMimeFactory : public QMimeSourceFactory { public: ResourceMimeFactory() @@ -210,9 +312,38 @@ static void setMic( int t = 0, int percent = -1 ) that are available to all Qtopia applications. - Simply by using QPEApplication instead of QApplication, a plain Qt + Simply by using QPEApplication instead of QApplication, a standard Qt application becomes a Qtopia application. It automatically follows style changes, quits and raises, and in the case of \link docwidget.html document-oriented\endlink applications, - changes the current displayed document in response to the environment. + changes the currently displayed document in response to the environment. + + To create a \link docwidget.html document-oriented\endlink + application use showMainDocumentWidget(); to create a + non-document-oriented application use showMainWidget(). The + keepRunning() function indicates whether the application will + continue running after it's processed the last \link qcop.html + QCop\endlink message. This can be changed using setKeepRunning(). + + A variety of signals are emitted when certain events occur, for + example, timeChanged(), clockChanged(), weekChanged(), + dateFormatChanged() and volumeChanged(). If the application receives + a \link qcop.html QCop\endlink message on the application's + QPE/Application/\e{appname} channel, the appMessage() signal is + emitted. There are also flush() and reload() signals, which + are emitted when synching begins and ends respectively - upon these + signals, the application should save and reload any data + files that are involved in synching. Most of these signals will initially + be received and unfiltered through the appMessage() signal. + + This class also provides a set of useful static functions. The + qpeDir() and documentDir() functions return the respective paths. + The grabKeyboard() and ungrabKeyboard() functions are used to + control whether the application takes control of the device's + physical buttons (e.g. application launch keys). The stylus' mode of + operation is set with setStylusOperation() and retrieved with + stylusOperation(). There are also setInputMethodHint() and + inputMethodHint() functions. + + \ingroup qtopiaemb */ @@ -225,7 +356,6 @@ static void setMic( int t = 0, int percent = -1 ) /*! \fn void QPEApplication::timeChanged(); - - This signal is emitted when the time jumps forward or backwards - by more than the normal passage of time. + This signal is emitted when the time changes outside the normal + passage of time, i.e. if the time is set backwards or forwards. */ @@ -233,7 +363,40 @@ static void setMic( int t = 0, int percent = -1 ) \fn void QPEApplication::clockChanged( bool ampm ); - This signal is emitted when the user changes the style - of clock. If \a ampm is TRUE, the user wants a 12-hour - AM/PM close, otherwise, they want a 24-hour clock. + This signal is emitted when the user changes the clock's style. If + \a ampm is TRUE, the user wants a 12-hour AM/PM clock, otherwise, + they want a 24-hour clock. +*/ + +/*! + \fn void QPEApplication::volumeChanged( bool muted ) + + This signal is emitted whenever the mute state is changed. If \a + muted is TRUE, then sound output has been muted. +*/ + +/*! + \fn void QPEApplication::weekChanged( bool startOnMonday ) + + This signal is emitted if the week start day is changed. If \a + startOnMonday is TRUE then the first day of the week is Monday; if + \a startOnMonday is FALSE then the first day of the week is + Sunday. +*/ + +/*! + \fn void QPEApplication::dateFormatChanged() + + This signal is emitted whenever the date format is changed. +*/ + +/*! + \fn void QPEApplication::flush() + + ### +*/ + +/*! + \fn void QPEApplication::reload() + */ @@ -241,6 +404,7 @@ static void setMic( int t = 0, int percent = -1 ) \fn void QPEApplication::appMessage( const QCString& msg, const QByteArray& data ) - This signal is emitted when a message is received on the - QPE/Application/<i>appname</i> QCop channel for this application. + This signal is emitted when a message is received on this + application's QPE/Application/<i>appname</i> \link qcop.html + QCop\endlink channel. The slot to which you connect this signal uses \a msg and \a data @@ -262,4 +426,6 @@ static void setMic( int t = 0, int percent = -1 ) \sa qcop.html + Note that messages received here may be processed by qpe application + and emitted as signals, such as flush() and reload(). */ @@ -267,16 +433,30 @@ static void setMic( int t = 0, int percent = -1 ) Constructs a QPEApplication just as you would construct a QApplication, passing \a argc, \a argv, and \a t. + + For applications, \a t should be the default, GuiClient. Only + the Qtopia server passes GuiServer. */ QPEApplication::QPEApplication( int & argc, char **argv, Type t ) : QApplication( argc, argv, t ) { + d = new QPEApplicationData; + d->loadTextCodecs(); + d->loadImageCodecs(); int dw = desktop() ->width(); if ( dw < 200 ) { - // setFont( QFont( "helvetica", 8 ) ); + setFont( QFont( "helvetica", 8 ) ); AppLnk::setSmallIconSize( 10 ); AppLnk::setBigIconSize( 28 ); + }else if ( dw > 600 ) { + setFont( QFont( "helvetica", 12 ) ); + AppLnk::setSmallIconSize( 24 ); + AppLnk::setBigIconSize( 48 ); + }else if ( dw > 400 ) { + setFont( QFont( "helvetica", 12 ) ); + AppLnk::setSmallIconSize( 16 ); + AppLnk::setBigIconSize( 32 ); } - d = new QPEApplicationData; + QMimeSourceFactory::setDefaultFactory( new ResourceMimeFactory ); @@ -340,5 +520,5 @@ QPEApplication::QPEApplication( int & argc, char **argv, Type t ) #endif - qwsSetDecoration( new QPEDecoration() ); +// qwsSetDecoration( new QPEDecoration() ); #ifndef QT_NO_TRANSLATION @@ -365,30 +545,12 @@ QPEApplication::QPEApplication( int & argc, char **argv, Type t ) delete trans; - /* - * not required. if using one of these languages, you might as well install - * a custom font. - //###language/font hack; should look it up somewhere +#ifdef QWS if ( lang == "ja" || lang == "zh_CN" || lang == "zh_TW" || lang == "ko" ) { QFont fn = FontManager::unicodeFont( FontManager::Proportional ); setFont( fn ); } - - else { - */ - Config config( "qpe" ); - config.setGroup( "Appearance" ); - QString familyStr = config.readEntry( "FontFamily", "helvetica" ); - QString styleStr = config.readEntry( "FontStyle", "Regular" ); - QString sizeStr = config.readEntry( "FontSize", "10" ); - QString charSetStr = config.readEntry( "FontCharSet", QString::null ); - bool ok; - int i_size = sizeStr.toInt( &ok, 10 ); - FontDatabase fdb; - QFont selectedFont = fdb.font( familyStr, styleStr, i_size, charSetStr ); - setFont( selectedFont ); - //} +#endif } - #endif @@ -418,7 +580,8 @@ static void createInputMethodDict() /*! Returns the currently set hint to the system as to whether - \a w has any use for text input methods. + widget \a w has any use for text input methods. - \sa setInputMethodHint() + + \sa setInputMethodHint() InputMethodHint */ QPEApplication::InputMethodHint QPEApplication::inputMethodHint( QWidget * w ) @@ -438,8 +601,8 @@ QPEApplication::InputMethodHint QPEApplication::inputMethodHint( QWidget * w ) /*! - Hints to the system that \a w has use for text input methods + Hints to the system that widget \a w has use for text input methods as specified by \a mode. - \sa inputMethodHint() + \sa inputMethodHint() InputMethodHint */ void QPEApplication::setInputMethodHint( QWidget * w, InputMethodHint mode ) @@ -458,12 +621,6 @@ class HackDialog : public QDialog { public: - void acceptIt() - { - accept(); - } - void rejectIt() - { - reject(); - } + void acceptIt() { accept(); } + void rejectIt() { reject(); } }; @@ -481,5 +638,7 @@ void QPEApplication::mapToDefaultAction( QWSKeyEvent * ke, int key ) key = Qt::Key_Return; +#ifdef QWS ke->simpleData.keycode = key; +#endif } @@ -488,7 +647,5 @@ class HackWidget : public QWidget public: bool needsOk() - { - return ( getWState() & WState_Reserved1 ); - } + { return ( getWState() & WState_Reserved1 ); } }; @@ -496,4 +653,6 @@ public: \internal */ + +#ifdef QWS bool QPEApplication::qwsEventFilter( QWSEvent * e ) { @@ -510,4 +669,7 @@ bool QPEApplication::qwsEventFilter( QWSEvent * e ) if ( e->asMouse() ->simpleData.state && !QWidget::find( e->window() ) ) emit clientMoused(); + break; + default: + break; } } @@ -545,6 +707,5 @@ bool QPEApplication::qwsEventFilter( QWSEvent * e ) } } - } - else if ( ke->simpleData.keycode == Qt::Key_F30 ) { + } else if ( ke->simpleData.keycode == Qt::Key_F30 ) { // Use special "select" key to do whatever default action a widget has mapToDefaultAction( ke, Qt::Key_Space ); @@ -611,4 +772,5 @@ bool QPEApplication::qwsEventFilter( QWSEvent * e ) return QApplication::qwsEventFilter( e ); } +#endif /*! @@ -645,9 +807,5 @@ QString QPEApplication::qpeDir() QString QPEApplication::documentDir() { - const char * base = getenv( "HOME" ); - if ( base ) - return QString( base ) + "/Documents/"; - - return QString( "../Documents/" ); + return QString( qpeDir() + "Documents"); } @@ -685,7 +843,11 @@ void QPEApplication::setDefaultRotation( int r ) deforient = r; setenv( "QWS_DISPLAY", QString( "Transformed:Rot%1:0" ).arg( r ).latin1(), 1 ); - } - else { - QCopEnvelope( "QPE/System", "setDefaultRotation(int)" ) << r; + Config config("qpe"); + config.setGroup( "Rotation" ); + config.writeEntry( "Screen", getenv("QWS_DISPLAY") ); + } else { +#ifndef QT_NO_COP + { QCopEnvelope e( "QPE/System", "setDefaultRotation(int)" ); e << r; } +#endif } } @@ -723,4 +885,16 @@ void QPEApplication::applyStyle() setPalette( pal, TRUE ); + + // Window Decoration + QString dec = config.readEntry( "Decoration", "Qtopia" ); + if ( dec != d->decorationName ) { + qwsSetDecoration( new QPEDecoration( dec ) ); + d->decorationName = dec; + } + + // Font + QString ff = config.readEntry( "FontFamily", font().family() ); + int fs = config.readNumEntry( "FontSize", font().pointSize() ); + setFont( QFont(ff,fs) ); } @@ -731,6 +905,5 @@ void QPEApplication::systemMessage( const QCString & msg, const QByteArray & dat if ( msg == "applyStyle()" ) { applyStyle(); - } - else if ( msg == "setDefaultRotation(int)" ) { + } else if ( msg == "setDefaultRotation(int)" ) { if ( type() == GuiServer ) { int r; @@ -738,22 +911,17 @@ void QPEApplication::systemMessage( const QCString & msg, const QByteArray & dat setDefaultRotation( r ); } - } - else if ( msg == "shutdown()" ) { + } else if ( msg == "shutdown()" ) { if ( type() == GuiServer ) shutdown(); - } - else if ( msg == "quit()" ) { + } else if ( msg == "quit()" ) { if ( type() != GuiServer ) tryQuit(); - } - else if ( msg == "forceQuit()" ) { + } else if ( msg == "forceQuit()" ) { if ( type() != GuiServer ) quit(); - } - else if ( msg == "restart()" ) { + } else if ( msg == "restart()" ) { if ( type() == GuiServer ) restart(); - } - else if ( msg == "grabKeyboard(QString)" ) { + } else if ( msg == "grabKeyboard(QString)" ) { QString who; stream >> who; @@ -764,8 +932,5 @@ void QPEApplication::systemMessage( const QCString & msg, const QByteArray & dat else d->kbgrabber = 2; - - printf( "'%s' received grabKeyboard ( '%s' ) -> kbgrabber = %d\n", d-> appName.latin1(), who.latin1(), d-> kbgrabber ); - } - else if ( msg == "language(QString)" ) { + } else if ( msg == "language(QString)" ) { if ( type() == GuiServer ) { QString l; @@ -780,6 +945,5 @@ void QPEApplication::systemMessage( const QCString & msg, const QByteArray & dat } } - } - else if ( msg == "timeChange(QString)" ) { + } else if ( msg == "timeChange(QString)" ) { QString t; stream >> t; @@ -790,6 +954,5 @@ void QPEApplication::systemMessage( const QCString & msg, const QByteArray & dat // emit the signal so everyone else knows... emit timeChanged(); - } - else if ( msg == "execute(QString)" ) { + } else if ( msg == "execute(QString)" ) { if ( type() == GuiServer ) { QString t; @@ -797,6 +960,5 @@ void QPEApplication::systemMessage( const QCString & msg, const QByteArray & dat Global::execute( t ); } - } - else if ( msg == "execute(QString,QString)" ) { + } else if ( msg == "execute(QString,QString)" ) { if ( type() == GuiServer ) { QString t, d; @@ -804,6 +966,5 @@ void QPEApplication::systemMessage( const QCString & msg, const QByteArray & dat Global::execute( t, d ); } - } - else if ( msg == "addAlarm(QDateTime,QCString,QCString,int)" ) { + } else if ( msg == "addAlarm(QDateTime,QCString,QCString,int)" ) { if ( type() == GuiServer ) { QDateTime when; @@ -813,6 +974,5 @@ void QPEApplication::systemMessage( const QCString & msg, const QByteArray & dat AlarmServer::addAlarm( when, channel, message, data ); } - } - else if ( msg == "deleteAlarm(QDateTime,QCString,QCString,int)" ) { + } else if ( msg == "deleteAlarm(QDateTime,QCString,QCString,int)" ) { if ( type() == GuiServer ) { QDateTime when; @@ -822,38 +982,31 @@ void QPEApplication::systemMessage( const QCString & msg, const QByteArray & dat AlarmServer::deleteAlarm( when, channel, message, data ); } - } - else if ( msg == "clockChange(bool)" ) { + } else if ( msg == "clockChange(bool)" ) { int tmp; stream >> tmp; emit clockChanged( tmp ); - } - else if ( msg == "weekChange(bool)" ) { + } else if ( msg == "weekChange(bool)" ) { int tmp; stream >> tmp; emit weekChanged( tmp ); - } - else if ( msg == "setDateFormat(DateFormat)" ) { + } else if ( msg == "setDateFormat(DateFormat)" ) { DateFormat tmp; stream >> tmp; emit dateFormatChanged( tmp ); - } - else if ( msg == "setVolume(int,int)" ) { + } else if ( msg == "setVolume(int,int)" ) { int t, v; stream >> t >> v; setVolume( t, v ); emit volumeChanged( muted ); - } - else if ( msg == "volumeChange(bool)" ) { + } else if ( msg == "volumeChange(bool)" ) { stream >> muted; setVolume(); emit volumeChanged( muted ); - } - else if ( msg == "setMic(int,int)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com> + } else if ( msg == "setMic(int,int)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com> int t, v; stream >> t >> v; setMic( t, v ); emit micChanged( micMuted ); - } - else if ( msg == "micChange(bool)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com> + } else if ( msg == "micChange(bool)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com> stream >> micMuted; setMic(); @@ -872,17 +1025,15 @@ bool QPEApplication::raiseAppropriateWindow() // ########## it and then all childen. This belongs in Qt/Embedded QWidget *top = d->qpe_main_widget; - if ( !top ) - top = mainWidget(); + if ( !top ) top =mainWidget(); if ( top && d->keep_running ) { if ( top->isVisible() ) r = TRUE; -#ifdef Q_WS_QWS - - if ( !d->nomaximize ) - top->showMaximized(); - else -#endif + else if (d->preloaded) { + // We are preloaded and not visible.. pretend we just started.. + QCopEnvelope e("QPE/System", "fastAppShowing(QString)"); + e << d->appName; + } - top->show(); + d->show_mx(top,d->nomaximize); top->raise(); top->setActiveWindow(); @@ -893,4 +1044,9 @@ bool QPEApplication::raiseAppropriateWindow() 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; } @@ -904,37 +1060,33 @@ void QPEApplication::pidMessage( const QCString &msg, const QByteArray & data ) if ( msg == "quit()" ) { tryQuit(); - } - else if ( msg == "quitIfInvisible()" ) { + } else if ( msg == "quitIfInvisible()" ) { if ( d->qpe_main_widget && !d->qpe_main_widget->isVisible() ) quit(); - } - else if ( msg == "close()" ) { + } else if ( msg == "close()" ) { hideOrQuit(); - } - else if ( msg == "disablePreload()" ) { + } else if ( msg == "disablePreload()" ) { d->preloaded = FALSE; d->keep_running = TRUE; /* so that quit will quit */ - } - else if ( msg == "enablePreload()" ) { + } else if ( msg == "enablePreload()" ) { + if (d->qpe_main_widget) d->preloaded = TRUE; d->keep_running = TRUE; /* so next quit won't quit */ - } - else if ( msg == "raise()" ) { + } else if ( msg == "raise()" ) { d->keep_running = TRUE; d->notbusysent = FALSE; raiseAppropriateWindow(); - } - else if ( msg == "flush()" ) { + // Tell the system we're still chugging along... + QCopEnvelope e("QPE/System", "appRaised(QString)"); + e << d->appName; + } else if ( msg == "flush()" ) { emit flush(); // we need to tell the desktop QCopEnvelope e( "QPE/Desktop", "flushDone(QString)" ); e << d->appName; - } - else if ( msg == "reload()" ) { + } else if ( msg == "reload()" ) { emit reload(); - } - else if ( msg == "setDocument(QString)" ) { + } else if ( msg == "setDocument(QString)" ) { d->keep_running = TRUE; QDataStream stream( data, IO_ReadOnly ); @@ -946,42 +1098,20 @@ void QPEApplication::pidMessage( const QCString &msg, const QByteArray & data ) if ( mw ) Global::setDocument( mw, doc ); - } - else if ( msg == "nextView()" ) { + } else if ( msg == "nextView()" ) { + qDebug("got nextView()"); +/* if ( raiseAppropriateWindow() ) +*/ emit appMessage( msg, data ); - } - else { + } else { emit appMessage( msg, data ); } -#endif -} - - -static bool setWidgetCaptionFromAppName( QWidget* /*mw*/, const QString& /*appName*/, const QString& /*appsPath*/ ) -{ - /* - // This works but disable it for now until it is safe to apply - // What is does is scan the .desktop files of all the apps for - // the applnk that has the corresponding argv[0] as this program - // then it uses the name stored in the .desktop file as the caption - // for the main widget. This saves duplicating translations for - // the app name in the program and in the .desktop files. - AppLnkSet apps( appsPath ); - - QList<AppLnk> appsList = apps.children(); - for ( QListIterator<AppLnk> it(appsList); it.current(); ++it ) { - if ( (*it)->exec() == appName ) { - mw->setCaption( (*it)->name() ); - return TRUE; - } - } - */ - return FALSE; +#endif } /*! - Sets \a mw as the mainWidget() and shows it. For small windows, + Sets widget \a mw as the mainWidget() and shows it. For small windows, consider passing TRUE for \a nomaximize rather than the default FALSE. @@ -990,33 +1120,9 @@ static bool setWidgetCaptionFromAppName( QWidget* /*mw*/, const QString& /*appNa void QPEApplication::showMainWidget( QWidget* mw, bool nomaximize ) { - setWidgetCaptionFromAppName( mw, d->appName, qpeDir() + "apps" ); - - d->nomaximize = nomaximize; - d->qpe_main_widget = mw; - d->sendQCopQ(); - if ( d->preloaded ) { - if ( d->forceshow ) { -#ifdef Q_WS_QWS - if ( !nomaximize ) - mw->showMaximized(); - else -#endif - - mw->show(); - } - } - else if ( d->keep_running ) { -#ifdef Q_WS_QWS - if ( !nomaximize ) - mw->showMaximized(); - else -#endif - - mw->show(); - } + d->show(mw,nomaximize ); } /*! - Sets \a mw as the mainWidget() and shows it. For small windows, + Sets widget \a mw as the mainWidget() and shows it. For small windows, consider passing TRUE for \a nomaximize rather than the default FALSE. @@ -1024,5 +1130,5 @@ void QPEApplication::showMainWidget( QWidget* mw, bool nomaximize ) a \link docwidget.html document-oriented\endlink application. - The \a mw widget must have a slot: setDocument(const QString&). + The \a mw widget \e must have this slot: setDocument(const QString&). \sa showMainWidget() @@ -1030,40 +1136,18 @@ void QPEApplication::showMainWidget( QWidget* mw, bool nomaximize ) void QPEApplication::showMainDocumentWidget( QWidget* mw, bool nomaximize ) { - setWidgetCaptionFromAppName( mw, d->appName, qpeDir() + "apps" ); - if ( mw && argc() == 2 ) Global::setDocument( mw, QString::fromUtf8( argv() [ 1 ] ) ); - d->nomaximize = nomaximize; - d->qpe_main_widget = mw; - d->sendQCopQ(); - if ( d->preloaded ) { - if ( d->forceshow ) { -#ifdef Q_WS_QWS - if ( !nomaximize ) - mw->showMaximized(); - else -#endif - - mw->show(); - } - } - else if ( d->keep_running ) { -#ifdef Q_WS_QWS - if ( !nomaximize ) - mw->showMaximized(); - else -#endif - mw->show(); - } + d->show(mw, nomaximize ); } /*! - Sets that the application should continue running after processing - qcop messages. Normally if an application is started via a qcop message, - the application will process the qcop message and then quit. If while - processing the qcop message it calls this function, then the application - will show and start proper once it has finished processing qcop messages. + If an application is started via a \link qcop.html QCop\endlink + message, the application will process the \link qcop.html + QCop\endlink message and then quit. If the application calls this + function while processing a \link qcop.html QCop\endlink message, + after processing its outstanding \link qcop.html QCop\endlink + messages the application will start 'properly' and show itself. \sa keepRunning() @@ -1078,6 +1162,6 @@ void QPEApplication::setKeepRunning() /*! - Returns whether the application will quit after processing the current - list of qcop messages. + Returns TRUE if the application will quit after processing the + current list of qcop messages; otherwise returns FALSE. \sa setKeepRunning() @@ -1215,7 +1299,7 @@ static void createDict() /*! - Returns the current StylusMode for \a w. + Returns the current StylusMode for widget \a w. - \sa setStylusOperation() + \sa setStylusOperation() StylusMode */ QPEApplication::StylusMode QPEApplication::stylusOperation( QWidget * w ) @@ -1234,11 +1318,12 @@ QPEApplication::StylusMode QPEApplication::stylusOperation( QWidget * w ) if the user uses the press-and-hold gesture. - See setStylusOperation(). + \sa setStylusOperation() stylusOperation() */ /*! - Causes \a w to receive mouse events according to \a mode. + Causes widget \a w to receive mouse events according to the stylus + \a mode. - \sa stylusOperation() + \sa stylusOperation() StylusMode */ void QPEApplication::setStylusOperation( QWidget * w, StylusMode mode ) @@ -1265,5 +1350,4 @@ bool QPEApplication::eventFilter( QObject *o, QEvent *e ) if ( stylusDict && e->type() >= QEvent::MouseButtonPress && e->type() <= QEvent::MouseMove ) { QMouseEvent * me = ( QMouseEvent* ) e; - if ( me->button() == LeftButton ) { StylusMode mode = ( StylusMode ) ( int ) stylusDict->find( o ); switch ( mode ) { @@ -1271,10 +1355,19 @@ bool QPEApplication::eventFilter( QObject *o, QEvent *e ) switch ( me->type() ) { case QEvent::MouseButtonPress: + if ( me->button() == LeftButton ) { d->presstimer = startTimer( 500 ); // #### pref. d->presswidget = ( QWidget* ) o; d->presspos = me->pos(); d->rightpressed = FALSE; + } + break; + case QEvent::MouseMove: + if (d->presstimer && (me->pos()-d->presspos).manhattanLength() > 8) { + killTimer(d->presstimer); + d->presstimer = 0; + } break; case QEvent::MouseButtonRelease: + if ( me->button() == LeftButton ) { if ( d->presstimer ) { killTimer( d->presstimer ); @@ -1296,4 +1389,5 @@ bool QPEApplication::eventFilter( QObject *o, QEvent *e ) return TRUE; // don't send the real Left release } + } break; default: @@ -1304,7 +1398,5 @@ bool QPEApplication::eventFilter( QObject *o, QEvent *e ) ; } - } - } - else if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) { + }else if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) { QKeyEvent * ke = ( QKeyEvent * ) e; if ( ke->key() == Key_Enter ) { @@ -1316,5 +1408,4 @@ bool QPEApplication::eventFilter( QObject *o, QEvent *e ) } } - return FALSE; } @@ -1361,6 +1452,8 @@ void QPEApplication::ungrabKeyboard() QPEApplicationData * d = ( ( QPEApplication* ) qApp ) ->d; if ( d->kbgrabber == 2 ) { +#ifndef QT_NO_COP QCopEnvelope e( "QPE/System", "grabKeyboard(QString)" ); e << QString::null; +#endif d->kbregrab = FALSE; d->kbgrabber = 0; @@ -1369,7 +1462,9 @@ void QPEApplication::ungrabKeyboard() /*! - Grabs the keyboard such that the system's application launching - keys no longer work, and instead they are receivable by this - application. + Grabs the physical keyboard keys, e.g. the application's launching + keys. Instead of launching applications when these keys are pressed + the signals emitted are sent to this application instead. Some games + programs take over the launch keys in this way to make interaction + easier. \sa ungrabKeyboard() @@ -1381,6 +1476,8 @@ void QPEApplication::grabKeyboard() d->kbgrabber = 0; else { +#ifndef QT_NO_COP QCopEnvelope e( "QPE/System", "grabKeyboard(QString)" ); e << d->appName; +#endif d->kbgrabber = 2; // me } @@ -1392,13 +1489,17 @@ void QPEApplication::grabKeyboard() int QPEApplication::exec() { +#ifndef QT_NO_COP d->sendQCopQ(); +#endif if ( d->keep_running ) //|| d->qpe_main_widget && d->qpe_main_widget->isVisible() ) return QApplication::exec(); +#ifndef QT_NO_COP { QCopEnvelope e( "QPE/System", "closing(QString)" ); e << d->appName; } +#endif processEvents(); return 0; @@ -1414,8 +1515,10 @@ void QPEApplication::tryQuit() if ( activeModalWidget() || strcmp( argv() [ 0 ], "embeddedkonsole" ) == 0 ) return ; // Inside modal loop or konsole. Too hard to save state. +#ifndef QT_NO_COP { QCopEnvelope e( "QPE/System", "closing(QString)" ); e << d->appName; } +#endif processEvents(); @@ -1431,12 +1534,16 @@ void QPEApplication::tryQuit() void QPEApplication::hideOrQuit() { - // notify of our demise :) - { - QCopEnvelope e( "QPE/System", "closing(QString)" ); - e << d->appName; - } processEvents(); + + // If we are a preloaded application we don't actually quit, so emit + // a System message indicating we're quasi-closing. if ( d->preloaded && d->qpe_main_widget ) +#ifndef QT_NO_COP + { + QCopEnvelope e("QPE/System", "fastAppHiding(QString)" ); + e << d->appName; d->qpe_main_widget->hide(); + } +#endif else quit(); @@ -1484,4 +1591,5 @@ void operator delete( void* p, size_t /*size*/ ) #if ( QT_VERSION <= 230 ) && !defined(SINGLE_APP) #include <qwidgetlist.h> +#ifdef QWS #include <qgfx_qws.h> extern QRect qt_maxWindowRect; @@ -1504,2 +1612,3 @@ void qt_setMaxWindowRect( const QRect & r ) } #endif +#endif |