summaryrefslogtreecommitdiff
path: root/core/launcher/desktop.cpp
Side-by-side diff
Diffstat (limited to 'core/launcher/desktop.cpp') (more/less context) (show whitespace changes)
-rw-r--r--core/launcher/desktop.cpp352
1 files changed, 144 insertions, 208 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
@@ -49,51 +49,52 @@
#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 );
@@ -180,42 +181,53 @@ DesktopApplication::DesktopApplication( int& argc, char **argv, Type appType )
//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();
@@ -227,39 +239,24 @@ void DesktopApplication::apmTimeout()
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;
@@ -278,180 +275,203 @@ void DesktopApplication::systemMessage( const QCString & msg, const QByteArray &
}
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 )
@@ -477,28 +497,26 @@ Desktop::Desktop() :
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();
}
@@ -574,121 +592,44 @@ 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
@@ -718,24 +659,25 @@ void Desktop::togglePower()
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
@@ -867,39 +809,33 @@ 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;
}