author | sandman <sandman> | 2002-06-16 01:31:36 (UTC) |
---|---|---|
committer | sandman <sandman> | 2002-06-16 01:31:36 (UTC) |
commit | ac7ddc479efedd5cbfb0f4a8a3e4fa304abfaa91 (patch) (side-by-side diff) | |
tree | 9f21f116a4b7057c6a2f1bae45a0dfedc5bcae6b | |
parent | eb414eb5d393f0f727e833fc8901aef096558997 (diff) | |
download | opie-ac7ddc479efedd5cbfb0f4a8a3e4fa304abfaa91.zip opie-ac7ddc479efedd5cbfb0f4a8a3e4fa304abfaa91.tar.gz opie-ac7ddc479efedd5cbfb0f4a8a3e4fa304abfaa91.tar.bz2 |
Keyboard filter restructuring based on model detection:
1) Added a KeyboardFilter to main.cpp
!! Please use this class for low-level/model-based filtering !!
2) Cursor keys are rotated for H31xx and H38xx
3) Power button long-press toggles backlight on iPAQs now
(Mapped to F34/F35 - just like Z's)
-rw-r--r-- | core/launcher/desktop.cpp | 11 | ||||
-rw-r--r-- | core/launcher/launcher.pro | 2 | ||||
-rw-r--r-- | core/launcher/main.cpp | 91 |
3 files changed, 99 insertions, 5 deletions
diff --git a/core/launcher/desktop.cpp b/core/launcher/desktop.cpp index aa51898..ab4f14a 100644 --- a/core/launcher/desktop.cpp +++ b/core/launcher/desktop.cpp @@ -197,100 +197,103 @@ bool DesktopApplication::qwsEventFilter( QWSEvent *e ) KeyRegisterList::Iterator it; for( it = keyRegisterList.begin(); it != keyRegisterList.end(); ++it ) { if ((*it).getKeyCode() == ke->simpleData.keycode && !autoRepeat) { if(press) qDebug("press"); else qDebug("release"); QCopEnvelope((*it).getChannel().utf8(), (*it).getMessage().utf8()); } } } if ( !keyboardGrabbed() ) { if ( ke->simpleData.keycode == Key_F9 ) { if ( press ) emit datebook(); return TRUE; } if ( ke->simpleData.keycode == Key_F10 ) { if ( !press && cardSendTimer ) { emit contacts(); delete cardSendTimer; } else if ( press ) { cardSendTimer = new QTimer(); cardSendTimer->start( 2000, TRUE ); connect( cardSendTimer, SIGNAL( timeout() ), this, SLOT( sendCard() ) ); } return TRUE; } /* menu key now opens application menu/toolbar if ( ke->simpleData.keycode == Key_F11 ) { if ( press ) emit menu(); return TRUE; } */ if ( ke->simpleData.keycode == Key_F12 ) { while( activePopupWidget() ) activePopupWidget()->close(); if ( press ) emit launch(); return TRUE; } if ( ke->simpleData.keycode == Key_F13 ) { if ( press ) emit email(); return TRUE; } } if ( ke->simpleData.keycode == Key_F34 ) { if ( press ) emit power(); return TRUE; } - if ( ke->simpleData.keycode == Key_SysReq ) { - if ( press ) emit power(); - return TRUE; - } +// This was used for the iPAQ PowerButton +// See main.cpp for new KeyboardFilter +// +// if ( ke->simpleData.keycode == Key_SysReq ) { +// if ( press ) emit power(); +// return TRUE; +// } if ( ke->simpleData.keycode == Key_F35 ) { if ( press ) emit backlight(); return TRUE; } if ( ke->simpleData.keycode == Key_F32 ) { if ( press ) QCopEnvelope e( "QPE/Desktop", "startSync()" ); return TRUE; } if ( ke->simpleData.keycode == Key_F31 && !ke->simpleData.modifiers ) { if ( press ) emit symbol(); return TRUE; } if ( ke->simpleData.keycode == Key_NumLock ) { if ( press ) emit numLockStateToggle(); } if ( ke->simpleData.keycode == Key_CapsLock ) { if ( press ) emit capsLockStateToggle(); } if ( press ) qpedesktop->keyClick(); } else { if ( e->type == QWSEvent::Mouse ) { QWSMouseEvent *me = (QWSMouseEvent *)e; static bool up = TRUE; if ( me->simpleData.state&LeftButton ) { if ( up ) { up = FALSE; qpedesktop->screenClick(); } } else { up = TRUE; } } } return QPEApplication::qwsEventFilter( e ); } #endif void DesktopApplication::psTimeout() { qpedesktop->checkMemory(); // in case no events are being generated *ps = PowerStatusManager::readStatus(); if ( (ps->batteryStatus() == PowerStatus::VeryLow ) ) { pa->alert( tr( "Battery is running very low." ), 6 ); } diff --git a/core/launcher/launcher.pro b/core/launcher/launcher.pro index c77da50..f94f338 100644 --- a/core/launcher/launcher.pro +++ b/core/launcher/launcher.pro @@ -64,60 +64,60 @@ SOURCES = background.cpp \ launcherview.cpp \ $(OPIEDIR)/calibrate/calibrate.cpp \ transferserver.cpp \ packageslave.cpp \ irserver.cpp \ qcopbridge.cpp \ startmenu.cpp \ main.cpp \ $(OPIEDIR)/rsync/base64.c \ $(OPIEDIR)/rsync/buf.c \ $(OPIEDIR)/rsync/checksum.c \ $(OPIEDIR)/rsync/command.c \ $(OPIEDIR)/rsync/delta.c \ $(OPIEDIR)/rsync/emit.c \ $(OPIEDIR)/rsync/hex.c \ $(OPIEDIR)/rsync/job.c \ $(OPIEDIR)/rsync/mdfour.c \ $(OPIEDIR)/rsync/mksum.c \ $(OPIEDIR)/rsync/msg.c \ $(OPIEDIR)/rsync/netint.c \ $(OPIEDIR)/rsync/patch.c \ $(OPIEDIR)/rsync/prototab.c \ $(OPIEDIR)/rsync/readsums.c \ $(OPIEDIR)/rsync/scoop.c \ $(OPIEDIR)/rsync/search.c \ $(OPIEDIR)/rsync/stats.c \ $(OPIEDIR)/rsync/stream.c \ $(OPIEDIR)/rsync/sumset.c \ $(OPIEDIR)/rsync/trace.c \ $(OPIEDIR)/rsync/tube.c \ $(OPIEDIR)/rsync/util.c \ $(OPIEDIR)/rsync/version.c \ $(OPIEDIR)/rsync/whole.c \ $(OPIEDIR)/rsync/qrsync.cpp INTERFACES = shutdown.ui syncdialog.ui INCLUDEPATH += $(OPIEDIR)/include DEPENDPATH += $(OPIEDIR)/include . INCLUDEPATH += $(OPIEDIR)/calibrate DEPENDPATH += $(OPIEDIR)/calibrate INCLUDEPATH += $(OPIEDIR)/rsync DEPENDPATH += $(OPIEDIR)/rsync TARGET = qpe -LIBS += -lqpe -lcrypt +LIBS += -lqpe -lcrypt -lopie TRANSLATIONS = ../i18n/de/qpe.ts TRANSLATIONS += ../i18n/pt_BR/qpe.ts TRANSLATIONS += ../i18n/en/qpe.ts TRANSLATIONS += ../i18n/hu/qpe.ts TRANSLATIONS += ../i18n/ja/qpe.ts TRANSLATIONS += ../i18n/fr/qpe.ts TRANSLATIONS += ../i18n/ko/qpe.ts TRANSLATIONS += ../i18n/no/qpe.ts TRANSLATIONS += ../i18n/zh_CN/qpe.ts TRANSLATIONS += ../i18n/zh_TW/qpe.ts diff --git a/core/launcher/main.cpp b/core/launcher/main.cpp index fc6d829..347eee9 100644 --- a/core/launcher/main.cpp +++ b/core/launcher/main.cpp @@ -1,84 +1,86 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #include "desktop.h" #include "taskbar.h" #include "stabmon.h" #include <qpe/qpeapplication.h> #include <qpe/network.h> #include <qpe/config.h> #if defined( QT_QWS_CUSTOM ) || defined( QT_QWS_IPAQ ) #include <qpe/custom.h> #endif #include <qfile.h> #include <qwindowsystem_qws.h> #include <qpe/qcopenvelope_qws.h> #include <qpe/alarmserver.h> +#include <opie/ohwinfo.h> + #include <stdlib.h> #include <stdio.h> #include <signal.h> #include <unistd.h> #if defined(QT_QWS_CASSIOPEIA) || defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX) #include "../calibrate/calibrate.h" #endif #ifdef QT_QWS_LOGIN #include "../login/qdmdialogimpl.h" #endif #ifdef QT_QWS_CASSIOPEIA static void ignoreMessage( QtMsgType, const char * ) { } #include <sys/mount.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/time.h> #include <fcntl.h> #include <qdatetime.h> void initCassiopeia() { // MIPSEL-specific init - make sure /proc exists for shm /* if ( mount("/dev/ram0", "/", "ext2", MS_REMOUNT | MS_MGC_VAL, 0 ) ) { perror("Remounting - / read/write"); } */ if ( mount("none", "/tmp", "ramfs", 0, 0 ) ) { perror("mounting ramfs /tmp"); } else { fprintf( stderr, "mounted /tmp\n" ); } if ( mount("none", "/home", "ramfs", 0, 0 ) ) { perror("mounting ramfs /home"); } else { fprintf( stderr, "mounted /home\n" ); } if ( mount("none","/proc","proc",0,0) ) { perror("Mounting - /proc"); } else { fprintf( stderr, "mounted /proc\n" ); } if ( mount("none","/mnt","shm",0,0) ) { @@ -139,121 +141,210 @@ static void disableAPM() } static void initAPM() { // So that we have to do it ourself, but better. disableAPM(); } #endif #ifdef QT_DEMO_SINGLE_FLOPPY #include <sys/mount.h> void initFloppy() { mount("none","/proc","proc",0,0); setenv( "QTDIR", "/", 0 ); setenv( "HOME", "/root", 0 ); setenv( "QWS_SIZE", "240x320", 0 ); } #endif void initEnvironment() { Config config("locale"); config.setGroup( "Location" ); QString tz = config.readEntry( "Timezone", getenv("TZ") ); // if not timezone set, pick New York if (tz.isNull()) tz = "America/New_York"; setenv( "TZ", tz, 1 ); config.writeEntry( "Timezone", tz); config.setGroup( "Language" ); QString lang = config.readEntry( "Language", getenv("LANG") ); if ( !lang.isNull() ) setenv( "LANG", lang, 1 ); } static void initBacklight() { QCopEnvelope e("QPE/System", "setBacklight(int)" ); e << -3; // Forced on } +class ModelKeyFilter : public QObject, public QWSServer::KeyboardFilter +{ +public: + ModelKeyFilter ( ) : QObject ( 0, "MODEL_KEY_FILTER" ) + { + bool doinst = false; + + m_model = OHwInfo::inst ( )-> model ( ); + m_power_timer = 0; + + switch ( m_model ) { + case OMODEL_iPAQ_H31xx: + case OMODEL_iPAQ_H36xx: + case OMODEL_iPAQ_H37xx: + case OMODEL_iPAQ_H38xx: doinst = true; + break; + default : break; + } + if ( doinst ) + QWSServer::setKeyboardFilter ( this ); + } + + virtual bool filter ( int unicode, int keycode, int modifiers, bool isPress, bool autoRepeat ) + { + bool kill = false; + + // Rotate cursor keys 180° + switch ( m_model ) { + case OMODEL_iPAQ_H31xx: + case OMODEL_iPAQ_H38xx: { + int newkeycode = keycode; + + switch ( keycode ) { + case Key_Left : newkeycode = Key_Right; break; + case Key_Right: newkeycode = Key_Left; break; + case Key_Up : newkeycode = Key_Down; break; + case Key_Down : newkeycode = Key_Up; break; + } + if ( newkeycode != keycode ) { + QWSServer::sendKeyEvent ( -1, newkeycode, modifiers, isPress, autoRepeat ); + kill = true; + } + break; + } + default: break; + } + + // map Power Button short/long press to F34/F35 + switch ( m_model ) { + case OMODEL_iPAQ_H31xx: + case OMODEL_iPAQ_H36xx: + case OMODEL_iPAQ_H37xx: + case OMODEL_iPAQ_H38xx: { + if ( keycode == Key_SysReq ) { + if ( isPress ) { + m_power_timer = startTimer ( 500 ); + } + else if ( m_power_timer ) { + killTimer ( m_power_timer ); + m_power_timer = 0; + QWSServer::sendKeyEvent ( -1, Key_F34, 0, true, false ); + QWSServer::sendKeyEvent ( -1, Key_F34, 0, false, false ); + } + kill = true; + } + break; + } + default: break; + } + return kill; + } + + virtual void timerEvent ( QTimerEvent * ) + { + killTimer ( m_power_timer ); + m_power_timer = 0; + QWSServer::sendKeyEvent ( -1, Key_F35, 0, true, false ); + QWSServer::sendKeyEvent ( -1, Key_F35, 0, false, false ); + } + +private: + OHwModel m_model; + bool m_power_press; + int m_power_timer; +}; + + int initApplication( int argc, char ** argv ) { #ifdef QT_QWS_CASSIOPEIA initCassiopeia(); #endif #ifdef QPE_OWNAPM initAPM(); #endif #ifdef QT_DEMO_SINGLE_FLOPPY initFloppy(); #endif initEnvironment(); #if !defined(QT_QWS_CASSIOPEIA) && !defined(QT_QWS_IPAQ) && !defined(QT_QWS_EBX) setenv( "QWS_SIZE", "240x320", 0 ); #endif //Don't flicker at startup: QWSServer::setDesktopBackground( QImage() ); DesktopApplication a( argc, argv, QApplication::GuiServer ); + (void) new ModelKeyFilter ( ); + initBacklight(); AlarmServer::initialize(); #if defined(QT_QWS_LOGIN) for( int i=0; i<a.argc(); i++ ) if( strcmp( a.argv()[i], "-login" ) == 0 ) { QDMDialogImpl::login( ); return 0; } #endif Desktop *d = new Desktop(); QObject::connect( &a, SIGNAL(datebook()), d, SLOT(raiseDatebook()) ); QObject::connect( &a, SIGNAL(contacts()), d, SLOT(raiseContacts()) ); QObject::connect( &a, SIGNAL(launch()), d, SLOT(raiseLauncher()) ); QObject::connect( &a, SIGNAL(email()), d, SLOT(raiseEmail()) ); QObject::connect( &a, SIGNAL(power()), d, SLOT(togglePower()) ); QObject::connect( &a, SIGNAL(backlight()), d, SLOT(toggleLight()) ); QObject::connect( &a, SIGNAL(symbol()), d, SLOT(toggleSymbolInput()) ); QObject::connect( &a, SIGNAL(numLockStateToggle()), d, SLOT(toggleNumLockState()) ); QObject::connect( &a, SIGNAL(capsLockStateToggle()), d, SLOT(toggleCapsLockState()) ); QObject::connect( &a, SIGNAL(prepareForRestart()), d, SLOT(terminateServers()) ); (void)new SysFileMonitor(d); Network::createServer(d); #if defined(QT_QWS_CASSIOPEIA) || defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX) if ( !QFile::exists( "/etc/pointercal" ) ) { // Make sure calibration widget starts on top. Calibrate *cal = new Calibrate; cal->exec(); delete cal; } #endif d->show(); int rv = a.exec(); delete d; return rv; } int main( int argc, char ** argv ) { |