-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 @@ -606,2 +606,9 @@ void Desktop::togglePower() { + static bool excllock = false; + + if ( excllock ) + return; + + excllock = true; + bool wasloggedin = loggedin; @@ -613,7 +620,6 @@ void Desktop::togglePower() - system("apm --suspend"); - - + ODevice::inst ( )-> suspend ( ); QWSServer::screenSaverActivate( FALSE ); + { @@ -623,6 +629,6 @@ void Desktop::togglePower() } - if ( wasloggedin ) { + + if ( wasloggedin ) login(TRUE); - } - sleep(1); + execAutoStart(); @@ -630,2 +636,6 @@ void Desktop::togglePower() //qDebug("called togglePower()!!!!!!"); + + qApp-> processEvents ( ); + + excllock = false; } 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 @@ -335,2 +335,25 @@ int initApplication( int argc, char ** argv ) +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 ) @@ -338,3 +361,11 @@ 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 @@ -345,6 +376,5 @@ int main( int argc, char ** argv ) // 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 diff --git a/libopie/odevice.cpp b/libopie/odevice.cpp index bc8014a..057c344 100644 --- a/libopie/odevice.cpp +++ b/libopie/odevice.cpp @@ -19,2 +19,4 @@ +#include <stdlib.h> + #include <qfile.h> @@ -49,2 +51,4 @@ protected: public: + virtual bool suspend ( ); + virtual void alarmSound ( ); @@ -54,2 +58,5 @@ public: virtual bool setLed ( uint which, OLedState st ); + +private: + static void tstp_sighandler ( int ); }; @@ -115,2 +122,12 @@ ODevice::~ODevice ( ) +bool ODevice::suspend ( ) +{ + int rc = ::system ( "apm --suspend" ); + + if (( rc == 127 ) || ( rc == -1 )) + return false; + else + return true; +} + QString ODevice::vendorString ( ) @@ -253,2 +270,4 @@ void ODeviceIPAQ::init ( ) #include <sys/ioctl.h> +#include <signal.h> +#include <sys/time.h> #include <linux/soundcard.h> @@ -272,2 +291,45 @@ typedef struct h3600_ts_led { +//#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 ( ) diff --git a/libopie/odevice.h b/libopie/odevice.h index b54e576..eeae357 100644 --- a/libopie/odevice.h +++ b/libopie/odevice.h @@ -68,2 +68,4 @@ public: +// system + virtual bool suspend ( ); |