summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--core/launcher/desktop.cpp332
-rw-r--r--core/launcher/desktop.h13
2 files changed, 287 insertions, 58 deletions
diff --git a/core/launcher/desktop.cpp b/core/launcher/desktop.cpp
index dee5535..a19e4c6 100644
--- a/core/launcher/desktop.cpp
+++ b/core/launcher/desktop.cpp
@@ -37,6 +37,7 @@
#include <qpe/power.h>
#include <qpe/timeconversion.h>
#include <qpe/qcopenvelope_qws.h>
+#include <qpe/network.h>
#include <qpe/global.h>
#if defined( QT_QWS_CUSTOM ) || defined( QT_QWS_IPAQ )
@@ -55,17 +56,29 @@
#include <stdlib.h>
#include <unistd.h>
+#include <fcntl.h>
class QCopKeyRegister
{
public:
- QCopKeyRegister() : keyCode(0) { }
+ QCopKeyRegister() : keyCode( 0 )
+ { }
QCopKeyRegister(int k, const QString &c, const QString &m)
- : keyCode(k), channel(c), message(m) { }
+ : keyCode( k ), channel( c ), message( m )
+ { }
- int getKeyCode() const { return keyCode; }
- QString getChannel() const { return channel; }
- QString getMessage() const { return message; }
+ int getKeyCode() const
+ {
+ return keyCode;
+ }
+ QString getChannel() const
+ {
+ return channel;
+ }
+ QString getMessage() const
+ {
+ return message;
+ }
private:
int keyCode;
@@ -138,6 +151,179 @@ void DesktopPowerAlerter::hideEvent( QHideEvent *e )
}
+class QPEScreenSaver : public QWSScreenSaver
+{
+private:
+ int LcdOn;
+
+public:
+ QPEScreenSaver()
+ {
+ m_disable_suspend = 100;
+ m_enable_dim = false;
+ m_enable_lightoff = false;
+ m_enable_onlylcdoff = false;
+
+ m_lcd_status = true;
+
+ m_backlight_bright = -1;
+ m_backlight_forcedoff = false;
+
+ // Make sure the LCD is in fact on, (if opie was killed while the LCD is off it would still be off)
+ ODevice::inst ( ) -> setDisplayStatus ( true );
+ }
+ void restore()
+ {
+ if ( !m_lcd_status ) // We must have turned it off
+ ODevice::inst ( ) -> setDisplayStatus ( true );
+
+ setBacklight ( -1 );
+ }
+ bool save( int level )
+ {
+ switch ( level ) {
+ case 0:
+ if ( m_disable_suspend > 0 && m_enable_dim ) {
+ if ( backlight() > 1 )
+ setBacklight( 1 ); // lowest non-off
+ }
+ return true;
+ break;
+ case 1:
+ if ( m_disable_suspend > 1 && m_enable_lightoff ) {
+ setBacklight( 0 ); // off
+ }
+ return true;
+ break;
+ case 2:
+ if ( m_enable_onlylcdoff ) {
+ ODevice::inst ( ) -> setDisplayStatus ( false );
+ m_lcd_status = false;
+ return true;
+ }
+ else // We're going to suspend the whole machine
+ {
+ if ( ( m_disable_suspend > 2 ) &&
+ ( PowerStatusManager::readStatus().acStatus() != PowerStatus::Online ) &&
+ ( !Network::networkOnline ( ) ) ) {
+ QWSServer::sendKeyEvent( 0xffff, Qt::Key_F34, FALSE, TRUE, FALSE );
+ return true;
+ }
+ }
+ break;
+ }
+ return false;
+ }
+
+private:
+ static int ssi( int interval, Config & config, const QString & enable, const QString & value, int def )
+ {
+ if ( !enable.isEmpty() && config.readNumEntry( enable, 0 ) == 0 )
+ return 0;
+
+ if ( interval < 0 ) {
+ // Restore screen blanking and power saving state
+ interval = config.readNumEntry( value, def );
+ }
+ return interval;
+ }
+
+public:
+ void setIntervals( int i1, int i2, int i3 )
+ {
+ Config config( "qpe" );
+ config.setGroup( "Screensaver" );
+
+ int v[ 4 ];
+ i1 = ssi( i1, config, "Dim", "Interval_Dim", 30 );
+ i2 = ssi( i2, config, "LightOff", "Interval_LightOff", 20 );
+ i3 = ssi( i3, config, "", "Interval", 60 );
+
+ //qDebug("screen saver intervals: %d %d %d", i1, i2, i3);
+
+ v [ 0 ] = QMAX( 1000 * i1, 100 );
+ v [ 1 ] = QMAX( 1000 * i2, 100 );
+ v [ 2 ] = QMAX( 1000 * i3, 100 );
+ v [ 3 ] = 0;
+ m_enable_dim = ( ( i1 != 0 ) ? config. readNumEntry ( "Dim", 1 ) : false );
+ m_enable_lightoff = ( ( i2 != 0 ) ? config. readNumEntry ( "LightOff", 1 ) : false );
+ m_enable_onlylcdoff = config. readNumEntry ( "LcdOffOnly", 0 );
+
+ if ( !i1 && !i2 && !i3 )
+ QWSServer::setScreenSaverInterval( 0 );
+ else
+ QWSServer::setScreenSaverIntervals( v );
+ }
+
+ void setInterval ( int interval )
+ {
+ setIntervals ( -1, -1, interval );
+ }
+
+ void setMode ( int mode )
+ {
+ if ( mode > m_disable_suspend )
+ setInterval( -1 );
+ m_disable_suspend = mode;
+ }
+
+ int backlight ( )
+ {
+ if ( m_backlight_bright == -1 ) {
+ // Read from config
+ Config config ( "qpe" );
+ config. setGroup ( "Screensaver" );
+ m_backlight_bright = config. readNumEntry ( "Brightness", 255 );
+ }
+ return m_backlight_bright;
+ }
+
+ void setBacklight ( int bright )
+ {
+ if ( bright == -3 ) {
+ // Forced on
+ m_backlight_forcedoff = false;
+ bright = -1;
+ }
+ if ( m_backlight_forcedoff && bright != -2 )
+ return ;
+ if ( bright == -2 ) {
+ // Toggle between off and on
+ bright = m_backlight_bright ? 0 : -1;
+ m_backlight_forcedoff = !bright;
+ }
+
+ m_backlight_bright = bright;
+
+ bright = backlight ( );
+ ODevice::inst ( ) -> setDisplayBrightness ( bright );
+
+ m_backlight_bright = bright;
+ }
+
+private:
+ int m_disable_suspend;
+ bool m_enable_dim;
+ bool m_enable_lightoff;
+ bool m_enable_onlylcdoff;
+
+ bool m_lcd_status;
+
+ int m_backlight_bright;
+ bool m_backlight_forcedoff;
+};
+
+
+void DesktopApplication::switchLCD ( bool on )
+{
+ if ( qApp ) {
+ DesktopApplication *dapp = (DesktopApplication *) qApp;
+
+ if ( dapp-> m_screensaver )
+ dapp-> m_screensaver-> setBacklight ( on ? -3 : -1 );
+ }
+}
+
DesktopApplication::DesktopApplication( int& argc, char **argv, Type appType )
: QPEApplication( argc, argv, appType )
@@ -151,7 +337,16 @@ DesktopApplication::DesktopApplication( int& argc, char **argv, Type appType )
channel = new QCopChannel( "QPE/Desktop", this );
connect( channel, SIGNAL(received(const QCString&, const QByteArray&)),
- this, SLOT(receive(const QCString&, const QByteArray&)) );
+ this, SLOT( desktopMessage( const QCString&, const QByteArray& ) ) );
+
+ channel = new QCopChannel( "QPE/System", this );
+ connect( channel, SIGNAL( received( const QCString&, const QByteArray& ) ),
+ this, SLOT( systemMessage( const QCString&, const QByteArray& ) ) );
+
+ m_screensaver = new QPEScreenSaver;
+
+ m_screensaver-> setInterval ( -1 );
+ QWSServer::setScreenSaver( m_screensaver );
}
@@ -161,11 +356,11 @@ DesktopApplication::~DesktopApplication()
delete pa;
}
-void DesktopApplication::receive( const QCString &msg, const QByteArray &data )
+void DesktopApplication::desktopMessage( const QCString &msg, const QByteArray &data )
{
+#ifdef Q_WS_QWS
QDataStream stream( data, IO_ReadOnly );
- if (msg == "keyRegister(int key, QString channel, QString message)")
- {
+ if ( msg == "keyRegister(int key, QString channel, QString message)" ) {
int k;
QString c, m;
stream >> k;
@@ -178,7 +373,36 @@ void DesktopApplication::receive( const QCString &msg, const QByteArray &data )
else if (msg == "suspend()"){
emit power();
}
+#endif
+}
+
+void DesktopApplication::systemMessage( const QCString & msg, const QByteArray & data )
+{
+#ifdef Q_WS_QWS
+ QDataStream stream ( data, IO_ReadOnly );
+
+ if ( msg == "setScreenSaverInterval(int)" ) {
+ int time;
+ stream >> time;
+ m_screensaver-> setInterval( time );
+ }
+ else if ( msg == "setScreenSaverIntervals(int,int,int)" ) {
+ int t1, t2, t3;
+ stream >> t1 >> t2 >> t3;
+ m_screensaver-> setIntervals( t1, t2, t3 );
+ }
+ else if ( msg == "setBacklight(int)" ) {
+ int bright;
+ stream >> bright;
+ m_screensaver-> setBacklight( bright );
+ }
+ else if ( msg == "setScreenSaverMode(int)" ) {
+ int mode;
+ stream >> mode;
+ m_screensaver-> setMode ( mode );
+ }
+#endif
}
enum MemState { Unknown, VeryLow, Low, Normal } memstate=Unknown;
@@ -205,7 +429,10 @@ bool DesktopApplication::qwsEventFilter( QWSEvent *e )
KeyRegisterList::Iterator it;
for( it = keyRegisterList.begin(); it != keyRegisterList.end(); ++it ) {
if ((*it).getKeyCode() == ke->simpleData.keycode && !autoRepeat && !keyboardGrabbed() && press) {
- if(press) qDebug("press"); else qDebug("release");
+ if ( press )
+ qDebug( "press" );
+ else
+ qDebug( "release" );
QCopEnvelope((*it).getChannel().utf8(), (*it).getMessage().utf8());
}
}
@@ -213,14 +440,16 @@ bool DesktopApplication::qwsEventFilter( QWSEvent *e )
if ( !keyboardGrabbed() ) {
if ( ke->simpleData.keycode == Key_F9 ) {
- if ( press ) emit datebook();
+ if ( press )
+ emit datebook();
return TRUE;
}
if ( ke->simpleData.keycode == Key_F10 ) {
if ( !press && cardSendTimer ) {
emit contacts();
delete cardSendTimer;
- } else if ( press ) {
+ }
+ else if ( press ) {
cardSendTimer = new QTimer();
cardSendTimer->start( 2000, TRUE );
connect( cardSendTimer, SIGNAL( timeout() ), this, SLOT( sendCard() ) );
@@ -236,17 +465,20 @@ bool DesktopApplication::qwsEventFilter( QWSEvent *e )
if ( ke->simpleData.keycode == Key_F12 ) {
while( activePopupWidget() )
activePopupWidget()->close();
- if ( press ) emit launch();
+ if ( press )
+ emit launch();
return TRUE;
}
if ( ke->simpleData.keycode == Key_F13 ) {
- if ( press ) emit email();
+ if ( press )
+ emit email();
return TRUE;
}
}
if ( ke->simpleData.keycode == Key_F34 ) {
- if ( press ) emit power();
+ if ( press )
+ emit power();
return TRUE;
}
// This was used for the iPAQ PowerButton
@@ -257,26 +489,32 @@ bool DesktopApplication::qwsEventFilter( QWSEvent *e )
// return TRUE;
// }
if ( ke->simpleData.keycode == Key_F35 ) {
- if ( press ) emit backlight();
+ if ( press )
+ emit backlight();
return TRUE;
}
if ( ke->simpleData.keycode == Key_F32 ) {
- if ( press ) QCopEnvelope e( "QPE/Desktop", "startSync()" );
+ if ( press )
+ QCopEnvelope e( "QPE/Desktop", "startSync()" );
return TRUE;
}
if ( ke->simpleData.keycode == Key_F31 && !ke->simpleData.modifiers ) {
- if ( press ) emit symbol();
+ if ( press )
+ emit symbol();
return TRUE;
}
if ( ke->simpleData.keycode == Key_NumLock ) {
- if ( press ) emit numLockStateToggle();
+ if ( press )
+ emit numLockStateToggle();
}
if ( ke->simpleData.keycode == Key_CapsLock ) {
- if ( press ) emit capsLockStateToggle();
+ if ( press )
+ emit capsLockStateToggle();
}
if (( press && !autoRepeat ) || ( !press && autoRepeat ))
qpedesktop->keyClick();
- } else {
+ }
+ else {
if ( e->type == QWSEvent::Mouse ) {
QWSMouseEvent *me = (QWSMouseEvent *)e;
static bool up = TRUE;
@@ -285,7 +523,8 @@ bool DesktopApplication::qwsEventFilter( QWSEvent *e )
up = FALSE;
qpedesktop->screenClick();
}
- } else {
+ }
+ else {
up = TRUE;
}
}
@@ -366,6 +605,7 @@ Desktop::Desktop() :
launcher->show();
launcher->raise();
#if defined(QPE_HAVE_MEMALERTER)
+
initMemalerter();
#endif
// start services
@@ -473,7 +713,8 @@ void Desktop::raiseLauncher()
launcher->nextView();
else
launcher->raise();
- } else {
+ }
+ else {
QCopEnvelope e("QPE/System","execute(QString)");
e << tempItem;
}
@@ -491,7 +732,8 @@ void Desktop::executeOrModify(const QString& appLnkFile)
QCopChannel::send("QPE/Application/" + app, "nextView()");
else
QCopChannel::send("QPE/Application/" + app, "raise()");
- } else {
+ }
+ else {
lnk.execute();
}
}
@@ -532,7 +774,8 @@ void Desktop::raiseMenu()
if ( tempItem == "Popup Menu" || tempItem.isEmpty() ) {
Global::terminateBuiltin( "calibrate" );
tb->startMenu()->launch();
- } else {
+ }
+ else {
QCopEnvelope e("QPE/System","execute(QString)");
e << tempItem;
}
@@ -581,30 +824,9 @@ void Desktop::execAutoStart()
#include <time.h>
#endif
-static bool blanked=FALSE;
-
-static void blankScreen()
-{
- if ( !qt_screen ) return;
- /* Should use a big black window instead.
- QGfx* g = qt_screen->screenGfx();
- g->fillRect(0,0,qt_screen->width(),qt_screen->height());
- delete g;
- */
- blanked = TRUE;
-}
-
-static void darkScreen()
-{
- extern void qpe_setBacklight(int);
- qpe_setBacklight(0); // force off
-}
-
void Desktop::togglePower()
{
- extern void qpe_setBacklight ( int ); // We need to toggle the LCD fast - no time to send a QCop
-
static bool excllock = false;
if ( excllock )
@@ -616,18 +838,10 @@ void Desktop::togglePower()
loggedin=0;
suspendTime = QDateTime::currentDateTime();
-// qpe_setBacklight ( 0 ); // force LCD off (sandman: why ????)
-
- if ( wasloggedin )
- blankScreen();
-
- qDebug ( "OPIE suspending\n" );
-
ODevice::inst ( )-> suspend ( );
QWSServer::screenSaverActivate ( false );
-
- qpe_setBacklight ( -3 ); // force LCD on
+ DesktopApplication::switchLCD ( true ); // force LCD on without slow qcop call
{
QCopEnvelope("QPE/Card", "mtabChanged()" ); // might have changed while asleep
@@ -714,15 +928,20 @@ void DesktopApplication::restart()
prepareForTermination(TRUE);
#ifdef Q_WS_QWS
+
for ( int fd = 3; fd < 100; fd++ )
close( fd );
#if defined(QT_DEMO_SINGLE_FLOPPY)
+
execl( "/sbin/init", "qpe", 0 );
#elif defined(QT_QWS_CASSIOPEIA)
+
execl( "/bin/sh", "sh", 0 );
#else
+
execl( (qpeDir()+"/bin/qpe").latin1(), "qpe", 0 );
#endif
+
exit(1);
#endif
}
@@ -804,7 +1023,8 @@ bool Desktop::eventFilter( QObject *, QEvent *ev )
QCopEnvelope e( "QPE/System", "execute(QString)" );
e << QString( "mail" );
return true;
- } else {
+ }
+ else {
raiseMenu ( );
return true;
}
diff --git a/core/launcher/desktop.h b/core/launcher/desktop.h
index 9bc4be9..b9ff39f 100644
--- a/core/launcher/desktop.h
+++ b/core/launcher/desktop.h
@@ -37,6 +37,7 @@ class QCopBridge;
class TransferServer;
class DesktopPowerAlerter;
class PackageSlave;
+class QPEScreenSaver;
class DesktopApplication : public QPEApplication
{
@@ -44,6 +45,9 @@ class DesktopApplication : public QPEApplication
public:
DesktopApplication( int& argc, char **argv, Type t );
~DesktopApplication();
+
+ static void switchLCD ( bool on ); // only for togglePower in Desktop
+
signals:
void home();
void datebook();
@@ -59,13 +63,16 @@ signals:
protected:
#ifdef Q_WS_QWS
+
bool qwsEventFilter( QWSEvent * );
#endif
+
void shutdown();
void restart();
public slots:
- void receive( const QCString &msg, const QByteArray &data );
+ virtual void desktopMessage ( const QCString &msg, const QByteArray &data );
+ virtual void systemMessage ( const QCString &msg, const QByteArray &data );
protected slots:
void shutdown(ShutdownImpl::Type);
@@ -76,10 +83,12 @@ private:
PowerStatus *ps;
QTimer *cardSendTimer;
QCopChannel *channel;
+ QPEScreenSaver *m_screensaver;
};
-class Desktop : public QWidget {
+class Desktop : public QWidget
+{
Q_OBJECT
public:
Desktop();