-rw-r--r-- | core/launcher/desktop.cpp | 22 | ||||
-rw-r--r-- | core/launcher/main.cpp | 40 | ||||
-rw-r--r-- | libopie/odevice.cpp | 62 | ||||
-rw-r--r-- | libopie/odevice.h | 2 |
4 files changed, 115 insertions, 11 deletions
diff --git a/core/launcher/desktop.cpp b/core/launcher/desktop.cpp index f90da1a..7f24259 100644 --- a/core/launcher/desktop.cpp +++ b/core/launcher/desktop.cpp @@ -603,32 +603,42 @@ static void darkScreen() void Desktop::togglePower() { + static bool excllock = false; + + if ( excllock ) + return; + + excllock = true; + bool wasloggedin = loggedin; loggedin=0; suspendTime = QDateTime::currentDateTime(); darkScreen(); if ( wasloggedin ) blankScreen(); - system("apm --suspend"); - - + ODevice::inst ( )-> suspend ( ); QWSServer::screenSaverActivate( FALSE ); + { QCopEnvelope("QPE/Card", "mtabChanged()" ); // might have changed while asleep QCopEnvelope e("QPE/System", "setBacklight(int)"); e << -3; // Force on } - if ( wasloggedin ) { + + if ( wasloggedin ) login(TRUE); - } - sleep(1); + execAutoStart(); //qcopBridge->closeOpenConnections(); //qDebug("called togglePower()!!!!!!"); + + qApp-> processEvents ( ); + + excllock = false; } void Desktop::toggleLight() { diff --git a/core/launcher/main.cpp b/core/launcher/main.cpp index a19da14..1e741d5 100644 --- a/core/launcher/main.cpp +++ b/core/launcher/main.cpp @@ -332,22 +332,52 @@ int initApplication( int argc, char ** argv ) return rv; } +static const char *pidfile_path = "/var/run/opie.pid"; + +void create_pidfile ( ) +{ + FILE *f; + + if (( f = ::fopen ( pidfile_path, "w" ))) { + ::fprintf ( f, "%d", getpid ( )); + ::fclose ( f ); + } +} + +void remove_pidfile ( ) +{ + ::unlink ( pidfile_path ); +} + +void handle_sigterm ( int sig ) +{ + if ( qApp ) + qApp-> quit ( ); +} + int main( int argc, char ** argv ) { #ifndef SINGLE_APP - signal( SIGCHLD, SIG_IGN ); + ::signal( SIGCHLD, SIG_IGN ); + + ::signal ( SIGTERM, handle_sigterm ); + + ::setsid ( ); + ::setpgid ( 0, 0 ); + + ::atexit ( remove_pidfile ); + create_pidfile ( ); #endif int retVal = initApplication( argc, argv ); #ifndef SINGLE_APP // Kill them. Kill them all. - setpgid( getpid(), getppid() ); - killpg( getpid(), SIGTERM ); - sleep( 1 ); - killpg( getpid(), SIGKILL ); + ::kill ( 0, SIGTERM ); + ::sleep( 1 ); + ::kill ( 0, SIGKILL ); #endif return retVal; } diff --git a/libopie/odevice.cpp b/libopie/odevice.cpp index bc8014a..057c344 100644 --- a/libopie/odevice.cpp +++ b/libopie/odevice.cpp @@ -16,8 +16,10 @@ the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include <stdlib.h> + #include <qfile.h> #include <qtextstream.h> #include <qpe/sound.h> #include <qpe/resource.h> @@ -46,13 +48,18 @@ class ODeviceIPAQ : public ODevice { protected: virtual void init ( ); public: + virtual bool suspend ( ); + virtual void alarmSound ( ); virtual uint hasLeds ( ) const; virtual OLedState led ( uint which ) const; virtual bool setLed ( uint which, OLedState st ); + +private: + static void tstp_sighandler ( int ); }; class ODeviceZaurus : public ODevice { protected: @@ -112,8 +119,18 @@ ODevice::~ODevice ( ) { delete d; } +bool ODevice::suspend ( ) +{ + int rc = ::system ( "apm --suspend" ); + + if (( rc == 127 ) || ( rc == -1 )) + return false; + else + return true; +} + QString ODevice::vendorString ( ) { return d-> m_vendorstr; } @@ -250,8 +267,10 @@ void ODeviceIPAQ::init ( ) #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> +#include <signal.h> +#include <sys/time.h> #include <linux/soundcard.h> #include <qapplication.h> #include <qpe/config.h> @@ -269,8 +288,51 @@ typedef struct h3600_ts_led { // #define LED_ON _IOW(IOC_H3600_TS_MAGIC, 5, struct h3600_ts_led) #define LED_ON (( 1<<30 ) | ( 'f'<<8 ) | ( 5 ) | ( sizeof(struct h3600_ts_led)<<16 )) // _IOW only defined in kernel headers :( +//#include <linux/apm_bios.h> + +//#define APM_IOC_SUSPEND _IO('A',2) + +#define APM_IOC_SUSPEND (( 0<<30 ) | ( 'A'<<8 ) | ( 2 ) | ( 0<<16 )) + + +void ODeviceIPAQ::tstp_sighandler ( int ) +{ +} + + +bool ODeviceIPAQ::suspend ( ) +{ + int fd; + bool res = false; + + if (( fd = ::open ( "/dev/apm_bios", O_RDWR )) >= 0 ) { + struct timeval tvs, tvn; + + ::signal ( SIGTSTP, tstp_sighandler ); + ::gettimeofday ( &tvs, 0 ); + + res = ( ::ioctl ( fd, APM_IOC_SUSPEND ) == 0 ); + ::close ( fd ); + + if ( res ) { + ::kill ( -::getpid ( ), SIGTSTP ); + + do { + ::usleep ( 200 * 1000 ); + ::gettimeofday ( &tvn, 0 ); + } while ((( tvn. tv_sec - tvs. tv_sec ) * 1000 + ( tvn. tv_usec - tvs. tv_usec ) / 1000 ) < 1500 ); + + ::kill ( -::getpid ( ), SIGCONT ); + } + + ::signal ( SIGTSTP, SIG_DFL ); + } + return res; +} + + void ODeviceIPAQ::alarmSound ( ) { #if defined( QT_QWS_IPAQ ) // IPAQ #ifndef QT_NO_SOUND diff --git a/libopie/odevice.h b/libopie/odevice.h index b54e576..eeae357 100644 --- a/libopie/odevice.h +++ b/libopie/odevice.h @@ -65,8 +65,10 @@ public: public: static ODevice *inst ( ); +// system + virtual bool suspend ( ); // information QString modelString ( ); |