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,8 +1,8 @@ /********************************************************************** -** 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 ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the @@ -44,8 +44,9 @@ #include <qdir.h> #include <qlabel.h> #include <qdialog.h> #include <qdragobject.h> +#include <qtextcodec.h> #include <qevent.h> #include <qtooltip.h> #include <qsignal.h> #include "qpeapplication.h" @@ -63,24 +64,30 @@ #include <qpe/qlibrary.h> #endif #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> #include <sys/file.h> #include <sys/ioctl.h> #include <sys/soundcard.h> -class QPEApplicationData -{ +class QPEApplicationData { public: QPEApplicationData() : presstimer( 0 ), presswidget( 0 ), rightpressed( FALSE ), kbgrabber( 0 ), kbregrab( FALSE ), notbusysent( FALSE ), preloaded( FALSE ), forceshow( FALSE ), nomaximize( FALSE ), qpe_main_widget( 0 ), @@ -91,47 +98,142 @@ public: int presstimer; 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; QCString message; 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; void enqueueQCop( const QCString &ch, const QCString &msg, const QByteArray &data ) { 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() { setFilePath( Global::helpPath() ); @@ -208,13 +310,42 @@ static void setMic( int t = 0, int percent = -1 ) \class QPEApplication qpeapplication.h \brief The QPEApplication class implements various system services 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 */ /*! \fn void QPEApplication::clientMoused() @@ -223,26 +354,59 @@ 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. */ /*! \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() + */ /*! \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 in the following way: @@ -260,25 +424,41 @@ static void setMic( int t = 0, int percent = -1 ) } \endcode \sa qcop.html + Note that messages received here may be processed by qpe application + and emitted as signals, such as flush() and reload(). */ /*! 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 ); connect( this, SIGNAL( lastWindowClosed() ), this, SLOT( hideOrQuit() ) ); #if defined(Q_WS_QWS) && !defined(QT_NO_COP) @@ -338,9 +518,9 @@ QPEApplication::QPEApplication( int & argc, char **argv, Type t ) setArgs( argc, argv ); #endif - qwsSetDecoration( new QPEDecoration() ); +// qwsSetDecoration( new QPEDecoration() ); #ifndef QT_NO_TRANSLATION QStringList langs = Global::languageList(); @@ -363,34 +543,16 @@ QPEApplication::QPEApplication( int & argc, char **argv, Type t ) installTranslator( trans ); else 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 applyStyle(); @@ -416,11 +578,12 @@ 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 ) { if ( inputMethodDict && w ) @@ -436,12 +599,12 @@ QPEApplication::InputMethodHint QPEApplication::inputMethodHint( QWidget * w ) \value AlwaysOn the application always needs text input. */ /*! - 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 ) { createInputMethodDict(); @@ -456,16 +619,10 @@ void QPEApplication::setInputMethodHint( QWidget * w, InputMethodHint mode ) class HackDialog : public QDialog { public: - void acceptIt() - { - accept(); - } - void rejectIt() - { - reject(); - } + void acceptIt() { accept(); } + void rejectIt() { reject(); } }; void QPEApplication::mapToDefaultAction( QWSKeyEvent * ke, int key ) @@ -479,23 +636,25 @@ void QPEApplication::mapToDefaultAction( QWSKeyEvent * ke, int key ) if ( activePopupWidget() && activePopupWidget() ->inherits( "QPopupMenu" ) ) key = Qt::Key_Return; +#ifdef QWS ke->simpleData.keycode = key; +#endif } class HackWidget : public QWidget { public: bool needsOk() - { - return ( getWState() & WState_Reserved1 ); - } + { return ( getWState() & WState_Reserved1 ); } }; /*! \internal */ + +#ifdef QWS bool QPEApplication::qwsEventFilter( QWSEvent * e ) { if ( !d->notbusysent && e->type == QWSEvent::Focus ) { if ( qApp->type() != QApplication::GuiServer ) { @@ -508,8 +667,11 @@ bool QPEApplication::qwsEventFilter( QWSEvent * e ) switch ( e->type ) { case QWSEvent::Mouse: if ( e->asMouse() ->simpleData.state && !QWidget::find( e->window() ) ) emit clientMoused(); + break; + default: + break; } } if ( e->type == QWSEvent::Key ) { if ( d->kbgrabber == 1 ) @@ -543,10 +705,9 @@ bool QPEApplication::qwsEventFilter( QWSEvent * e ) mapToDefaultAction( ke, Qt::Key_Return ); } } } - } - 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 ); } else if ( ke->simpleData.keycode == Qt::Key_Escape && @@ -609,8 +770,9 @@ bool QPEApplication::qwsEventFilter( QWSEvent * e ) } } return QApplication::qwsEventFilter( e ); } +#endif /*! Destroys the QPEApplication. */ @@ -643,13 +805,9 @@ QString QPEApplication::qpeDir() Returns the user's current Document directory. There is a trailing "/". */ QString QPEApplication::documentDir() { - const char * base = getenv( "HOME" ); - if ( base ) - return QString( base ) + "/Documents/"; - - return QString( "../Documents/" ); + return QString( qpeDir() + "Documents"); } static int deforient = -1; @@ -683,11 +841,15 @@ void QPEApplication::setDefaultRotation( int r ) { if ( qApp->type() == GuiServer ) { 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 } } /*! @@ -721,53 +883,56 @@ void QPEApplication::applyStyle() pal.setColor( QPalette::Disabled, QColorGroup::Text, pal.color( QPalette::Active, QColorGroup::Background ).dark() ); 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) ); } void QPEApplication::systemMessage( const QCString & msg, const QByteArray & data ) { #ifdef Q_WS_QWS QDataStream stream( data, IO_ReadOnly ); if ( msg == "applyStyle()" ) { applyStyle(); - } - else if ( msg == "setDefaultRotation(int)" ) { + } else if ( msg == "setDefaultRotation(int)" ) { if ( type() == GuiServer ) { int r; stream >> r; 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; if ( who.isEmpty() ) d->kbgrabber = 0; else if ( who != d->appName ) d->kbgrabber = 1; 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; stream >> l; QString cl = getenv( "LANG" ); @@ -778,84 +943,72 @@ void QPEApplication::systemMessage( const QCString & msg, const QByteArray & dat setenv( "LANG", l.latin1(), 1 ); restart(); } } - } - else if ( msg == "timeChange(QString)" ) { + } else if ( msg == "timeChange(QString)" ) { QString t; stream >> t; if ( t.isNull() ) unsetenv( "TZ" ); else setenv( "TZ", t.latin1(), 1 ); // emit the signal so everyone else knows... emit timeChanged(); - } - else if ( msg == "execute(QString)" ) { + } else if ( msg == "execute(QString)" ) { if ( type() == GuiServer ) { QString t; stream >> t; Global::execute( t ); } - } - else if ( msg == "execute(QString,QString)" ) { + } else if ( msg == "execute(QString,QString)" ) { if ( type() == GuiServer ) { QString t, d; stream >> t >> d; 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; QCString channel, message; int data; stream >> when >> channel >> message >> data; 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; QCString channel, message; int data; stream >> when >> channel >> message >> data; 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(); emit micChanged( micMuted ); } @@ -870,29 +1023,32 @@ 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 ) 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(); } 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; } @@ -902,41 +1058,37 @@ void QPEApplication::pidMessage( const QCString &msg, const QByteArray & data ) #ifdef Q_WS_QWS 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 ); QString doc; stream >> doc; @@ -944,128 +1096,60 @@ void QPEApplication::pidMessage( const QCString &msg, const QByteArray & data ) if ( !mw ) mw = d->qpe_main_widget; 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. \sa showMainDocumentWidget() */ 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. This calls designates the application as 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() */ 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() */ void QPEApplication::setKeepRunning() @@ -1076,10 +1160,10 @@ 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() */ bool QPEApplication::keepRunning() const @@ -1213,11 +1297,11 @@ static void createDict() stylusDict = new QPtrDict<void>; } /*! - 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 ) { if ( stylusDict ) @@ -1232,15 +1316,16 @@ QPEApplication::StylusMode QPEApplication::stylusOperation( QWidget * w ) events (the default). \value RightOnHold the stylus generates RightButton events 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 ) { createDict(); @@ -1263,20 +1348,28 @@ void QPEApplication::setStylusOperation( QWidget * w, StylusMode mode ) 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 ) { case RightOnHold: 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 ); d->presstimer = 0; } @@ -1294,19 +1387,18 @@ bool QPEApplication::eventFilter( QObject *o, QEvent *e ) LeftButton, LeftButton ) ); d->rightpressed = FALSE; return TRUE; // don't send the real Left release } + } break; default: break; } break; default: ; } - } - } - 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 ) { if ( o->isA( "QRadioButton" ) || o->isA( "QCheckBox" ) ) { postEvent( o, new QKeyEvent( e->type(), Key_Space, ' ', @@ -1314,9 +1406,8 @@ bool QPEApplication::eventFilter( QObject *o, QEvent *e ) return TRUE; } } } - return FALSE; } /*! @@ -1359,19 +1450,23 @@ bool QPEApplication::keyboardGrabbed() const 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; } } /*! - 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() */ void QPEApplication::grabKeyboard() @@ -1379,10 +1474,12 @@ void QPEApplication::grabKeyboard() QPEApplicationData * d = ( ( QPEApplication* ) qApp ) ->d; if ( qApp->type() == QApplication::GuiServer ) d->kbgrabber = 0; else { +#ifndef QT_NO_COP QCopEnvelope e( "QPE/System", "grabKeyboard(QString)" ); e << d->appName; +#endif d->kbgrabber = 2; // me } } @@ -1390,17 +1487,21 @@ void QPEApplication::grabKeyboard() \reimp */ 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; } @@ -1412,12 +1513,14 @@ int QPEApplication::exec() 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(); quit(); } @@ -1429,16 +1532,20 @@ void QPEApplication::tryQuit() As this is user initiated we don't need to check state. */ 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(); } @@ -1482,8 +1589,9 @@ void operator delete( void* p, size_t /*size*/ ) #endif #if ( QT_VERSION <= 230 ) && !defined(SINGLE_APP) #include <qwidgetlist.h> +#ifdef QWS #include <qgfx_qws.h> extern QRect qt_maxWindowRect; void qt_setMaxWindowRect( const QRect & r ) { @@ -1502,4 +1610,5 @@ void qt_setMaxWindowRect( const QRect & r ) delete l; } } #endif +#endif |