summaryrefslogtreecommitdiff
path: root/core/launcher/desktop.cpp
Unidiff
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
@@ -58,6 +58,7 @@
58#include <unistd.h> 58#include <unistd.h>
59#include <fcntl.h> 59#include <fcntl.h>
60 60
61
61using namespace Opie; 62using namespace Opie;
62 63
63class QCopKeyRegister 64class QCopKeyRegister
@@ -65,7 +66,7 @@ class QCopKeyRegister
65public: 66public:
66 QCopKeyRegister() : keyCode( 0 ) 67 QCopKeyRegister() : keyCode( 0 )
67 { } 68 { }
68 QCopKeyRegister( int k, const QString &c, const QString &m ) 69 QCopKeyRegister( int k, const QCString &c, const QCString &m )
69 : keyCode( k ), channel( c ), message( m ) 70 : keyCode( k ), channel( c ), message( m )
70 { } 71 { }
71 72
@@ -73,18 +74,18 @@ public:
73 { 74 {
74 return keyCode; 75 return keyCode;
75 } 76 }
76 QString getChannel() const 77 QCString getChannel() const
77 { 78 {
78 return channel; 79 return channel;
79 } 80 }
80 QString getMessage() const 81 QCString getMessage() const
81 { 82 {
82 return message; 83 return message;
83 } 84 }
84 85
85private: 86private:
86 int keyCode; 87 int keyCode;
87 QString channel, message; 88 QCString channel, message;
88}; 89};
89 90
90typedef QValueList<QCopKeyRegister> KeyRegisterList; 91typedef QValueList<QCopKeyRegister> KeyRegisterList;
@@ -189,24 +190,35 @@ DesktopApplication::DesktopApplication( int& argc, char **argv, Type appType )
189 connect( m_timer, SIGNAL( timeout() ), this, SLOT( apmTimeout() ) ); 190 connect( m_timer, SIGNAL( timeout() ), this, SLOT( apmTimeout() ) );
190 m_timer->start( 5000 ); 191 m_timer->start( 5000 );
191 192
192 channel = new QCopChannel( "QPE/Desktop", this ); 193 m_last_button = 0;
193 connect( channel, SIGNAL( received( const QCString&, const QByteArray& ) ), 194 m_button_timer = new QTimer ( );
194 this, SLOT( desktopMessage( const QCString&, const QByteArray& ) ) ); 195 connect ( m_button_timer, SIGNAL( timeout ( )), this, SLOT( sendHeldAction ( )));
195 196
196 channel = new QCopChannel( "QPE/System", this ); 197 channel = new QCopChannel( "QPE/System", this );
197 connect( channel, SIGNAL( received( const QCString&, const QByteArray& ) ), 198 connect( channel, SIGNAL( received( const QCString&, const QByteArray& ) ),
198 this, SLOT( systemMessage( const QCString&, const QByteArray& ) ) ); 199 this, SLOT( systemMessage( const QCString&, const QByteArray& ) ) );
199 200
201 channel = new QCopChannel( "QPE/Launcher", this );
202 connect( channel, SIGNAL( received( const QCString&, const QByteArray& ) ),
203 this, SLOT( launcherMessage( const QCString&, const QByteArray& ) ) );
204
200 m_screensaver = new OpieScreenSaver ( ); 205 m_screensaver = new OpieScreenSaver ( );
201 m_screensaver-> setInterval ( -1 ); 206 m_screensaver-> setInterval ( -1 );
202 QWSServer::setScreenSaver( m_screensaver ); 207 QWSServer::setScreenSaver( m_screensaver );
203 208
209 rereadVolumes();
210 connect( qApp, SIGNAL( volumeChanged( bool ) ), this, SLOT( rereadVolumes() ) );
211
204 apmTimeout ( ); 212 apmTimeout ( );
213
214 grabKeyboard ( );
205} 215}
206 216
207 217
208DesktopApplication::~DesktopApplication() 218DesktopApplication::~DesktopApplication()
209{ 219{
220 ungrabKeyboard ( );
221
210 delete m_ps; 222 delete m_ps;
211 delete m_ps_last; 223 delete m_ps_last;
212 delete pa; 224 delete pa;
@@ -236,21 +248,6 @@ void DesktopApplication::apmTimeout()
236 } 248 }
237} 249}
238 250
239void DesktopApplication::desktopMessage( const QCString &msg, const QByteArray &data )
240{
241 QDataStream stream( data, IO_ReadOnly );
242 if ( msg == "keyRegister(int key, QString channel, QString message)" ) {
243 int k;
244 QString c, m;
245 stream >> k;
246 stream >> c;
247 stream >> m;
248
249 qWarning( "KeyRegisterReceived: %i, %s, %s", k, ( const char* ) c, ( const char * ) m );
250 keyRegisterList.append( QCopKeyRegister( k, c, m ) );
251 }
252}
253
254 251
255void DesktopApplication::systemMessage( const QCString & msg, const QByteArray & data ) 252void DesktopApplication::systemMessage( const QCString & msg, const QByteArray & data )
256{ 253{
@@ -287,9 +284,20 @@ void DesktopApplication::systemMessage( const QCString & msg, const QByteArray &
287 else if ( msg == "suspend()" ) { 284 else if ( msg == "suspend()" ) {
288 emit power(); 285 emit power();
289 } 286 }
287 else if ( msg == "sendBusinessCard()" ) {
288 QString card = ::getenv ( "HOME" );
289 card += "/Applications/addressbook/businesscard.vcf";
290
291 if ( QFile::exists( card ) ) {
292 QCopEnvelope e ( "QPE/Obex", "send(QString,QString,QString)" );
293 QString mimetype = "text/x-vCard";
294 e << tr( "business card" ) << card << mimetype;
295 }
296 }
290} 297}
291 298
292void DesktopApplication::reloadPowerWarnSettings() { 299void DesktopApplication::reloadPowerWarnSettings()
300{
293 Config cfg( "apm" ); 301 Config cfg( "apm" );
294 cfg.setGroup( "Warnings" ); 302 cfg.setGroup( "Warnings" );
295 303
@@ -301,127 +309,152 @@ void DesktopApplication::reloadPowerWarnSettings() {
301 309
302enum MemState { Unknown, VeryLow, Low, Normal } memstate = Unknown; 310enum MemState { Unknown, VeryLow, Low, Normal } memstate = Unknown;
303 311
304#ifdef Q_WS_QWS 312
305bool DesktopApplication::qwsEventFilter( QWSEvent *e ) 313void DesktopApplication::launcherMessage( const QCString & msg, const QByteArray & data )
306{ 314{
307 qpedesktop->checkMemory(); 315 QDataStream stream ( data, IO_ReadOnly );
308 316
309 if ( e->type == QWSEvent::Key ) { 317 if ( msg == "deviceButton(int,int,int)" ) {
310 QWSKeyEvent * ke = ( QWSKeyEvent * ) e; 318 int keycode, press, autoRepeat;
311 if ( !loggedin && ke->simpleData.keycode != Key_F34 ) 319 stream >> keycode >> press >> autoRepeat;
312 return TRUE;
313 bool press = ke->simpleData.is_press;
314 bool autoRepeat = ke->simpleData.is_auto_repeat;
315 320
316 /* 321 const ODeviceButton *db = ODevice::inst ( )-> buttonForKeycode ( keycode );
317 app that registers key/message to be sent back to the app, when it doesn't have focus, 322
318 when user presses key, unless keyboard has been requested from app. 323 if ( db )
319 will not send multiple repeats if user holds key 324 checkButtonAction ( db, keycode, press, autoRepeat );
320 i.e. one shot
321 */
322 if ( !keyRegisterList.isEmpty() && ke->simpleData.keycode !=0 && press) {
323// qDebug("<<<<<<<<<<<<<keycode %d", ke->simpleData.keycode);
324 KeyRegisterList::Iterator it;
325 for ( it = keyRegisterList.begin(); it != keyRegisterList.end(); ++it ) {
326 if ( ( *it ).getKeyCode() == ke->simpleData.keycode && !autoRepeat && !keyboardGrabbed() ) {
327 if ( press )
328 qDebug( "press" );
329 else
330 qDebug( "release" );
331 QCopEnvelope( ( *it ).getChannel().utf8(), ( *it ).getMessage().utf8() );
332 } 325 }
326 else if ( msg == "keyRegister(int,QCString,QCString)" ) {
327 int k;
328 QCString c, m;
329 stream >> k >> c >> m;
330
331 keyRegisterList.append ( QCopKeyRegister ( k, c, m ));
333 } 332 }
334 } 333 }
335 334
336 if ( !keyboardGrabbed() ) { 335void DesktopApplication::sendHeldAction ( )
337 if ( ke->simpleData.keycode == Key_F9 ) { 336{
338 if ( press ) 337 if ( m_last_button ) {
339 emit datebook(); 338 m_last_button-> heldAction ( ). send ( );
340 return TRUE; 339 m_last_button = 0;
341 } 340 }
342 if ( ke->simpleData.keycode == Key_F10 ) {
343 if ( !press && cardSendTimer ) {
344 emit contacts();
345 delete cardSendTimer;
346 } 341 }
347 else if ( press ) { 342
348 cardSendTimer = new QTimer(); 343
349 cardSendTimer->start( 2000, TRUE ); 344
350 connect( cardSendTimer, SIGNAL( timeout() ), this, SLOT( sendCard() ) ); 345void DesktopApplication::checkButtonAction ( const ODeviceButton *db, int keycode, bool press, bool autoRepeat )
346 {
347 if ( db ) {
348 if ( !press && !autoRepeat && m_button_timer-> isActive ( )) {
349 m_button_timer-> stop ( );
350 if ( !db-> pressedAction ( ). channel ( ). isEmpty ( )) {
351 db-> pressedAction ( ). send ( );
351 } 352 }
352 return TRUE;
353 } 353 }
354 else if ( press && !autoRepeat ) {
355 m_button_timer-> stop ( );
354 356
355 if ( ke->simpleData.keycode == Key_F11 ) { 357 if ( !db-> heldAction ( ). channel ( ). isEmpty ( )) {
356 if ( press ) emit menu(); 358 m_last_button = db;
357 return TRUE; 359 m_button_timer-> start ( ODevice::inst ( )-> buttonHoldTime ( ), true );
360 }
361 }
362 }
358 } 363 }
359 364
360 if ( ke->simpleData.keycode == Key_F12 ) { 365bool DesktopApplication::eventFilter ( QObject *o, QEvent *e )
361 while ( activePopupWidget() ) 366{
362 activePopupWidget() ->close(); 367 if ( e-> type ( ) == QEvent::KeyPress || e-> type ( ) == QEvent::KeyRelease ) {
363 if ( press ) 368 QKeyEvent *ke = (QKeyEvent *) e;
364 emit launch(); 369
365 return TRUE; 370 const ODeviceButton *db = ODevice::inst ( )-> buttonForKeycode ( ke-> key ( ));
371
372 if ( db ) {
373 checkButtonAction ( db, ke-> key ( ), e-> type ( ) == QEvent::KeyPress, ke-> isAutoRepeat ( ));
374 return true;
375 }
376 }
377 return QPEApplication::eventFilter ( o, e );
378}
379
380#ifdef Q_WS_QWS
381
382bool DesktopApplication::qwsEventFilter( QWSEvent *e )
383{
384 qpedesktop->checkMemory();
385
386 if ( e->type == QWSEvent::Key ) {
387 QWSKeyEvent * ke = (QWSKeyEvent *) e;
388 ushort keycode = ke-> simpleData. keycode;
389
390 if ( !loggedin && keycode != Key_F34 )
391 return true;
392
393 bool press = ke-> simpleData. is_press;
394 bool autoRepeat = ke-> simpleData. is_auto_repeat;
395
396 if ( !keyboardGrabbed ( )) {
397 // app that registers key/message to be sent back to the app, when it doesn't have focus,
398 // when user presses key, unless keyboard has been requested from app.
399 // will not send multiple repeats if user holds key
400 // i.e. one shot
401
402 if ( keycode != 0 && press && !autoRepeat ) {
403 for ( KeyRegisterList::Iterator it = keyRegisterList.begin(); it != keyRegisterList.end(); ++it ) {
404 if (( *it ). getKeyCode ( ) == keycode ) {
405 QCopEnvelope (( *it ). getChannel ( ), ( *it ). getMessage ( ));
406 return true;
407 }
366 } 408 }
367 if ( ke->simpleData.keycode == Key_F13 ) {
368 if ( press )
369 emit email();
370 return TRUE;
371 } 409 }
372 } 410 }
373 411
374 if ( ke->simpleData.keycode == Key_F34 ) { 412 if ( keycode == HardKey_Suspend ) {
375 if ( press ) 413 if ( press )
376 emit power(); 414 emit power();
377 return TRUE; 415 return true;
378 } 416 }
379 // This was used for the iPAQ PowerButton 417 else if ( keycode == HardKey_Backlight ) {
380 // See main.cpp for new KeyboardFilter
381 //
382 // if ( ke->simpleData.keycode == Key_SysReq ) {
383 // if ( press ) emit power();
384 // return TRUE;
385 // }
386 if ( ke->simpleData.keycode == Key_F35 ) {
387 if ( press ) 418 if ( press )
388 emit backlight(); 419 emit backlight();
389 return TRUE; 420 return true;
390 } 421 }
391 if ( ke->simpleData.keycode == Key_F32 ) { 422 else if ( keycode == Key_F32 ) {
392 if ( press ) 423 if ( press )
393 QCopEnvelope e( "QPE/Desktop", "startSync()" ); 424 QCopEnvelope e( "QPE/Desktop", "startSync()" );
394 return TRUE; 425 return true;
395 } 426 }
396 if ( ke->simpleData.keycode == Key_F31 && !ke->simpleData.modifiers ) { 427 else if ( keycode == Key_F31 && !ke-> simpleData. modifiers ) { // Symbol Key -> show Unicode IM
397 if ( press ) 428 if ( press )
398 emit symbol(); 429 emit symbol();
399 return TRUE; 430 return true;
400 } 431 }
401 if ( ke->simpleData.keycode == Key_NumLock ) { 432 else if ( keycode == Key_NumLock ) {
402 if ( press ) 433 if ( press )
403 emit numLockStateToggle(); 434 emit numLockStateToggle();
404 } 435 }
405 if ( ke->simpleData.keycode == Key_CapsLock ) { 436 else if ( keycode == Key_CapsLock ) {
406 if ( press ) 437 if ( press )
407 emit capsLockStateToggle(); 438 emit capsLockStateToggle();
408 } 439 }
409 if ( ( press && !autoRepeat ) || ( !press && autoRepeat ) ) 440 if (( press && !autoRepeat ) || ( !press && autoRepeat )) {
410 qpedesktop->keyClick(); 441 if ( m_keyclick_sound )
442 ODevice::inst ( )-> keySound ( );
411 } 443 }
412 else { 444 }
413 if ( e->type == QWSEvent::Mouse ) { 445 else if ( e-> type == QWSEvent::Mouse ) {
414 QWSMouseEvent * me = ( QWSMouseEvent * ) e; 446 QWSMouseEvent * me = ( QWSMouseEvent * ) e;
415 static bool up = TRUE; 447 static bool up = true;
448
416 if ( me->simpleData.state & LeftButton ) { 449 if ( me->simpleData.state & LeftButton ) {
417 if ( up ) { 450 if ( up ) {
418 up = FALSE; 451 up = false;
419 qpedesktop->screenClick(); 452 if ( m_screentap_sound )
453 ODevice::inst ( ) -> touchSound ( );
420 } 454 }
421 } 455 }
422 else { 456 else {
423 up = TRUE; 457 up = true;
424 }
425 } 458 }
426 } 459 }
427 460
@@ -430,19 +463,6 @@ bool DesktopApplication::qwsEventFilter( QWSEvent *e )
430#endif 463#endif
431 464
432 465
433void DesktopApplication::sendCard()
434{
435 delete cardSendTimer;
436 cardSendTimer = 0;
437 QString card = getenv( "HOME" );
438 card += "/Applications/addressbook/businesscard.vcf";
439
440 if ( QFile::exists( card ) ) {
441 QCopEnvelope e( "QPE/Obex", "send(QString,QString,QString)" );
442 QString mimetype = "text/x-vCard";
443 e << tr( "business card" ) << card << mimetype;
444 }
445}
446 466
447#if defined(QPE_HAVE_MEMALERTER) 467#if defined(QPE_HAVE_MEMALERTER)
448QPE_MEMALERTER_IMPL 468QPE_MEMALERTER_IMPL
@@ -486,10 +506,8 @@ Desktop::Desktop() :
486 // start services 506 // start services
487 startTransferServer(); 507 startTransferServer();
488 ( void ) new IrServer( this ); 508 ( void ) new IrServer( this );
489 rereadVolumes();
490 509
491 packageSlave = new PackageSlave( this ); 510 packageSlave = new PackageSlave( this );
492 connect( qApp, SIGNAL( volumeChanged( bool ) ), this, SLOT( rereadVolumes() ) );
493 511
494 qApp->installEventFilter( this ); 512 qApp->installEventFilter( this );
495 513
@@ -583,28 +601,6 @@ static bool hasVisibleWindow( const QString& clientname )
583 return FALSE; 601 return FALSE;
584} 602}
585 603
586void Desktop::raiseLauncher()
587{
588 Config cfg( "qpe" ); //F12 'Home'
589 cfg.setGroup( "AppsKey" );
590 QString tempItem;
591 tempItem = cfg.readEntry( "Middle", "Home" );
592 if ( tempItem == "Home" || tempItem.isEmpty() ) {
593 home ( );
594 }
595 else {
596 QCopEnvelope e( "QPE/System", "execute(QString)" );
597 e << tempItem;
598 }
599}
600
601void Desktop::home ( )
602{
603 if ( isVisibleWindow( launcher->winId() ) )
604 launcher->nextView();
605 else
606 launcher->raise();
607}
608 604
609void Desktop::executeOrModify( const QString& appLnkFile ) 605void Desktop::executeOrModify( const QString& appLnkFile )
610{ 606{
@@ -625,61 +621,6 @@ void Desktop::executeOrModify( const QString& appLnkFile )
625 } 621 }
626} 622}
627 623
628void Desktop::raiseDatebook()
629{
630 Config cfg( "qpe" ); //F9 'Activity'
631 cfg.setGroup( "AppsKey" );
632 QString tempItem;
633 tempItem = cfg.readEntry( "LeftEnd" , "Calendar" );
634 if ( tempItem == "Calendar" || tempItem.isEmpty() ) {
635 tempItem = "datebook";
636 }
637 QCopEnvelope e( "QPE/System", "execute(QString)" );
638 e << tempItem;
639}
640
641void Desktop::raiseContacts()
642{
643 Config cfg( "qpe" ); //F10, 'Contacts'
644 cfg.setGroup( "AppsKey" );
645 QString tempItem;
646 tempItem = cfg.readEntry( "Left2nd", "Address Book" );
647 if ( tempItem == "Address Book" || tempItem.isEmpty() ) {
648 tempItem = "addressbook";
649 }
650 QCopEnvelope e( "QPE/System", "execute(QString)" );
651 e << tempItem;
652}
653
654void Desktop::raiseMenu()
655{
656 Config cfg( "qpe" ); //F11, 'Menu
657 cfg.setGroup( "AppsKey" );
658 QString tempItem;
659 tempItem = cfg.readEntry( "Right2nd" , "Popup Menu" );
660 if ( tempItem == "Popup Menu" || tempItem.isEmpty() ) {
661 Global::terminateBuiltin( "calibrate" );
662 tb->startMenu() ->launch();
663 }
664 else {
665 QCopEnvelope e( "QPE/System", "execute(QString)" );
666 e << tempItem;
667 }
668}
669
670void Desktop::raiseEmail()
671{
672 Config cfg( "qpe" ); //F13, 'Mail' // only in zaurus, on ipaq mail key is F11
673 cfg.setGroup( "AppsKey" );
674 QString tempItem;
675 tempItem = cfg.readEntry( "RightEnd", "Mail" );
676 if ( tempItem == "Mail" || tempItem == "qtmail" || tempItem.isEmpty() ) {
677 tempItem = "mail";
678 }
679 QCopEnvelope e( "QPE/System", "execute(QString)" );
680 e << tempItem;
681}
682
683// autoStarts apps on resume and start 624// autoStarts apps on resume and start
684void Desktop::execAutoStart() 625void Desktop::execAutoStart()
685{ 626{
@@ -727,6 +668,7 @@ void Desktop::togglePower()
727 suspendTime = QDateTime::currentDateTime(); 668 suspendTime = QDateTime::currentDateTime();
728 669
729#ifdef QWS 670#ifdef QWS
671
730 if ( Password::needToAuthenticate ( true ) && qt_screen ) { 672 if ( Password::needToAuthenticate ( true ) && qt_screen ) {
731 // Should use a big black window instead. 673 // Should use a big black window instead.
732 // But this would not show up fast enough 674 // But this would not show up fast enough
@@ -876,30 +818,24 @@ void Desktop::terminateServers()
876 qcopBridge = 0; 818 qcopBridge = 0;
877} 819}
878 820
879void Desktop::rereadVolumes() 821void DesktopApplication::rereadVolumes()
880{ 822{
881 Config cfg( "qpe" ); 823 Config cfg( "qpe" );
882 cfg.setGroup( "Volume" ); 824 cfg.setGroup( "Volume" );
883 touchclick = cfg.readBoolEntry( "TouchSound" );
884 keyclick = cfg.readBoolEntry( "KeySound" );
885 alarmsound = cfg.readBoolEntry( "AlarmSound" );
886}
887 825
888void Desktop::keyClick() 826 m_screentap_sound = cfg. readBoolEntry ( "TouchSound" );
889{ 827 m_keyclick_sound = cfg. readBoolEntry ( "KeySound" );
890 if ( keyclick ) 828 m_alarm_sound = cfg. readBoolEntry ( "AlarmSound" );
891 ODevice::inst ( ) -> keySound ( );
892} 829}
893 830
894void Desktop::screenClick() 831void DesktopApplication::soundAlarm()
895{ 832{
896 if ( touchclick ) 833 if ( me ( )-> m_alarm_sound )
897 ODevice::inst ( ) -> touchSound ( ); 834 ODevice::inst ( )-> alarmSound ( );
898} 835}
899 836
900void Desktop::soundAlarm() 837DesktopApplication *DesktopApplication::me ( )
901{ 838{
902 if ( qpedesktop-> alarmsound ) 839 return (DesktopApplication *) qApp;
903 ODevice::inst ( ) -> alarmSound ( );
904} 840}
905 841