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 | |
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-- | ChangeLog | 1 | ||||
-rw-r--r-- | examples/opiecore/oinputsystemdemo/oinputsystemdemo.cpp | 4 | ||||
-rw-r--r-- | libopie2/opiecore/device/odevice_zaurus.cpp | 73 | ||||
-rw-r--r-- | libopie2/opiecore/device/odevice_zaurus.h | 6 | ||||
-rw-r--r-- | libopie2/opiecore/linux/oinputsystem.cpp | 38 | ||||
-rw-r--r-- | libopie2/opiecore/linux/oinputsystem.h | 11 | ||||
-rw-r--r-- | libopie2/opiecore/linux/oinputsystemenums.h | 405 | ||||
-rw-r--r-- | libopie2/opiecore/linux_input.h | 25 | ||||
-rw-r--r-- | libopie2/opiecore/oinputsystemenums.h | 13 | ||||
-rw-r--r-- | noncore/settings/sysinfo/devicesinfo.cpp | 1 |
10 files changed, 163 insertions, 414 deletions
@@ -33,64 +33,65 @@ * #1565 - crash-fix in odevice.cpp while scanning the distribution table (deller) * #1614 - Make Opie-console start in $HOME instead of / (skyhusker) * #1635 - opie-today, datebook-plugin does not show notes (skyhusker) * #1665 - Opie-IRC displays the host prepended to the message when peer is using and ipv6 address (skyhusker) * #1666 - Opie-IRC does not allow to add !channels in config as autojoin ones (skyhusker) * #1667 - Opie-IRC does not show messages from !channel (skyhusker) * #1679 - Security PIN plugin is QVGA sized (hrw) * #1682 - Properly resize tab control in OTabWidget (drw) * n.a. - always show volume and wireless applet popups inside visible screen (deller) * n.a. - scale O-Menu-Applets appropriately (mickeyl) * n.a. - libopienet: fix bugs in wireless scanning and setting SSID (skyhusker) * n.a. - Wellenreiter: relax WE version matching test a bit (mickeyl) * n.a. - scale BluezApplet appropriately and use larger icons (mickeyl) * n.a. - memoryapplet: fix crash in memoryapplet on kernels without swap support (seneca cunningham) * n.a. - networksettings: ignore hostap control interfaces wifi* (mickeyl) * n.a. - Today Addressbook plugin fix configuration to show/not show birthdays, use checkboxes for selection (hrw) * n.a. - remove hardcoded font size from netsystemtime (hrw) * n.a. - remove hardcoded font size from checkbook graphs (hrw) * n.a. - Dagger - fixes for Sword 1.5.8, morph tag x-refs, closing last tab crash (drw) Internal -------- * Make BluezApplet use OTaskbarApplet (mickeyl) * libopiecore: rewrite OFileNotification to use the Linux 2.6 inotify interface (mickeyl) * libopiecore: add ODirNotification - recursive directory notifications (mickeyl) * libopienet: Skip hostap control interfaces 'wifi' and improve robustness in ONetworkInterface (mickeyl) * libopieui: Remove OVersatileView and OVersatileViewItem (mickeyl) * libopienet: Miscellaneous API cleanups (mickeyl) * libopiecore: Add linux pcmcia system abstraction classes (mickeyl) * libopiecore: ODevice now knows the default gfx driver to use (mteira,mickeyl) * libopiecore: Add support for the Sharp SL-C3100 "Borzoi" (mickeyl) + * libopiecore: Add support for the new Linux Inputsystem Switches type [necessary for auto rotation in 2.6.13] (mickeyl) * Remove assumptions about default gfx driver ("Transformed") all over the place (mteira,mickeyl) * Fix / Optimize number of scanned directories (ljp) 2005-03-25 Opie 1.2.0 Fixed Bugs ---------- * #1613 - AdvancedFM - scale toolbar icons appropriately (drw) * #1620 - OFileSelector - show the button on press and not on press on hold (alwin) * #1473 - Opie-Eye - Same as #1620 but we lack a common FileSystem Button class (zecke) * n.a. - PackageManager - fix bug where messages show up multiple times in install dialog (drw) * n.a. - make qpeglobal.h include qglobal.h (zecke) 2005-03-20 Opie 1.2.0-rc1 New Features ------------ * Launcher: Support a static background pixmap (mickeyl) * LauncherSettings: Choose whether to have a static background pixmap (mickeyl) * PackageManager supports the 'lists_dir' ipkg configuration option (drw) * Added hi-res inline images for large resolution devices (drw) * Improved launcher icons for consistency (ar) * Datebook: Added plugin system to datebook so holidays and birthdays from contacts may displayed in datebook (alwin) Fixed Bugs ---------- * #1236 - VCards contained empty home and work address entries causing Palms to crash (eilers) * #1412 - Launcher Settings - fixed default settings for background in Edit tab dialog (drw) * #1472 - Opie textedit now check for unsaved changes on ESC key (ljp) * #1474 - Implement GUI for Scrollbars on the Left in Appearance (zecke) * #1482 - Fix double '/' in paths (zecke) diff --git a/examples/opiecore/oinputsystemdemo/oinputsystemdemo.cpp b/examples/opiecore/oinputsystemdemo/oinputsystemdemo.cpp index 6c95048..b49df99 100644 --- a/examples/opiecore/oinputsystemdemo/oinputsystemdemo.cpp +++ b/examples/opiecore/oinputsystemdemo/oinputsystemdemo.cpp @@ -34,94 +34,98 @@ using namespace Opie::Core; #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/ioctl.h> #include <sys/fcntl.h> #if 1 int main( int argc, char** argv ) { OInputSystem* sys = OInputSystem::instance(); OInputSystem::DeviceIterator it = sys->iterator(); OInputDevice* dev = 0; while ( it.current() ) { odebug << "DEMO: OInputSystem contains OInputDevice '" << it.current()->name() << "'" << oendl; dev = it.current(); QString features; features += QString( "\nSynchronous: " ); if ( dev->hasFeature( OInputDevice::Synchronous ) ) features += "[ x ]"; else features += "[ ]"; features += QString( "\nKeys or Buttons: " ); if ( dev->hasFeature( OInputDevice::Keys ) ) features += "[ x ]"; else features += "[ ]"; features += QString( "\nRelative Axes: " ); if ( dev->hasFeature( OInputDevice::Relative ) ) features += "[ x ]"; else features += "[ ]"; features += QString( "\nAbsolute Axes: " ); if ( dev->hasFeature( OInputDevice::Absolute ) ) features += "[ x ]"; else features += "[ ]"; features += QString( "\nMiscellaneous: " ); if ( dev->hasFeature( OInputDevice::Miscellaneous ) ) features += "[ x ]"; else features += "[ ]"; + features += QString( "\nSwitches: " ); + if ( dev->hasFeature( OInputDevice::Switches ) ) features += "[ x ]"; else features += "[ ]"; features += QString( "\nLeds: " ); if ( dev->hasFeature( OInputDevice::Leds ) ) features += "[ x ]"; else features += "[ ]"; features += QString( "\nSound: " ); if ( dev->hasFeature( OInputDevice::Sound ) ) features += "[ x ]"; else features += "[ ]"; features += QString( "\nAutoRepeat " ); if ( dev->hasFeature( OInputDevice::AutoRepeat ) ) features += "[ x ]"; else features += "[ ]"; features += QString( "\nForceFeedback: " ); if ( dev->hasFeature( OInputDevice::ForceFeedback ) ) features += "[ x ]"; else features += "[ ]"; features += QString( "\nPowerManagement: " ); if ( dev->hasFeature( OInputDevice::PowerManagement ) ) features += "[ x ]"; else features += "[ ]"; features += QString( "\nFeedbackStatus: " ); if ( dev->hasFeature( OInputDevice::ForceFeedbackStatus ) ) features += "[ x ]"; else features += "[ ]"; odebug << "========================================" << "\nDevice: " << dev->name() << "\nName: " << dev->identity() << "\nPath: " << dev->path() << "\nUniq: " << dev->uniq() << features << "\n" << oendl; if ( dev->isHeld( OInputDevice::Key_LEFTSHIFT ) ) odebug << "Left Shift is being held." << oendl; else odebug << "Left Shift is _not_ being held." << oendl; if ( dev->isHeld( OInputDevice::Button_LEFT ) ) odebug << "Left Mouse Button is being held." << oendl; else odebug << "Left Mouse Button is _not_ being held." << oendl; odebug << "Global key mask: " << dev->globalKeyMask() << oendl; + odebug << "Global switch mask: " << dev->globalSwitchMask() << oendl; + ++it; } } #else #include <fcntl.h> #include <unistd.h> #include <cstdlib> #include <cstdio> #include <string> #include <sys/types.h> #include <linux/input.h> using std::string; const unsigned char BUT1 = 0x01; const unsigned char BUT2 = 0x04; const unsigned char BUT3 = 0x02; const unsigned char BUT4 = 0x40; const unsigned char BUT5 = 0x80; #define BITMASK( name, numbits ) \ unsigned short name[ ((numbits) - 1) / (sizeof( short ) * 8) + 1 ]; \ memset( name, 0, sizeof( name ) ) #define TEST_BIT( bitmask, bit ) \ ( bitmask[ (bit) / sizeof(short) / 8 ] & (1u << ( (bit) % (sizeof(short) * 8))) ) int Open_cPad() 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 @@ -15,64 +15,66 @@ + . -:. = it will be useful, but WITHOUT ANY WARRANTY; : .. .:, . . . without even the implied warranty of =_ + =;=|` MERCHANTABILITY or FITNESS FOR A _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU ..}^=.= = ; Library General Public License for more ++= -. .` .: details. : = ...= . :.=- -. .:....=;==+<; You should have received a copy of the GNU -_. . . )=. = Library General Public License along with -- :-=` this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "odevice_zaurus.h" /* OPIE */ #include <opie2/oinputsystem.h> #include <opie2/oresource.h> #include <qpe/config.h> #include <qpe/sound.h> /* QT */ #include <qapplication.h> #include <qfile.h> #include <qtextstream.h> #include <qwindowsystem_qws.h> #include <qcopchannel_qws.h> /* STD */ +#include <string.h> +#include <errno.h> #include <fcntl.h> #include <math.h> #include <stdlib.h> #include <signal.h> #include <sys/ioctl.h> #include <sys/time.h> #include <unistd.h> #ifndef QT_NO_SOUND #include <linux/soundcard.h> #endif using namespace Opie::Core; using namespace Opie::Core::Internal; struct z_button z_buttons [] = { { Qt::Key_F9, QT_TRANSLATE_NOOP("Button", "Calendar Button"), "devicebuttons/z_calendar", "datebook", "nextView()", "today", "raise()" }, { Qt::Key_F10, QT_TRANSLATE_NOOP("Button", "Contacts Button"), "devicebuttons/z_contact", "addressbook", "raise()", "addressbook", "beamBusinessCard()" }, { Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Home Button"), "devicebuttons/z_home", "QPE/Launcher", "home()", "buttonsettings", "raise()" }, { Qt::Key_F11, QT_TRANSLATE_NOOP("Button", "Menu Button"), "devicebuttons/z_menu", "QPE/TaskBar", "toggleMenu()", "QPE/TaskBar", "toggleStartMenu()" }, { Qt::Key_F13, QT_TRANSLATE_NOOP("Button", "Mail Button"), @@ -275,66 +277,68 @@ void Zaurus::init(const QString& cpu_info) break; default: d->m_qteDriver = "Transformed"; } m_leds[0] = Led_Off; if ( m_embedix ) qDebug( "Zaurus::init() - Using the 2.4 Embedix HAL on a %s", (const char*) d->m_modelstr ); else qDebug( "Zaurus::init() - Using the 2.6 OpenZaurus HAL on a %s", (const char*) d->m_modelstr ); } void Zaurus::initButtons() { if ( d->m_buttons ) return; d->m_buttons = new QValueList <ODeviceButton>; struct z_button * pz_buttons; int buttoncount; switch ( d->m_model ) { case Model_Zaurus_SL6000: pz_buttons = z_buttons_6000; buttoncount = ARRAY_SIZE(z_buttons_6000); break; case Model_Zaurus_SLC3100: // fallthrough case Model_Zaurus_SLC3000: // fallthrough 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; buttoncount = ARRAY_SIZE(z_buttons_c700); break; default: pz_buttons = z_buttons; buttoncount = ARRAY_SIZE(z_buttons); break; } for ( int i = 0; i < buttoncount; i++ ) { struct z_button *zb = pz_buttons + i; ODeviceButton b; b.setKeycode( zb->code ); b.setUserText( QObject::tr( "Button", zb->utext )); b.setPixmap( OResource::loadPixmap( zb->pix )); b.setFactoryPresetPressedAction( OQCopMessage( makeChannel ( zb->fpressedservice ), zb->fpressedaction )); b.setFactoryPresetHeldAction( OQCopMessage( makeChannel ( zb->fheldservice ), zb->fheldaction )); d->m_buttons->append( b ); } reloadButtonMapping(); } 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; @@ -633,71 +637,124 @@ bool Zaurus::hasHingeSensor() const d->m_model == Model_Zaurus_SLC3000 || d->m_model == Model_Zaurus_SLC1000; } OHingeStatus Zaurus::readHingeSensor() const { if (m_embedix) { int handle = ::open("/dev/apm_bios", O_RDWR|O_NONBLOCK); if (handle == -1) { qWarning("Zaurus::readHingeSensor() - failed (%s)", "unknown reason" ); //FIXME: use strerror return CASE_UNKNOWN; } else { int retval = ::ioctl(handle, SHARP_IOCTL_GET_ROTATION); ::close (handle); if ( retval == CASE_CLOSED || retval == CASE_PORTRAIT || retval == CASE_LANDSCAPE ) { qDebug( "Zaurus::readHingeSensor() - result = %d", retval ); return static_cast<OHingeStatus>( retval ); } else { qWarning("Zaurus::readHingeSensor() - couldn't compute hinge status!" ); return CASE_UNKNOWN; } } } 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()" ); + } } } /* * Take code from iPAQ device. * That way we switch the cursor directions depending on status of hinge sensor, eg. hardware direction. * I hope that is ok - Alwin */ bool Zaurus::filter ( int /*unicode*/, int keycode, int modifiers, bool isPress, bool autoRepeat ) { int newkeycode = keycode; if ( !hasHingeSensor() ) return false; /* map cursor keys depending on the hinge status */ switch ( keycode ) { // Rotate cursor keys case Key_Left : case Key_Right: case Key_Up : case Key_Down : { if (rotation()==Rot90) { newkeycode = Key_Left + ( keycode - Key_Left + 3 ) % 4; } } break; } if (newkeycode!=keycode) { if ( newkeycode != Key_unknown ) { QWSServer::sendKeyEvent ( -1, newkeycode, modifiers, isPress, autoRepeat ); 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 @@ -4,64 +4,65 @@ =. Copyright (C) 2002-2005 Michael 'Mickey' Lauer <mickey@Vanille.de> .=l. .>+-= _;:, .> :=|. This program is free software; you can .> <`_, > . <= redistribute it and/or modify it under :`=1 )Y*s>-.-- : the terms of the GNU Library General Public .="- .-=="i, .._ License as published by the Free Software - . .-<_> .<> Foundation; version 2 of the License. ._= =} : .%`+i> _;_. .i_,=:_. -<s. This program is distributed in the hope that + . -:. = it will be useful, but WITHOUT ANY WARRANTY; : .. .:, . . . without even the implied warranty of =_ + =;=|` MERCHANTABILITY or FITNESS FOR A _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU ..}^=.= = ; Library General Public License for more ++= -. .` .: details. : = ...= . :.=- -. .:....=;==+<; You should have received a copy of the GNU -_. . . )=. = Library General Public License along with -- :-=` this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef ODEVICE_ZAURUS #define ODEVICE_ZAURUS #include "odevice_abstractmobiledevice.h" /* QT */ +#include <qfile.h> #include <qwindowsystem_qws.h> #ifndef ARRAY_SIZE #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) #endif // _IO and friends are only defined in kernel headers ... #define OD_IOC(dir,type,number,size) (( dir << 30 ) | ( type << 8 ) | ( number ) | ( size << 16 )) #define OD_IO(type,number) OD_IOC(0,type,number,0) #define OD_IOW(type,number,size) OD_IOC(1,type,number,sizeof(size)) #define OD_IOR(type,number,size) OD_IOC(2,type,number,sizeof(size)) #define OD_IORW(type,number,size) OD_IOC(3,type,number,sizeof(size)) // Audio #define SHARP_DEV_IOCTL_COMMAND_START 0x5680 #define SHARP_BUZZER_IOCTL_START (SHARP_DEV_IOCTL_COMMAND_START) #define SHARP_BUZZER_MAKESOUND (SHARP_BUZZER_IOCTL_START) #define SHARP_BUZ_TOUCHSOUND 1 /* touch panel sound */ #define SHARP_BUZ_KEYSOUND 2 /* key sound */ #define SHARP_BUZ_SCHEDULE_ALARM 11 /* schedule alarm */ #define SHARP_BUZZER_SETVOLUME (SHARP_BUZZER_IOCTL_START+1) #define SHARP_BUZZER_GETVOLUME (SHARP_BUZZER_IOCTL_START+2) #define SHARP_BUZZER_ISSUPPORTED (SHARP_BUZZER_IOCTL_START+3) #define SHARP_BUZZER_SETMUTE (SHARP_BUZZER_IOCTL_START+4) #define SHARP_BUZZER_STOPSOUND (SHARP_BUZZER_IOCTL_START+5) // LED #define SHARP_LED_IOCTL_START (SHARP_DEV_IOCTL_COMMAND_START) #define SHARP_LED_SETSTATUS (SHARP_LED_IOCTL_START+1) @@ -70,76 +71,81 @@ #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 */ // Rotation and Power Management #define SHARP_IOCTL_GET_ROTATION 0x413c #define APM_IOCGEVTSRC OD_IOR( 'A', 203, int ) #define APM_IOCSEVTSRC OD_IORW( 'A', 204, int ) #define APM_EVT_POWER_BUTTON (1 << 0) // Brightness Embedix #define SHARP_FL_IOCTL_DEVICE "/dev/sharp_fl" #define SHARP_FL_IOCTL_ON 1 #define SHARP_FL_IOCTL_OFF 2 #define SHARP_FL_IOCTL_STEP_CONTRAST 100 #define SHARP_FL_IOCTL_GET_STEP_CONTRAST 101 #define SHARP_FL_IOCTL_GET_STEP 102 // Vesa Standard #define FB_BLANK_UNBLANK 0 #define FB_BLANK_POWERDOWN 4 namespace Opie { namespace Core { namespace Internal { class Zaurus : public OAbstractMobileDevice, public QWSServer::KeyboardFilter { protected: virtual void init(const QString&); virtual void initButtons(); + void initHingeSensor(); + + protected slots: + void hingeSensorTriggered(); public: virtual bool setDisplayBrightness( int b ); virtual bool setDisplayStatus( bool on ); virtual int displayBrightnessResolution() const; virtual void playAlarmSound(); virtual void playKeySound(); virtual void playTouchSound(); virtual QValueList <OLed> ledList() const; virtual QValueList <OLedState> ledStateList ( OLed led ) const; virtual OLedState ledState( OLed led ) const; virtual bool setLedState( OLed led, OLedState st ); virtual bool hasHingeSensor() const; virtual OHingeStatus readHingeSensor() const; virtual Transformation rotation() const; virtual ODirection direction() const; virtual bool suspend(); protected: virtual void buzzer( int snd ); virtual bool filter( int unicode, int keycode, int modifiers, bool isPress, bool autoRepeat ); QString m_backlightdev; OLedState m_leds[1]; bool m_embedix; + QFile m_hinge; }; struct z_button { Qt::Key code; char *utext; char *pix; char *fpressedservice; char *fpressedaction; char *fheldservice; char *fheldaction; }; } } } #endif diff --git a/libopie2/opiecore/linux/oinputsystem.cpp b/libopie2/opiecore/linux/oinputsystem.cpp index bad27ed..ebc417f 100644 --- a/libopie2/opiecore/linux/oinputsystem.cpp +++ b/libopie2/opiecore/linux/oinputsystem.cpp @@ -159,64 +159,102 @@ QString OInputDevice::uniq() const bool OInputDevice::hasFeature( Feature bit ) const { BIT_MASK( features, EV_MAX ); if( ioctl( _fd, EVIOCGBIT( 0, EV_MAX ), features) < 0 ) { perror( "EVIOCGBIT" ); return false; } else return BIT_TEST( features, bit ); } bool OInputDevice::isHeld( Key bit ) const { BIT_MASK( keys, KEY_MAX ); if( ioctl( _fd, EVIOCGKEY( sizeof(keys) ), keys ) < 0 ) { perror( "EVIOCGKEY" ); return false; } else { return BIT_TEST( keys, bit ); } } +bool OInputDevice::isHeld( Switch bit ) const +{ + BIT_MASK( switches, SW_MAX ); + + if( ioctl( _fd, EVIOCGSW( sizeof(switches) ), switches ) < 0 ) + { + perror( "EVIOCGSW" ); + return false; + } + else + { + return BIT_TEST( switches, bit ); + } +} + + QString OInputDevice::globalKeyMask() const { BIT_MASK( keys, KEY_MAX ); if( ioctl( _fd, EVIOCGKEY( sizeof(keys) ), keys ) < 0 ) { perror( "EVIOCGKEY" ); return QString::null; } else { QString keymask; for ( int i = 0; i < KEY_MAX; ++i ) { if ( BIT_TEST( keys, i ) ) keymask.append( QString().sprintf( "%0d, ", i ) ); } return keymask; } } +QString OInputDevice::globalSwitchMask() const +{ + BIT_MASK( switches, SW_MAX ); + + if( ioctl( _fd, EVIOCGSW( sizeof(switches) ), switches ) < 0 ) + { + perror( "EVIOCGSW" ); + return QString::null; + } + else + { + QString switchmask; + for ( int i = 0; i < SW_MAX; ++i ) + { + if ( BIT_TEST( switches, i ) ) switchmask.append( QString().sprintf( "%0d, ", i ) ); + } + return switchmask; + + } +} + + bool OInputDevice::isValid( const QString& path ) { char buf[BUFSIZE] = "<unknown>"; int fd = ::open( (const char*) path, O_RDONLY ); if ( fd < 0 ) return false; int res = ::ioctl( fd, EVIOCGNAME(sizeof buf), buf ); ::close( fd ); return res >= 0; } diff --git a/libopie2/opiecore/linux/oinputsystem.h b/libopie2/opiecore/linux/oinputsystem.h index 9676e73..fb5f498 100644 --- a/libopie2/opiecore/linux/oinputsystem.h +++ b/libopie2/opiecore/linux/oinputsystem.h @@ -65,78 +65,87 @@ class OInputSystem : public QObject * @returns an iterator usable for iterating through all network interfaces. */ DeviceIterator iterator() const; /** * @returns a pointer to the @ref OAudioInterface object for the specified @a interface or 0, if not found * @see OAudioInterface */ OInputDevice* device( const QString& interface ) const; /** * @internal Rebuild the internal interface database * @note Sometimes it might be useful to call this from client code, */ void synchronize(); /** * @internal destructor */ ~OInputSystem(); protected: OInputSystem(); static OInputSystem* _instance; DeviceMap _devices; }; class OInputDevice : public QObject { public: OInputDevice( QObject* parent, const char* name = 0 ); ~OInputDevice(); - #include "oinputsystemenums.h" + #include <opie2/oinputsystemenums.h> public: /** * @returns the identity string of this input device */ QString identity() const; /** * @returns the path of this input device */ QString path() const; /** * @returns a unique identifier for this input device * @note Only a few devices support this */ QString uniq() const; /** * @returns whether a certain @a Feature is being supported by this device */ bool hasFeature( Feature ) const; /** * @returns whether a given @a Key or Button is being held at the moment */ bool isHeld( Key ) const; /** + * @returns whether a given @a Switch is being held at the moment + */ + bool isHeld( Switch ) const; + /** * @internal * @returns a string containing a printable form of the global keymask */ + QString globalSwitchMask() const; + /** + * @internal + * @returns a string containing a printable form of the global switchmask + */ QString globalKeyMask() const; /** * @internal * @returns whether a certain @a path corresponds to an input device */ static bool isValid( const QString& path ); private: int _fd; input_id _id; }; } } #endif // OINPUTSYSTEM_H diff --git a/libopie2/opiecore/linux/oinputsystemenums.h b/libopie2/opiecore/linux/oinputsystemenums.h deleted file mode 100644 index 3461e5a..0000000 --- a/libopie2/opiecore/linux/oinputsystemenums.h +++ b/dev/null @@ -1,405 +0,0 @@ - - enum Feature - { - Synchronous = EV_SYN, - Keys = EV_KEY, - Relative = EV_REL, - Absolute = EV_ABS, - Miscellaneous = EV_MSC, - Leds = EV_LED, - Sound = EV_SND, - AutoRepeat = EV_REP, - ForceFeedback = EV_FF, - PowerManagement = EV_PWR, - ForceFeedbackStatus = EV_FF_STATUS, - }; - - enum Bus - { - PCI = BUS_PCI, - ISAPNP = BUS_ISAPNP, - HIL = BUS_HIL, - BLUETOOTH = BUS_BLUETOOTH, - ISA = BUS_ISA, - I8042 = BUS_I8042, - XTKBD = BUS_XTKBD, - RS232 = BUS_RS232, - GAMEPORT = BUS_GAMEPORT, - PARPORT = BUS_PARPORT, - AMIGA = BUS_AMIGA, - ADB = BUS_ADB, - I2C = BUS_I2C, - HOST = BUS_HOST, - }; - - enum Key - { - Key_RESERVED = 0, - Key_ESC = 1, - Key_1 = 2, - Key_2 = 3, - Key_3 = 4, - Key_4 = 5, - Key_5 = 6, - Key_6 = 7, - Key_7 = 8, - Key_8 = 9, - Key_9 = 10, - Key_0 = 11, - Key_MINUS = 12, - Key_EQUAL = 13, - Key_BACKSPACE = 14, - Key_TAB = 15, - Key_Q = 16, - Key_W = 17, - Key_E = 18, - Key_R = 19, - Key_T = 20, - Key_Y = 21, - Key_U = 22, - Key_I = 23, - Key_O = 24, - Key_P = 25, - Key_LEFTBRACE = 26, - Key_RIGHTBRACE = 27, - Key_ENTER = 28, - Key_LEFTCTRL = 29, - Key_A = 30, - Key_S = 31, - Key_D = 32, - Key_F = 33, - Key_G = 34, - Key_H = 35, - Key_J = 36, - Key_K = 37, - Key_L = 38, - Key_SEMICOLON = 39, - Key_APOSTROPHE = 40, - Key_GRAVE = 41, - Key_LEFTSHIFT = 42, - Key_BACKSLASH = 43, - Key_Z = 44, - Key_X = 45, - Key_C = 46, - Key_V = 47, - Key_B = 48, - Key_N = 49, - Key_M = 50, - Key_COMMA = 51, - Key_DOT = 52, - Key_SLASH = 53, - Key_RIGHTSHIFT = 54, - Key_KPASTERISK = 55, - Key_LEFTALT = 56, - Key_SPACE = 57, - Key_CAPSLOCK = 58, - Key_F1 = 59, - Key_F2 = 60, - Key_F3 = 61, - Key_F4 = 62, - Key_F5 = 63, - Key_F6 = 64, - Key_F7 = 65, - Key_F8 = 66, - Key_F9 = 67, - Key_F10 = 68, - Key_NUMLOCK = 69, - Key_SCROLLLOCK = 70, - Key_KP7 = 71, - Key_KP8 = 72, - Key_KP9 = 73, - Key_KPMINUS = 74, - Key_KP4 = 75, - Key_KP5 = 76, - Key_KP6 = 77, - Key_KPPLUS = 78, - Key_KP1 = 79, - Key_KP2 = 80, - Key_KP3 = 81, - Key_KP0 = 82, - Key_KPDOT = 83, - - Key_ZENKAKUHANKAKU = 85, - Key_102ND = 86, - Key_F11 = 87, - Key_F12 = 88, - Key_RO = 89, - Key_KATAKANA = 90, - Key_HIRAGANA = 91, - Key_HENKAN = 92, - Key_KATAKANAHIRAGANA = 93, - Key_MUHENKAN = 94, - Key_KPJPCOMMA = 95, - Key_KPENTER = 96, - Key_RIGHTCTRL = 97, - Key_KPSLASH = 98, - Key_SYSRQ = 99, - Key_RIGHTALT = 100, - Key_LINEFEED = 101, - Key_HOME = 102, - Key_UP = 103, - Key_PAGEUP = 104, - Key_LEFT = 105, - Key_RIGHT = 106, - Key_END = 107, - Key_DOWN = 108, - Key_PAGEDOWN = 109, - Key_INSERT = 110, - Key_DELETE = 111, - Key_MACRO = 112, - Key_MUTE = 113, - Key_VOLUMEDOWN = 114, - Key_VOLUMEUP = 115, - Key_POWER = 116, - Key_KPEQUAL = 117, - Key_KPPLUSMINUS = 118, - Key_PAUSE = 119, - - Key_KPCOMMA = 121, - Key_HANGUEL = 122, - Key_HANJA = 123, - Key_YEN = 124, - Key_LEFTMETA = 125, - Key_RIGHTMETA = 126, - Key_COMPOSE = 127, - - Key_STOP = 128, - Key_AGAIN = 129, - Key_PROPS = 130, - Key_UNDO = 131, - Key_FRONT = 132, - Key_COPY = 133, - Key_OPEN = 134, - Key_PASTE = 135, - Key_FIND = 136, - Key_CUT = 137, - Key_HELP = 138, - Key_MENU = 139, - Key_CALC = 140, - Key_SETUP = 141, - Key_SLEEP = 142, - Key_WAKEUP = 143, - Key_FILE = 144, - Key_SENDFILE = 145, - Key_DELETEFILE = 146, - Key_XFER = 147, - Key_PROG1 = 148, - Key_PROG2 = 149, - Key_WWW = 150, - Key_MSDOS = 151, - Key_COFFEE = 152, - Key_DIRECTION = 153, - Key_CYCLEWINDOWS = 154, - Key_MAIL = 155, - Key_BOOKMARKS = 156, - Key_COMPUTER = 157, - Key_BACK = 158, - Key_FORWARD = 159, - Key_CLOSECD = 160, - Key_EJECTCD = 161, - Key_EJECTCLOSECD = 162, - Key_NEXTSONG = 163, - Key_PLAYPAUSE = 164, - Key_PREVIOUSSONG = 165, - Key_STOPCD = 166, - Key_RECORD = 167, - Key_REWIND = 168, - Key_PHONE = 169, - Key_ISO = 170, - Key_CONFIG = 171, - Key_HOMEPAGE = 172, - Key_REFRESH = 173, - Key_EXIT = 174, - Key_MOVE = 175, - Key_EDIT = 176, - Key_SCROLLUP = 177, - Key_SCROLLDOWN = 178, - Key_KPLEFTPAREN = 179, - Key_KPRIGHTPAREN = 180, - - Key_F13 = 183, - Key_F14 = 184, - Key_F15 = 185, - Key_F16 = 186, - Key_F17 = 187, - Key_F18 = 188, - Key_F19 = 189, - Key_F20 = 190, - Key_F21 = 191, - Key_F22 = 192, - Key_F23 = 193, - Key_F24 = 194, - - Key_PLAYCD = 200, - Key_PAUSECD = 201, - Key_PROG3 = 202, - Key_PROG4 = 203, - Key_SUSPEND = 205, - Key_CLOSE = 206, - Key_PLAY = 207, - Key_FASTFORWARD = 208, - Key_BASSBOOST = 209, - Key_PRINT = 210, - Key_HP = 211, - Key_CAMERA = 212, - Key_SOUND = 213, - Key_QUESTION = 214, - Key_EMAIL = 215, - Key_CHAT = 216, - Key_SEARCH = 217, - Key_CONNECT = 218, - Key_FINANCE = 219, - Key_SPORT = 220, - Key_SHOP = 221, - Key_ALTERASE = 222, - Key_CANCEL = 223, - Key_BRIGHTNESSDOWN = 224, - Key_BRIGHTNESSUP = 225, - Key_MEDIA = 226, - - Key_UNKNOWN = 240, - - Button_MISC = 0x100, - Button_0 = 0x100, - Button_1 = 0x101, - Button_2 = 0x102, - Button_3 = 0x103, - Button_4 = 0x104, - Button_5 = 0x105, - Button_6 = 0x106, - Button_7 = 0x107, - Button_8 = 0x108, - Button_9 = 0x109, - - Button_MOUSE = 0x110, - Button_LEFT = 0x110, - Button_RIGHT = 0x111, - Button_MIDDLE = 0x112, - Button_SIDE = 0x113, - Button_EXTRA = 0x114, - Button_FORWARD = 0x115, - Button_BACK = 0x116, - Button_TASK = 0x117, - - Button_JOYSTICK = 0x120, - Button_TRIGGER = 0x120, - Button_THUMB = 0x121, - Button_THUMB2 = 0x122, - Button_TOP = 0x123, - Button_TOP2 = 0x124, - Button_PINKIE = 0x125, - Button_BASE = 0x126, - Button_BASE2 = 0x127, - Button_BASE3 = 0x128, - Button_BASE4 = 0x129, - Button_BASE5 = 0x12a, - Button_BASE6 = 0x12b, - Button_DEAD = 0x12f, - - Button_GAMEPAD = 0x130, - Button_A = 0x130, - Button_B = 0x131, - Button_C = 0x132, - Button_X = 0x133, - Button_Y = 0x134, - Button_Z = 0x135, - Button_TL = 0x136, - Button_TR = 0x137, - Button_TL2 = 0x138, - Button_TR2 = 0x139, - Button_SELECT = 0x13a, - Button_START = 0x13b, - Button_MODE = 0x13c, - Button_THUMBL = 0x13d, - Button_THUMBR = 0x13e, - - Button_DIGI = 0x140, - Button_TOOL_PEN = 0x140, - Button_TOOL_RUBBER = 0x141, - Button_TOOL_BRUSH = 0x142, - Button_TOOL_PENCIL = 0x143, - Button_TOOL_AIRBRUSH = 0x144, - Button_TOOL_FINGER = 0x145, - Button_TOOL_MOUSE = 0x146, - Button_TOOL_LENS = 0x147, - Button_TOUCH = 0x14a, - Button_STYLUS = 0x14b, - Button_STYLUS2 = 0x14c, - Button_TOOL_DOUBLETAP = 0x14d, - Button_TOOL_TRIPLETAP = 0x14e, - - Button_WHEEL = 0x150, - Button_GEAR_DOWN = 0x150, - Button_GEAR_UP = 0x151, - - Key_OK = 0x160, - Key_SELECT = 0x161, - Key_GOTO = 0x162, - Key_CLEAR = 0x163, - Key_POWER2 = 0x164, - Key_OPTION = 0x165, - Key_INFO = 0x166, - Key_TIME = 0x167, - Key_VENDOR = 0x168, - Key_ARCHIVE = 0x169, - Key_PROGRAM = 0x16a, - Key_CHANNEL = 0x16b, - Key_FAVORITES = 0x16c, - Key_EPG = 0x16d, - Key_PVR = 0x16e, - Key_MHP = 0x16f, - Key_LANGUAGE = 0x170, - Key_TITLE = 0x171, - Key_SUBTITLE = 0x172, - Key_ANGLE = 0x173, - Key_ZOOM = 0x174, - Key_MODE = 0x175, - Key_KEYBOARD = 0x176, - Key_SCREEN = 0x177, - Key_PC = 0x178, - Key_TV = 0x179, - Key_TV2 = 0x17a, - Key_VCR = 0x17b, - Key_VCR2 = 0x17c, - Key_SAT = 0x17d, - Key_SAT2 = 0x17e, - Key_CD = 0x17f, - Key_TAPE = 0x180, - Key_RADIO = 0x181, - Key_TUNER = 0x182, - Key_PLAYER = 0x183, - Key_TEXT = 0x184, - Key_DVD = 0x185, - Key_AUX = 0x186, - Key_MP3 = 0x187, - Key_AUDIO = 0x188, - Key_VIDEO = 0x189, - Key_DIRECTORY = 0x18a, - Key_LIST = 0x18b, - Key_MEMO = 0x18c, - Key_CALENDAR = 0x18d, - Key_RED = 0x18e, - Key_GREEN = 0x18f, - Key_YELLOW = 0x190, - Key_BLUE = 0x191, - Key_CHANNELUP = 0x192, - Key_CHANNELDOWN = 0x193, - Key_FIRST = 0x194, - Key_LAST = 0x195, - Key_AB = 0x196, - Key_NEXT = 0x197, - Key_RESTART = 0x198, - Key_SLOW = 0x199, - Key_SHUFFLE = 0x19a, - Key_BREAK = 0x19b, - Key_PREVIOUS = 0x19c, - Key_DIGITS = 0x19d, - Key_TEEN = 0x19e, - Key_TWEN = 0x19f, - - Key_DEL_EOL = 0x1c0, - Key_DEL_EOS = 0x1c1, - Key_INS_LINE = 0x1c2, - Key_DEL_LINE = 0x1c3, - }; - diff --git a/libopie2/opiecore/linux_input.h b/libopie2/opiecore/linux_input.h index b7a30bb..2df8a59 100644 --- a/libopie2/opiecore/linux_input.h +++ b/libopie2/opiecore/linux_input.h @@ -37,84 +37,86 @@ struct input_event { /* * IOCTLs (0x00 - 0x7f) */ struct input_id { __u16 bustype; __u16 vendor; __u16 product; __u16 version; }; struct input_absinfo { __s32 value; __s32 minimum; __s32 maximum; __s32 fuzz; __s32 flat; }; #define EVIOCGVERSION _IOR('E', 0x01, int) /* get driver version */ #define EVIOCGID _IOR('E', 0x02, struct input_id) /* get device ID */ #define EVIOCGKEYCODE _IOR('E', 0x04, int[2]) /* get keycode */ #define EVIOCSKEYCODE _IOW('E', 0x04, int[2]) /* set keycode */ #define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */ #define EVIOCGPHYS(len) _IOC(_IOC_READ, 'E', 0x07, len) /* get physical location */ #define EVIOCGUNIQ(len) _IOC(_IOC_READ, 'E', 0x08, len) /* get unique identifier */ #define EVIOCGKEY(len) _IOC(_IOC_READ, 'E', 0x18, len) /* get global keystate */ #define EVIOCGLED(len) _IOC(_IOC_READ, 'E', 0x19, len) /* get all LEDs */ #define EVIOCGSND(len) _IOC(_IOC_READ, 'E', 0x1a, len) /* get all sounds status */ +#define EVIOCGSW(len) _IOC(_IOC_READ, 'E', 0x1b, len) /* get all switch states */ #define EVIOCGBIT(ev,len) _IOC(_IOC_READ, 'E', 0x20 + ev, len) /* get event bits */ #define EVIOCGABS(abs) _IOR('E', 0x40 + abs, struct input_absinfo) /* get abs value/limits */ #define EVIOCSABS(abs) _IOW('E', 0xc0 + abs, struct input_absinfo) /* set abs value/limits */ #define EVIOCSFF _IOC(_IOC_WRITE, 'E', 0x80, sizeof(struct ff_effect)) /* send a force effect to a force feedback device */ #define EVIOCRMFF _IOW('E', 0x81, int) /* Erase a force effect */ #define EVIOCGEFFECTS _IOR('E', 0x84, int) /* Report number of effects playable at the same time */ #define EVIOCGRAB _IOW('E', 0x90, int) /* Grab/Release device */ /* * Event types */ #define EV_SYN 0x00 #define EV_KEY 0x01 #define EV_REL 0x02 #define EV_ABS 0x03 #define EV_MSC 0x04 +#define EV_SW 0x05 #define EV_LED 0x11 #define EV_SND 0x12 #define EV_REP 0x14 #define EV_FF 0x15 #define EV_PWR 0x16 #define EV_FF_STATUS 0x17 #define EV_MAX 0x1f /* * Synchronization events. */ #define SYN_REPORT 0 #define SYN_CONFIG 1 /* * Keys and buttons */ #define KEY_RESERVED 0 #define KEY_ESC 1 #define KEY_1 2 #define KEY_2 3 #define KEY_3 4 #define KEY_4 5 #define KEY_5 6 #define KEY_6 7 #define KEY_7 8 #define KEY_8 9 #define KEY_9 10 #define KEY_0 11 #define KEY_MINUS 12 @@ -492,64 +494,78 @@ struct input_absinfo { * Absolute axes */ #define ABS_X 0x00 #define ABS_Y 0x01 #define ABS_Z 0x02 #define ABS_RX 0x03 #define ABS_RY 0x04 #define ABS_RZ 0x05 #define ABS_THROTTLE 0x06 #define ABS_RUDDER 0x07 #define ABS_WHEEL 0x08 #define ABS_GAS 0x09 #define ABS_BRAKE 0x0a #define ABS_HAT0X 0x10 #define ABS_HAT0Y 0x11 #define ABS_HAT1X 0x12 #define ABS_HAT1Y 0x13 #define ABS_HAT2X 0x14 #define ABS_HAT2Y 0x15 #define ABS_HAT3X 0x16 #define ABS_HAT3Y 0x17 #define ABS_PRESSURE 0x18 #define ABS_DISTANCE 0x19 #define ABS_TILT_X 0x1a #define ABS_TILT_Y 0x1b #define ABS_TOOL_WIDTH 0x1c #define ABS_VOLUME 0x20 #define ABS_MISC 0x28 #define ABS_MAX 0x3f /* + * Switch events + */ + +#define SW_0 0x00 +#define SW_1 0x01 +#define SW_2 0x02 +#define SW_3 0x03 +#define SW_4 0x04 +#define SW_5 0x05 +#define SW_6 0x06 +#define SW_7 0x07 +#define SW_MAX 0x0f + +/* * Misc events */ #define MSC_SERIAL 0x00 #define MSC_PULSELED 0x01 #define MSC_GESTURE 0x02 #define MSC_MAX 0x07 /* * LEDs */ #define LED_NUML 0x00 #define LED_CAPSL 0x01 #define LED_SCROLLL 0x02 #define LED_COMPOSE 0x03 #define LED_KANA 0x04 #define LED_SLEEP 0x05 #define LED_SUSPEND 0x06 #define LED_MUTE 0x07 #define LED_MISC 0x08 #define LED_MAX 0x0f /* * Autorepeat values */ #define REP_DELAY 0x00 #define REP_PERIOD 0x01 #define REP_MAX 0x01 /* @@ -761,143 +777,147 @@ struct ff_effect { case 2: { \ u16 *k = (u16 *)dev->keycode; \ __old = k[scancode]; \ k[scancode] = val; \ break; \ } \ default: { \ u32 *k = (u32 *)dev->keycode; \ __old = k[scancode]; \ k[scancode] = val; \ break; \ } \ } \ __old; }) struct input_dev { void *private; char *name; char *phys; char *uniq; struct input_id id; unsigned long evbit[NBITS(EV_MAX)]; unsigned long keybit[NBITS(KEY_MAX)]; unsigned long relbit[NBITS(REL_MAX)]; unsigned long absbit[NBITS(ABS_MAX)]; unsigned long mscbit[NBITS(MSC_MAX)]; unsigned long ledbit[NBITS(LED_MAX)]; unsigned long sndbit[NBITS(SND_MAX)]; unsigned long ffbit[NBITS(FF_MAX)]; + unsigned long swbit[NBITS(SW_MAX)]; int ff_effects_max; unsigned int keycodemax; unsigned int keycodesize; void *keycode; unsigned int repeat_key; struct timer_list timer; struct pm_dev *pm_dev; struct pt_regs *regs; int state; int sync; int abs[ABS_MAX + 1]; int rep[REP_MAX + 1]; unsigned long key[NBITS(KEY_MAX)]; unsigned long led[NBITS(LED_MAX)]; unsigned long snd[NBITS(SND_MAX)]; + unsigned long sw[NBITS(SW_MAX)]; int absmax[ABS_MAX + 1]; int absmin[ABS_MAX + 1]; int absfuzz[ABS_MAX + 1]; int absflat[ABS_MAX + 1]; int (*open)(struct input_dev *dev); void (*close)(struct input_dev *dev); int (*accept)(struct input_dev *dev, struct file *file); int (*flush)(struct input_dev *dev, struct file *file); int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value); int (*upload_effect)(struct input_dev *dev, struct ff_effect *effect); int (*erase_effect)(struct input_dev *dev, int effect_id); struct input_handle *grab; struct device *dev; struct list_head h_list; struct list_head node; }; /* * Structure for hotplug & device<->driver matching. */ #define INPUT_DEVICE_ID_MATCH_BUS 1 #define INPUT_DEVICE_ID_MATCH_VENDOR 2 #define INPUT_DEVICE_ID_MATCH_PRODUCT 4 #define INPUT_DEVICE_ID_MATCH_VERSION 8 #define INPUT_DEVICE_ID_MATCH_EVBIT 0x010 #define INPUT_DEVICE_ID_MATCH_KEYBIT 0x020 #define INPUT_DEVICE_ID_MATCH_RELBIT 0x040 #define INPUT_DEVICE_ID_MATCH_ABSBIT 0x080 #define INPUT_DEVICE_ID_MATCH_MSCIT 0x100 #define INPUT_DEVICE_ID_MATCH_LEDBIT 0x200 #define INPUT_DEVICE_ID_MATCH_SNDBIT 0x400 #define INPUT_DEVICE_ID_MATCH_FFBIT 0x800 +#define INPUT_DEVICE_ID_MATCH_SWBIT 0x1000 #define INPUT_DEVICE_ID_MATCH_DEVICE\ (INPUT_DEVICE_ID_MATCH_BUS | INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT) #define INPUT_DEVICE_ID_MATCH_DEVICE_AND_VERSION\ (INPUT_DEVICE_ID_MATCH_DEVICE | INPUT_DEVICE_ID_MATCH_VERSION) struct input_device_id { unsigned long flags; struct input_id id; unsigned long evbit[NBITS(EV_MAX)]; unsigned long keybit[NBITS(KEY_MAX)]; unsigned long relbit[NBITS(REL_MAX)]; unsigned long absbit[NBITS(ABS_MAX)]; unsigned long mscbit[NBITS(MSC_MAX)]; unsigned long ledbit[NBITS(LED_MAX)]; unsigned long sndbit[NBITS(SND_MAX)]; unsigned long ffbit[NBITS(FF_MAX)]; + unsigned long swbit[NBITS(SW_MAX)]; unsigned long driver_info; }; struct input_handle; struct input_handler { void *private; void (*event)(struct input_handle *handle, unsigned int type, unsigned int code, int value); struct input_handle* (*connect)(struct input_handler *handler, struct input_dev *dev, struct input_device_id *id); void (*disconnect)(struct input_handle *handle); struct file_operations *fops; int minor; char *name; struct input_device_id *id_table; struct input_device_id *blacklist; struct list_head h_list; struct list_head node; }; struct input_handle { void *private; int open; char *name; @@ -932,57 +952,62 @@ int input_open_device(struct input_handle *); void input_close_device(struct input_handle *); int input_accept_process(struct input_handle *handle, struct file *file); int input_flush_device(struct input_handle* handle, struct file* file); void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value); static inline void input_report_key(struct input_dev *dev, unsigned int code, int value) { input_event(dev, EV_KEY, code, !!value); } static inline void input_report_rel(struct input_dev *dev, unsigned int code, int value) { input_event(dev, EV_REL, code, value); } static inline void input_report_abs(struct input_dev *dev, unsigned int code, int value) { input_event(dev, EV_ABS, code, value); } static inline void input_report_ff(struct input_dev *dev, unsigned int code, int value) { input_event(dev, EV_FF, code, value); } static inline void input_report_ff_status(struct input_dev *dev, unsigned int code, int value) { input_event(dev, EV_FF_STATUS, code, value); } +static inline void input_report_switch(struct input_dev *dev, unsigned int code, int value) +{ + input_event(dev, EV_SW, code, !!value); +} + static inline void input_regs(struct input_dev *dev, struct pt_regs *regs) { dev->regs = regs; } static inline void input_sync(struct input_dev *dev) { input_event(dev, EV_SYN, SYN_REPORT, 0); dev->regs = NULL; } static inline void input_set_abs_params(struct input_dev *dev, int axis, int min, int max, int fuzz, int flat) { dev->absmin[axis] = min; dev->absmax[axis] = max; dev->absfuzz[axis] = fuzz; dev->absflat[axis] = flat; dev->absbit[LONG(axis)] |= BIT(axis); } extern struct class_simple *input_class; #endif #endif diff --git a/libopie2/opiecore/oinputsystemenums.h b/libopie2/opiecore/oinputsystemenums.h index 3461e5a..728423a 100644 --- a/libopie2/opiecore/oinputsystemenums.h +++ b/libopie2/opiecore/oinputsystemenums.h @@ -1,66 +1,79 @@ enum Feature { Synchronous = EV_SYN, Keys = EV_KEY, Relative = EV_REL, Absolute = EV_ABS, Miscellaneous = EV_MSC, + Switches = EV_SW, Leds = EV_LED, Sound = EV_SND, AutoRepeat = EV_REP, ForceFeedback = EV_FF, PowerManagement = EV_PWR, ForceFeedbackStatus = EV_FF_STATUS, }; enum Bus { PCI = BUS_PCI, ISAPNP = BUS_ISAPNP, HIL = BUS_HIL, BLUETOOTH = BUS_BLUETOOTH, ISA = BUS_ISA, I8042 = BUS_I8042, XTKBD = BUS_XTKBD, RS232 = BUS_RS232, GAMEPORT = BUS_GAMEPORT, PARPORT = BUS_PARPORT, AMIGA = BUS_AMIGA, ADB = BUS_ADB, I2C = BUS_I2C, HOST = BUS_HOST, }; + enum Switch + { + Switch0 = SW_0, + Switch1 = SW_1, + Switch2 = SW_2, + Switch3 = SW_3, + Switch4 = SW_4, + Switch5 = SW_5, + Switch6 = SW_6, + Switch7 = SW_7, + }; + enum Key { Key_RESERVED = 0, Key_ESC = 1, Key_1 = 2, Key_2 = 3, Key_3 = 4, Key_4 = 5, Key_5 = 6, Key_6 = 7, Key_7 = 8, Key_8 = 9, Key_9 = 10, Key_0 = 11, Key_MINUS = 12, Key_EQUAL = 13, Key_BACKSPACE = 14, Key_TAB = 15, Key_Q = 16, Key_W = 17, Key_E = 18, Key_R = 19, Key_T = 20, Key_Y = 21, Key_U = 22, Key_I = 23, Key_O = 24, Key_P = 25, Key_LEFTBRACE = 26, Key_RIGHTBRACE = 27, Key_ENTER = 28, Key_LEFTCTRL = 29, diff --git a/noncore/settings/sysinfo/devicesinfo.cpp b/noncore/settings/sysinfo/devicesinfo.cpp index 76c9b79..176d178 100644 --- a/noncore/settings/sysinfo/devicesinfo.cpp +++ b/noncore/settings/sysinfo/devicesinfo.cpp @@ -368,64 +368,65 @@ void CardDevice::setInfo( const OPcmciaSocket* card ) text += "<unknown>"; } new OListViewItem( (OListView*) details, "Status", text.join( ", " ) ); } CardDevice::~CardDevice() { } //================================================================================================= InputDevice::InputDevice( Category* parent, const QString& name ) :Device( parent, name ) { OListView* w = new OListView( devinfo ); details = w; w->addColumn( "Info" ); w->addColumn( "Value" ); w->hide(); } void InputDevice::setInfo( const OInputDevice* dev ) { new OListViewItem( (OListView*) details, "Identity", dev->identity() ); new OListViewItem( (OListView*) details, "Path", dev->path() ); new OListViewItem( (OListView*) details, "Unique", dev->uniq() ); QStringList text; if ( dev->hasFeature( OInputDevice::Synchronous ) ) text += "Synchronous"; if ( dev->hasFeature( OInputDevice::Keys ) ) text += "Keys"; if ( dev->hasFeature( OInputDevice::Relative ) ) text += "Relative"; if ( dev->hasFeature( OInputDevice::Absolute ) ) text += "Absolute"; if ( dev->hasFeature( OInputDevice::Miscellaneous ) ) text += "Miscellaneous"; + if ( dev->hasFeature( OInputDevice::Switches ) ) text += "Switches"; if ( dev->hasFeature( OInputDevice::Leds ) ) text += "Leds"; if ( dev->hasFeature( OInputDevice::Sound ) ) text += "Sound"; if ( dev->hasFeature( OInputDevice::AutoRepeat ) ) text += "AutoRepeat"; if ( dev->hasFeature( OInputDevice::ForceFeedback ) ) text += "ForceFeedback"; if ( dev->hasFeature( OInputDevice::PowerManagement ) ) text += "PowerManagement"; if ( dev->hasFeature( OInputDevice::ForceFeedbackStatus ) ) text += "ForceFeedbackStatus"; new OListViewItem( (OListView*) details, "Features", text.join( ", " ) ); } InputDevice::~InputDevice() { } //================================================================================================= UsbDevice::UsbDevice( Category* parent, const QString& name ) :Device( parent, name ) { details = new QPushButton( name, devinfo ); details->hide(); } //================================================================================================= UsbDevice::UsbDevice( UsbDevice* parent, const QString& name ) :Device( parent, name ) { details = new QPushButton( name, devinfo ); details->hide(); } UsbDevice::~UsbDevice() { |