summaryrefslogtreecommitdiff
path: root/library/qpeapplication.cpp
Side-by-side diff
Diffstat (limited to 'library/qpeapplication.cpp') (more/less context) (show whitespace changes)
-rw-r--r--library/qpeapplication.cpp605
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,7 +1,7 @@
/**********************************************************************
-** 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
@@ -45,6 +45,7 @@
#include <qlabel.h>
#include <qdialog.h>
#include <qdragobject.h>
+#include <qtextcodec.h>
#include <qevent.h>
#include <qtooltip.h>
#include <qsignal.h>
@@ -64,13 +65,20 @@
#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>
@@ -78,8 +86,7 @@
#include <sys/soundcard.h>
-class QPEApplicationData
-{
+class QPEApplicationData {
public:
QPEApplicationData() : presstimer( 0 ), presswidget( 0 ), rightpressed( FALSE ),
kbgrabber( 0 ), kbregrab( FALSE ), notbusysent( FALSE ), preloaded( FALSE ),
@@ -92,27 +99,25 @@ 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,
@@ -120,17 +125,114 @@ 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()
{
@@ -209,11 +311,40 @@ static void setMic( int t = 0, int percent = -1 )
\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
*/
/*!
@@ -224,24 +355,57 @@ 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:
@@ -261,23 +425,39 @@ 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() ) );
@@ -339,7 +519,7 @@ QPEApplication::QPEApplication( int & argc, char **argv, Type t )
#endif
- qwsSetDecoration( new QPEDecoration() );
+// qwsSetDecoration( new QPEDecoration() );
#ifndef QT_NO_TRANSLATION
@@ -364,32 +544,14 @@ QPEApplication::QPEApplication( int & argc, char **argv, Type t )
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();
@@ -417,9 +579,10 @@ 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 )
{
@@ -437,10 +600,10 @@ 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 )
{
@@ -457,14 +620,8 @@ void QPEApplication::setInputMethodHint( QWidget * w, InputMethodHint mode )
class HackDialog : public QDialog
{
public:
- void acceptIt()
- {
- accept();
- }
- void rejectIt()
- {
- reject();
- }
+ void acceptIt() { accept(); }
+ void rejectIt() { reject(); }
};
@@ -480,21 +637,23 @@ 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 ) {
@@ -509,6 +668,9 @@ bool QPEApplication::qwsEventFilter( QWSEvent * e )
case QWSEvent::Mouse:
if ( e->asMouse() ->simpleData.state && !QWidget::find( e->window() ) )
emit clientMoused();
+ break;
+ default:
+ break;
}
}
if ( e->type == QWSEvent::Key ) {
@@ -544,8 +706,7 @@ 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 );
}
@@ -610,6 +771,7 @@ bool QPEApplication::qwsEventFilter( QWSEvent * e )
}
return QApplication::qwsEventFilter( e );
}
+#endif
/*!
Destroys the QPEApplication.
@@ -644,11 +806,7 @@ QString QPEApplication::qpeDir()
*/
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;
@@ -684,9 +842,13 @@ 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
}
}
@@ -722,6 +884,18 @@ void QPEApplication::applyStyle()
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 )
@@ -730,31 +904,25 @@ void QPEApplication::systemMessage( const QCString & msg, const QByteArray & dat
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() )
@@ -763,10 +931,7 @@ void QPEApplication::systemMessage( const QCString & msg, const QByteArray & dat
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;
@@ -779,8 +944,7 @@ void QPEApplication::systemMessage( const QCString & msg, const QByteArray & dat
restart();
}
}
- }
- else if ( msg == "timeChange(QString)" ) {
+ } else if ( msg == "timeChange(QString)" ) {
QString t;
stream >> t;
if ( t.isNull() )
@@ -789,22 +953,19 @@ void QPEApplication::systemMessage( const QCString & msg, const QByteArray & dat
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;
@@ -812,8 +973,7 @@ void QPEApplication::systemMessage( const QCString & msg, const QByteArray & dat
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;
@@ -821,40 +981,33 @@ void QPEApplication::systemMessage( const QCString & msg, const QByteArray & dat
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 );
@@ -871,19 +1024,17 @@ bool QPEApplication::raiseAppropriateWindow()
// ########## 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();
}
@@ -892,6 +1043,11 @@ bool QPEApplication::raiseAppropriateWindow()
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;
@@ -903,39 +1059,35 @@ 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 );
QString doc;
@@ -945,126 +1097,58 @@ void QPEApplication::pidMessage( const QCString &msg, const QByteArray & data )
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()
*/
@@ -1077,8 +1161,8 @@ 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()
*/
@@ -1214,9 +1298,9 @@ 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 )
{
@@ -1233,13 +1317,14 @@ QPEApplication::StylusMode QPEApplication::stylusOperation( QWidget * w )
\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 )
{
@@ -1264,18 +1349,26 @@ 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;
@@ -1295,6 +1388,7 @@ bool QPEApplication::eventFilter( QObject *o, QEvent *e )
d->rightpressed = FALSE;
return TRUE; // don't send the real Left release
}
+ }
break;
default:
break;
@@ -1303,9 +1397,7 @@ bool QPEApplication::eventFilter( QObject *o, QEvent *e )
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" ) ) {
@@ -1315,7 +1407,6 @@ bool QPEApplication::eventFilter( QObject *o, QEvent *e )
}
}
}
-
return FALSE;
}
@@ -1360,17 +1451,21 @@ 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()
*/
@@ -1380,8 +1475,10 @@ void QPEApplication::grabKeyboard()
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
}
}
@@ -1391,15 +1488,19 @@ 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;
}
@@ -1413,10 +1514,12 @@ 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();
@@ -1430,14 +1533,18 @@ 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();
}
@@ -1483,6 +1590,7 @@ 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;
void qt_setMaxWindowRect( const QRect & r )
@@ -1503,3 +1611,4 @@ void qt_setMaxWindowRect( const QRect & r )
}
}
#endif
+#endif