-rw-r--r-- | core/launcher/desktop.cpp | 58 | ||||
-rw-r--r-- | core/launcher/main.cpp | 42 | ||||
-rw-r--r-- | libopie/odevice.cpp | 62 | ||||
-rw-r--r-- | libopie/odevice.h | 4 |
4 files changed, 135 insertions, 31 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 | |||
@@ -604,30 +604,40 @@ static void darkScreen() | |||
604 | 604 | ||
605 | void Desktop::togglePower() | 605 | void Desktop::togglePower() |
606 | { | 606 | { |
607 | bool wasloggedin = loggedin; | 607 | static bool excllock = false; |
608 | loggedin=0; | 608 | |
609 | suspendTime = QDateTime::currentDateTime(); | 609 | if ( excllock ) |
610 | darkScreen(); | 610 | return; |
611 | if ( wasloggedin ) | 611 | |
612 | blankScreen(); | 612 | excllock = true; |
613 | 613 | ||
614 | system("apm --suspend"); | 614 | bool wasloggedin = loggedin; |
615 | 615 | loggedin=0; | |
616 | 616 | suspendTime = QDateTime::currentDateTime(); | |
617 | 617 | darkScreen(); | |
618 | QWSServer::screenSaverActivate( FALSE ); | 618 | if ( wasloggedin ) |
619 | { | 619 | blankScreen(); |
620 | QCopEnvelope("QPE/Card", "mtabChanged()" ); // might have changed while asleep | 620 | |
621 | QCopEnvelope e("QPE/System", "setBacklight(int)"); | 621 | ODevice::inst ( )-> suspend ( ); |
622 | e << -3; // Force on | 622 | |
623 | } | 623 | QWSServer::screenSaverActivate( FALSE ); |
624 | if ( wasloggedin ) { | 624 | |
625 | login(TRUE); | 625 | { |
626 | } | 626 | QCopEnvelope("QPE/Card", "mtabChanged()" ); // might have changed while asleep |
627 | sleep(1); | 627 | QCopEnvelope e("QPE/System", "setBacklight(int)"); |
628 | execAutoStart(); | 628 | e << -3; // Force on |
629 | //qcopBridge->closeOpenConnections(); | 629 | } |
630 | //qDebug("called togglePower()!!!!!!"); | 630 | |
631 | if ( wasloggedin ) | ||
632 | login(TRUE); | ||
633 | |||
634 | execAutoStart(); | ||
635 | //qcopBridge->closeOpenConnections(); | ||
636 | //qDebug("called togglePower()!!!!!!"); | ||
637 | |||
638 | qApp-> processEvents ( ); | ||
639 | |||
640 | excllock = false; | ||
631 | } | 641 | } |
632 | 642 | ||
633 | void Desktop::toggleLight() | 643 | 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 | |||
@@ -333,20 +333,50 @@ int initApplication( int argc, char ** argv ) | |||
333 | return rv; | 333 | return rv; |
334 | } | 334 | } |
335 | 335 | ||
336 | static const char *pidfile_path = "/var/run/opie.pid"; | ||
337 | |||
338 | void create_pidfile ( ) | ||
339 | { | ||
340 | FILE *f; | ||
341 | |||
342 | if (( f = ::fopen ( pidfile_path, "w" ))) { | ||
343 | ::fprintf ( f, "%d", getpid ( )); | ||
344 | ::fclose ( f ); | ||
345 | } | ||
346 | } | ||
347 | |||
348 | void remove_pidfile ( ) | ||
349 | { | ||
350 | ::unlink ( pidfile_path ); | ||
351 | } | ||
352 | |||
353 | void handle_sigterm ( int sig ) | ||
354 | { | ||
355 | if ( qApp ) | ||
356 | qApp-> quit ( ); | ||
357 | } | ||
358 | |||
336 | int main( int argc, char ** argv ) | 359 | int main( int argc, char ** argv ) |
337 | { | 360 | { |
338 | #ifndef SINGLE_APP | 361 | #ifndef SINGLE_APP |
339 | signal( SIGCHLD, SIG_IGN ); | 362 | ::signal( SIGCHLD, SIG_IGN ); |
363 | |||
364 | ::signal ( SIGTERM, handle_sigterm ); | ||
365 | |||
366 | ::setsid ( ); | ||
367 | ::setpgid ( 0, 0 ); | ||
368 | |||
369 | ::atexit ( remove_pidfile ); | ||
370 | create_pidfile ( ); | ||
340 | #endif | 371 | #endif |
341 | 372 | ||
342 | int retVal = initApplication( argc, argv ); | 373 | int retVal = initApplication ( argc, argv ); |
343 | 374 | ||
344 | #ifndef SINGLE_APP | 375 | #ifndef SINGLE_APP |
345 | // Kill them. Kill them all. | 376 | // Kill them. Kill them all. |
346 | setpgid( getpid(), getppid() ); | 377 | ::kill ( 0, SIGTERM ); |
347 | killpg( getpid(), SIGTERM ); | 378 | ::sleep( 1 ); |
348 | sleep( 1 ); | 379 | ::kill ( 0, SIGKILL ); |
349 | killpg( getpid(), SIGKILL ); | ||
350 | #endif | 380 | #endif |
351 | 381 | ||
352 | return retVal; | 382 | return retVal; |
diff --git a/libopie/odevice.cpp b/libopie/odevice.cpp index bc8014a..057c344 100644 --- a/libopie/odevice.cpp +++ b/libopie/odevice.cpp | |||
@@ -17,6 +17,8 @@ | |||
17 | Boston, MA 02111-1307, USA. | 17 | Boston, MA 02111-1307, USA. |
18 | */ | 18 | */ |
19 | 19 | ||
20 | #include <stdlib.h> | ||
21 | |||
20 | #include <qfile.h> | 22 | #include <qfile.h> |
21 | #include <qtextstream.h> | 23 | #include <qtextstream.h> |
22 | #include <qpe/sound.h> | 24 | #include <qpe/sound.h> |
@@ -47,11 +49,16 @@ protected: | |||
47 | virtual void init ( ); | 49 | virtual void init ( ); |
48 | 50 | ||
49 | public: | 51 | public: |
52 | virtual bool suspend ( ); | ||
53 | |||
50 | virtual void alarmSound ( ); | 54 | virtual void alarmSound ( ); |
51 | 55 | ||
52 | virtual uint hasLeds ( ) const; | 56 | virtual uint hasLeds ( ) const; |
53 | virtual OLedState led ( uint which ) const; | 57 | virtual OLedState led ( uint which ) const; |
54 | virtual bool setLed ( uint which, OLedState st ); | 58 | virtual bool setLed ( uint which, OLedState st ); |
59 | |||
60 | private: | ||
61 | static void tstp_sighandler ( int ); | ||
55 | }; | 62 | }; |
56 | 63 | ||
57 | class ODeviceZaurus : public ODevice { | 64 | class ODeviceZaurus : public ODevice { |
@@ -113,6 +120,16 @@ ODevice::~ODevice ( ) | |||
113 | delete d; | 120 | delete d; |
114 | } | 121 | } |
115 | 122 | ||
123 | bool ODevice::suspend ( ) | ||
124 | { | ||
125 | int rc = ::system ( "apm --suspend" ); | ||
126 | |||
127 | if (( rc == 127 ) || ( rc == -1 )) | ||
128 | return false; | ||
129 | else | ||
130 | return true; | ||
131 | } | ||
132 | |||
116 | QString ODevice::vendorString ( ) | 133 | QString ODevice::vendorString ( ) |
117 | { | 134 | { |
118 | return d-> m_vendorstr; | 135 | return d-> m_vendorstr; |
@@ -251,6 +268,8 @@ void ODeviceIPAQ::init ( ) | |||
251 | #include <unistd.h> | 268 | #include <unistd.h> |
252 | #include <fcntl.h> | 269 | #include <fcntl.h> |
253 | #include <sys/ioctl.h> | 270 | #include <sys/ioctl.h> |
271 | #include <signal.h> | ||
272 | #include <sys/time.h> | ||
254 | #include <linux/soundcard.h> | 273 | #include <linux/soundcard.h> |
255 | #include <qapplication.h> | 274 | #include <qapplication.h> |
256 | #include <qpe/config.h> | 275 | #include <qpe/config.h> |
@@ -270,6 +289,49 @@ typedef struct h3600_ts_led { | |||
270 | #define LED_ON (( 1<<30 ) | ( 'f'<<8 ) | ( 5 ) | ( sizeof(struct h3600_ts_led)<<16 )) // _IOW only defined in kernel headers :( | 289 | #define LED_ON (( 1<<30 ) | ( 'f'<<8 ) | ( 5 ) | ( sizeof(struct h3600_ts_led)<<16 )) // _IOW only defined in kernel headers :( |
271 | 290 | ||
272 | 291 | ||
292 | //#include <linux/apm_bios.h> | ||
293 | |||
294 | //#define APM_IOC_SUSPEND _IO('A',2) | ||
295 | |||
296 | #define APM_IOC_SUSPEND (( 0<<30 ) | ( 'A'<<8 ) | ( 2 ) | ( 0<<16 )) | ||
297 | |||
298 | |||
299 | void ODeviceIPAQ::tstp_sighandler ( int ) | ||
300 | { | ||
301 | } | ||
302 | |||
303 | |||
304 | bool ODeviceIPAQ::suspend ( ) | ||
305 | { | ||
306 | int fd; | ||
307 | bool res = false; | ||
308 | |||
309 | if (( fd = ::open ( "/dev/apm_bios", O_RDWR )) >= 0 ) { | ||
310 | struct timeval tvs, tvn; | ||
311 | |||
312 | ::signal ( SIGTSTP, tstp_sighandler ); | ||
313 | ::gettimeofday ( &tvs, 0 ); | ||
314 | |||
315 | res = ( ::ioctl ( fd, APM_IOC_SUSPEND ) == 0 ); | ||
316 | ::close ( fd ); | ||
317 | |||
318 | if ( res ) { | ||
319 | ::kill ( -::getpid ( ), SIGTSTP ); | ||
320 | |||
321 | do { | ||
322 | ::usleep ( 200 * 1000 ); | ||
323 | ::gettimeofday ( &tvn, 0 ); | ||
324 | } while ((( tvn. tv_sec - tvs. tv_sec ) * 1000 + ( tvn. tv_usec - tvs. tv_usec ) / 1000 ) < 1500 ); | ||
325 | |||
326 | ::kill ( -::getpid ( ), SIGCONT ); | ||
327 | } | ||
328 | |||
329 | ::signal ( SIGTSTP, SIG_DFL ); | ||
330 | } | ||
331 | return res; | ||
332 | } | ||
333 | |||
334 | |||
273 | void ODeviceIPAQ::alarmSound ( ) | 335 | void ODeviceIPAQ::alarmSound ( ) |
274 | { | 336 | { |
275 | #if defined( QT_QWS_IPAQ ) // IPAQ | 337 | #if defined( QT_QWS_IPAQ ) // IPAQ |
diff --git a/libopie/odevice.h b/libopie/odevice.h index b54e576..eeae357 100644 --- a/libopie/odevice.h +++ b/libopie/odevice.h | |||
@@ -65,7 +65,9 @@ public: | |||
65 | 65 | ||
66 | public: | 66 | public: |
67 | static ODevice *inst ( ); | 67 | static ODevice *inst ( ); |
68 | 68 | ||
69 | // system | ||
70 | virtual bool suspend ( ); | ||
69 | 71 | ||
70 | // information | 72 | // information |
71 | 73 | ||