-rw-r--r-- | libopie/odevice.cpp | 68 |
1 files changed, 64 insertions, 4 deletions
diff --git a/libopie/odevice.cpp b/libopie/odevice.cpp index 2f40731..95fd6bd 100644 --- a/libopie/odevice.cpp +++ b/libopie/odevice.cpp @@ -50,36 +50,40 @@ public: OSystem m_system; QString m_sysverstr; OLedState m_leds [4]; // just for convenience ... }; 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; virtual bool setLed ( uint which, OLedState st ); protected: virtual void buzzer ( int snd ); }; @@ -122,42 +126,47 @@ void ODevice::init ( ) ODevice::~ODevice ( ) { delete d; } //#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; bool res = false; if ((( fd = ::open ( "/dev/apm_bios", O_RDWR )) >= 0 ) || (( fd = ::open ( "/dev/misc/apm_bios",O_RDWR )) >= 0 )) { struct timeval tvs, tvn; ::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 ); ::gettimeofday ( &tvn, 0 ); } while ((( tvn. tv_sec - tvs. tv_sec ) * 1000 + ( tvn. tv_usec - tvs. tv_usec ) / 1000 ) < 1500 ); ::kill ( -::getpid ( ), SIGCONT ); // continue everything in our process group } @@ -395,32 +404,47 @@ bool ODeviceIPAQ::setLed ( uint which, OLedState st ) case OLED_BlinkFast: leds. OnTime = 5; leds. OffTime = 5; break; } if ( ::ioctl ( fd, LED_ON, &leds ) >= 0 ) { d-> m_leds [0] = st; return true; } } } return false; } +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" ); -//#endif + 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"; d-> m_vendor = OVENDOR_Sharp; QFile f ( "/proc/filesystems" ); if ( f. open ( IO_ReadOnly ) && ( QTextStream ( &f ). read ( ). find ( "\tjffs2\n" ) >= 0 )) { d-> m_systemstr = "OpenZaurus"; @@ -485,24 +509,30 @@ void ODeviceZaurus::init ( ) typedef struct sharp_led_status { int which; /* select which LED status is wanted. */ int status; /* set new led status if you call SHARP_LED_SETSTATUS */ } 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 ); if ( fd >= 0 ) ::ioctl ( fd, SHARP_BUZZER_MAKESOUND, sound ); } void ODeviceZaurus::alarmSound ( ) @@ -551,13 +581,43 @@ bool ODeviceZaurus::setLed ( uint which, OLedState st ) case OLED_BlinkFast: leds. status = LED_MAIL_UNREAD_MAIL_EX; break; } if ( ::ioctl ( fd, SHARP_LED_SETSTATUS, &leds ) >= 0 ) { d-> m_leds [0] = st; return true; } } } 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; +} |