author | sandman <sandman> | 2002-12-23 00:07:32 (UTC) |
---|---|---|
committer | sandman <sandman> | 2002-12-23 00:07:32 (UTC) |
commit | 6f82a7bad0746d37ff1545717be3fe67e2eed17c (patch) (side-by-side diff) | |
tree | eaf5e6b6d7e7fcc648d25ae7021d1785b80122f2 | |
parent | c513f413c7d901cc9945714c8e7eb47292f63306 (diff) | |
download | opie-6f82a7bad0746d37ff1545717be3fe67e2eed17c.zip opie-6f82a7bad0746d37ff1545717be3fe67e2eed17c.tar.gz opie-6f82a7bad0746d37ff1545717be3fe67e2eed17c.tar.bz2 |
- ported the device button handling to the new ODevice based framework
- removed the key re-grabbing in runningsappbar (not necessary anymore)
- added a few new QCops to make all "special" launcher functions available
via qcop
- added the devicebuttons to the opie-taskbar ipk
-rw-r--r-- | core/launcher/desktop.cpp | 352 | ||||
-rw-r--r-- | core/launcher/desktop.h | 39 | ||||
-rw-r--r-- | core/launcher/launcher.cpp | 7 | ||||
-rw-r--r-- | core/launcher/main.cpp | 5 | ||||
-rw-r--r-- | core/launcher/opie-taskbar.control | 2 | ||||
-rw-r--r-- | core/launcher/runningappbar.cpp | 9 | ||||
-rw-r--r-- | core/launcher/startmenu.cpp | 3 | ||||
-rw-r--r-- | core/launcher/taskbar.cpp | 12 |
8 files changed, 186 insertions, 243 deletions
diff --git a/core/launcher/desktop.cpp b/core/launcher/desktop.cpp index 6c67056..fa9736f 100644 --- a/core/launcher/desktop.cpp +++ b/core/launcher/desktop.cpp @@ -29,91 +29,92 @@ #include "irserver.h" #include "packageslave.h" #include "screensaver.h" #include <qpe/applnk.h> #include <qpe/mimetype.h> #include <qpe/password.h> #include <qpe/config.h> #include <qpe/power.h> #include <qpe/timeconversion.h> #include <qpe/qcopenvelope_qws.h> #include <qpe/network.h> #include <qpe/global.h> #if defined( QT_QWS_SHARP ) || defined( QT_QWS_IPAQ ) #include <qpe/custom.h> #endif #include <opie/odevice.h> #include <qgfx_qws.h> #include <qmainwindow.h> #include <qmessagebox.h> #include <qtimer.h> #include <qwindowsystem_qws.h> #include <qvaluelist.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> + using namespace Opie; class QCopKeyRegister { public: QCopKeyRegister() : keyCode( 0 ) { } - QCopKeyRegister( int k, const QString &c, const QString &m ) + QCopKeyRegister( int k, const QCString &c, const QCString &m ) : keyCode( k ), channel( c ), message( m ) { } int getKeyCode() const { return keyCode; } - QString getChannel() const + QCString getChannel() const { return channel; } - QString getMessage() const + QCString getMessage() const { return message; } private: int keyCode; - QString channel, message; + QCString channel, message; }; typedef QValueList<QCopKeyRegister> KeyRegisterList; KeyRegisterList keyRegisterList; static Desktop* qpedesktop = 0; static int loggedin = 0; static void login( bool at_poweron ) { if ( !loggedin ) { Global::terminateBuiltin( "calibrate" ); Password::authenticate( at_poweron ); loggedin = 1; QCopEnvelope e( "QPE/Desktop", "unlocked()" ); } } bool Desktop::screenLocked() { return loggedin == 0; } /* Priority is number of alerts that are needed to pop up alert. */ class DesktopPowerAlerter : public QMessageBox { public: DesktopPowerAlerter( QWidget *parent, const char *name = 0 ) : QMessageBox( tr( "Battery Status" ), "Low Battery", QMessageBox::Critical, @@ -160,365 +161,382 @@ void DesktopApplication::switchLCD ( bool on ) if ( dapp-> m_screensaver ) { if ( on ) { dapp-> m_screensaver-> setDisplayState ( true ); dapp-> m_screensaver-> setBacklight ( -3 ); } else { dapp-> m_screensaver-> setDisplayState ( false ); } } } } DesktopApplication::DesktopApplication( int& argc, char **argv, Type appType ) : QPEApplication( argc, argv, appType ) { Config cfg( "apm" ); cfg.setGroup( "Warnings" ); //cfg.readNumEntry( "checkinterval", 10000 ) m_powerVeryLow = cfg.readNumEntry( "powerverylow", 10 ); m_powerCritical = cfg.readNumEntry( "powercritical", 5 ); m_ps = new PowerStatus; m_ps_last = new PowerStatus; pa = new DesktopPowerAlerter( 0 ); m_timer = new QTimer( this ); connect( m_timer, SIGNAL( timeout() ), this, SLOT( apmTimeout() ) ); m_timer->start( 5000 ); - channel = new QCopChannel( "QPE/Desktop", this ); - connect( channel, SIGNAL( received( const QCString&, const QByteArray& ) ), - this, SLOT( desktopMessage( const QCString&, const QByteArray& ) ) ); + m_last_button = 0; + m_button_timer = new QTimer ( ); + connect ( m_button_timer, SIGNAL( timeout ( )), this, SLOT( sendHeldAction ( ))); channel = new QCopChannel( "QPE/System", this ); connect( channel, SIGNAL( received( const QCString&, const QByteArray& ) ), this, SLOT( systemMessage( const QCString&, const QByteArray& ) ) ); + channel = new QCopChannel( "QPE/Launcher", this ); + connect( channel, SIGNAL( received( const QCString&, const QByteArray& ) ), + this, SLOT( launcherMessage( const QCString&, const QByteArray& ) ) ); + m_screensaver = new OpieScreenSaver ( ); m_screensaver-> setInterval ( -1 ); QWSServer::setScreenSaver( m_screensaver ); + rereadVolumes(); + connect( qApp, SIGNAL( volumeChanged( bool ) ), this, SLOT( rereadVolumes() ) ); + apmTimeout ( ); + + grabKeyboard ( ); } DesktopApplication::~DesktopApplication() { + ungrabKeyboard ( ); + delete m_ps; delete m_ps_last; delete pa; } void DesktopApplication::apmTimeout() { qpedesktop->checkMemory(); // in case no events are being generated *m_ps_last = *m_ps; *m_ps = PowerStatusManager::readStatus(); if ( m_ps-> acStatus ( ) != m_ps_last-> acStatus ( )) m_screensaver-> powerStatusChanged ( *m_ps ); if ( m_ps-> acStatus ( ) != PowerStatus::Online ) { int bat = m_ps-> batteryPercentRemaining ( ); if ( bat < m_ps_last-> batteryPercentRemaining ( )) { if ( bat <= m_powerCritical ) pa->alert( tr( "Battery level is critical!\nKeep power off until power restored!" ), 1 ); else if ( bat <= m_powerVeryLow ) pa->alert( tr( "Battery is running very low." ), 2 ); } if ( m_ps-> backupBatteryStatus ( ) == PowerStatus::VeryLow ) pa->alert( tr( "The Back-up battery is very low.\nPlease charge the back-up battery." ), 2 ); } } -void DesktopApplication::desktopMessage( 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 ) ); - } -} - void DesktopApplication::systemMessage( const QCString & msg, const QByteArray & data ) { QDataStream stream ( data, IO_ReadOnly ); if ( msg == "setScreenSaverInterval(int)" ) { int time; stream >> time; m_screensaver-> setInterval( time ); } else if ( msg == "setScreenSaverIntervals(int,int,int)" ) { int t1, t2, t3; stream >> t1 >> t2 >> t3; m_screensaver-> setIntervals( t1, t2, t3 ); } else if ( msg == "setBacklight(int)" ) { int bright; stream >> bright; m_screensaver-> setBacklight( bright ); } else if ( msg == "setScreenSaverMode(int)" ) { int mode; stream >> mode; m_screensaver-> setMode ( mode ); } else if ( msg == "reloadPowerWarnSettings()" ) { reloadPowerWarnSettings(); } else if ( msg == "setDisplayState(int)" ) { int state; stream >> state; m_screensaver-> setDisplayState ( state != 0 ); } else if ( msg == "suspend()" ) { emit power(); } + else if ( msg == "sendBusinessCard()" ) { + 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; + } + } } -void DesktopApplication::reloadPowerWarnSettings() { +void DesktopApplication::reloadPowerWarnSettings() +{ Config cfg( "apm" ); cfg.setGroup( "Warnings" ); // m_timer->changeInterval( cfg.readNumEntry( "checkinterval", 10000 ) ); m_powerVeryLow = cfg.readNumEntry( "powerverylow", 10 ); m_powerCritical = cfg.readNumEntry( "powervcritical", 5 ); } enum MemState { Unknown, VeryLow, Low, Normal } memstate = Unknown; -#ifdef Q_WS_QWS -bool DesktopApplication::qwsEventFilter( QWSEvent *e ) + +void DesktopApplication::launcherMessage( const QCString & msg, const QByteArray & data ) { - qpedesktop->checkMemory(); + QDataStream stream ( data, IO_ReadOnly ); - 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 ( msg == "deviceButton(int,int,int)" ) { + int keycode, press, autoRepeat; + stream >> keycode >> press >> autoRepeat; - /* - app that registers key/message to be sent back to the app, when it doesn't have focus, - when user presses key, unless keyboard has been requested from app. - will not send multiple repeats if user holds key - i.e. one shot - */ - if ( !keyRegisterList.isEmpty() && ke->simpleData.keycode !=0 && press) { -// qDebug("<<<<<<<<<<<<<keycode %d", ke->simpleData.keycode); - KeyRegisterList::Iterator it; - for ( it = keyRegisterList.begin(); it != keyRegisterList.end(); ++it ) { - if ( ( *it ).getKeyCode() == ke->simpleData.keycode && !autoRepeat && !keyboardGrabbed() ) { - if ( press ) - qDebug( "press" ); - else - qDebug( "release" ); - QCopEnvelope( ( *it ).getChannel().utf8(), ( *it ).getMessage().utf8() ); + const ODeviceButton *db = ODevice::inst ( )-> buttonForKeycode ( keycode ); + + if ( db ) + checkButtonAction ( db, keycode, press, autoRepeat ); } + else if ( msg == "keyRegister(int,QCString,QCString)" ) { + int k; + QCString c, m; + stream >> k >> c >> m; + + keyRegisterList.append ( QCopKeyRegister ( k, c, m )); } } - if ( !keyboardGrabbed() ) { - if ( ke->simpleData.keycode == Key_F9 ) { - if ( press ) - emit datebook(); - return TRUE; +void DesktopApplication::sendHeldAction ( ) +{ + if ( m_last_button ) { + m_last_button-> heldAction ( ). send ( ); + m_last_button = 0; } - 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() ) ); + + + +void DesktopApplication::checkButtonAction ( const ODeviceButton *db, int keycode, bool press, bool autoRepeat ) +{ + if ( db ) { + if ( !press && !autoRepeat && m_button_timer-> isActive ( )) { + m_button_timer-> stop ( ); + if ( !db-> pressedAction ( ). channel ( ). isEmpty ( )) { + db-> pressedAction ( ). send ( ); } - return TRUE; } + else if ( press && !autoRepeat ) { + m_button_timer-> stop ( ); - if ( ke->simpleData.keycode == Key_F11 ) { - if ( press ) emit menu(); - return TRUE; + if ( !db-> heldAction ( ). channel ( ). isEmpty ( )) { + m_last_button = db; + m_button_timer-> start ( ODevice::inst ( )-> buttonHoldTime ( ), true ); + } + } + } } - if ( ke->simpleData.keycode == Key_F12 ) { - while ( activePopupWidget() ) - activePopupWidget() ->close(); - if ( press ) - emit launch(); - return TRUE; +bool DesktopApplication::eventFilter ( QObject *o, QEvent *e ) +{ + if ( e-> type ( ) == QEvent::KeyPress || e-> type ( ) == QEvent::KeyRelease ) { + QKeyEvent *ke = (QKeyEvent *) e; + + const ODeviceButton *db = ODevice::inst ( )-> buttonForKeycode ( ke-> key ( )); + + if ( db ) { + checkButtonAction ( db, ke-> key ( ), e-> type ( ) == QEvent::KeyPress, ke-> isAutoRepeat ( )); + return true; + } + } + return QPEApplication::eventFilter ( o, e ); +} + +#ifdef Q_WS_QWS + +bool DesktopApplication::qwsEventFilter( QWSEvent *e ) +{ + qpedesktop->checkMemory(); + + if ( e->type == QWSEvent::Key ) { + QWSKeyEvent * ke = (QWSKeyEvent *) e; + ushort keycode = ke-> simpleData. keycode; + + if ( !loggedin && keycode != Key_F34 ) + return true; + + bool press = ke-> simpleData. is_press; + bool autoRepeat = ke-> simpleData. is_auto_repeat; + + if ( !keyboardGrabbed ( )) { + // app that registers key/message to be sent back to the app, when it doesn't have focus, + // when user presses key, unless keyboard has been requested from app. + // will not send multiple repeats if user holds key + // i.e. one shot + + if ( keycode != 0 && press && !autoRepeat ) { + for ( KeyRegisterList::Iterator it = keyRegisterList.begin(); it != keyRegisterList.end(); ++it ) { + if (( *it ). getKeyCode ( ) == keycode ) { + QCopEnvelope (( *it ). getChannel ( ), ( *it ). getMessage ( )); + return true; + } } - if ( ke->simpleData.keycode == Key_F13 ) { - if ( press ) - emit email(); - return TRUE; } } - if ( ke->simpleData.keycode == Key_F34 ) { + if ( keycode == HardKey_Suspend ) { if ( press ) emit power(); - return TRUE; + 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 ) { + else if ( keycode == HardKey_Backlight ) { if ( press ) emit backlight(); - return TRUE; + return true; } - if ( ke->simpleData.keycode == Key_F32 ) { + else if ( keycode == Key_F32 ) { if ( press ) QCopEnvelope e( "QPE/Desktop", "startSync()" ); - return TRUE; + return true; } - if ( ke->simpleData.keycode == Key_F31 && !ke->simpleData.modifiers ) { + else if ( keycode == Key_F31 && !ke-> simpleData. modifiers ) { // Symbol Key -> show Unicode IM if ( press ) emit symbol(); - return TRUE; + return true; } - if ( ke->simpleData.keycode == Key_NumLock ) { + else if ( keycode == Key_NumLock ) { if ( press ) emit numLockStateToggle(); } - if ( ke->simpleData.keycode == Key_CapsLock ) { + else if ( keycode == Key_CapsLock ) { if ( press ) emit capsLockStateToggle(); } - if ( ( press && !autoRepeat ) || ( !press && autoRepeat ) ) - qpedesktop->keyClick(); + if (( press && !autoRepeat ) || ( !press && autoRepeat )) { + if ( m_keyclick_sound ) + ODevice::inst ( )-> keySound ( ); } - else { - if ( e->type == QWSEvent::Mouse ) { + } + else if ( e-> type == QWSEvent::Mouse ) { QWSMouseEvent * me = ( QWSMouseEvent * ) e; - static bool up = TRUE; + static bool up = true; + if ( me->simpleData.state & LeftButton ) { if ( up ) { - up = FALSE; - qpedesktop->screenClick(); + up = false; + if ( m_screentap_sound ) + ODevice::inst ( ) -> touchSound ( ); } } else { - up = TRUE; - } + up = true; } } return QPEApplication::qwsEventFilter( e ); } #endif -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 //=========================================================================== Desktop::Desktop() : QWidget( 0, 0, WStyle_Tool | WStyle_Customize ), qcopBridge( 0 ), transferServer( 0 ), packageSlave( 0 ) { qpedesktop = this; // bg = new Info( this ); tb = new TaskBar; launcher = new Launcher( 0, 0, WStyle_Customize | QWidget::WGroupLeader ); connect( launcher, SIGNAL( busy() ), tb, SLOT( startWait() ) ); connect( launcher, SIGNAL( notBusy( const QString& ) ), tb, SLOT( stopWait( const QString& ) ) ); int displayw = qApp->desktop() ->width(); int displayh = qApp->desktop() ->height(); QSize sz = tb->sizeHint(); setGeometry( 0, displayh - sz.height(), displayw, sz.height() ); tb->setGeometry( 0, displayh - sz.height(), displayw, sz.height() ); tb->show(); launcher->showMaximized(); launcher->show(); launcher->raise(); #if defined(QPE_HAVE_MEMALERTER) initMemalerter(); #endif // start services startTransferServer(); ( void ) new IrServer( this ); - rereadVolumes(); packageSlave = new PackageSlave( this ); - connect( qApp, SIGNAL( volumeChanged( bool ) ), this, SLOT( rereadVolumes() ) ); qApp->installEventFilter( this ); qApp-> setMainWidget ( launcher ); } void Desktop::show() { login( TRUE ); QWidget::show(); } Desktop::~Desktop() { delete launcher; delete tb; delete qcopBridge; delete transferServer; } bool Desktop::recoverMemory() { return tb->recoverMemory(); } void Desktop::checkMemory() { #if defined(QPE_HAVE_MEMALERTER) static bool ignoreNormal = FALSE; static bool existingMessage = FALSE; if ( existingMessage ) @@ -554,208 +572,132 @@ void Desktop::checkMemory() recoverMemory(); } existingMessage = FALSE; #endif } static bool isVisibleWindow( int wid ) { #ifdef QWS const QList<QWSWindow> &list = qwsServer->clientWindows(); QWSWindow* w; for ( QListIterator<QWSWindow> it( list ); ( w = it.current() ); ++it ) { if ( w->winId() == wid ) return !w->isFullyObscured(); } #endif return FALSE; } static bool hasVisibleWindow( const QString& clientname ) { #ifdef QWS const QList<QWSWindow> &list = qwsServer->clientWindows(); QWSWindow* w; for ( QListIterator<QWSWindow> it( list ); ( w = it.current() ); ++it ) { if ( w->client() ->identity() == clientname && !w->isFullyObscured() ) return TRUE; } #endif return FALSE; } -void Desktop::raiseLauncher() -{ - Config cfg( "qpe" ); //F12 'Home' - cfg.setGroup( "AppsKey" ); - QString tempItem; - tempItem = cfg.readEntry( "Middle", "Home" ); - if ( tempItem == "Home" || tempItem.isEmpty() ) { - home ( ); - } - else { - QCopEnvelope e( "QPE/System", "execute(QString)" ); - e << tempItem; - } -} - -void Desktop::home ( ) -{ - if ( isVisibleWindow( launcher->winId() ) ) - launcher->nextView(); - else - launcher->raise(); -} void Desktop::executeOrModify( const QString& appLnkFile ) { AppLnk lnk( MimeType::appsFolderName() + "/" + appLnkFile ); if ( lnk.isValid() ) { QCString app = lnk.exec().utf8(); Global::terminateBuiltin( "calibrate" ); if ( QCopChannel::isRegistered( "QPE/Application/" + app ) ) { // MRUList::addTask( &lnk ); if ( hasVisibleWindow( app ) ) QCopChannel::send( "QPE/Application/" + app, "nextView()" ); else QCopChannel::send( "QPE/Application/" + app, "raise()" ); } else { lnk.execute(); } } } -void Desktop::raiseDatebook() -{ - Config cfg( "qpe" ); //F9 'Activity' - cfg.setGroup( "AppsKey" ); - QString tempItem; - tempItem = cfg.readEntry( "LeftEnd" , "Calendar" ); - if ( tempItem == "Calendar" || tempItem.isEmpty() ) { - tempItem = "datebook"; - } - QCopEnvelope e( "QPE/System", "execute(QString)" ); - e << tempItem; -} - -void Desktop::raiseContacts() -{ - Config cfg( "qpe" ); //F10, 'Contacts' - cfg.setGroup( "AppsKey" ); - QString tempItem; - tempItem = cfg.readEntry( "Left2nd", "Address Book" ); - if ( tempItem == "Address Book" || tempItem.isEmpty() ) { - tempItem = "addressbook"; - } - QCopEnvelope e( "QPE/System", "execute(QString)" ); - e << tempItem; -} - -void Desktop::raiseMenu() -{ - Config cfg( "qpe" ); //F11, 'Menu - cfg.setGroup( "AppsKey" ); - QString tempItem; - tempItem = cfg.readEntry( "Right2nd" , "Popup Menu" ); - if ( tempItem == "Popup Menu" || tempItem.isEmpty() ) { - Global::terminateBuiltin( "calibrate" ); - tb->startMenu() ->launch(); - } - else { - QCopEnvelope e( "QPE/System", "execute(QString)" ); - e << tempItem; - } -} - -void Desktop::raiseEmail() -{ - Config cfg( "qpe" ); //F13, 'Mail' // only in zaurus, on ipaq mail key is F11 - cfg.setGroup( "AppsKey" ); - QString tempItem; - tempItem = cfg.readEntry( "RightEnd", "Mail" ); - if ( tempItem == "Mail" || tempItem == "qtmail" || tempItem.isEmpty() ) { - tempItem = "mail"; - } - QCopEnvelope e( "QPE/System", "execute(QString)" ); - e << tempItem; -} - // autoStarts apps on resume and start void Desktop::execAutoStart() { QString appName; int delay; QDateTime now = QDateTime::currentDateTime(); Config cfg( "autostart" ); cfg.setGroup( "AutoStart" ); appName = cfg.readEntry( "Apps", "" ); delay = ( cfg.readEntry( "Delay", "0" ) ).toInt(); // If the time between suspend and resume was longer then the // value saved as delay, start the app if ( suspendTime.secsTo( now ) >= ( delay * 60 ) && !appName.isEmpty() ) { QCopEnvelope e( "QPE/System", "execute(QString)" ); e << QString( appName ); } } #if defined(QPE_HAVE_TOGGLELIGHT) #include <qpe/config.h> #include <sys/ioctl.h> #include <sys/types.h> #include <fcntl.h> #include <unistd.h> #include <errno.h> #include <linux/ioctl.h> #include <time.h> #endif void Desktop::togglePower() { static bool excllock = false; qDebug ( "togglePower (locked == %d)", excllock ? 1 : 0 ); if ( excllock ) return; excllock = true; bool wasloggedin = loggedin; loggedin = 0; suspendTime = QDateTime::currentDateTime(); #ifdef QWS + if ( Password::needToAuthenticate ( true ) && qt_screen ) { // Should use a big black window instead. // But this would not show up fast enough QGfx *g = qt_screen-> screenGfx ( ); g-> fillRect ( 0, 0, qt_screen-> width ( ), qt_screen-> height ( )); delete g; } #endif ODevice::inst ( )-> suspend ( ); DesktopApplication::switchLCD ( true ); // force LCD on without slow qcop call QWSServer::screenSaverActivate ( false ); { QCopEnvelope( "QPE/Card", "mtabChanged()" ); // might have changed while asleep } if ( wasloggedin ) login ( true ); execAutoStart(); //qcopBridge->closeOpenConnections(); excllock = false; } void Desktop::toggleLight() { QCopEnvelope e( "QPE/System", "setBacklight(int)" ); e << -2; // toggle } @@ -847,59 +789,53 @@ void DesktopApplication::restart() void Desktop::startTransferServer() { // start qcop bridge server qcopBridge = new QCopBridge( 4243 ); if ( !qcopBridge->ok() ) { delete qcopBridge; qcopBridge = 0; } // start transfer server transferServer = new TransferServer( 4242 ); if ( !transferServer->ok() ) { delete transferServer; transferServer = 0; } if ( !transferServer || !qcopBridge ) startTimer( 2000 ); } void Desktop::timerEvent( QTimerEvent *e ) { killTimer( e->timerId() ); startTransferServer(); } void Desktop::terminateServers() { delete transferServer; delete qcopBridge; transferServer = 0; qcopBridge = 0; } -void Desktop::rereadVolumes() +void DesktopApplication::rereadVolumes() { Config cfg( "qpe" ); cfg.setGroup( "Volume" ); - touchclick = cfg.readBoolEntry( "TouchSound" ); - keyclick = cfg.readBoolEntry( "KeySound" ); - alarmsound = cfg.readBoolEntry( "AlarmSound" ); -} -void Desktop::keyClick() -{ - if ( keyclick ) - ODevice::inst ( ) -> keySound ( ); + m_screentap_sound = cfg. readBoolEntry ( "TouchSound" ); + m_keyclick_sound = cfg. readBoolEntry ( "KeySound" ); + m_alarm_sound = cfg. readBoolEntry ( "AlarmSound" ); } -void Desktop::screenClick() +void DesktopApplication::soundAlarm() { - if ( touchclick ) - ODevice::inst ( ) -> touchSound ( ); + if ( me ( )-> m_alarm_sound ) + ODevice::inst ( )-> alarmSound ( ); } -void Desktop::soundAlarm() +DesktopApplication *DesktopApplication::me ( ) { - if ( qpedesktop-> alarmsound ) - ODevice::inst ( ) -> alarmSound ( ); + return (DesktopApplication *) qApp; } diff --git a/core/launcher/desktop.h b/core/launcher/desktop.h index 1f8daa0..6cb7ab2 100644 --- a/core/launcher/desktop.h +++ b/core/launcher/desktop.h @@ -1,152 +1,155 @@ /********************************************************************** ** 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. ** **********************************************************************/ #ifndef __DESKTOP_H__ #define __DESKTOP_H__ #include "shutdownimpl.h" #include <qpe/qpeapplication.h> +#include <opie/odevicebutton.h> #include <qwidget.h> #include <qdatetime.h> class Background; class Launcher; class TaskBar; class PowerStatus; class QCopBridge; class TransferServer; class DesktopPowerAlerter; class PackageSlave; class OpieScreenSaver; class DesktopApplication : public QPEApplication { Q_OBJECT public: DesktopApplication( int& argc, char **argv, Type t ); ~DesktopApplication(); static void switchLCD ( bool on ); // only for togglePower in Desktop + static void soundAlarm(); // only because QCop soundAlarm() is defined in QPE/TaskBar + signals: void menu(); void home(); - void datebook(); - void contacts(); void launch(); - void email(); void backlight(); void power(); void symbol(); void numLockStateToggle(); void capsLockStateToggle(); void prepareForRestart(); protected: #ifdef Q_WS_QWS bool qwsEventFilter( QWSEvent * ); #endif void shutdown(); void restart(); public slots: - virtual void desktopMessage ( const QCString &msg, const QByteArray &data ); virtual void systemMessage ( const QCString &msg, const QByteArray &data ); + virtual void launcherMessage ( const QCString &msg, const QByteArray &data ); + void rereadVolumes(); protected slots: void shutdown( ShutdownImpl::Type ); void apmTimeout(); - void sendCard(); + void sendHeldAction ( ); + +protected: + virtual bool eventFilter ( QObject *o, QEvent *e ); + void checkButtonAction ( const Opie::ODeviceButton *db, int keycode, bool press, bool autoRepeat ); + +private: + static DesktopApplication *me ( ); + private: void reloadPowerWarnSettings(); DesktopPowerAlerter *pa; PowerStatus *m_ps, *m_ps_last; QTimer *cardSendTimer; QCopChannel *channel; OpieScreenSaver *m_screensaver; QTimer * m_timer; int m_powerVeryLow; int m_powerCritical; int m_currentPowerLevel; + + const Opie::ODeviceButton *m_last_button; + QTimer *m_button_timer; + + bool m_keyclick_sound : 1; + bool m_screentap_sound : 1; + bool m_alarm_sound : 1; }; class Desktop : public QWidget { Q_OBJECT public: Desktop(); ~Desktop(); static bool screenLocked(); void show(); void checkMemory(); - void keyClick(); - void screenClick(); - static void soundAlarm(); - public slots: - void raiseDatebook(); - void raiseContacts(); - void raiseMenu(); - void raiseLauncher(); - void raiseEmail(); void execAutoStart(); void togglePower(); void toggleLight(); void toggleNumLockState(); void toggleCapsLockState(); void toggleSymbolInput(); void terminateServers(); - void rereadVolumes(); - - void home ( ); protected: void executeOrModify( const QString& appLnkFile ); void styleChange( QStyle & ); void timerEvent( QTimerEvent *e ); QWidget *bg; Launcher *launcher; TaskBar *tb; private: void startTransferServer(); bool recoverMemory(); QCopBridge *qcopBridge; TransferServer *transferServer; PackageSlave *packageSlave; QDateTime suspendTime; - bool keyclick, touchclick, alarmsound; }; #endif // __DESKTOP_H__ diff --git a/core/launcher/launcher.cpp b/core/launcher/launcher.cpp index 767efb2..6764338 100644 --- a/core/launcher/launcher.cpp +++ b/core/launcher/launcher.cpp @@ -1153,64 +1153,71 @@ void Launcher::launcherMessage( const QCString &msg, const QByteArray &data) if ( tabs->view(id) ) tabs->view(id)->setBackgroundType( (LauncherView::BackgroundType)mode, pixmapOrColor ); } else if ( msg == "setTextColor(QString,QString)" ) { QString id; stream >> id; QString color; stream >> color; if ( tabs->view(id) ) tabs->view(id)->setTextColor( QColor(color) ); } else if ( msg == "setFont(QString,QString,int,int,int)" ) { QString id; stream >> id; QString fam; stream >> fam; int size; stream >> size; int weight; stream >> weight; int italic; stream >> italic; if ( tabs->view(id) ) if ( !fam. isEmpty ( )) tabs->view(id)->setViewFont( QFont(fam, size, weight, italic!=0) ); else tabs->view(id)->unsetViewFont(); qDebug( "setFont: %s, %d, %d, %d", fam.latin1(), size, weight, italic ); } else if ( msg == "setBusyIndicatorType(QString)" ) { QString type; stream >> type; tabs->setBusyIndicatorType(type); } + else if ( msg == "home()" ) { + if ( isVisibleWindow( winId ( ))) + nextView ( ); + else + raise ( ); + + } } void Launcher::storageChanged() { if ( in_lnk_props ) { got_lnk_change = TRUE; lnk_change = QString::null; } else { updateLink( QString::null ); } } bool Launcher::mkdir(const QString &localPath) { QDir fullDir(localPath); if (fullDir.exists()) return true; // at this point the directory doesn't exist // go through the directory tree and start creating the direcotories // that don't exist; if we can't create the directories, return false QString dirSeps = "/"; int dirIndex = localPath.find(dirSeps); QString checkedPath; // didn't find any seps; weird, use the cur dir instead if (dirIndex == -1) { //qDebug("No seperators found in path %s", localPath.latin1()); checkedPath = QDir::currentDirPath(); } diff --git a/core/launcher/main.cpp b/core/launcher/main.cpp index 8b91f5d..49b41d6 100644 --- a/core/launcher/main.cpp +++ b/core/launcher/main.cpp @@ -63,69 +63,64 @@ void initEnvironment() config.writeEntry( "Timezone", tz); config.setGroup( "Language" ); QString lang = config.readEntry( "Language", getenv("LANG") ); if ( !lang.isNull() ) setenv( "LANG", lang, 1 ); } int initApplication( int argc, char ** argv ) { 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 ); ODevice::inst ( )-> setSoftSuspend ( true ); { // init backlight QCopEnvelope e("QPE/System", "setBacklight(int)" ); e << -3; // Forced on } AlarmServer::initialize(); Desktop *d = new Desktop(); - QObject::connect( &a, SIGNAL(menu()), d, SLOT(raiseMenu()) ); - 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(); if ( QDate::currentDate ( ). year ( ) < 2000 ) { if ( QMessageBox::information ( 0, DesktopApplication::tr( "Information" ), DesktopApplication::tr( "<p>The system date doesn't seem to be valid.\n(%1)</p><p>Do you want to correct the clock ?</p>" ). arg( TimeString::dateString ( QDate::currentDate ( ))), QMessageBox::Yes, QMessageBox::No ) == QMessageBox::Yes ) { QCopEnvelope e ( "QPE/Application/systemtime", "setDocument(QString)" ); e << QString ( ); } } int rv = a.exec(); delete d; diff --git a/core/launcher/opie-taskbar.control b/core/launcher/opie-taskbar.control index 13e5715..8bf2113 100644 --- a/core/launcher/opie-taskbar.control +++ b/core/launcher/opie-taskbar.control @@ -1,9 +1,9 @@ -Files: bin/qpe apps/Settings/Calibrate.desktop pics/launcher plugins/applets/libsuspendapplet.so* plugins/applets/libhomeapplet.so* plugins/applets/liblogoutapplet.so* +Files: bin/qpe apps/Settings/Calibrate.desktop pics/launcher pics/devicebuttons/*.png plugins/applets/libsuspendapplet.so* plugins/applets/libhomeapplet.so* plugins/applets/liblogoutapplet.so* Priority: required Section: opie/system Maintainer: Project Opie <opie@handhelds.org> Architecture: arm Version: $QPE_VERSION-$SUB_VERSION.1 Depends: qt-embedded (>=$QTE_VERSION) Description: Launcher for Opie The "finder" or "explorer", or whatever you want to call it. diff --git a/core/launcher/runningappbar.cpp b/core/launcher/runningappbar.cpp index 3ac66f2..356200b 100644 --- a/core/launcher/runningappbar.cpp +++ b/core/launcher/runningappbar.cpp @@ -95,73 +95,64 @@ void RunningAppBar::received(const QCString& msg, const QByteArray& data) // channel we need to watch for the showing/hiding events and update according. QDataStream stream( data, IO_ReadOnly ); if ( msg == "fastAppShowing(QString)") { QString appName; stream >> appName; addTask(*m_AppLnkSet->findExec(appName)); } else if ( msg == "fastAppHiding(QString)") { QString appName; stream >> appName; removeTask(*m_AppLnkSet->findExec(appName)); } } void RunningAppBar::addTask(const AppLnk& appLnk) { // qDebug("Added %s to app list.", appLnk.name().latin1()); AppLnk* newApp = new AppLnk(appLnk); newApp->setExec(appLnk.exec()); m_AppList.prepend(newApp); update(); } void RunningAppBar::removeTask(const AppLnk& appLnk) { unsigned int i = 0; for (; i < m_AppList.count() ; i++) { AppLnk* target = m_AppList.at(i); if (target->exec() == appLnk.exec()) { qDebug("Removing %s from app list.", appLnk.name().latin1()); m_AppList.remove(); - // grab the keyboard back, in case the app crashed/forgot - - QPEApplication *qpeapp = (QPEApplication *) qApp; - - if ( appLnk.exec() == qpeapp-> keyboardGrabbedBy ( )) { - qDebug ( "grabbing keyboard back from %s", appLnk.name().latin1()); - qpeapp-> grabKeyboard ( ); - } - delete target; } } update(); } void RunningAppBar::mousePressEvent(QMouseEvent *e) { // Find out if the user is clicking on an app icon... // If so, snag the index so when we repaint we show it // as highlighed. m_SelectedAppIndex = 0; int x = 0; QListIterator<AppLnk> it( m_AppList ); for ( ; it.current(); ++it, ++m_SelectedAppIndex, x += spacing ) { if ( x + spacing <= width() ) { if ( e->x() >= x && e->x() < x + spacing ) { if ( m_SelectedAppIndex < (int)m_AppList.count() ) { repaint(FALSE); return ; } } } else { break; } } m_SelectedAppIndex = -1; repaint( FALSE ); } void RunningAppBar::mouseReleaseEvent(QMouseEvent *e) diff --git a/core/launcher/startmenu.cpp b/core/launcher/startmenu.cpp index 88c6219..39e07c8 100644 --- a/core/launcher/startmenu.cpp +++ b/core/launcher/startmenu.cpp @@ -216,66 +216,67 @@ bool StartMenu::loadMenu( AppLnkSet *folder, QPopupMenu *menu ) pmenu = menu; } else { if ( !pmenu ) pmenu = menu; else pmenu = 0; } if ( pmenu ) { QString t = app->name(); t.replace(QRegExp("&"),"&&"); // escape shortcut character pmenu->insertItem( app->pixmap(), t, app->id() ); } result=TRUE; } } } if ( sepId && ( menu-> idAt ( 0 ) == sepId )) { // no tabs entries menu-> removeItem ( sepId ); sepId = 0; } if ( !menu-> count ( )) // if we don't do this QPopupMenu will insert a dummy Separator, which won't go away later sepId = menu-> insertSeparator ( ); return result; } void StartMenu::launch() { int y = mapToGlobal( QPoint() ).y() - launchMenu->sizeHint().height(); - if ( launchMenu->isVisible() ) + if ( launchMenu-> isVisible ( )) { launchMenu->hide(); + } else { QWidget *active = qApp->activeWindow(); if ( active && active->isPopup() ) active->close(); launchMenu->popup( QPoint( 1, y ) ); } } const AppLnk* StartMenu::execToLink(const QString& appname) { const AppLnk* a = apps->findExec( appname ); return a; } void StartPopupMenu::keyPressEvent( QKeyEvent *e ) { if ( e->key() == Key_F33 || e->key() == Key_Space ) { // "OK" button, little hacky QKeyEvent ke(QEvent::KeyPress, Key_Enter, 13, 0); QPopupMenu::keyPressEvent( &ke ); } else { QPopupMenu::keyPressEvent( e ); } } static int compareAppletPositions(const void *a, const void *b) { const MenuApplet* aa = *(const MenuApplet**)a; const MenuApplet* ab = *(const MenuApplet**)b; int d = aa->iface->position() - ab->iface->position(); if ( d ) return d; diff --git a/core/launcher/taskbar.cpp b/core/launcher/taskbar.cpp index b4b7df6..77035a3 100644 --- a/core/launcher/taskbar.cpp +++ b/core/launcher/taskbar.cpp @@ -251,78 +251,88 @@ void TaskBar::calcMaxWindowRect() } #if QT_VERSION < 300 QWSServer::setMaxWindowRect( qt_screen->mapToDevice(wr, QSize(qt_screen->width(),qt_screen->height())) ); #else QWSServer::setMaxWindowRect( wr ); #endif #endif } void TaskBar::receive( const QCString &msg, const QByteArray &data ) { QDataStream stream( data, IO_ReadOnly ); if ( msg == "message(QString)" ) { QString text; stream >> text; setStatusMessage( text ); } else if ( msg == "hideInputMethod()" ) { inputMethods->hideInputMethod(); } else if ( msg == "showInputMethod()" ) { inputMethods->showInputMethod(); } else if ( msg == "reloadInputMethods()" ) { inputMethods->loadInputMethods(); } else if ( msg == "reloadApps()" ) { sm->reloadApps(); } else if ( msg == "reloadApplets()" ) { sysTray->clearApplets(); sysTray->addApplets(); sm->reloadApplets(); } else if ( msg == "soundAlarm()" ) { - Desktop::soundAlarm(); + DesktopApplication::soundAlarm ( ); } else if ( msg == "setLed(int,bool)" ) { int led, status; stream >> led >> status; QValueList <OLed> ll = ODevice::inst ( )-> ledList ( ); if ( ll. count ( )) { OLed l = ll. contains ( Led_Mail ) ? Led_Mail : ll [0]; bool canblink = ODevice::inst ( )-> ledStateList ( l ). contains ( Led_BlinkSlow ); ODevice::inst ( )-> setLedState ( l, status ? ( canblink ? Led_BlinkSlow : Led_On ) : Led_Off ); } } + else if ( msg == "toggleMenu()" ) { + if ( sm-> launchMenu-> isVisible ( )) + sm-> launch ( ); + else { + QCopEnvelope e ( "QPE/System", "toggleApplicationMenu()" ); + } + } + else if ( msg == "toggleStartMenu()" ) { + sm-> launch ( ); + } } QWidget *TaskBar::calibrate(bool) { #ifdef Q_WS_QWS Calibrate *c = new Calibrate; c->show(); return c; #else return 0; #endif } void TaskBar::toggleNumLockState() { if ( lockState ) lockState->toggleNumLockState(); } void TaskBar::toggleCapsLockState() { if ( lockState ) lockState->toggleCapsLockState(); } void TaskBar::toggleSymbolInput() { if ( inputMethods->currentShown() == "Unicode" ) { inputMethods->hideInputMethod(); } else { inputMethods->showInputMethod("Unicode"); } } |