summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie/odevice.cpp70
-rw-r--r--libopie/odevice.h6
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
@@ -58,8 +58,10 @@ 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;
@@ -70,8 +72,10 @@ class ODeviceZaurus : public ODevice {
protected:
virtual void init ( );
public:
+ virtual bool setPowerButtonHandler ( PowerButtonHandler h );
+
virtual void alarmSound ( );
virtual void keySound ( );
virtual void touchSound ( );
@@ -130,8 +134,13 @@ ODevice::~ODevice ( )
//#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;
@@ -147,9 +156,9 @@ bool ODevice::suspend ( )
::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
@@ -403,16 +412,31 @@ 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";
@@ -493,8 +517,14 @@ typedef struct sharp_led_status {
#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 )
{
@@ -559,5 +589,35 @@ 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
@@ -66,8 +66,14 @@ public:
public:
static ODevice *inst ( );
// system
+ enum PowerButtonHandler {
+ KERNEL,
+ OPIE
+ };
+
+ virtual bool setPowerButtonHandler ( PowerButtonHandler h );
virtual bool suspend ( );
// information