author | mickeyl <mickeyl> | 2005-08-31 10:21:12 (UTC) |
---|---|---|
committer | mickeyl <mickeyl> | 2005-08-31 10:21:12 (UTC) |
commit | cde931654d1966be6989e6c8f3cfacb23e6822a2 (patch) (side-by-side diff) | |
tree | 9a8244f4da0180a685554ebca0d7b628630fb42e /libopie2/opiecore/device | |
parent | 142e7e82efa6dd45884805c34fadec2160225e4b (diff) | |
download | opie-cde931654d1966be6989e6c8f3cfacb23e6822a2.zip opie-cde931654d1966be6989e6c8f3cfacb23e6822a2.tar.gz opie-cde931654d1966be6989e6c8f3cfacb23e6822a2.tar.bz2 |
- add support for the new Switches type in the Linux Input System (coming with 2.6.14)
- use the new Switches support to rewrite the hinge sensor handling on Zaurus models w/ 2.6
- add Switches support to SysInfo, OInputSystem, oinputsystemdemo
-rw-r--r-- | libopie2/opiecore/device/odevice_zaurus.cpp | 73 | ||||
-rw-r--r-- | libopie2/opiecore/device/odevice_zaurus.h | 6 |
2 files changed, 71 insertions, 8 deletions
diff --git a/libopie2/opiecore/device/odevice_zaurus.cpp b/libopie2/opiecore/device/odevice_zaurus.cpp index 33d5cd6..a75f566 100644 --- a/libopie2/opiecore/device/odevice_zaurus.cpp +++ b/libopie2/opiecore/device/odevice_zaurus.cpp @@ -45,4 +45,6 @@ /* STD */ +#include <string.h> +#include <errno.h> #include <fcntl.h> #include <math.h> @@ -305,6 +307,8 @@ void Zaurus::initButtons() case Model_Zaurus_SLC1000: // fallthrough case Model_Zaurus_SLC7x0: - if ( isQWS( ) ) { - addPreHandler(this); // hinge-sensor-handler + if ( isQWS( ) ) + { // setup hinge sensor stuff + addPreHandler(this); + initHingeSensor(); } pz_buttons = z_buttons_c700; @@ -663,11 +667,64 @@ OHingeStatus Zaurus::readHingeSensor() const else { - // corgi keyboard is event source 0 in OZ kernel 2.6 + /* + * The corgi keyboard is event source 0 in OZ kernel 2.6. + * Hinge status is reported via Input System Switchs 0 and 1 like that: + * + * ------------------------- + * | SW0 | SW1 | CASE | + * |-----|-----|-----------| + * | 0 0 Landscape | + * | 0 1 Portrait | + * | 1 0 Unknown | + * | 1 1 Closed | + * ------------------------- + */ OInputDevice* keyboard = OInputSystem::instance()->device( "event0" ); - if ( keyboard && keyboard->isHeld( OInputDevice::Key_KP0 ) ) return CASE_LANDSCAPE; - else if ( keyboard && keyboard->isHeld( OInputDevice::Key_KP1 ) ) return CASE_PORTRAIT; - else if ( keyboard && keyboard->isHeld( OInputDevice::Key_KP2 ) ) return CASE_CLOSED; - qWarning("Zaurus::readHingeSensor() - couldn't compute hinge status!" ); - return CASE_UNKNOWN; + bool switch0 = true; + bool switch1 = false; + if ( keyboard ) + { + switch0 = keyboard->isHeld( OInputDevice::Switch0 ); + switch1 = keyboard->isHeld( OInputDevice::Switch1 ); + } + if ( switch0 ) + { + return switch1 ? CASE_CLOSED : CASE_UNKNOWN; + } + else + { + return switch1 ? CASE_PORTRAIT : CASE_LANDSCAPE; + } + } +} + +void Zaurus::initHingeSensor() +{ + if ( m_embedix ) return; + + m_hinge.setName( "/dev/input/event0" ); + if ( !m_hinge.open( IO_ReadOnly ) ) + { + qDebug( "Zaurus::init() - Couldn't open /dev/input/event0 for read (%s)", strerror( errno ) ); + return; + } + + QSocketNotifier* sn = new QSocketNotifier( m_hinge.handle(), QSocketNotifier::Read, this ); + QObject::connect( sn, SIGNAL(activated(int)), this, SLOT(hingeSensorTriggered()) ); +} + +void Zaurus::hingeSensorTriggered() +{ + qDebug( "Zaurus::hingeSensorTriggered() - got event" ); + struct input_event e; + if ( ::read( m_hinge.handle(), &e, sizeof e ) > 0 ) + { + qDebug( "Zaurus::hingeSensorTriggered() - event has type %d, code %d, value %d", e.type, e.code, e.value ); + if ( e.type != EV_SW ) return; + if ( readHingeSensor() != CASE_UNKNOWN ) + { + qDebug( "Zaurus::hingeSensorTriggered() - got valid switch event, calling rotateDefault()" ); + QCopChannel::send( "QPE/Rotation", "rotateDefault()" ); + } } } diff --git a/libopie2/opiecore/device/odevice_zaurus.h b/libopie2/opiecore/device/odevice_zaurus.h index 677e29f..bf30bc6 100644 --- a/libopie2/opiecore/device/odevice_zaurus.h +++ b/libopie2/opiecore/device/odevice_zaurus.h @@ -34,4 +34,5 @@ /* QT */ +#include <qfile.h> #include <qwindowsystem_qws.h> @@ -100,4 +101,8 @@ class Zaurus : public OAbstractMobileDevice, public QWSServer::KeyboardFilter virtual void init(const QString&); virtual void initButtons(); + void initHingeSensor(); + + protected slots: + void hingeSensorTriggered(); public: @@ -129,4 +134,5 @@ class Zaurus : public OAbstractMobileDevice, public QWSServer::KeyboardFilter OLedState m_leds[1]; bool m_embedix; + QFile m_hinge; }; |