-rw-r--r-- | core/launcher/desktop.cpp | 332 |
1 files changed, 276 insertions, 56 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 @@ -34,12 +34,13 @@ #include <qpe/mimetype.h> #include <qpe/password.h> #include <qpe/config.h> #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 ) #include <qpe/custom.h> #endif @@ -52,23 +53,35 @@ #include <qwindowsystem_qws.h> #include <qvaluelist.h> #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; QString channel, message; }; @@ -135,12 +148,185 @@ void DesktopPowerAlerter::hideEvent( QHideEvent *e ) QMessageBox::hideEvent( e ); alertCount = 0; currentPriority = INT_MAX; } +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 ) { QTimer *t = new QTimer( this ); @@ -148,40 +334,78 @@ DesktopApplication::DesktopApplication( int& argc, char **argv, Type appType ) t->start( 10000 ); ps = new PowerStatus; pa = new DesktopPowerAlerter( 0 ); 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 ); } DesktopApplication::~DesktopApplication() { delete ps; 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; stream >> c; stream >> m; qWarning("KeyRegisterReceived: %i, %s, %s", k, (const char*)c, (const char *)m ); keyRegisterList.append(QCopKeyRegister(k,c,m)); } 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; #ifdef Q_WS_QWS bool DesktopApplication::qwsEventFilter( QWSEvent *e ) @@ -202,28 +426,33 @@ bool DesktopApplication::qwsEventFilter( QWSEvent *e ) i.e. one shot */ if (!keyRegisterList.isEmpty()) { 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()); } } } 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() ) ); } return TRUE; } @@ -233,62 +462,72 @@ bool DesktopApplication::qwsEventFilter( QWSEvent *e ) return TRUE; } */ 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 // See main.cpp for new KeyboardFilter // // if ( ke->simpleData.keycode == Key_SysReq ) { // if ( press ) emit power(); // 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; if ( me->simpleData.state&LeftButton ) { if ( up ) { up = FALSE; qpedesktop->screenClick(); } - } else { + } + else { up = TRUE; } } } return QPEApplication::qwsEventFilter( e ); @@ -363,12 +602,13 @@ Desktop::Desktop() : tb->show(); launcher->showMaximized(); launcher->show(); launcher->raise(); #if defined(QPE_HAVE_MEMALERTER) + initMemalerter(); #endif // start services startTransferServer(); (void) new IrServer( this ); rereadVolumes(); @@ -470,13 +710,14 @@ void Desktop::raiseLauncher() tempItem = cfg.readEntry("Middle","Home"); if(tempItem == "Home" || tempItem.isEmpty()) { if ( isVisibleWindow(launcher->winId()) ) launcher->nextView(); else launcher->raise(); - } else { + } + else { QCopEnvelope e("QPE/System","execute(QString)"); e << tempItem; } } void Desktop::executeOrModify(const QString& appLnkFile) @@ -488,13 +729,14 @@ void Desktop::executeOrModify(const QString& appLnkFile) if ( QCopChannel::isRegistered("QPE/Application/" + app) ) { MRUList::addTask(&lnk); if ( hasVisibleWindow(app) ) QCopChannel::send("QPE/Application/" + app, "nextView()"); else QCopChannel::send("QPE/Application/" + app, "raise()"); - } else { + } + else { lnk.execute(); } } } void Desktop::raiseDatebook() @@ -529,13 +771,14 @@ void Desktop::raiseMenu() cfg.setGroup( "AppsKey" ); QString tempItem; tempItem = cfg.readEntry( "Right2nd" , "Popup Menu" ); if ( tempItem == "Popup Menu" || tempItem.isEmpty() ) { Global::terminateBuiltin( "calibrate" ); tb->startMenu()->launch(); - } else { + } + else { QCopEnvelope e("QPE/System","execute(QString)"); e << tempItem; } } void Desktop::raiseEmail() @@ -578,59 +821,30 @@ void Desktop::execAutoStart() #include <unistd.h> #include <errno.h> #include <linux/ioctl.h> #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 ) return; excllock = true; bool wasloggedin = loggedin; 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 } if ( wasloggedin ) @@ -711,21 +925,26 @@ void DesktopApplication::shutdown( ShutdownImpl::Type t ) 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 } void Desktop::startTransferServer() { @@ -801,13 +1020,14 @@ bool Desktop::eventFilter( QObject *, QEvent *ev ) * To not confuse the users, make it launch the mail app on 38xx */ if (ODevice::inst()->model() == OMODEL_iPAQ_H38xx ) { QCopEnvelope e( "QPE/System", "execute(QString)" ); e << QString( "mail" ); return true; - } else { + } + else { raiseMenu ( ); return true; } } } return false; |