-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 @@ -56,24 +56,28 @@ public: class ODeviceIPAQ : public ODevice { protected: virtual void init ( ); public: + virtual bool setPowerButtonHandler ( PowerButtonHandler h ); + virtual void alarmSound ( ); virtual uint hasLeds ( ) const; virtual OLedState led ( uint which ) const; virtual bool setLed ( uint which, OLedState st ); }; class ODeviceZaurus : public ODevice { protected: virtual void init ( ); public: + virtual bool setPowerButtonHandler ( PowerButtonHandler h ); + virtual void alarmSound ( ); virtual void keySound ( ); virtual void touchSound ( ); virtual uint hasLeds ( ) const; virtual OLedState led ( uint which ) const; @@ -128,12 +132,17 @@ ODevice::~ODevice ( ) //#include <linux/apm_bios.h> //#define APM_IOC_SUSPEND _IO('A',2) #define APM_IOC_SUSPEND (( 0<<30 ) | ( 'A'<<8 ) | ( 2 ) | ( 0<<16 )) +bool ODevice::setPowerButtonHandler ( ODevice::PowerButtonHandler ) +{ + return false; +} + bool ODevice::suspend ( ) { if ( d-> m_model == OMODEL_Unknown ) // better don't suspend in qvfb / on unkown devices return false; int fd; @@ -145,13 +154,13 @@ bool ODevice::suspend ( ) ::signal ( SIGTSTP, SIG_IGN ); // we don't want to be stopped ::gettimeofday ( &tvs, 0 ); ::sync ( ); // flush fs caches - res = ( ::ioctl ( fd, APM_IOC_SUSPEND ) == 0 ); // tell the kernel to "start" suspending + res = ( ::ioctl ( fd, APM_IOC_SUSPEND, 0 ) == 0 ); // tell the kernel to "start" suspending if ( res ) { ::kill ( -::getpid ( ), SIGTSTP ); // stop everthing in our process group do { // wait at most 1.5 sec: either suspend didn't work or the device resumed ::usleep ( 200 * 1000 ); @@ -401,20 +410,35 @@ bool ODeviceIPAQ::setLed ( uint which, OLedState st ) } } } return false; } - -//#endif +bool ODeviceIPAQ::setPowerButtonHandler ( ODevice::PowerButtonHandler p ) +{ + bool res = false; + int fd; + + if (( fd = ::open ( "/proc/sys/ts/suspend_button_mode", O_WRONLY )) >= 0 ) { + if ( ::write ( fd, p == KERNEL ? "0" : "1", 1 ) == 1 ) + res = true; + else + ::perror ( "write to /proc/sys/ts/suspend_button_mode" ); + + ::close ( fd ); + } + else + ::perror ( "/proc/sys/ts/suspend_button_mode" ); + + return res; +} -//#if defined( QT_QWS_EBX ) // Zaurus void ODeviceZaurus::init ( ) { d-> m_modelstr = "Zaurus SL5000"; d-> m_model = OMODEL_Zaurus_SL5000; d-> m_vendorstr = "Sharp"; @@ -491,12 +515,18 @@ typedef struct sharp_led_status { #define SHARP_LED_MAIL_EXISTS 9 /* mail status (exists or not) */ #define LED_MAIL_NO_UNREAD_MAIL 0 /* for SHARP_LED_MAIL_EXISTS */ #define LED_MAIL_NEWMAIL_EXISTS 1 /* for SHARP_LED_MAIL_EXISTS */ #define LED_MAIL_UNREAD_MAIL_EX 2 /* for SHARP_LED_MAIL_EXISTS */ +// #include <asm/sharp_apm.h> // including kernel headers is evil ... + +#define APM_IOCGEVTSRC (( 2 ) | ( 'A'<<8 ) | ( 203 ) | ( sizeof(int) )) +#define APM_IOCSEVTSRC (( 3 ) | ( 'A'<<8 ) | ( 204 ) | ( sizeof(int) )) +#define APM_EVT_POWER_BUTTON (1 << 0) + void ODeviceZaurus::buzzer ( int sound ) { static int fd = ::open ( "/dev/sharp_buz", O_RDWR|O_NONBLOCK ); @@ -557,7 +587,37 @@ bool ODeviceZaurus::setLed ( uint which, OLedState st ) } } } return false; } -//#endif +bool ODeviceZaurus::setPowerButtonHandler ( ODevice::PowerButtonHandler p ) +{ + bool res = false; + int fd; + + if ((( fd = ::open ( "/dev/apm_bios", O_RDWR )) >= 0 ) || + (( fd = ::open ( "/dev/misc/apm_bios",O_RDWR )) >= 0 )) { + + int sources = ::ioctl ( fd, APM_IOCGEVTSRC, 0 ); // get current event sources + + if ( sources >= 0 ) { + if ( p == KERNEL ) + sources |= APM_EVT_POWER_BUTTON; + else + sources &= ~APM_EVT_POWER_BUTTON; + + if ( ::ioctl ( fd, APM_IOCSEVTSRC, sources & ~APM_EVT_POWER_BUTTON ) >= 0 ) // set new event sources + res = true; + else + perror ( "APM_IOCGEVTSRC" ); + } + else + perror ( "APM_IOCGEVTSRC" ); + + ::close ( fd ); + } + else + perror ( "/dev/apm_bios or /dev/misc/apm_bios" ); + + return res; +} diff --git a/libopie/odevice.h b/libopie/odevice.h index 5009b91..ee01f0f 100644 --- a/libopie/odevice.h +++ b/libopie/odevice.h @@ -64,12 +64,18 @@ class ODevice public: public: static ODevice *inst ( ); // system + enum PowerButtonHandler { + KERNEL, + OPIE + }; + + virtual bool setPowerButtonHandler ( PowerButtonHandler h ); virtual bool suspend ( ); // information QString modelString ( ); OModel model ( ); |