summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/launcher/serverapp.cpp106
1 files changed, 58 insertions, 48 deletions
diff --git a/core/launcher/serverapp.cpp b/core/launcher/serverapp.cpp
index f1bce40..a2302d8 100644
--- a/core/launcher/serverapp.cpp
+++ b/core/launcher/serverapp.cpp
@@ -49,44 +49,50 @@ using namespace Opie::Core;
49#ifdef Q_OS_WIN32 49#ifdef Q_OS_WIN32
50#include <io.h> 50#include <io.h>
51#include <process.h> 51#include <process.h>
52#else 52#else
53#include <unistd.h> 53#include <unistd.h>
54#endif 54#endif
55#include <stdlib.h> 55#include <stdlib.h>
56 56
57static ServerApplication *serverApp = 0; 57static ServerApplication *serverApp = 0;
58static int loggedin=0; 58static int loggedin=0;
59 59
60QCopKeyRegister::QCopKeyRegister() 60QCopKeyRegister::QCopKeyRegister()
61 : m_keyCode( 0 ) { 61 : m_keyCode( 0 )
62{
62} 63}
63 64
64QCopKeyRegister::QCopKeyRegister( int k, const QCString& c, const QCString& m ) 65QCopKeyRegister::QCopKeyRegister( int k, const QCString& c, const QCString& m )
65 :m_keyCode( k ), m_channel( c ), m_message( m ) { 66 :m_keyCode( k ), m_channel( c ), m_message( m )
67{
66} 68}
67 69
68int QCopKeyRegister::keyCode()const { 70int QCopKeyRegister::keyCode() const
71{
69 return m_keyCode; 72 return m_keyCode;
70} 73}
71 74
72QCString QCopKeyRegister::channel()const { 75QCString QCopKeyRegister::channel() const
76{
73 return m_channel; 77 return m_channel;
74} 78}
75 79
76QCString QCopKeyRegister::message()const { 80QCString QCopKeyRegister::message() const
81{
77 return m_message; 82 return m_message;
78} 83}
79 84
80bool QCopKeyRegister::send() { 85bool QCopKeyRegister::send()
86{
81 if (m_channel.isNull() ) 87 if (m_channel.isNull() )
82 return false; 88 return false;
83 89
84 QCopEnvelope( m_channel, m_message ); 90 QCopEnvelope( m_channel, m_message );
85 91
86 return true; 92 return true;
87} 93}
88 94
89//--------------------------------------------------------------------------- 95//---------------------------------------------------------------------------
90 96
91/* 97/*
92 Priority is number of alerts that are needed to pop up 98 Priority is number of alerts that are needed to pop up
@@ -148,64 +154,65 @@ void KeyFilter::timerEvent(QTimerEvent* e)
148{ 154{
149 if ( e->timerId() == held_tid ) { 155 if ( e->timerId() == held_tid ) {
150 killTimer(held_tid); 156 killTimer(held_tid);
151 // button held 157 // button held
152 if ( heldButton ) { 158 if ( heldButton ) {
153 emit activate(heldButton, TRUE); 159 emit activate(heldButton, TRUE);
154 heldButton = 0; 160 heldButton = 0;
155 } 161 }
156 held_tid = 0; 162 held_tid = 0;
157 } 163 }
158} 164}
159 165
160void KeyFilter::registerKey( const QCopKeyRegister& key ) { 166void KeyFilter::registerKey( const QCopKeyRegister& key )
167{
161 m_keys.insert( key.keyCode(), key ); 168 m_keys.insert( key.keyCode(), key );
162} 169}
163 170
164void KeyFilter::unregisterKey( const QCopKeyRegister& key ) { 171void KeyFilter::unregisterKey( const QCopKeyRegister& key )
172{
165 m_keys.remove( key.keyCode() ); 173 m_keys.remove( key.keyCode() );
166} 174}
167 175
168bool KeyFilter::keyRegistered( int key ) { 176bool KeyFilter::keyRegistered( int key )
177{
169 /* 178 /*
170 * Check if we've a key registered 179 * Check if we've a key registered
171 */ 180 */
172 if ( !m_keys[key].send()) 181 if ( !m_keys[key].send())
173 return false; 182 return false;
174 else 183 else
175 return true; 184 return true;
176
177} 185}
178 186
179bool KeyFilter::checkButtonAction(bool db, int keycode, int press, int autoRepeat) 187bool KeyFilter::checkButtonAction(bool db, int keycode, int press, int autoRepeat)
180{ 188{
181 if ( !loggedin 189 if ( !loggedin
182 // Permitted keys 190 // Permitted keys
183 && keycode != Key_F34 // power 191 && keycode != Key_F34 // power
184 && keycode != Key_F30 // select 192 && keycode != Key_F30 // select
185 && keycode != Key_Enter 193 && keycode != Key_Enter
186 && keycode != Key_Return 194 && keycode != Key_Return
187 && keycode != Key_Space 195 && keycode != Key_Space
188 && keycode != Key_Left 196 && keycode != Key_Left
189 && keycode != Key_Right 197 && keycode != Key_Right
190 && keycode != Key_Up 198 && keycode != Key_Up
191 && keycode != Key_Down ) 199 && keycode != Key_Down )
192 return TRUE; 200 return TRUE;
193 201
194 /* check if it was registered */ 202 /* check if it was registered */
195 if (!db ) { 203 if (!db ) {
196 if (keycode != 0 &&press && !autoRepeat && keyRegistered(keycode) ) 204 if (keycode != 0 &&press && !autoRepeat && keyRegistered(keycode) )
197 return true; 205 return true;
198 }else { 206 } else {
199
200 207
201 // First check to see if DeviceButtonManager knows something about this button: 208 // First check to see if DeviceButtonManager knows something about this button:
202 const ODeviceButton* button = ODevice::inst()->buttonForKeycode(keycode); 209 const ODeviceButton* button = ODevice::inst()->buttonForKeycode(keycode);
203 if (button && !autoRepeat) { 210 if (button && !autoRepeat) {
204 if ( held_tid ) { 211 if ( held_tid ) {
205 killTimer(held_tid); 212 killTimer(held_tid);
206 held_tid = 0; 213 held_tid = 0;
207 } 214 }
208 if ( button->heldAction().isNull() ) { 215 if ( button->heldAction().isNull() ) {
209 if ( press ) 216 if ( press )
210 emit activate(button, FALSE); 217 emit activate(button, FALSE);
211 } else if ( press ) { 218 } else if ( press ) {
@@ -257,37 +264,38 @@ enum MemState { MemUnknown, MemVeryLow, MemLow, MemNormal } memstate=MemUnknown;
257#if defined(QPE_HAVE_MEMALERTER) 264#if defined(QPE_HAVE_MEMALERTER)
258QPE_MEMALERTER_IMPL 265QPE_MEMALERTER_IMPL
259#endif 266#endif
260 267
261 268
262 269
263//--------------------------------------------------------------------------- 270//---------------------------------------------------------------------------
264 271
265bool ServerApplication::doRestart = FALSE; 272bool ServerApplication::doRestart = FALSE;
266bool ServerApplication::allowRestart = TRUE; 273bool ServerApplication::allowRestart = TRUE;
267bool ServerApplication::ms_is_starting = TRUE; 274bool ServerApplication::ms_is_starting = TRUE;
268 275
269void ServerApplication::switchLCD( bool on ) { 276void ServerApplication::switchLCD( bool on )
277{
270 if ( !qApp ) 278 if ( !qApp )
271 return; 279 return;
272 280
273 ServerApplication *dapp = ServerApplication::me() ; 281 ServerApplication *dapp = ServerApplication::me() ;
274 282
275 if ( !dapp-> m_screensaver ) 283 if ( !dapp-> m_screensaver )
276 return; 284 return;
277 285
278 if ( on ) { 286 if ( on ) {
279 dapp-> m_screensaver-> setDisplayState ( true ); 287 dapp-> m_screensaver-> setDisplayState ( true );
280 dapp-> m_screensaver-> setBacklight ( -3 ); 288 dapp-> m_screensaver-> setBacklight ( -3 );
281 }else 289 } else
282 dapp-> m_screensaver-> setDisplayState ( false ); 290 dapp-> m_screensaver-> setDisplayState ( false );
283 291
284 292
285} 293}
286 294
287ServerApplication::ServerApplication( int& argc, char **argv, Type t ) 295ServerApplication::ServerApplication( int& argc, char **argv, Type t )
288 : QPEApplication( argc, argv, t ) 296 : QPEApplication( argc, argv, t )
289{ 297{
290 ms_is_starting = true; 298 ms_is_starting = true;
291 299
292 // We know we'll have lots of cached pixmaps due to App/DocLnks 300 // We know we'll have lots of cached pixmaps due to App/DocLnks
293 QPixmapCache::setCacheLimit(512); 301 QPixmapCache::setCacheLimit(512);
@@ -350,31 +358,31 @@ ServerApplication::ServerApplication( int& argc, char **argv, Type t )
350 grabKeyboard(); 358 grabKeyboard();
351 359
352 /* make sure the event filter is installed */ 360 /* make sure the event filter is installed */
353 const ODeviceButton* but = ODevice::inst()->buttonForKeycode( -1 ); 361 const ODeviceButton* but = ODevice::inst()->buttonForKeycode( -1 );
354 Q_CONST_UNUSED( but ) 362 Q_CONST_UNUSED( but )
355} 363}
356 364
357 365
358ServerApplication::~ServerApplication() 366ServerApplication::~ServerApplication()
359{ 367{
360 ungrabKeyboard(); 368 ungrabKeyboard();
361 369
362
363 delete pa; 370 delete pa;
364 delete m_ps; 371 delete m_ps;
365 delete m_ps_last; 372 delete m_ps_last;
366} 373}
367 374
368void ServerApplication::apmTimeout() { 375void ServerApplication::apmTimeout()
376{
369 serverApp-> checkMemory( ); // in case no events are generated 377 serverApp-> checkMemory( ); // in case no events are generated
370 *m_ps_last = *m_ps; 378 *m_ps_last = *m_ps;
371 *m_ps = PowerStatusManager::readStatus(); 379 *m_ps = PowerStatusManager::readStatus();
372 380
373 if ( m_ps->acStatus() != m_ps_last-> acStatus() ) 381 if ( m_ps->acStatus() != m_ps_last-> acStatus() )
374 m_screensaver-> powerStatusChanged( *m_ps ); 382 m_screensaver-> powerStatusChanged( *m_ps );
375 383
376 if ( m_ps->acStatus() == PowerStatus::Online ) { 384 if ( m_ps->acStatus() == PowerStatus::Online ) {
377 return; 385 return;
378 } 386 }
379 387
380 int bat = m_ps-> batteryPercentRemaining(); 388 int bat = m_ps-> batteryPercentRemaining();
@@ -399,25 +407,26 @@ void ServerApplication::apmTimeout() {
399 tr("WARNING"), 407 tr("WARNING"),
400 tr("<p>The Back-up battery is very low" 408 tr("<p>The Back-up battery is very low"
401 "<p>Please charge the back-up battery"), 409 "<p>Please charge the back-up battery"),
402 QMessageBox::Warning, 410 QMessageBox::Warning,
403 QMessageBox::Cancel, QMessageBox::NoButton, QMessageBox::NoButton, 411 QMessageBox::Cancel, QMessageBox::NoButton, QMessageBox::NoButton,
404 0, QString::null, TRUE, WStyle_StaysOnTop); 412 0, QString::null, TRUE, WStyle_StaysOnTop);
405 battlow.setButtonText(QMessageBox::Cancel, tr("Ok")); 413 battlow.setButtonText(QMessageBox::Cancel, tr("Ok"));
406 battlow.exec(); 414 battlow.exec();
407 } 415 }
408} 416}
409 417
410void ServerApplication::systemMessage( const QCString& msg, 418void ServerApplication::systemMessage( const QCString& msg,
411 const QByteArray& data ) { 419 const QByteArray& data )
420{
412 QDataStream stream ( data, IO_ReadOnly ); 421 QDataStream stream ( data, IO_ReadOnly );
413 422
414 if ( msg == "setScreenSaverInterval(int)" ) { 423 if ( msg == "setScreenSaverInterval(int)" ) {
415 int time; 424 int time;
416 stream >> time; 425 stream >> time;
417 m_screensaver-> setInterval( time ); 426 m_screensaver-> setInterval( time );
418 } 427 }
419 else if ( msg == "setScreenSaverIntervals(int,int,int)" ) { 428 else if ( msg == "setScreenSaverIntervals(int,int,int)" ) {
420 int t1, t2, t3; 429 int t1, t2, t3;
421 stream >> t1 >> t2 >> t3; 430 stream >> t1 >> t2 >> t3;
422 m_screensaver-> setIntervals( t1, t2, t3 ); 431 m_screensaver-> setIntervals( t1, t2, t3 );
423 } 432 }
@@ -512,57 +521,56 @@ void ServerApplication::login(bool at_poweron)
512#include <sys/ioctl.h> 521#include <sys/ioctl.h>
513#include <sys/types.h> 522#include <sys/types.h>
514#include <fcntl.h> 523#include <fcntl.h>
515#include <unistd.h> 524#include <unistd.h>
516#include <errno.h> 525#include <errno.h>
517#include <linux/ioctl.h> 526#include <linux/ioctl.h>
518#include <time.h> 527#include <time.h>
519#endif 528#endif
520 529
521namespace { 530namespace {
522 void execAutoStart(const QDateTime& suspendTime ) { 531 void execAutoStart(const QDateTime& suspendTime ) {
523 QString appName; 532 QString appName;
524 int delay; 533 int delay;
525 QDateTime now = QDateTime::currentDateTime(); 534 QDateTime now = QDateTime::currentDateTime();
526 535
527 Config cfg( "autostart" ); 536 Config cfg( "autostart" );
528 cfg.setGroup( "AutoStart" ); 537 cfg.setGroup( "AutoStart" );
529 appName = cfg.readEntry( "Apps", "" ); 538 appName = cfg.readEntry( "Apps", "" );
530 delay = cfg.readNumEntry( "Delay", 0 ); 539 delay = cfg.readNumEntry( "Delay", 0 );
531 540
532 // If the time between suspend and resume was longer then the 541 // If the time between suspend and resume was longer then the
533 // value saved as delay, start the app 542 // value saved as delay, start the app
534 if ( suspendTime.secsTo( now ) >= ( delay * 60 ) && !appName.isEmpty() ) { 543 if ( suspendTime.secsTo( now ) >= ( delay * 60 ) && !appName.isEmpty() ) {
535 QCopEnvelope e( "QPE/System", "execute(QString)" ); 544 QCopEnvelope e( "QPE/System", "execute(QString)" );
536 e << QString( appName ); 545 e << QString( appName );
537 } 546 }
538 } 547 }
539} 548}
540 549
541 550
542void ServerApplication::togglePower() 551void ServerApplication::togglePower()
543{ 552{
544 static bool excllock = false; 553 static bool excllock = false;
545 554
546 if ( excllock ) 555 if ( excllock )
547 return ; 556 return ;
548 557
549 excllock = true; 558 excllock = true;
550 559
551 bool wasloggedin = loggedin; 560 bool wasloggedin = loggedin;
552 loggedin = 0; 561 loggedin = 0;
553 m_suspendTime = QDateTime::currentDateTime(); 562 m_suspendTime = QDateTime::currentDateTime();
554 563
555#ifdef QWS 564#ifdef QWS
556
557 if ( Opie::Security::MultiauthPassword::needToAuthenticate ( true ) && qt_screen ) { 565 if ( Opie::Security::MultiauthPassword::needToAuthenticate ( true ) && qt_screen ) {
558 // Should use a big black window instead. 566 // Should use a big black window instead.
559 // But this would not show up fast enough 567 // But this would not show up fast enough
560 QGfx *g = qt_screen-> screenGfx ( ); 568 QGfx *g = qt_screen-> screenGfx ( );
561 g-> fillRect ( 0, 0, qt_screen-> width ( ), qt_screen-> height ( )); 569 g-> fillRect ( 0, 0, qt_screen-> width ( ), qt_screen-> height ( ));
562 delete g; 570 delete g;
563 } 571 }
564#endif 572#endif
565 573
566 ODevice::inst ( )-> suspend ( ); 574 ODevice::inst ( )-> suspend ( );
567 575
568 ServerApplication::switchLCD ( true ); // force LCD on without slow qcop call 576 ServerApplication::switchLCD ( true ); // force LCD on without slow qcop call
@@ -607,83 +615,85 @@ bool ServerApplication::eventFilter( QObject *o, QEvent *e) {
607 return true; 615 return true;
608 616
609 return QPEApplication::eventFilter( o, e ); 617 return QPEApplication::eventFilter( o, e );
610 618
611} 619}
612 620
613#ifdef Q_WS_QWS 621#ifdef Q_WS_QWS
614bool ServerApplication::qwsEventFilter( QWSEvent *e ) 622bool ServerApplication::qwsEventFilter( QWSEvent *e )
615{ 623{
616 checkMemory(); 624 checkMemory();
617 625
618 if ( e->type == QWSEvent::Mouse ) { 626 if ( e->type == QWSEvent::Mouse ) {
619 QWSMouseEvent *me = (QWSMouseEvent *)e; 627 QWSMouseEvent *me = (QWSMouseEvent *)e;
620 static bool up = TRUE; 628 static bool up = TRUE;
621 if ( me->simpleData.state&LeftButton ) { 629 if ( me->simpleData.state&LeftButton ) {
622 if ( up ) { 630 if ( up ) {
623 up = FALSE; 631 up = FALSE;
624 screenClick(TRUE); 632 screenClick(TRUE);
633 }
634 } else if ( !up ) {
635 up = TRUE;
636 screenClick(FALSE);
625 } 637 }
626 } else if ( !up ) { 638 } else
627 up = TRUE; 639 if ( e->type == QWSEvent::Key ) {
628 screenClick(FALSE);
629 }
630 }else if ( e->type == QWSEvent::Key ) {
631 QWSKeyEvent * ke = static_cast<QWSKeyEvent*>( e ); 640 QWSKeyEvent * ke = static_cast<QWSKeyEvent*>( e );
632 if ( kf->checkButtonAction( false, 641 if ( kf->checkButtonAction( false,
633 ke-> simpleData.keycode, 642 ke-> simpleData.keycode,
634 ke-> simpleData.is_press, 643 ke-> simpleData.is_press,
635 ke-> simpleData.is_auto_repeat ) ) 644 ke-> simpleData.is_auto_repeat ) )
636 return true; 645 return true;
637 } 646 }
638 647
639 return QPEApplication::qwsEventFilter( e ); 648 return QPEApplication::qwsEventFilter( e );
640} 649}
641#endif 650#endif
642 651
643 652
644/* ### FIXME libqtopia Plugin Safe Mode */ 653/* ### FIXME libqtopia Plugin Safe Mode */
645 654
646void ServerApplication::showSafeMode() 655void ServerApplication::showSafeMode()
647{ 656{
648#if 0 657#if 0
649 if ( QMessageBox::warning(0, tr("Safe Mode"), tr("<P>A system startup error occurred, " 658 if ( QMessageBox::warning(0, tr("Safe Mode"), tr("<P>A system startup error occurred, "
650 "and the system is now in Safe Mode. " 659 "and the system is now in Safe Mode. "
651 "Plugins are not loaded in Safe Mode. " 660 "Plugins are not loaded in Safe Mode. "
652 "You can use the Plugin Manager to " 661 "You can use the Plugin Manager to "
653 "disable plugins that cause system error."), tr("OK"), tr("Plugin Manager..."), 0) == 1 ) { 662 "disable plugins that cause system error."), tr("OK"), tr("Plugin Manager..."), 0) == 1 )
654 Global::execute( "pluginmanager" ); 663 {
664 Global::execute( "pluginmanager" );
655 } 665 }
656#endif 666#endif
657} 667}
658 668
659void ServerApplication::clearSafeMode() 669void ServerApplication::clearSafeMode()
660{ 670{
661#if 0 671#if 0
662 // If we've been running OK for a while then we won't bother going into 672 // If we've been running OK for a while then we won't bother going into
663 // safe mode immediately on the next crash. 673 // safe mode immediately on the next crash.
664 Config cfg( "PluginLoader" ); 674 Config cfg( "PluginLoader" );
665 cfg.setGroup( "Global" ); 675 cfg.setGroup( "Global" );
666 QString mode = cfg.readEntry( "Mode", "Normal" ); 676 QString mode = cfg.readEntry( "Mode", "Normal" );
667 if ( mode == "MaybeSafe" ) { 677 if ( mode == "MaybeSafe" ) {
668 cfg.writeEntry( "Mode", "Normal" ); 678 cfg.writeEntry( "Mode", "Normal" );
669 } 679 }
670#endif 680#endif
671} 681}
672 682
673 683
674void ServerApplication::shutdown() 684void ServerApplication::shutdown()
675{ 685{
676 if ( type() != GuiServer ) 686 if ( type() != GuiServer )
677 return; 687 return;
678 ShutdownImpl *sd = new ShutdownImpl( 0, 0, WDestructiveClose ); 688 ShutdownImpl *sd = new ShutdownImpl( 0, 0, WDestructiveClose );
679 connect( sd, SIGNAL(shutdown(ShutdownImpl::Type)), 689 connect( sd, SIGNAL(shutdown(ShutdownImpl::Type)),
680 this, SLOT(shutdown(ShutdownImpl::Type)) ); 690 this, SLOT(shutdown(ShutdownImpl::Type)) );
681 QPEApplication::showWidget( sd ); 691 QPEApplication::showWidget( sd );
682} 692}
683 693
684void ServerApplication::shutdown( ShutdownImpl::Type t ) 694void ServerApplication::shutdown( ShutdownImpl::Type t )
685{ 695{
686 char *opt = 0; 696 char *opt = 0;
687 697
688 switch ( t ) { 698 switch ( t ) {
689 case ShutdownImpl::ShutdownSystem: 699 case ShutdownImpl::ShutdownSystem:
@@ -720,27 +730,27 @@ void ServerApplication::restart()
720 730
721 /* 731 /*
722 * Applets and restart is a problem. Some applets delete 732 * Applets and restart is a problem. Some applets delete
723 * their widgets even if ownership gets transfered to the 733 * their widgets even if ownership gets transfered to the
724 * parent (Systray ) but deleting the applet may be unsafe 734 * parent (Systray ) but deleting the applet may be unsafe
725 * as well ( double deletion ). Some have topLevel widgets 735 * as well ( double deletion ). Some have topLevel widgets
726 * and when we dlclose and then delete the widget we will 736 * and when we dlclose and then delete the widget we will
727 * crash and an crash during restart is not nice 737 * crash and an crash during restart is not nice
728 */ 738 */
729#ifdef ALL_APPLETS_ON_THIS_WORLD_ARE_FIXED 739#ifdef ALL_APPLETS_ON_THIS_WORLD_ARE_FIXED
730 /* same as above */ 740 /* same as above */
731 emit aboutToQuit(); 741 emit aboutToQuit();
732 prepareForTermination(TRUE); 742 prepareForTermination(TRUE);
733 doRestart = TRUE; 743 doRestart = TRUE;
734 quit(); 744 quit();
735#else 745#else
736 prepareForTermination( true ); 746 prepareForTermination( true );
737 for ( int fd = 3; fd < 100; fd++ ) 747 for ( int fd = 3; fd < 100; fd++ )
738 close( fd ); 748 close( fd );
739 execl( ( qpeDir() + "/bin/qpe" ).latin1(), "qpe", 0 ); 749 execl( ( qpeDir() + "/bin/qpe" ).latin1(), "qpe", 0 );
740 exit( 1 ); 750 exit( 1 );
741#endif 751#endif
742 } 752 }
743} 753}
744 754
745void ServerApplication::rereadVolumes() 755void ServerApplication::rereadVolumes()
746{ 756{