-rw-r--r-- | libopie/odevice.cpp | 70 | ||||
-rw-r--r-- | libopie/odevice.h | 6 |
2 files changed, 71 insertions, 5 deletions
diff --git a/libopie/odevice.cpp b/libopie/odevice.cpp index 2f40731..95fd6bd 100644 --- a/libopie/odevice.cpp +++ b/libopie/odevice.cpp | |||
@@ -59,6 +59,8 @@ protected: | |||
59 | virtual void init ( ); | 59 | virtual void init ( ); |
60 | 60 | ||
61 | public: | 61 | public: |
62 | virtual bool setPowerButtonHandler ( PowerButtonHandler h ); | ||
63 | |||
62 | virtual void alarmSound ( ); | 64 | virtual void alarmSound ( ); |
63 | 65 | ||
64 | virtual uint hasLeds ( ) const; | 66 | virtual uint hasLeds ( ) const; |
@@ -71,6 +73,8 @@ protected: | |||
71 | virtual void init ( ); | 73 | virtual void init ( ); |
72 | 74 | ||
73 | public: | 75 | public: |
76 | virtual bool setPowerButtonHandler ( PowerButtonHandler h ); | ||
77 | |||
74 | virtual void alarmSound ( ); | 78 | virtual void alarmSound ( ); |
75 | virtual void keySound ( ); | 79 | virtual void keySound ( ); |
76 | virtual void touchSound ( ); | 80 | virtual void touchSound ( ); |
@@ -131,6 +135,11 @@ ODevice::~ODevice ( ) | |||
131 | 135 | ||
132 | #define APM_IOC_SUSPEND (( 0<<30 ) | ( 'A'<<8 ) | ( 2 ) | ( 0<<16 )) | 136 | #define APM_IOC_SUSPEND (( 0<<30 ) | ( 'A'<<8 ) | ( 2 ) | ( 0<<16 )) |
133 | 137 | ||
138 | bool ODevice::setPowerButtonHandler ( ODevice::PowerButtonHandler ) | ||
139 | { | ||
140 | return false; | ||
141 | } | ||
142 | |||
134 | bool ODevice::suspend ( ) | 143 | bool ODevice::suspend ( ) |
135 | { | 144 | { |
136 | if ( d-> m_model == OMODEL_Unknown ) // better don't suspend in qvfb / on unkown devices | 145 | if ( d-> m_model == OMODEL_Unknown ) // better don't suspend in qvfb / on unkown devices |
@@ -148,7 +157,7 @@ bool ODevice::suspend ( ) | |||
148 | 157 | ||
149 | ::sync ( ); // flush fs caches | 158 | ::sync ( ); // flush fs caches |
150 | 159 | ||
151 | res = ( ::ioctl ( fd, APM_IOC_SUSPEND ) == 0 ); // tell the kernel to "start" suspending | 160 | res = ( ::ioctl ( fd, APM_IOC_SUSPEND, 0 ) == 0 ); // tell the kernel to "start" suspending |
152 | 161 | ||
153 | if ( res ) { | 162 | if ( res ) { |
154 | ::kill ( -::getpid ( ), SIGTSTP ); // stop everthing in our process group | 163 | ::kill ( -::getpid ( ), SIGTSTP ); // stop everthing in our process group |
@@ -404,14 +413,29 @@ bool ODeviceIPAQ::setLed ( uint which, OLedState st ) | |||
404 | return false; | 413 | return false; |
405 | } | 414 | } |
406 | 415 | ||
407 | 416 | bool ODeviceIPAQ::setPowerButtonHandler ( ODevice::PowerButtonHandler p ) | |
408 | //#endif | 417 | { |
418 | bool res = false; | ||
419 | int fd; | ||
420 | |||
421 | if (( fd = ::open ( "/proc/sys/ts/suspend_button_mode", O_WRONLY )) >= 0 ) { | ||
422 | if ( ::write ( fd, p == KERNEL ? "0" : "1", 1 ) == 1 ) | ||
423 | res = true; | ||
424 | else | ||
425 | ::perror ( "write to /proc/sys/ts/suspend_button_mode" ); | ||
426 | |||
427 | ::close ( fd ); | ||
428 | } | ||
429 | else | ||
430 | ::perror ( "/proc/sys/ts/suspend_button_mode" ); | ||
431 | |||
432 | return res; | ||
433 | } | ||
409 | 434 | ||
410 | 435 | ||
411 | 436 | ||
412 | 437 | ||
413 | 438 | ||
414 | //#if defined( QT_QWS_EBX ) // Zaurus | ||
415 | 439 | ||
416 | void ODeviceZaurus::init ( ) | 440 | void ODeviceZaurus::init ( ) |
417 | { | 441 | { |
@@ -494,6 +518,12 @@ typedef struct sharp_led_status { | |||
494 | #define LED_MAIL_NEWMAIL_EXISTS 1 /* for SHARP_LED_MAIL_EXISTS */ | 518 | #define LED_MAIL_NEWMAIL_EXISTS 1 /* for SHARP_LED_MAIL_EXISTS */ |
495 | #define LED_MAIL_UNREAD_MAIL_EX 2 /* for SHARP_LED_MAIL_EXISTS */ | 519 | #define LED_MAIL_UNREAD_MAIL_EX 2 /* for SHARP_LED_MAIL_EXISTS */ |
496 | 520 | ||
521 | // #include <asm/sharp_apm.h> // including kernel headers is evil ... | ||
522 | |||
523 | #define APM_IOCGEVTSRC (( 2 ) | ( 'A'<<8 ) | ( 203 ) | ( sizeof(int) )) | ||
524 | #define APM_IOCSEVTSRC (( 3 ) | ( 'A'<<8 ) | ( 204 ) | ( sizeof(int) )) | ||
525 | #define APM_EVT_POWER_BUTTON (1 << 0) | ||
526 | |||
497 | 527 | ||
498 | 528 | ||
499 | void ODeviceZaurus::buzzer ( int sound ) | 529 | void ODeviceZaurus::buzzer ( int sound ) |
@@ -560,4 +590,34 @@ bool ODeviceZaurus::setLed ( uint which, OLedState st ) | |||
560 | return false; | 590 | return false; |
561 | } | 591 | } |
562 | 592 | ||
563 | //#endif | 593 | bool ODeviceZaurus::setPowerButtonHandler ( ODevice::PowerButtonHandler p ) |
594 | { | ||
595 | bool res = false; | ||
596 | int fd; | ||
597 | |||
598 | if ((( fd = ::open ( "/dev/apm_bios", O_RDWR )) >= 0 ) || | ||
599 | (( fd = ::open ( "/dev/misc/apm_bios",O_RDWR )) >= 0 )) { | ||
600 | |||
601 | int sources = ::ioctl ( fd, APM_IOCGEVTSRC, 0 ); // get current event sources | ||
602 | |||
603 | if ( sources >= 0 ) { | ||
604 | if ( p == KERNEL ) | ||
605 | sources |= APM_EVT_POWER_BUTTON; | ||
606 | else | ||
607 | sources &= ~APM_EVT_POWER_BUTTON; | ||
608 | |||
609 | if ( ::ioctl ( fd, APM_IOCSEVTSRC, sources & ~APM_EVT_POWER_BUTTON ) >= 0 ) // set new event sources | ||
610 | res = true; | ||
611 | else | ||
612 | perror ( "APM_IOCGEVTSRC" ); | ||
613 | } | ||
614 | else | ||
615 | perror ( "APM_IOCGEVTSRC" ); | ||
616 | |||
617 | ::close ( fd ); | ||
618 | } | ||
619 | else | ||
620 | perror ( "/dev/apm_bios or /dev/misc/apm_bios" ); | ||
621 | |||
622 | return res; | ||
623 | } | ||
diff --git a/libopie/odevice.h b/libopie/odevice.h index 5009b91..ee01f0f 100644 --- a/libopie/odevice.h +++ b/libopie/odevice.h | |||
@@ -67,6 +67,12 @@ public: | |||
67 | static ODevice *inst ( ); | 67 | static ODevice *inst ( ); |
68 | 68 | ||
69 | // system | 69 | // system |
70 | enum PowerButtonHandler { | ||
71 | KERNEL, | ||
72 | OPIE | ||
73 | }; | ||
74 | |||
75 | virtual bool setPowerButtonHandler ( PowerButtonHandler h ); | ||
70 | virtual bool suspend ( ); | 76 | virtual bool suspend ( ); |
71 | 77 | ||
72 | // information | 78 | // information |