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,10 +1,10 @@
/**********************************************************************
-** 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
** packaging of this file.
**
@@ -42,12 +42,13 @@
#include <qptrdict.h>
#include <qregexp.h>
#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"
#include "qpestyle.h"
#include "styleinterface.h"
@@ -61,79 +62,180 @@
#include "lightstyle.h"
#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 ),
keep_running( TRUE )
{
qcopq.setAutoDelete( TRUE );
}
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() );
setExtensionType( "html", "text/html;charset=UTF-8" );
}
@@ -206,45 +308,107 @@ 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()
\internal
*/
/*!
\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:
\code
void MyWidget::receive( const QCString& msg, const QByteArray& data )
@@ -258,29 +422,45 @@ 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)
QString qcopfn( "/tmp/qcop-msg-" );
@@ -336,13 +516,13 @@ QPEApplication::QPEApplication( int & argc, char **argv, Type t )
/* overide stored arguments */
setArgs( argc, argv );
#endif
- qwsSetDecoration( new QPEDecoration() );
+// qwsSetDecoration( new QPEDecoration() );
#ifndef QT_NO_TRANSLATION
QStringList langs = Global::languageList();
for ( QStringList::ConstIterator it = langs.begin(); it != langs.end(); ++it ) {
QString lang = *it;
@@ -361,38 +541,20 @@ QPEApplication::QPEApplication( int & argc, char **argv, Type t )
tfn = qpeDir() + "/i18n/" + lang + "/" + d->appName + ".qm";
if ( trans->load( tfn ) )
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();
if ( type() == GuiServer ) {
setVolume();
@@ -414,15 +576,16 @@ static void createInputMethodDict()
if ( !inputMethodDict )
inputMethodDict = new QPtrDict<void>;
}
/*!
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 )
return ( InputMethodHint ) ( int ) inputMethodDict->find( w );
return Normal;
@@ -434,16 +597,16 @@ QPEApplication::InputMethodHint QPEApplication::inputMethodHint( QWidget * w )
\value Normal the application sometimes needs text input (the default).
\value AlwaysOff the application never needs text input.
\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();
if ( mode == Normal ) {
inputMethodDict->remove
@@ -454,20 +617,14 @@ 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 )
{
// specialised actions for certain widgets. May want to
@@ -477,27 +634,29 @@ void QPEApplication::mapToDefaultAction( QWSKeyEvent * ke, int key )
&& activePopupWidget() ->parentWidget() ->inherits( "QComboBox" ) )
key = Qt::Key_Return;
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 ) {
QCopEnvelope e( "QPE/System", "notBusy(QString)" );
e << d->appName;
@@ -506,12 +665,15 @@ bool QPEApplication::qwsEventFilter( QWSEvent * e )
}
if ( type() == GuiServer ) {
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 )
return TRUE;
QWSKeyEvent *ke = ( QWSKeyEvent * ) e;
@@ -541,14 +703,13 @@ bool QPEApplication::qwsEventFilter( QWSEvent * e )
else {
// do the same as with the select key: Map to the default action of the widget:
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 &&
ke->simpleData.is_press ) {
// Escape key closes app if focus on toplevel
@@ -607,12 +768,13 @@ bool QPEApplication::qwsEventFilter( QWSEvent * e )
if ( m == AlwaysOn )
Global::showInputMethod();
}
}
return QApplication::qwsEventFilter( e );
}
+#endif
/*!
Destroys the QPEApplication.
*/
QPEApplication::~QPEApplication()
{
@@ -641,17 +803,13 @@ 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;
/*!
\internal
@@ -681,15 +839,19 @@ int QPEApplication::defaultRotation()
*/
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
}
}
/*!
\internal
*/
@@ -719,145 +881,136 @@ void QPEApplication::applyStyle()
pal.setColor( QColorGroup::Base, QColor( color ) );
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" );
if ( cl != l ) {
if ( l.isNull() )
unsetenv( "LANG" );
else
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 );
}
#endif
}
@@ -868,220 +1021,151 @@ void QPEApplication::systemMessage( const QCString & msg, const QByteArray & dat
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;
}
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;
QWidget *mw = mainWidget();
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()
{
if ( qApp && qApp->inherits( "QPEApplication" ) ) {
QPEApplication * qpeApp = ( QPEApplication* ) qApp;
qpeApp->d->keep_running = TRUE;
}
}
/*!
- 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
{
return d->keep_running;
@@ -1211,15 +1295,15 @@ static void createDict()
{
if ( !stylusDict )
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 )
return ( StylusMode ) ( int ) stylusDict->find( w );
return LeftOnly;
@@ -1230,19 +1314,20 @@ QPEApplication::StylusMode QPEApplication::stylusOperation( QWidget * w )
\value LeftOnly the stylus only generates LeftButton
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();
if ( mode == LeftOnly ) {
stylusDict->remove
@@ -1261,24 +1346,32 @@ void QPEApplication::setStylusOperation( QWidget * w, StylusMode mode )
\reimp
*/
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;
}
if ( d->rightpressed && d->presswidget ) {
// Right released
@@ -1292,33 +1385,31 @@ bool QPEApplication::eventFilter( QObject *o, QEvent *e )
postEvent( d->presswidget,
new QMouseEvent( QEvent::MouseButtonRelease, QPoint( -1, -1 ),
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, ' ',
ke->state(), " ", ke->isAutoRepeat(), ke->count() ) );
return TRUE;
}
}
}
-
return FALSE;
}
/*!
\reimp
*/
@@ -1357,52 +1448,62 @@ bool QPEApplication::keyboardGrabbed() const
on program exit.
*/
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()
{
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
}
}
/*!
\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;
}
/*!
\internal
@@ -1410,16 +1511,18 @@ int QPEApplication::exec()
loosing state.
*/
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();
}
/*!
@@ -1427,20 +1530,24 @@ void QPEApplication::tryQuit()
User initiated quit. Makes the window 'Go Away'. If preloaded this means
hiding the window. If not it means quitting the application.
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();
}
#if defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX)
@@ -1480,12 +1587,13 @@ 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 )
{
qt_maxWindowRect = qt_screen->mapFromDevice( r,
qt_screen->mapToDevice( QSize( qt_screen->width(), qt_screen->height() ) ) );
@@ -1500,6 +1608,7 @@ void qt_setMaxWindowRect( const QRect & r )
w = l->next();
}
delete l;
}
}
#endif
+#endif