summaryrefslogtreecommitdiff
authorsandman <sandman>2002-06-16 01:31:36 (UTC)
committer sandman <sandman>2002-06-16 01:31:36 (UTC)
commitac7ddc479efedd5cbfb0f4a8a3e4fa304abfaa91 (patch) (side-by-side diff)
tree9f21f116a4b7057c6a2f1bae45a0dfedc5bcae6b
parenteb414eb5d393f0f727e833fc8901aef096558997 (diff)
downloadopie-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)
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--core/launcher/desktop.cpp11
-rw-r--r--core/launcher/launcher.pro2
-rw-r--r--core/launcher/main.cpp91
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
@@ -149,196 +149,199 @@ DesktopApplication::DesktopApplication( int& argc, char **argv, Type appType )
channel = new QCopChannel( "QPE/Desktop", this );
connect( channel, SIGNAL(received(const QCString&, const QByteArray&)),
this, SLOT(receive(const QCString&, const QByteArray&)) );
}
DesktopApplication::~DesktopApplication()
{
delete ps;
delete pa;
}
void DesktopApplication::receive( const QCString &msg, const QByteArray &data )
{
QDataStream stream( data, IO_ReadOnly );
if (msg == "keyRegister(int key, QString channel, QString message)")
{
int k;
QString c, m;
stream >> k;
stream >> c;
stream >> m;
qWarning("KeyRegisterReceived: %i, %s, %s", k, (const char*)c, (const char *)m );
keyRegisterList.append(QCopKeyRegister(k,c,m));
}
else if (msg == "suspend()"){
emit power();
}
}
enum MemState { Unknown, VeryLow, Low, Normal } memstate=Unknown;
#ifdef Q_WS_QWS
bool DesktopApplication::qwsEventFilter( QWSEvent *e )
{
qpedesktop->checkMemory();
if ( e->type == QWSEvent::Key ) {
QWSKeyEvent *ke = (QWSKeyEvent *)e;
if ( !loggedin && ke->simpleData.keycode != Key_F34 )
return TRUE;
bool press = ke->simpleData.is_press;
bool autoRepeat= ke->simpleData.is_auto_repeat;
if (!keyRegisterList.isEmpty())
{
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 );
}
if ( ps->batteryStatus() == PowerStatus::Critical ) {
pa->alert( tr( "Battery level is critical!\n"
"Keep power off until power restored!" ), 1 );
}
if ( ps->backupBatteryStatus() == PowerStatus::VeryLow ) {
pa->alert( tr( "The Back-up battery is very low.\nPlease charge the back-up battery." ), 3 );
}
}
void DesktopApplication::sendCard()
{
delete cardSendTimer;
cardSendTimer = 0;
QString card = getenv("HOME");
card += "/Applications/addressbook/businesscard.vcf";
if ( QFile::exists( card ) ) {
QCopEnvelope e("QPE/Obex", "send(QString,QString,QString)");
QString mimetype = "text/x-vCard";
e << tr("business card") << card << mimetype;
}
}
#if defined(QPE_HAVE_MEMALERTER)
QPE_MEMALERTER_IMPL
#endif
#if defined(CUSTOM_SOUND_IMPL)
CUSTOM_SOUND_IMPL
#endif
//===========================================================================
Desktop::Desktop() :
QWidget( 0, 0, WStyle_Tool | WStyle_Customize ),
qcopBridge( 0 ),
transferServer( 0 ),
packageSlave( 0 )
{
#ifdef CUSTOM_SOUND_INIT
CUSTOM_SOUND_INIT;
#endif
qpedesktop = this;
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
@@ -16,108 +16,108 @@ HEADERS = background.h \
stabmon.h \
inputmethods.h \
systray.h \
wait.h \
shutdownimpl.h \
launcher.h \
launcherview.h \
../calibrate/calibrate.h \
startmenu.h \
transferserver.h \
qcopbridge.h \
packageslave.h \
irserver.h \
$(OPIEDIR)/rsync/buf.h \
$(OPIEDIR)/rsync/checksum.h \
$(OPIEDIR)/rsync/command.h \
$(OPIEDIR)/rsync/emit.h \
$(OPIEDIR)/rsync/job.h \
$(OPIEDIR)/rsync/netint.h \
$(OPIEDIR)/rsync/protocol.h \
$(OPIEDIR)/rsync/prototab.h \
$(OPIEDIR)/rsync/rsync.h \
$(OPIEDIR)/rsync/search.h \
$(OPIEDIR)/rsync/stream.h \
$(OPIEDIR)/rsync/sumset.h \
$(OPIEDIR)/rsync/trace.h \
$(OPIEDIR)/rsync/types.h \
$(OPIEDIR)/rsync/util.h \
$(OPIEDIR)/rsync/whole.h \
$(OPIEDIR)/rsync/config_rsync.h \
$(OPIEDIR)/rsync/qrsync.h
# quicklauncher.h \
SOURCES = background.cpp \
desktop.cpp \
mediummountgui.cpp \
qprocess.cpp qprocess_unix.cpp \
info.cpp \
appicons.cpp \
taskbar.cpp \
sidething.cpp \
mrulist.cpp \
stabmon.cpp \
inputmethods.cpp \
systray.cpp \
wait.cpp \
shutdownimpl.cpp \
launcher.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,276 +1,367 @@
/**********************************************************************
** 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) ) {
perror("Mounting - shm");
}
setenv( "QTDIR", "/", 1 );
setenv( "OPIEDIR", "/", 1 );
setenv( "HOME", "/home", 1 );
mkdir( "/home/Documents", 0755 );
// set a reasonable starting date
QDateTime dt( QDate( 2001, 3, 15 ) );
QDateTime now = QDateTime::currentDateTime();
int change = now.secsTo( dt );
time_t t = ::time(0);
t += change;
stime(&t);
qInstallMsgHandler(ignoreMessage);
}
#endif
#ifdef QPE_OWNAPM
#include <sys/ioctl.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <linux/ioctl.h>
#include <qpe/global.h>
static void disableAPM()
{
int fd, cur_val, ret;
char *device = "/dev/apm_bios";
fd = open (device, O_WRONLY);
if (fd == -1) {
perror(device);
return;
}
cur_val = ioctl(fd, APM_IOCGEVTSRC, 0);
if (cur_val == -1) {
perror("ioctl");
exit(errno);
}
ret = ioctl(fd, APM_IOCSEVTSRC, cur_val & ~APM_EVT_POWER_BUTTON);
if (ret == -1) {
perror("ioctl");
return;
}
close(fd);
}
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 )
{
#ifndef SINGLE_APP
signal( SIGCHLD, SIG_IGN );
#endif
int retVal = initApplication( argc, argv );
#ifndef SINGLE_APP
// Kill them. Kill them all.
setpgid( getpid(), getppid() );
killpg( getpid(), SIGTERM );
sleep( 1 );
killpg( getpid(), SIGKILL );
#endif
return retVal;
}