summaryrefslogtreecommitdiff
authorsandman <sandman>2002-08-06 21:46:30 (UTC)
committer sandman <sandman>2002-08-06 21:46:30 (UTC)
commit2ac1e6ec5a97d3721a3d6513ea68e4e21da1d40b (patch) (unidiff)
treead84f4e405da51a6ca14ab4dd33bfd7c9f2a411e
parent8084d002de5e310491eec7fac0713ef29d0cf30f (diff)
downloadopie-2ac1e6ec5a97d3721a3d6513ea68e4e21da1d40b.zip
opie-2ac1e6ec5a97d3721a3d6513ea68e4e21da1d40b.tar.gz
opie-2ac1e6ec5a97d3721a3d6513ea68e4e21da1d40b.tar.bz2
- Fix for the "iPAQ won't suspend until apm --suspend is called" problem
- Improved the resume delay until the LCD backlight is on again
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/launcher/desktop.cpp12
-rw-r--r--libopie/odevice.cpp4
2 files changed, 11 insertions, 5 deletions
diff --git a/core/launcher/desktop.cpp b/core/launcher/desktop.cpp
index 7f24259..552c7c3 100644
--- a/core/launcher/desktop.cpp
+++ b/core/launcher/desktop.cpp
@@ -559,118 +559,122 @@ void Desktop::execAutoStart() {
559 QDateTime now = QDateTime::currentDateTime(); 559 QDateTime now = QDateTime::currentDateTime();
560 Config cfg( "autostart" ); 560 Config cfg( "autostart" );
561 cfg.setGroup( "AutoStart" ); 561 cfg.setGroup( "AutoStart" );
562 appName = cfg.readEntry("Apps", ""); 562 appName = cfg.readEntry("Apps", "");
563 delay = (cfg.readEntry("Delay", "0" )).toInt(); 563 delay = (cfg.readEntry("Delay", "0" )).toInt();
564 // If the time between suspend and resume was longer then the 564 // If the time between suspend and resume was longer then the
565 // value saved as delay, start the app 565 // value saved as delay, start the app
566 if ( suspendTime.secsTo(now) >= (delay*60) ) { 566 if ( suspendTime.secsTo(now) >= (delay*60) ) {
567 QCopEnvelope e("QPE/System", "execute(QString)"); 567 QCopEnvelope e("QPE/System", "execute(QString)");
568 e << QString(appName); 568 e << QString(appName);
569 } //else { 569 } //else {
570 //} 570 //}
571} 571}
572 572
573#if defined(QPE_HAVE_TOGGLELIGHT) 573#if defined(QPE_HAVE_TOGGLELIGHT)
574#include <qpe/config.h> 574#include <qpe/config.h>
575 575
576#include <sys/ioctl.h> 576#include <sys/ioctl.h>
577#include <sys/types.h> 577#include <sys/types.h>
578#include <fcntl.h> 578#include <fcntl.h>
579#include <unistd.h> 579#include <unistd.h>
580#include <errno.h> 580#include <errno.h>
581#include <linux/ioctl.h> 581#include <linux/ioctl.h>
582#include <time.h> 582#include <time.h>
583#endif 583#endif
584 584
585static bool blanked=FALSE; 585static bool blanked=FALSE;
586 586
587static void blankScreen() 587static void blankScreen()
588{ 588{
589 if ( !qt_screen ) return; 589 if ( !qt_screen ) return;
590 /* Should use a big black window instead. 590 /* Should use a big black window instead.
591 QGfx* g = qt_screen->screenGfx(); 591 QGfx* g = qt_screen->screenGfx();
592 g->fillRect(0,0,qt_screen->width(),qt_screen->height()); 592 g->fillRect(0,0,qt_screen->width(),qt_screen->height());
593 delete g; 593 delete g;
594 */ 594 */
595 blanked = TRUE; 595 blanked = TRUE;
596} 596}
597 597
598static void darkScreen() 598static void darkScreen()
599{ 599{
600 extern void qpe_setBacklight(int); 600 extern void qpe_setBacklight(int);
601 qpe_setBacklight(0); // force off 601 qpe_setBacklight(0); // force off
602} 602}
603 603
604 604
605void Desktop::togglePower() 605void Desktop::togglePower()
606{ 606{
607 extern void qpe_setBacklight ( int ); // We need to toggle the LCD fast - no time to send a QCop
608
607 static bool excllock = false; 609 static bool excllock = false;
608 610
609 if ( excllock ) 611 if ( excllock )
610 return; 612 return;
611 613
612 excllock = true; 614 excllock = true;
613 615
614 bool wasloggedin = loggedin; 616 bool wasloggedin = loggedin;
615 loggedin=0; 617 loggedin=0;
616 suspendTime = QDateTime::currentDateTime(); 618 suspendTime = QDateTime::currentDateTime();
617 darkScreen(); 619
620 qpe_setBacklight ( 0 ); // force LCD off
621
618 if ( wasloggedin ) 622 if ( wasloggedin )
619 blankScreen(); 623 blankScreen();
620 624
621 ODevice::inst ( )-> suspend ( ); 625 ODevice::inst ( )-> suspend ( );
622 626
623 QWSServer::screenSaverActivate( FALSE ); 627 QWSServer::screenSaverActivate ( false );
628
629 qpe_setBacklight ( -3 ); // force LCD on
624 630
625 { 631 {
626 QCopEnvelope("QPE/Card", "mtabChanged()" ); // might have changed while asleep 632 QCopEnvelope("QPE/Card", "mtabChanged()" ); // might have changed while asleep
627 QCopEnvelope e("QPE/System", "setBacklight(int)");
628 e << -3; // Force on
629 } 633 }
630 634
631 if ( wasloggedin ) 635 if ( wasloggedin )
632 login(TRUE); 636 login(TRUE);
633 637
634 execAutoStart(); 638 execAutoStart();
635 //qcopBridge->closeOpenConnections(); 639 //qcopBridge->closeOpenConnections();
636 //qDebug("called togglePower()!!!!!!"); 640 //qDebug("called togglePower()!!!!!!");
637 641
638 qApp-> processEvents ( ); 642 qApp-> processEvents ( );
639 643
640 excllock = false; 644 excllock = false;
641} 645}
642 646
643void Desktop::toggleLight() 647void Desktop::toggleLight()
644{ 648{
645 QCopEnvelope e("QPE/System", "setBacklight(int)"); 649 QCopEnvelope e("QPE/System", "setBacklight(int)");
646 e << -2; // toggle 650 e << -2; // toggle
647} 651}
648 652
649void Desktop::toggleSymbolInput() 653void Desktop::toggleSymbolInput()
650{ 654{
651 tb->toggleSymbolInput(); 655 tb->toggleSymbolInput();
652} 656}
653 657
654void Desktop::toggleNumLockState() 658void Desktop::toggleNumLockState()
655{ 659{
656 tb->toggleNumLockState(); 660 tb->toggleNumLockState();
657} 661}
658 662
659void Desktop::toggleCapsLockState() 663void Desktop::toggleCapsLockState()
660{ 664{
661 tb->toggleCapsLockState(); 665 tb->toggleCapsLockState();
662} 666}
663 667
664void Desktop::styleChange( QStyle &s ) 668void Desktop::styleChange( QStyle &s )
665{ 669{
666 QWidget::styleChange( s ); 670 QWidget::styleChange( s );
667 int displayw = qApp->desktop()->width(); 671 int displayw = qApp->desktop()->width();
668 int displayh = qApp->desktop()->height(); 672 int displayh = qApp->desktop()->height();
669 673
670 QSize sz = tb->sizeHint(); 674 QSize sz = tb->sizeHint();
671 675
672 tb->setGeometry( 0, displayh-sz.height(), displayw, sz.height() ); 676 tb->setGeometry( 0, displayh-sz.height(), displayw, sz.height() );
673} 677}
674 678
675void DesktopApplication::shutdown() 679void DesktopApplication::shutdown()
676{ 680{
diff --git a/libopie/odevice.cpp b/libopie/odevice.cpp
index 057c344..bf64676 100644
--- a/libopie/odevice.cpp
+++ b/libopie/odevice.cpp
@@ -261,118 +261,120 @@ void ODeviceIPAQ::init ( )
261 261
262 f. close ( ); 262 f. close ( );
263 } 263 }
264 264
265 d-> m_leds [0] = OLED_Off; 265 d-> m_leds [0] = OLED_Off;
266} 266}
267 267
268#include <unistd.h> 268#include <unistd.h>
269#include <fcntl.h> 269#include <fcntl.h>
270#include <sys/ioctl.h> 270#include <sys/ioctl.h>
271#include <signal.h> 271#include <signal.h>
272#include <sys/time.h> 272#include <sys/time.h>
273#include <linux/soundcard.h> 273#include <linux/soundcard.h>
274#include <qapplication.h> 274#include <qapplication.h>
275#include <qpe/config.h> 275#include <qpe/config.h>
276 276
277//#include <linux/h3600_ts.h> // including kernel headers is evil ... 277//#include <linux/h3600_ts.h> // including kernel headers is evil ...
278 278
279typedef struct h3600_ts_led { 279typedef struct h3600_ts_led {
280 unsigned char OffOnBlink; /* 0=off 1=on 2=Blink */ 280 unsigned char OffOnBlink; /* 0=off 1=on 2=Blink */
281 unsigned char TotalTime; /* Units of 5 seconds */ 281 unsigned char TotalTime; /* Units of 5 seconds */
282 unsigned char OnTime; /* units of 100m/s */ 282 unsigned char OnTime; /* units of 100m/s */
283 unsigned char OffTime; /* units of 100m/s */ 283 unsigned char OffTime; /* units of 100m/s */
284} LED_IN; 284} LED_IN;
285 285
286 286
287// #define IOC_H3600_TS_MAGIC 'f' 287// #define IOC_H3600_TS_MAGIC 'f'
288// #define LED_ON _IOW(IOC_H3600_TS_MAGIC, 5, struct h3600_ts_led) 288// #define LED_ON _IOW(IOC_H3600_TS_MAGIC, 5, struct h3600_ts_led)
289#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 :(
290 290
291 291
292//#include <linux/apm_bios.h> 292//#include <linux/apm_bios.h>
293 293
294//#define APM_IOC_SUSPEND _IO('A',2) 294//#define APM_IOC_SUSPEND _IO('A',2)
295 295
296#define APM_IOC_SUSPEND (( 0<<30 ) | ( 'A'<<8 ) | ( 2 ) | ( 0<<16 )) 296#define APM_IOC_SUSPEND (( 0<<30 ) | ( 'A'<<8 ) | ( 2 ) | ( 0<<16 ))
297 297
298 298
299void ODeviceIPAQ::tstp_sighandler ( int ) 299void ODeviceIPAQ::tstp_sighandler ( int )
300{ 300{
301} 301}
302 302
303 303
304bool ODeviceIPAQ::suspend ( ) 304bool ODeviceIPAQ::suspend ( )
305{ 305{
306 int fd; 306 int fd;
307 bool res = false; 307 bool res = false;
308 308
309 if (( fd = ::open ( "/dev/apm_bios", O_RDWR )) >= 0 ) { 309 if ((( fd = ::open ( "/dev/apm_bios", O_RDWR )) >= 0 ) ||
310 (( fd = ::open ( "/dev/misc/apm_bios",O_RDWR )) >= 0 )) {
310 struct timeval tvs, tvn; 311 struct timeval tvs, tvn;
311 312
312 ::signal ( SIGTSTP, tstp_sighandler ); 313 ::signal ( SIGTSTP, tstp_sighandler );
313 ::gettimeofday ( &tvs, 0 ); 314 ::gettimeofday ( &tvs, 0 );
314 315
315 res = ( ::ioctl ( fd, APM_IOC_SUSPEND ) == 0 ); 316 res = ( ::ioctl ( fd, APM_IOC_SUSPEND ) == 0 );
316 ::close ( fd ); 317 ::close ( fd );
317 318
318 if ( res ) { 319 if ( res ) {
319 ::kill ( -::getpid ( ), SIGTSTP ); 320 ::kill ( -::getpid ( ), SIGTSTP );
320 321
321 do { 322 do {
322 ::usleep ( 200 * 1000 ); 323 ::usleep ( 200 * 1000 );
323 ::gettimeofday ( &tvn, 0 ); 324 ::gettimeofday ( &tvn, 0 );
324 } while ((( tvn. tv_sec - tvs. tv_sec ) * 1000 + ( tvn. tv_usec - tvs. tv_usec ) / 1000 ) < 1500 ); 325 } while ((( tvn. tv_sec - tvs. tv_sec ) * 1000 + ( tvn. tv_usec - tvs. tv_usec ) / 1000 ) < 1500 );
325 326
326 ::kill ( -::getpid ( ), SIGCONT ); 327 ::kill ( -::getpid ( ), SIGCONT );
327 } 328 }
328 329
329 ::signal ( SIGTSTP, SIG_DFL ); 330 ::signal ( SIGTSTP, SIG_DFL );
330 } 331 }
332
331 return res; 333 return res;
332} 334}
333 335
334 336
335void ODeviceIPAQ::alarmSound ( ) 337void ODeviceIPAQ::alarmSound ( )
336{ 338{
337#if defined( QT_QWS_IPAQ ) // IPAQ 339#if defined( QT_QWS_IPAQ ) // IPAQ
338#ifndef QT_NO_SOUND 340#ifndef QT_NO_SOUND
339 static Sound snd ( "alarm" ); 341 static Sound snd ( "alarm" );
340 int fd; 342 int fd;
341 int vol; 343 int vol;
342 bool vol_reset = false; 344 bool vol_reset = false;
343 345
344 if ((( fd = ::open ( "/dev/sound/mixer", O_RDWR )) >= 0 ) || 346 if ((( fd = ::open ( "/dev/sound/mixer", O_RDWR )) >= 0 ) ||
345 (( fd = ::open ( "/dev/mixer", O_RDWR )) >= 0 )) { 347 (( fd = ::open ( "/dev/mixer", O_RDWR )) >= 0 )) {
346 348
347 if ( ::ioctl ( fd, MIXER_READ( 0 ), &vol ) >= 0 ) { 349 if ( ::ioctl ( fd, MIXER_READ( 0 ), &vol ) >= 0 ) {
348 Config cfg ( "qpe" ); 350 Config cfg ( "qpe" );
349 cfg. setGroup ( "Volume" ); 351 cfg. setGroup ( "Volume" );
350 352
351 int volalarm = cfg. readNumEntry ( "AlarmPercent", 50 ); 353 int volalarm = cfg. readNumEntry ( "AlarmPercent", 50 );
352 if ( volalarm < 0 ) 354 if ( volalarm < 0 )
353 volalarm = 0; 355 volalarm = 0;
354 else if ( volalarm > 100 ) 356 else if ( volalarm > 100 )
355 volalarm = 100; 357 volalarm = 100;
356 volalarm |= ( volalarm << 8 ); 358 volalarm |= ( volalarm << 8 );
357 359
358 if (( volalarm & 0xff ) > ( vol & 0xff )) { 360 if (( volalarm & 0xff ) > ( vol & 0xff )) {
359 if ( ::ioctl ( fd, MIXER_WRITE( 0 ), &volalarm ) >= 0 ) 361 if ( ::ioctl ( fd, MIXER_WRITE( 0 ), &volalarm ) >= 0 )
360 vol_reset = true; 362 vol_reset = true;
361 } 363 }
362 } 364 }
363 } 365 }
364 366
365 snd. play ( ); 367 snd. play ( );
366 while ( !snd. isFinished ( )) 368 while ( !snd. isFinished ( ))
367 qApp-> processEvents ( ); 369 qApp-> processEvents ( );
368 370
369 if ( fd >= 0 ) { 371 if ( fd >= 0 ) {
370 if ( vol_reset ) 372 if ( vol_reset )
371 ::ioctl ( fd, MIXER_WRITE( 0 ), &vol ); 373 ::ioctl ( fd, MIXER_WRITE( 0 ), &vol );
372 ::close ( fd ); 374 ::close ( fd );
373 } 375 }
374#endif 376#endif
375#endif 377#endif
376} 378}
377 379
378uint ODeviceIPAQ::hasLeds ( ) const 380uint ODeviceIPAQ::hasLeds ( ) const