summaryrefslogtreecommitdiff
authorsandman <sandman>2002-11-24 18:21:41 (UTC)
committer sandman <sandman>2002-11-24 18:21:41 (UTC)
commit89bf0723eefc1e66a104fe8135f1a5389f021442 (patch) (unidiff)
treea7db1ba8fa34d8226fe9baa9e7c488c86ad95445
parentee62e73ddc29a5015c4a3e569be90dbfce4652c6 (diff)
downloadopie-89bf0723eefc1e66a104fe8135f1a5389f021442.zip
opie-89bf0723eefc1e66a104fe8135f1a5389f021442.tar.gz
opie-89bf0723eefc1e66a104fe8135f1a5389f021442.tar.bz2
- LD_PRELOADing of libpreload.so in case the user selected [x] Force style
settings in appearance - Some code to NOT style some applications, based on the binary name (also selectable in appearance)
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--library/global.cpp16
-rw-r--r--library/qpeapplication.cpp60
2 files changed, 72 insertions, 4 deletions
diff --git a/library/global.cpp b/library/global.cpp
index 9b3c51e..42c2729 100644
--- a/library/global.cpp
+++ b/library/global.cpp
@@ -223,584 +223,600 @@ static QString dictDir()
223*/ 223*/
224Global::Global() 224Global::Global()
225{ 225{
226} 226}
227 227
228/*! 228/*!
229 Returns the unchangeable QDawg that contains general 229 Returns the unchangeable QDawg that contains general
230 words for the current locale. 230 words for the current locale.
231 231
232 \sa addedDawg() 232 \sa addedDawg()
233*/ 233*/
234const QDawg& Global::fixedDawg() 234const QDawg& Global::fixedDawg()
235{ 235{
236 if ( !fixed_dawg ) { 236 if ( !fixed_dawg ) {
237 if ( !docDirCreated ) 237 if ( !docDirCreated )
238 createDocDir(); 238 createDocDir();
239 239
240 fixed_dawg = new QDawg; 240 fixed_dawg = new QDawg;
241 QString dawgfilename = dictDir() + "/dawg"; 241 QString dawgfilename = dictDir() + "/dawg";
242 QString words_lang; 242 QString words_lang;
243 QStringList langs = Global::languageList(); 243 QStringList langs = Global::languageList();
244 for (QStringList::ConstIterator it = langs.begin(); it!=langs.end(); ++it) { 244 for (QStringList::ConstIterator it = langs.begin(); it!=langs.end(); ++it) {
245 QString lang = *it; 245 QString lang = *it;
246 words_lang = dictDir() + "/words." + lang; 246 words_lang = dictDir() + "/words." + lang;
247 QString dawgfilename_lang = dawgfilename + "." + lang; 247 QString dawgfilename_lang = dawgfilename + "." + lang;
248 if ( QFile::exists(dawgfilename_lang) || 248 if ( QFile::exists(dawgfilename_lang) ||
249 QFile::exists(words_lang) ) { 249 QFile::exists(words_lang) ) {
250 dawgfilename = dawgfilename_lang; 250 dawgfilename = dawgfilename_lang;
251 break; 251 break;
252 } 252 }
253 } 253 }
254 QFile dawgfile(dawgfilename); 254 QFile dawgfile(dawgfilename);
255 255
256 if ( !dawgfile.exists() ) { 256 if ( !dawgfile.exists() ) {
257 QString fn = dictDir() + "/words"; 257 QString fn = dictDir() + "/words";
258 if ( QFile::exists(words_lang) ) 258 if ( QFile::exists(words_lang) )
259 fn = words_lang; 259 fn = words_lang;
260 QFile in(fn); 260 QFile in(fn);
261 if ( in.open(IO_ReadOnly) ) { 261 if ( in.open(IO_ReadOnly) ) {
262 fixed_dawg->createFromWords(&in); 262 fixed_dawg->createFromWords(&in);
263 dawgfile.open(IO_WriteOnly); 263 dawgfile.open(IO_WriteOnly);
264 fixed_dawg->write(&dawgfile); 264 fixed_dawg->write(&dawgfile);
265 dawgfile.close(); 265 dawgfile.close();
266 } 266 }
267 } else { 267 } else {
268 fixed_dawg->readFile(dawgfilename); 268 fixed_dawg->readFile(dawgfilename);
269 } 269 }
270 } 270 }
271 271
272 return *fixed_dawg; 272 return *fixed_dawg;
273} 273}
274 274
275/*! 275/*!
276 Returns the changeable QDawg that contains general 276 Returns the changeable QDawg that contains general
277 words for the current locale. 277 words for the current locale.
278 278
279 \sa fixedDawg() 279 \sa fixedDawg()
280*/ 280*/
281const QDawg& Global::addedDawg() 281const QDawg& Global::addedDawg()
282{ 282{
283 return dawg("local"); 283 return dawg("local");
284} 284}
285 285
286/*! 286/*!
287 Returns the QDawg with the given \a name. 287 Returns the QDawg with the given \a name.
288 This is an application-specific word list. 288 This is an application-specific word list.
289 289
290 \a name should not contain "/". 290 \a name should not contain "/".
291*/ 291*/
292const QDawg& Global::dawg(const QString& name) 292const QDawg& Global::dawg(const QString& name)
293{ 293{
294 createDocDir(); 294 createDocDir();
295 if ( !named_dawg ) 295 if ( !named_dawg )
296 named_dawg = new QDict<QDawg>; 296 named_dawg = new QDict<QDawg>;
297 QDawg* r = named_dawg->find(name); 297 QDawg* r = named_dawg->find(name);
298 if ( !r ) { 298 if ( !r ) {
299 r = new QDawg; 299 r = new QDawg;
300 named_dawg->insert(name,r); 300 named_dawg->insert(name,r);
301 QString dawgfilename = applicationFileName("Dictionary", name ) + ".dawg"; 301 QString dawgfilename = applicationFileName("Dictionary", name ) + ".dawg";
302 QFile dawgfile(dawgfilename); 302 QFile dawgfile(dawgfilename);
303 if ( dawgfile.open(IO_ReadOnly) ) 303 if ( dawgfile.open(IO_ReadOnly) )
304 r->readFile(dawgfilename); 304 r->readFile(dawgfilename);
305 } 305 }
306 return *r; 306 return *r;
307} 307}
308 308
309/*! 309/*!
310 \overload 310 \overload
311 Adds \a wordlist to the addedDawg(). 311 Adds \a wordlist to the addedDawg().
312 312
313 Note that the addition of words persists between program executions 313 Note that the addition of words persists between program executions
314 (they are saved in the dictionary files), so you should confirm the 314 (they are saved in the dictionary files), so you should confirm the
315 words with the user before adding them. 315 words with the user before adding them.
316*/ 316*/
317void Global::addWords(const QStringList& wordlist) 317void Global::addWords(const QStringList& wordlist)
318{ 318{
319 addWords("local",wordlist); 319 addWords("local",wordlist);
320} 320}
321 321
322/*! 322/*!
323 \overload 323 \overload
324 Adds \a wordlist to the addedDawg(). 324 Adds \a wordlist to the addedDawg().
325 325
326 Note that the addition of words persists between program executions 326 Note that the addition of words persists between program executions
327 (they are saved in the dictionary files), so you should confirm the 327 (they are saved in the dictionary files), so you should confirm the
328 words with the user before adding them. 328 words with the user before adding them.
329*/ 329*/
330void Global::addWords(const QString& dictname, const QStringList& wordlist) 330void Global::addWords(const QString& dictname, const QStringList& wordlist)
331{ 331{
332 QDawg& d = (QDawg&)dawg(dictname); 332 QDawg& d = (QDawg&)dawg(dictname);
333 QStringList all = d.allWords() + wordlist; 333 QStringList all = d.allWords() + wordlist;
334 d.createFromWords(all); 334 d.createFromWords(all);
335 335
336 QString dawgfilename = applicationFileName("Dictionary", dictname) + ".dawg"; 336 QString dawgfilename = applicationFileName("Dictionary", dictname) + ".dawg";
337 QFile dawgfile(dawgfilename); 337 QFile dawgfile(dawgfilename);
338 if ( dawgfile.open(IO_WriteOnly) ) { 338 if ( dawgfile.open(IO_WriteOnly) ) {
339 d.write(&dawgfile); 339 d.write(&dawgfile);
340 dawgfile.close(); 340 dawgfile.close();
341 } 341 }
342 342
343 // #### Re-read the dawg here if we use mmap(). 343 // #### Re-read the dawg here if we use mmap().
344 344
345 // #### Signal other processes to re-read. 345 // #### Signal other processes to re-read.
346} 346}
347 347
348 348
349/*! 349/*!
350 Returns the full path for the application called \a appname, with the 350 Returns the full path for the application called \a appname, with the
351 given \a filename. Returns QString::null if there was a problem creating 351 given \a filename. Returns QString::null if there was a problem creating
352 the directory tree for \a appname. 352 the directory tree for \a appname.
353 If \a filename contains "/", it is the caller's responsibility to 353 If \a filename contains "/", it is the caller's responsibility to
354 ensure that those directories exist. 354 ensure that those directories exist.
355*/ 355*/
356QString Global::applicationFileName(const QString& appname, const QString& filename) 356QString Global::applicationFileName(const QString& appname, const QString& filename)
357{ 357{
358 QDir d; 358 QDir d;
359 QString r = getenv("HOME"); 359 QString r = getenv("HOME");
360 r += "/Applications/"; 360 r += "/Applications/";
361 if ( !QFile::exists( r ) ) 361 if ( !QFile::exists( r ) )
362 if ( d.mkdir(r) == false ) 362 if ( d.mkdir(r) == false )
363 return QString::null; 363 return QString::null;
364 r += appname; 364 r += appname;
365 if ( !QFile::exists( r ) ) 365 if ( !QFile::exists( r ) )
366 if ( d.mkdir(r) == false ) 366 if ( d.mkdir(r) == false )
367 return QString::null; 367 return QString::null;
368 r += "/"; r += filename; 368 r += "/"; r += filename;
369 return r; 369 return r;
370} 370}
371 371
372/*! 372/*!
373 \internal 373 \internal
374*/ 374*/
375void Global::createDocDir() 375void Global::createDocDir()
376{ 376{
377 if ( !docDirCreated ) { 377 if ( !docDirCreated ) {
378 docDirCreated = TRUE; 378 docDirCreated = TRUE;
379 mkdir( QPEApplication::documentDir().latin1(), 0755 ); 379 mkdir( QPEApplication::documentDir().latin1(), 0755 );
380 } 380 }
381} 381}
382 382
383 383
384/*! 384/*!
385 Displays a status \a message to the user. This usually appears 385 Displays a status \a message to the user. This usually appears
386 in the taskbar for a short amount of time, then disappears. 386 in the taskbar for a short amount of time, then disappears.
387*/ 387*/
388void Global::statusMessage(const QString& message) 388void Global::statusMessage(const QString& message)
389{ 389{
390#if!defined(QT_NO_COP) 390#if!defined(QT_NO_COP)
391 QCopEnvelope e( "QPE/TaskBar", "message(QString)" ); 391 QCopEnvelope e( "QPE/TaskBar", "message(QString)" );
392 e << message; 392 e << message;
393#endif 393#endif
394} 394}
395 395
396/*! 396/*!
397 \internal 397 \internal
398*/ 398*/
399void Global::applyStyle() 399void Global::applyStyle()
400{ 400{
401#if !defined(QT_NO_COP) 401#if !defined(QT_NO_COP)
402 QCopChannel::send( "QPE/System", "applyStyle()" ); 402 QCopChannel::send( "QPE/System", "applyStyle()" );
403#else 403#else
404 ((QPEApplication *)qApp)->applyStyle(); // apply without needing QCop for floppy version 404 ((QPEApplication *)qApp)->applyStyle(); // apply without needing QCop for floppy version
405#endif 405#endif
406} 406}
407 407
408/*! 408/*!
409 \internal 409 \internal
410*/ 410*/
411QWidget *Global::shutdown( bool ) 411QWidget *Global::shutdown( bool )
412{ 412{
413#if !defined(QT_NO_COP) 413#if !defined(QT_NO_COP)
414 QCopChannel::send( "QPE/System", "shutdown()" ); 414 QCopChannel::send( "QPE/System", "shutdown()" );
415#endif 415#endif
416 return 0; 416 return 0;
417} 417}
418 418
419/*! 419/*!
420 \internal 420 \internal
421*/ 421*/
422QWidget *Global::restart( bool ) 422QWidget *Global::restart( bool )
423{ 423{
424#if !defined(QT_NO_COP) 424#if !defined(QT_NO_COP)
425 QCopChannel::send( "QPE/System", "restart()" ); 425 QCopChannel::send( "QPE/System", "restart()" );
426#endif 426#endif
427 return 0; 427 return 0;
428} 428}
429 429
430/*! 430/*!
431 Explicitly show the current input method. 431 Explicitly show the current input method.
432 432
433 Input methods are indicated in the taskbar by a small icon. If the 433 Input methods are indicated in the taskbar by a small icon. If the
434 input method is activated (shown) then it takes up some proportion 434 input method is activated (shown) then it takes up some proportion
435 of the bottom of the screen, to allow the user to interact (input 435 of the bottom of the screen, to allow the user to interact (input
436 characters) with it. 436 characters) with it.
437 437
438 \sa hideInputMethod() 438 \sa hideInputMethod()
439*/ 439*/
440void Global::showInputMethod() 440void Global::showInputMethod()
441{ 441{
442#if !defined(QT_NO_COP) 442#if !defined(QT_NO_COP)
443 QCopChannel::send( "QPE/TaskBar", "showInputMethod()" ); 443 QCopChannel::send( "QPE/TaskBar", "showInputMethod()" );
444#endif 444#endif
445} 445}
446 446
447/*! 447/*!
448 Explicitly hide the current input method. 448 Explicitly hide the current input method.
449 449
450 The current input method is still indicated in the taskbar, but no 450 The current input method is still indicated in the taskbar, but no
451 longer takes up screen space, and can no longer be interacted with. 451 longer takes up screen space, and can no longer be interacted with.
452 452
453 \sa showInputMethod() 453 \sa showInputMethod()
454*/ 454*/
455void Global::hideInputMethod() 455void Global::hideInputMethod()
456{ 456{
457#if !defined(QT_NO_COP) 457#if !defined(QT_NO_COP)
458 QCopChannel::send( "QPE/TaskBar", "hideInputMethod()" ); 458 QCopChannel::send( "QPE/TaskBar", "hideInputMethod()" );
459#endif 459#endif
460} 460}
461 461
462 462
463/*! 463/*!
464 \internal 464 \internal
465*/ 465*/
466bool Global::isBuiltinCommand( const QString &name ) 466bool Global::isBuiltinCommand( const QString &name )
467{ 467{
468 if(!builtin) 468 if(!builtin)
469 return FALSE; // yes, it can happen 469 return FALSE; // yes, it can happen
470 for (int i = 0; builtin[i].file; i++) { 470 for (int i = 0; builtin[i].file; i++) {
471 if ( builtin[i].file == name ) { 471 if ( builtin[i].file == name ) {
472 return TRUE; 472 return TRUE;
473 } 473 }
474 } 474 }
475 return FALSE; 475 return FALSE;
476} 476}
477 477
478Global::Command* Global::builtin=0; 478Global::Command* Global::builtin=0;
479QGuardedPtr<QWidget> *Global::running=0; 479QGuardedPtr<QWidget> *Global::running=0;
480 480
481/*! 481/*!
482 \class Global::Command 482 \class Global::Command
483 \brief The Global::Command class is internal. 483 \brief The Global::Command class is internal.
484 \internal 484 \internal
485*/ 485*/
486 486
487/*! 487/*!
488 \internal 488 \internal
489*/ 489*/
490void Global::setBuiltinCommands( Command* list ) 490void Global::setBuiltinCommands( Command* list )
491{ 491{
492 if ( running ) 492 if ( running )
493 delete [] running; 493 delete [] running;
494 494
495 builtin = list; 495 builtin = list;
496 int count = 0; 496 int count = 0;
497 if (!builtin) 497 if (!builtin)
498 return; 498 return;
499 while ( builtin[count].file ) 499 while ( builtin[count].file )
500 count++; 500 count++;
501 501
502 running = new QGuardedPtr<QWidget> [ count ]; 502 running = new QGuardedPtr<QWidget> [ count ];
503} 503}
504 504
505/*! 505/*!
506 \internal 506 \internal
507*/ 507*/
508void Global::setDocument( QWidget* receiver, const QString& document ) 508void Global::setDocument( QWidget* receiver, const QString& document )
509{ 509{
510 Emitter emitter(receiver,document); 510 Emitter emitter(receiver,document);
511} 511}
512 512
513/*! 513/*!
514 \internal 514 \internal
515*/ 515*/
516bool Global::terminateBuiltin( const QString& n ) 516bool Global::terminateBuiltin( const QString& n )
517{ 517{
518 if (!builtin) 518 if (!builtin)
519 return FALSE; 519 return FALSE;
520 for (int i = 0; builtin[i].file; i++) { 520 for (int i = 0; builtin[i].file; i++) {
521 if ( builtin[i].file == n ) { 521 if ( builtin[i].file == n ) {
522 delete running[i]; 522 delete running[i];
523 return TRUE; 523 return TRUE;
524 } 524 }
525 } 525 }
526 return FALSE; 526 return FALSE;
527} 527}
528 528
529/*! 529/*!
530 \internal 530 \internal
531*/ 531*/
532void Global::terminate( const AppLnk* app ) 532void Global::terminate( const AppLnk* app )
533{ 533{
534 //if ( terminateBuiltin(app->exec()) ) return; // maybe? haven't tried this 534 //if ( terminateBuiltin(app->exec()) ) return; // maybe? haven't tried this
535 535
536#ifndef QT_NO_COP 536#ifndef QT_NO_COP
537 QCString channel = "QPE/Application/" + app->exec().utf8(); 537 QCString channel = "QPE/Application/" + app->exec().utf8();
538 if ( QCopChannel::isRegistered(channel) ) { 538 if ( QCopChannel::isRegistered(channel) ) {
539 QCopEnvelope e(channel, "quit()"); 539 QCopEnvelope e(channel, "quit()");
540 } 540 }
541#endif 541#endif
542} 542}
543 543
544/*! 544/*!
545 Low-level function to run command \a c. 545 Low-level function to run command \a c.
546 546
547 \warning Do not use this function. Use execute instead. 547 \warning Do not use this function. Use execute instead.
548 548
549 \sa execute() 549 \sa execute()
550*/ 550*/
551void Global::invoke(const QString &c) 551void Global::invoke(const QString &c)
552{ 552{
553 // Convert the command line in to a list of arguments 553 // Convert the command line in to a list of arguments
554 QStringList list = QStringList::split(QRegExp(" *"),c); 554 QStringList list = QStringList::split(QRegExp(" *"),c);
555 555
556#if !defined(QT_NO_COP) 556#if !defined(QT_NO_COP)
557 QString ap=list[0]; 557 QString ap=list[0];
558 // see if the application is already running 558 // see if the application is already running
559 // XXX should lock file /tmp/qcop-msg-ap 559 // XXX should lock file /tmp/qcop-msg-ap
560 if ( QCopChannel::isRegistered( ("QPE/Application/" + ap).latin1() ) ) { 560 if ( QCopChannel::isRegistered( ("QPE/Application/" + ap).latin1() ) ) {
561 // If the channel is already register, the app is already running, so show it. 561 // If the channel is already register, the app is already running, so show it.
562 { QCopEnvelope env( ("QPE/Application/" + ap).latin1(), "raise()" ); } 562 { QCopEnvelope env( ("QPE/Application/" + ap).latin1(), "raise()" ); }
563 563
564 QCopEnvelope e("QPE/System", "notBusy(QString)" ); 564 QCopEnvelope e("QPE/System", "notBusy(QString)" );
565 e << ap; 565 e << ap;
566 return; 566 return;
567 } 567 }
568 // XXX should unlock file /tmp/qcop-msg-ap 568 // XXX should unlock file /tmp/qcop-msg-ap
569 //see if it is being started 569 //see if it is being started
570 if ( StartingAppList::isStarting( ap ) ) { 570 if ( StartingAppList::isStarting( ap ) ) {
571 QCopEnvelope e("QPE/System", "notBusy(QString)" ); 571 QCopEnvelope e("QPE/System", "notBusy(QString)" );
572 e << ap; 572 e << ap;
573 return; 573 return;
574 } 574 }
575 575
576#endif 576#endif
577 577
578#ifdef QT_NO_QWS_MULTIPROCESS 578#ifdef QT_NO_QWS_MULTIPROCESS
579 QMessageBox::warning( 0, "Error", "Could not find the application " + c, "Ok", 0, 0, 0, 1 ); 579 QMessageBox::warning( 0, "Error", "Could not find the application " + c, "Ok", 0, 0, 0, 1 );
580#else 580#else
581 581
582 QStrList slist; 582 QStrList slist;
583 unsigned int j; 583 unsigned int j;
584 for ( j = 0; j < list.count(); j++ ) 584 for ( j = 0; j < list.count(); j++ )
585 slist.append( list[j].utf8() ); 585 slist.append( list[j].utf8() );
586 586
587 const char **args = new (const char *)[slist.count() + 1]; 587 const char **args = new (const char *)[slist.count() + 1];
588 for ( j = 0; j < slist.count(); j++ ) 588 for ( j = 0; j < slist.count(); j++ )
589 args[j] = slist.at(j); 589 args[j] = slist.at(j);
590 args[j] = NULL; 590 args[j] = NULL;
591 591
592#if !defined(QT_NO_COP) 592#if !defined(QT_NO_COP)
593 // an attempt to show a wait... 593 // an attempt to show a wait...
594 // more logic should be used, but this will be fine for the moment... 594 // more logic should be used, but this will be fine for the moment...
595 QCopEnvelope ( "QPE/System", "busy()" ); 595 QCopEnvelope ( "QPE/System", "busy()" );
596#endif 596#endif
597 597
598#ifdef HAVE_QUICKEXEC 598#ifdef HAVE_QUICKEXEC
599 QString libexe = qpeDir()+"/binlib/lib"+args[0] + ".so"; 599 QString libexe = qpeDir()+"/binlib/lib"+args[0] + ".so";
600 qDebug("libfile = %s", libexe.latin1() ); 600 qDebug("libfile = %s", libexe.latin1() );
601 if ( QFile::exists( libexe ) ) { 601 if ( QFile::exists( libexe ) ) {
602 qDebug("calling quickexec %s", libexe.latin1() ); 602 qDebug("calling quickexec %s", libexe.latin1() );
603 quickexecv( libexe.utf8().data(), (const char **)args ); 603 quickexecv( libexe.utf8().data(), (const char **)args );
604 } else 604 } else
605#endif 605#endif
606 { 606 {
607 char *oldpre = ::getenv ( "LD_PRELOAD" );
608
609 extern bool opie_block_style;
610
611 QString newpre = QPEApplication::qpeDir ( ) + "/lib/libpreload.so";
612 if ( opie_block_style && QFile::exists ( newpre )) {
613 if ( oldpre && oldpre [0] )
614 newpre = newpre + ":" + oldpre;
615 ::setenv ( "LD_PRELOAD", newpre. latin1( ), 1 );
616 qDebug ( "\nPRELOADING\n" );
617 }
618
607 if ( !::vfork() ) { 619 if ( !::vfork() ) {
608 for ( int fd = 3; fd < 100; fd++ ) 620 for ( int fd = 3; fd < 100; fd++ )
609 ::close( fd ); 621 ::close( fd );
610 ::setpgid( ::getpid(), ::getppid() ); 622 ::setpgid( ::getpid(), ::getppid() );
611 // Try bindir first, so that foo/bar works too 623 // Try bindir first, so that foo/bar works too
612 ::execv( qpeDir()+"/bin/"+args[0], (char * const *)args ); 624 ::execv( qpeDir()+"/bin/"+args[0], (char * const *)args );
613 ::execvp( args[0], (char * const *)args ); 625 ::execvp( args[0], (char * const *)args );
614 _exit( -1 ); 626 _exit( -1 );
615 } 627 }
628 if ( oldpre )
629 ::setenv ( "LD_PRELOAD", oldpre, 1 );
630 else
631 ::unsetenv ( "LD_PRELOAD" );
616 } 632 }
617 StartingAppList::add( list[0] ); 633 StartingAppList::add( list[0] );
618#endif //QT_NO_QWS_MULTIPROCESS 634#endif //QT_NO_QWS_MULTIPROCESS
619} 635}
620 636
621 637
622/*! 638/*!
623 Executes the application identfied by \a c, passing \a 639 Executes the application identfied by \a c, passing \a
624 document if it isn't null. 640 document if it isn't null.
625 641
626 Note that a better approach might be to send a QCop message to the 642 Note that a better approach might be to send a QCop message to the
627 application's QPE/Application/\e{appname} channel. 643 application's QPE/Application/\e{appname} channel.
628*/ 644*/
629void Global::execute( const QString &c, const QString& document ) 645void Global::execute( const QString &c, const QString& document )
630{ 646{
631 if ( qApp->type() != QApplication::GuiServer ) { 647 if ( qApp->type() != QApplication::GuiServer ) {
632 // ask the server to do the work 648 // ask the server to do the work
633#if !defined(QT_NO_COP) 649#if !defined(QT_NO_COP)
634 if ( document.isNull() ) { 650 if ( document.isNull() ) {
635 QCopEnvelope e( "QPE/System", "execute(QString)" ); 651 QCopEnvelope e( "QPE/System", "execute(QString)" );
636 e << c; 652 e << c;
637 } else { 653 } else {
638 QCopEnvelope e( "QPE/System", "execute(QString,QString)" ); 654 QCopEnvelope e( "QPE/System", "execute(QString,QString)" );
639 e << c << document; 655 e << c << document;
640 } 656 }
641#endif 657#endif
642 return; 658 return;
643 } 659 }
644 660
645 // Attempt to execute the app using a builtin class for the app first 661 // Attempt to execute the app using a builtin class for the app first
646 // else try and find it in the bin directory 662 // else try and find it in the bin directory
647 if (builtin) { 663 if (builtin) {
648 for (int i = 0; builtin[i].file; i++) { 664 for (int i = 0; builtin[i].file; i++) {
649 if ( builtin[i].file == c ) { 665 if ( builtin[i].file == c ) {
650 if ( running[i] ) { 666 if ( running[i] ) {
651 if ( !document.isNull() && builtin[i].documentary ) 667 if ( !document.isNull() && builtin[i].documentary )
652 setDocument(running[i], document); 668 setDocument(running[i], document);
653 running[i]->raise(); 669 running[i]->raise();
654 running[i]->show(); 670 running[i]->show();
655 running[i]->setActiveWindow(); 671 running[i]->setActiveWindow();
656 } else { 672 } else {
657 running[i] = builtin[i].func( builtin[i].maximized ); 673 running[i] = builtin[i].func( builtin[i].maximized );
658 } 674 }
659#ifndef QT_NO_COP 675#ifndef QT_NO_COP
660 QCopEnvelope e("QPE/System", "notBusy(QString)" ); 676 QCopEnvelope e("QPE/System", "notBusy(QString)" );
661 e << c; // that was quick ;-) 677 e << c; // that was quick ;-)
662#endif 678#endif
663 return; 679 return;
664 } 680 }
665 } 681 }
666 } 682 }
667 683
668 //Global::invoke(c, document); 684 //Global::invoke(c, document);
669 685
670 // Convert the command line in to a list of arguments 686 // Convert the command line in to a list of arguments
671 QStringList list = QStringList::split(QRegExp(" *"),c); 687 QStringList list = QStringList::split(QRegExp(" *"),c);
672 688
673#if !defined(QT_NO_COP) 689#if !defined(QT_NO_COP)
674 QString ap=list[0]; 690 QString ap=list[0];
675 691
676 qDebug("executing %s", ap.latin1() ); 692 qDebug("executing %s", ap.latin1() );
677 693
678 /* if need be, sending a qcop message will result in an invoke, see 694 /* if need be, sending a qcop message will result in an invoke, see
679 preceeding function */ 695 preceeding function */
680 invoke( ap ); 696 invoke( ap );
681 //{ QCopEnvelope env( ("QPE/Application/" + ap).latin1(), "raise()" ); } 697 //{ QCopEnvelope env( ("QPE/Application/" + ap).latin1(), "raise()" ); }
682 if ( !document.isEmpty() ) { 698 if ( !document.isEmpty() ) {
683 QCopEnvelope env( ("QPE/Application/" + ap).latin1(), "setDocument(QString)" ); 699 QCopEnvelope env( ("QPE/Application/" + ap).latin1(), "setDocument(QString)" );
684 env << document; 700 env << document;
685 } 701 }
686#endif 702#endif
687} 703}
688 704
689/*! 705/*!
690 Returns the string \a s with the characters '\', '"', and '$' quoted 706 Returns the string \a s with the characters '\', '"', and '$' quoted
691 by a preceeding '\'. 707 by a preceeding '\'.
692 708
693 \sa stringQuote() 709 \sa stringQuote()
694*/ 710*/
695QString Global::shellQuote(const QString& s) 711QString Global::shellQuote(const QString& s)
696{ 712{
697 QString r="\""; 713 QString r="\"";
698 for (int i=0; i<(int)s.length(); i++) { 714 for (int i=0; i<(int)s.length(); i++) {
699 char c = s[i].latin1(); 715 char c = s[i].latin1();
700 switch (c) { 716 switch (c) {
701 case '\\': case '"': case '$': 717 case '\\': case '"': case '$':
702 r+="\\"; 718 r+="\\";
703 } 719 }
704 r += s[i]; 720 r += s[i];
705 } 721 }
706 r += "\""; 722 r += "\"";
707 return r; 723 return r;
708} 724}
709 725
710/*! 726/*!
711 Returns the string \a s with the characters '\' and '"' quoted by a 727 Returns the string \a s with the characters '\' and '"' quoted by a
712 preceeding '\'. 728 preceeding '\'.
713 729
714 \sa shellQuote() 730 \sa shellQuote()
715*/ 731*/
716QString Global::stringQuote(const QString& s) 732QString Global::stringQuote(const QString& s)
717{ 733{
718 QString r="\""; 734 QString r="\"";
719 for (int i=0; i<(int)s.length(); i++) { 735 for (int i=0; i<(int)s.length(); i++) {
720 char c = s[i].latin1(); 736 char c = s[i].latin1();
721 switch (c) { 737 switch (c) {
722 case '\\': case '"': 738 case '\\': case '"':
723 r+="\\"; 739 r+="\\";
724 } 740 }
725 r += s[i]; 741 r += s[i];
726 } 742 }
727 r += "\""; 743 r += "\"";
728 return r; 744 return r;
729} 745}
730 746
731/*! 747/*!
732 Finds all documents on the system's document directories which 748 Finds all documents on the system's document directories which
733 match the filter \a mimefilter, and appends the resulting DocLnk 749 match the filter \a mimefilter, and appends the resulting DocLnk
734 objects to \a folder. 750 objects to \a folder.
735*/ 751*/
736void Global::findDocuments(DocLnkSet* folder, const QString &mimefilter) 752void Global::findDocuments(DocLnkSet* folder, const QString &mimefilter)
737{ 753{
738 QString homedocs = QString(getenv("HOME")) + "/Documents"; 754 QString homedocs = QString(getenv("HOME")) + "/Documents";
739 DocLnkSet d(homedocs,mimefilter); 755 DocLnkSet d(homedocs,mimefilter);
740 folder->appendFrom(d); 756 folder->appendFrom(d);
741 /** let's do intellegint way of searching these files 757 /** let's do intellegint way of searching these files
742 * a) the user don't want to check mediums global 758 * a) the user don't want to check mediums global
743 * b) the user wants to check but use the global options for it 759 * b) the user wants to check but use the global options for it
744 * c) the user wants to check it but not this medium 760 * c) the user wants to check it but not this medium
745 * d) the user wants to check and this medium as well 761 * d) the user wants to check and this medium as well
746 * 762 *
747 * In all cases we need to apply a different mimefilter to 763 * In all cases we need to apply a different mimefilter to
748 * the medium. 764 * the medium.
749 * a) mimefilter.isEmpty() we need to apply the responding filter 765 * a) mimefilter.isEmpty() we need to apply the responding filter
750 * either the global or the one on the medium 766 * either the global or the one on the medium
751 * 767 *
752 * b) mimefilter is set to an application we need to find out if the 768 * b) mimefilter is set to an application we need to find out if the
753 * mimetypes are included in the mime mask of the medium 769 * mimetypes are included in the mime mask of the medium
754 */ 770 */
755 StorageInfo storage; 771 StorageInfo storage;
756 const QList<FileSystem> &fs = storage.fileSystems(); 772 const QList<FileSystem> &fs = storage.fileSystems();
757 QListIterator<FileSystem> it ( fs ); 773 QListIterator<FileSystem> it ( fs );
758 for ( ; it.current(); ++it ) { 774 for ( ; it.current(); ++it ) {
759 if ( (*it)->isRemovable() ) { // let's find out if we should search on it 775 if ( (*it)->isRemovable() ) { // let's find out if we should search on it
760 // this is a candidate look at the cf and see if we should search on it 776 // this is a candidate look at the cf and see if we should search on it
761 QString path = (*it)->path(); 777 QString path = (*it)->path();
762 if( !checkStorage((*it)->path() + "/.opiestorage.cf" ) ) 778 if( !checkStorage((*it)->path() + "/.opiestorage.cf" ) )
763 continue; 779 continue;
764 DocLnkSet ide( path, mimefilter ); 780 DocLnkSet ide( path, mimefilter );
765 folder->appendFrom(ide); 781 folder->appendFrom(ide);
766 } else if ( (*it)->disk() == "/dev/mtdblock6" || (*it)->disk() == "tmpfs" ) { 782 } else if ( (*it)->disk() == "/dev/mtdblock6" || (*it)->disk() == "tmpfs" ) {
767 QString path = (*it)->path() + "/Documents"; 783 QString path = (*it)->path() + "/Documents";
768 DocLnkSet ide( path, mimefilter ); 784 DocLnkSet ide( path, mimefilter );
769 folder->appendFrom(ide); 785 folder->appendFrom(ide);
770 } 786 }
771 } 787 }
772} 788}
773 789
774QStringList Global::languageList() 790QStringList Global::languageList()
775{ 791{
776 QString lang = getenv("LANG"); 792 QString lang = getenv("LANG");
777 QStringList langs; 793 QStringList langs;
778 langs.append(lang); 794 langs.append(lang);
779 int i = lang.find("."); 795 int i = lang.find(".");
780 if ( i > 0 ) 796 if ( i > 0 )
781 lang = lang.left( i ); 797 lang = lang.left( i );
782 i = lang.find( "_" ); 798 i = lang.find( "_" );
783 if ( i > 0 ) 799 if ( i > 0 )
784 langs.append(lang.left(i)); 800 langs.append(lang.left(i));
785 return langs; 801 return langs;
786} 802}
787 803
788QStringList Global::helpPath() 804QStringList Global::helpPath()
789{ 805{
790 QStringList path; 806 QStringList path;
791 QStringList langs = Global::languageList(); 807 QStringList langs = Global::languageList();
792 for (QStringList::ConstIterator it = langs.fromLast(); it!=langs.end(); --it) { 808 for (QStringList::ConstIterator it = langs.fromLast(); it!=langs.end(); --it) {
793 QString lang = *it; 809 QString lang = *it;
794 if ( !lang.isEmpty() ) 810 if ( !lang.isEmpty() )
795 path += QPEApplication::qpeDir() + "/help/" + lang + "/html"; 811 path += QPEApplication::qpeDir() + "/help/" + lang + "/html";
796 } 812 }
797 path += QPEApplication::qpeDir() + "/pics"; 813 path += QPEApplication::qpeDir() + "/pics";
798 path += QPEApplication::qpeDir() + "/help/html"; 814 path += QPEApplication::qpeDir() + "/help/html";
799 path += QPEApplication::qpeDir() + "/docs"; 815 path += QPEApplication::qpeDir() + "/docs";
800 816
801 817
802 return path; 818 return path;
803} 819}
804 820
805 821
806#include "global.moc" 822#include "global.moc"
diff --git a/library/qpeapplication.cpp b/library/qpeapplication.cpp
index efa65bc..a54fb20 100644
--- a/library/qpeapplication.cpp
+++ b/library/qpeapplication.cpp
@@ -517,1186 +517,1238 @@ QPEApplication::QPEApplication( int & argc, char **argv, Type t )
517 ds >> channel >> message >> data; 517 ds >> channel >> message >> data;
518 d->enqueueQCop( channel, message, data ); 518 d->enqueueQCop( channel, message, data );
519 } 519 }
520 520
521 flock( f.handle(), LOCK_UN ); 521 flock( f.handle(), LOCK_UN );
522 f.close(); 522 f.close();
523 f.remove(); 523 f.remove();
524 } 524 }
525 525
526 for ( int a = 0; a < argc; a++ ) { 526 for ( int a = 0; a < argc; a++ ) {
527 if ( qstrcmp( argv[ a ], "-preload" ) == 0 ) { 527 if ( qstrcmp( argv[ a ], "-preload" ) == 0 ) {
528 argv[ a ] = argv[ a + 1 ]; 528 argv[ a ] = argv[ a + 1 ];
529 a++; 529 a++;
530 d->preloaded = TRUE; 530 d->preloaded = TRUE;
531 argc -= 1; 531 argc -= 1;
532 } 532 }
533 else if ( qstrcmp( argv[ a ], "-preload-show" ) == 0 ) { 533 else if ( qstrcmp( argv[ a ], "-preload-show" ) == 0 ) {
534 argv[ a ] = argv[ a + 1 ]; 534 argv[ a ] = argv[ a + 1 ];
535 a++; 535 a++;
536 d->preloaded = TRUE; 536 d->preloaded = TRUE;
537 d->forceshow = TRUE; 537 d->forceshow = TRUE;
538 argc -= 1; 538 argc -= 1;
539 } 539 }
540 } 540 }
541 541
542 /* overide stored arguments */ 542 /* overide stored arguments */
543 setArgs( argc, argv ); 543 setArgs( argc, argv );
544 544
545#endif 545#endif
546 546
547 // qwsSetDecoration( new QPEDecoration() ); 547 // qwsSetDecoration( new QPEDecoration() );
548 548
549#ifndef QT_NO_TRANSLATION 549#ifndef QT_NO_TRANSLATION
550 550
551 QStringList langs = Global::languageList(); 551 QStringList langs = Global::languageList();
552 for ( QStringList::ConstIterator it = langs.begin(); it != langs.end(); ++it ) { 552 for ( QStringList::ConstIterator it = langs.begin(); it != langs.end(); ++it ) {
553 QString lang = *it; 553 QString lang = *it;
554 554
555 QTranslator * trans; 555 QTranslator * trans;
556 QString tfn; 556 QString tfn;
557 557
558 trans = new QTranslator( this ); 558 trans = new QTranslator( this );
559 tfn = qpeDir() + "/i18n/" + lang + "/libqpe.qm"; 559 tfn = qpeDir() + "/i18n/" + lang + "/libqpe.qm";
560 if ( trans->load( tfn ) ) 560 if ( trans->load( tfn ) )
561 installTranslator( trans ); 561 installTranslator( trans );
562 else 562 else
563 delete trans; 563 delete trans;
564 564
565 trans = new QTranslator( this ); 565 trans = new QTranslator( this );
566 tfn = qpeDir() + "/i18n/" + lang + "/" + d->appName + ".qm"; 566 tfn = qpeDir() + "/i18n/" + lang + "/" + d->appName + ".qm";
567 if ( trans->load( tfn ) ) 567 if ( trans->load( tfn ) )
568 installTranslator( trans ); 568 installTranslator( trans );
569 else 569 else
570 delete trans; 570 delete trans;
571 571
572 //###language/font hack; should look it up somewhere 572 //###language/font hack; should look it up somewhere
573#ifdef QWS 573#ifdef QWS
574 574
575 if ( lang == "ja" || lang == "zh_CN" || lang == "zh_TW" || lang == "ko" ) { 575 if ( lang == "ja" || lang == "zh_CN" || lang == "zh_TW" || lang == "ko" ) {
576 QFont fn = FontManager::unicodeFont( FontManager::Proportional ); 576 QFont fn = FontManager::unicodeFont( FontManager::Proportional );
577 setFont( fn ); 577 setFont( fn );
578 } 578 }
579#endif 579#endif
580 580
581 } 581 }
582#endif 582#endif
583 583
584 applyStyle(); 584 applyStyle();
585 585
586 if ( type() == GuiServer ) { 586 if ( type() == GuiServer ) {
587 setVolume(); 587 setVolume();
588 } 588 }
589 589
590 installEventFilter( this ); 590 installEventFilter( this );
591 591
592 QPEMenuToolFocusManager::initialize(); 592 QPEMenuToolFocusManager::initialize();
593 593
594#ifdef QT_NO_QWS_CURSOR 594#ifdef QT_NO_QWS_CURSOR
595 // if we have no cursor, probably don't want tooltips 595 // if we have no cursor, probably don't want tooltips
596 QToolTip::setEnabled( FALSE ); 596 QToolTip::setEnabled( FALSE );
597#endif 597#endif
598} 598}
599 599
600static QPtrDict<void>* inputMethodDict = 0; 600static QPtrDict<void>* inputMethodDict = 0;
601static void createInputMethodDict() 601static void createInputMethodDict()
602{ 602{
603 if ( !inputMethodDict ) 603 if ( !inputMethodDict )
604 inputMethodDict = new QPtrDict<void>; 604 inputMethodDict = new QPtrDict<void>;
605} 605}
606 606
607/*! 607/*!
608 Returns the currently set hint to the system as to whether 608 Returns the currently set hint to the system as to whether
609 widget \a w has any use for text input methods. 609 widget \a w has any use for text input methods.
610 610
611 611
612 \sa setInputMethodHint() InputMethodHint 612 \sa setInputMethodHint() InputMethodHint
613*/ 613*/
614QPEApplication::InputMethodHint QPEApplication::inputMethodHint( QWidget * w ) 614QPEApplication::InputMethodHint QPEApplication::inputMethodHint( QWidget * w )
615{ 615{
616 if ( inputMethodDict && w ) 616 if ( inputMethodDict && w )
617 return ( InputMethodHint ) ( int ) inputMethodDict->find( w ); 617 return ( InputMethodHint ) ( int ) inputMethodDict->find( w );
618 return Normal; 618 return Normal;
619} 619}
620 620
621/*! 621/*!
622 \enum QPEApplication::InputMethodHint 622 \enum QPEApplication::InputMethodHint
623 623
624 \value Normal the application sometimes needs text input (the default). 624 \value Normal the application sometimes needs text input (the default).
625 \value AlwaysOff the application never needs text input. 625 \value AlwaysOff the application never needs text input.
626 \value AlwaysOn the application always needs text input. 626 \value AlwaysOn the application always needs text input.
627*/ 627*/
628 628
629/*! 629/*!
630 Hints to the system that widget \a w has use for text input methods 630 Hints to the system that widget \a w has use for text input methods
631 as specified by \a mode. 631 as specified by \a mode.
632 632
633 \sa inputMethodHint() InputMethodHint 633 \sa inputMethodHint() InputMethodHint
634*/ 634*/
635void QPEApplication::setInputMethodHint( QWidget * w, InputMethodHint mode ) 635void QPEApplication::setInputMethodHint( QWidget * w, InputMethodHint mode )
636{ 636{
637 createInputMethodDict(); 637 createInputMethodDict();
638 if ( mode == Normal ) { 638 if ( mode == Normal ) {
639 inputMethodDict->remove 639 inputMethodDict->remove
640 ( w ); 640 ( w );
641 } 641 }
642 else { 642 else {
643 inputMethodDict->insert( w, ( void* ) mode ); 643 inputMethodDict->insert( w, ( void* ) mode );
644 } 644 }
645} 645}
646 646
647class HackDialog : public QDialog 647class HackDialog : public QDialog
648{ 648{
649public: 649public:
650 void acceptIt() 650 void acceptIt()
651 { 651 {
652 accept(); 652 accept();
653 } 653 }
654 void rejectIt() 654 void rejectIt()
655 { 655 {
656 reject(); 656 reject();
657 } 657 }
658}; 658};
659 659
660 660
661void QPEApplication::mapToDefaultAction( QWSKeyEvent * ke, int key ) 661void QPEApplication::mapToDefaultAction( QWSKeyEvent * ke, int key )
662{ 662{
663 // specialised actions for certain widgets. May want to 663 // specialised actions for certain widgets. May want to
664 // add more stuff here. 664 // add more stuff here.
665 if ( activePopupWidget() && activePopupWidget() ->inherits( "QListBox" ) 665 if ( activePopupWidget() && activePopupWidget() ->inherits( "QListBox" )
666 && activePopupWidget() ->parentWidget() 666 && activePopupWidget() ->parentWidget()
667 && activePopupWidget() ->parentWidget() ->inherits( "QComboBox" ) ) 667 && activePopupWidget() ->parentWidget() ->inherits( "QComboBox" ) )
668 key = Qt::Key_Return; 668 key = Qt::Key_Return;
669 669
670 if ( activePopupWidget() && activePopupWidget() ->inherits( "QPopupMenu" ) ) 670 if ( activePopupWidget() && activePopupWidget() ->inherits( "QPopupMenu" ) )
671 key = Qt::Key_Return; 671 key = Qt::Key_Return;
672 672
673#ifdef QWS 673#ifdef QWS
674 674
675 ke->simpleData.keycode = key; 675 ke->simpleData.keycode = key;
676#endif 676#endif
677} 677}
678 678
679class HackWidget : public QWidget 679class HackWidget : public QWidget
680{ 680{
681public: 681public:
682 bool needsOk() 682 bool needsOk()
683 { 683 {
684 return ( getWState() & WState_Reserved1 ); 684 return ( getWState() & WState_Reserved1 );
685 } 685 }
686}; 686};
687 687
688/*! 688/*!
689 \internal 689 \internal
690*/ 690*/
691 691
692#ifdef QWS 692#ifdef QWS
693bool QPEApplication::qwsEventFilter( QWSEvent * e ) 693bool QPEApplication::qwsEventFilter( QWSEvent * e )
694{ 694{
695 if ( !d->notbusysent && e->type == QWSEvent::Focus ) { 695 if ( !d->notbusysent && e->type == QWSEvent::Focus ) {
696 if ( qApp->type() != QApplication::GuiServer ) { 696 if ( qApp->type() != QApplication::GuiServer ) {
697 QCopEnvelope e( "QPE/System", "notBusy(QString)" ); 697 QCopEnvelope e( "QPE/System", "notBusy(QString)" );
698 e << d->appName; 698 e << d->appName;
699 } 699 }
700 d->notbusysent = TRUE; 700 d->notbusysent = TRUE;
701 } 701 }
702 if ( type() == GuiServer ) { 702 if ( type() == GuiServer ) {
703 switch ( e->type ) { 703 switch ( e->type ) {
704 case QWSEvent::Mouse: 704 case QWSEvent::Mouse:
705 if ( e->asMouse() ->simpleData.state && !QWidget::find( e->window() ) ) 705 if ( e->asMouse() ->simpleData.state && !QWidget::find( e->window() ) )
706 emit clientMoused(); 706 emit clientMoused();
707 break; 707 break;
708 default: 708 default:
709 break; 709 break;
710 } 710 }
711 } 711 }
712 if ( e->type == QWSEvent::Key ) { 712 if ( e->type == QWSEvent::Key ) {
713 if ( d->kbgrabber == 1 ) 713 if ( d->kbgrabber == 1 )
714 return TRUE; 714 return TRUE;
715 QWSKeyEvent *ke = ( QWSKeyEvent * ) e; 715 QWSKeyEvent *ke = ( QWSKeyEvent * ) e;
716 if ( ke->simpleData.keycode == Qt::Key_F33 ) { 716 if ( ke->simpleData.keycode == Qt::Key_F33 ) {
717 // Use special "OK" key to press "OK" on top level widgets 717 // Use special "OK" key to press "OK" on top level widgets
718 QWidget * active = activeWindow(); 718 QWidget * active = activeWindow();
719 QWidget *popup = 0; 719 QWidget *popup = 0;
720 if ( active && active->isPopup() ) { 720 if ( active && active->isPopup() ) {
721 popup = active; 721 popup = active;
722 active = active->parentWidget(); 722 active = active->parentWidget();
723 } 723 }
724 if ( active && ( int ) active->winId() == ke->simpleData.window && 724 if ( active && ( int ) active->winId() == ke->simpleData.window &&
725 !active->testWFlags( WStyle_Customize | WType_Popup | WType_Desktop ) ) { 725 !active->testWFlags( WStyle_Customize | WType_Popup | WType_Desktop ) ) {
726 if ( ke->simpleData.is_press ) { 726 if ( ke->simpleData.is_press ) {
727 if ( popup ) 727 if ( popup )
728 popup->close(); 728 popup->close();
729 if ( active->inherits( "QDialog" ) ) { 729 if ( active->inherits( "QDialog" ) ) {
730 HackDialog * d = ( HackDialog * ) active; 730 HackDialog * d = ( HackDialog * ) active;
731 d->acceptIt(); 731 d->acceptIt();
732 return TRUE; 732 return TRUE;
733 } 733 }
734 else if ( ( ( HackWidget * ) active ) ->needsOk() ) { 734 else if ( ( ( HackWidget * ) active ) ->needsOk() ) {
735 QSignal s; 735 QSignal s;
736 s.connect( active, SLOT( accept() ) ); 736 s.connect( active, SLOT( accept() ) );
737 s.activate(); 737 s.activate();
738 } 738 }
739 else { 739 else {
740 // do the same as with the select key: Map to the default action of the widget: 740 // do the same as with the select key: Map to the default action of the widget:
741 mapToDefaultAction( ke, Qt::Key_Return ); 741 mapToDefaultAction( ke, Qt::Key_Return );
742 } 742 }
743 } 743 }
744 } 744 }
745 } 745 }
746 else if ( ke->simpleData.keycode == Qt::Key_F30 ) { 746 else if ( ke->simpleData.keycode == Qt::Key_F30 ) {
747 // Use special "select" key to do whatever default action a widget has 747 // Use special "select" key to do whatever default action a widget has
748 mapToDefaultAction( ke, Qt::Key_Space ); 748 mapToDefaultAction( ke, Qt::Key_Space );
749 } 749 }
750 else if ( ke->simpleData.keycode == Qt::Key_Escape && 750 else if ( ke->simpleData.keycode == Qt::Key_Escape &&
751 ke->simpleData.is_press ) { 751 ke->simpleData.is_press ) {
752 // Escape key closes app if focus on toplevel 752 // Escape key closes app if focus on toplevel
753 QWidget * active = activeWindow(); 753 QWidget * active = activeWindow();
754 if ( active && active->testWFlags( WType_TopLevel ) && 754 if ( active && active->testWFlags( WType_TopLevel ) &&
755 ( int ) active->winId() == ke->simpleData.window && 755 ( int ) active->winId() == ke->simpleData.window &&
756 !active->testWFlags( WStyle_Dialog | WStyle_Customize | WType_Popup | WType_Desktop ) ) { 756 !active->testWFlags( WStyle_Dialog | WStyle_Customize | WType_Popup | WType_Desktop ) ) {
757 if ( active->inherits( "QDialog" ) ) { 757 if ( active->inherits( "QDialog" ) ) {
758 HackDialog * d = ( HackDialog * ) active; 758 HackDialog * d = ( HackDialog * ) active;
759 d->rejectIt(); 759 d->rejectIt();
760 return TRUE; 760 return TRUE;
761 } 761 }
762 else if ( strcmp( argv() [ 0 ], "embeddedkonsole" ) != 0 ) { 762 else if ( strcmp( argv() [ 0 ], "embeddedkonsole" ) != 0 ) {
763 active->close(); 763 active->close();
764 } 764 }
765 } 765 }
766 } 766 }
767 767
768#if QT_VERSION < 231 768#if QT_VERSION < 231
769 // Filter out the F4/Launcher key from apps 769 // Filter out the F4/Launcher key from apps
770 // ### The launcher key may not always be F4 on all devices 770 // ### The launcher key may not always be F4 on all devices
771 if ( ( ( QWSKeyEvent * ) e ) ->simpleData.keycode == Qt::Key_F4 ) 771 if ( ( ( QWSKeyEvent * ) e ) ->simpleData.keycode == Qt::Key_F4 )
772 return TRUE; 772 return TRUE;
773#endif 773#endif
774 774
775 } 775 }
776 if ( e->type == QWSEvent::Focus ) { 776 if ( e->type == QWSEvent::Focus ) {
777 QWSFocusEvent * fe = ( QWSFocusEvent* ) e; 777 QWSFocusEvent * fe = ( QWSFocusEvent* ) e;
778 QWidget* nfw = QWidget::find( e->window() ); 778 QWidget* nfw = QWidget::find( e->window() );
779 if ( !fe->simpleData.get_focus ) { 779 if ( !fe->simpleData.get_focus ) {
780 QWidget * active = activeWindow(); 780 QWidget * active = activeWindow();
781 while ( active && active->isPopup() ) { 781 while ( active && active->isPopup() ) {
782 active->close(); 782 active->close();
783 active = activeWindow(); 783 active = activeWindow();
784 } 784 }
785 if ( !nfw && d->kbgrabber == 2 ) { 785 if ( !nfw && d->kbgrabber == 2 ) {
786 ungrabKeyboard(); 786 ungrabKeyboard();
787 d->kbregrab = TRUE; // want kb back when we're active 787 d->kbregrab = TRUE; // want kb back when we're active
788 } 788 }
789 } 789 }
790 else { 790 else {
791 // make sure our modal widget is ALWAYS on top 791 // make sure our modal widget is ALWAYS on top
792 QWidget *topm = activeModalWidget(); 792 QWidget *topm = activeModalWidget();
793 if ( topm ) { 793 if ( topm ) {
794 topm->raise(); 794 topm->raise();
795 } 795 }
796 if ( d->kbregrab ) { 796 if ( d->kbregrab ) {
797 grabKeyboard(); 797 grabKeyboard();
798 d->kbregrab = FALSE; 798 d->kbregrab = FALSE;
799 } 799 }
800 } 800 }
801 if ( fe->simpleData.get_focus && inputMethodDict ) { 801 if ( fe->simpleData.get_focus && inputMethodDict ) {
802 InputMethodHint m = inputMethodHint( QWidget::find( e->window() ) ); 802 InputMethodHint m = inputMethodHint( QWidget::find( e->window() ) );
803 if ( m == AlwaysOff ) 803 if ( m == AlwaysOff )
804 Global::hideInputMethod(); 804 Global::hideInputMethod();
805 if ( m == AlwaysOn ) 805 if ( m == AlwaysOn )
806 Global::showInputMethod(); 806 Global::showInputMethod();
807 } 807 }
808 } 808 }
809 return QApplication::qwsEventFilter( e ); 809 return QApplication::qwsEventFilter( e );
810} 810}
811#endif 811#endif
812 812
813/*! 813/*!
814 Destroys the QPEApplication. 814 Destroys the QPEApplication.
815*/ 815*/
816QPEApplication::~QPEApplication() 816QPEApplication::~QPEApplication()
817{ 817{
818 ungrabKeyboard(); 818 ungrabKeyboard();
819#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 819#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
820 // Need to delete QCopChannels early, since the display will 820 // Need to delete QCopChannels early, since the display will
821 // be gone by the time we get to ~QObject(). 821 // be gone by the time we get to ~QObject().
822 delete sysChannel; 822 delete sysChannel;
823 delete pidChannel; 823 delete pidChannel;
824#endif 824#endif
825 825
826 delete d; 826 delete d;
827} 827}
828 828
829/*! 829/*!
830 Returns <tt>$OPIEDIR/</tt>. 830 Returns <tt>$OPIEDIR/</tt>.
831*/ 831*/
832QString QPEApplication::qpeDir() 832QString QPEApplication::qpeDir()
833{ 833{
834 const char * base = getenv( "OPIEDIR" ); 834 const char * base = getenv( "OPIEDIR" );
835 if ( base ) 835 if ( base )
836 return QString( base ) + "/"; 836 return QString( base ) + "/";
837 837
838 return QString( "../" ); 838 return QString( "../" );
839} 839}
840 840
841/*! 841/*!
842 Returns the user's current Document directory. There is a trailing "/". 842 Returns the user's current Document directory. There is a trailing "/".
843 .. well, it does now,, and there's no trailing '/' 843 .. well, it does now,, and there's no trailing '/'
844*/ 844*/
845QString QPEApplication::documentDir() 845QString QPEApplication::documentDir()
846{ 846{
847 const char* base = getenv( "HOME"); 847 const char* base = getenv( "HOME");
848 if ( base ) 848 if ( base )
849 return QString( base ) + "/Documents"; 849 return QString( base ) + "/Documents";
850 850
851 return QString( "../Documents" ); 851 return QString( "../Documents" );
852} 852}
853 853
854static int deforient = -1; 854static int deforient = -1;
855 855
856/*! 856/*!
857 \internal 857 \internal
858*/ 858*/
859int QPEApplication::defaultRotation() 859int QPEApplication::defaultRotation()
860{ 860{
861 if ( deforient < 0 ) { 861 if ( deforient < 0 ) {
862 QString d = getenv( "QWS_DISPLAY" ); 862 QString d = getenv( "QWS_DISPLAY" );
863 if ( d.contains( "Rot90" ) ) { 863 if ( d.contains( "Rot90" ) ) {
864 deforient = 90; 864 deforient = 90;
865 } 865 }
866 else if ( d.contains( "Rot180" ) ) { 866 else if ( d.contains( "Rot180" ) ) {
867 deforient = 180; 867 deforient = 180;
868 } 868 }
869 else if ( d.contains( "Rot270" ) ) { 869 else if ( d.contains( "Rot270" ) ) {
870 deforient = 270; 870 deforient = 270;
871 } 871 }
872 else { 872 else {
873 deforient = 0; 873 deforient = 0;
874 } 874 }
875 } 875 }
876 return deforient; 876 return deforient;
877} 877}
878 878
879/*! 879/*!
880 \internal 880 \internal
881*/ 881*/
882void QPEApplication::setDefaultRotation( int r ) 882void QPEApplication::setDefaultRotation( int r )
883{ 883{
884 if ( qApp->type() == GuiServer ) { 884 if ( qApp->type() == GuiServer ) {
885 deforient = r; 885 deforient = r;
886 setenv( "QWS_DISPLAY", QString( "Transformed:Rot%1:0" ).arg( r ).latin1(), 1 ); 886 setenv( "QWS_DISPLAY", QString( "Transformed:Rot%1:0" ).arg( r ).latin1(), 1 );
887 Config config("qpe"); 887 Config config("qpe");
888 config.setGroup( "Rotation" ); 888 config.setGroup( "Rotation" );
889 config.writeEntry( "Screen", getenv("QWS_DISPLAY") ); 889 config.writeEntry( "Screen", getenv("QWS_DISPLAY") );
890 } 890 }
891 else { 891 else {
892#ifndef QT_NO_COP 892#ifndef QT_NO_COP
893 { QCopEnvelope e( "QPE/System", "setDefaultRotation(int)" ); 893 { QCopEnvelope e( "QPE/System", "setDefaultRotation(int)" );
894 e << r; 894 e << r;
895 } 895 }
896#endif 896#endif
897 897
898 } 898 }
899} 899}
900 900
901// exported to libpreload.so
902bool opie_block_style = false;
903
901/*! 904/*!
902 \internal 905 \internal
903*/ 906*/
904void QPEApplication::applyStyle() 907void QPEApplication::applyStyle()
905{ 908{
906 Config config( "qpe" ); 909 Config config( "qpe" );
907
908 config.setGroup( "Appearance" ); 910 config.setGroup( "Appearance" );
909 911
912 // don't block ourselves ...
913 opie_block_style = false;
914
915
916 static QString appname;
917
918 if ( appname. isNull ( )) {
919 char src [32];
920 char dst [PATH_MAX + 1];
921 ::sprintf ( src, "/proc/%d/exe", ::getpid ( ));
922 int l = ::readlink ( src, dst, PATH_MAX );
923 if ( l > 0 ) {
924 dst [l] = 0;
925 const char *b = ::strrchr ( dst, '/' );
926 appname = ( b ? b + 1 : dst );
927 }
928 else
929 appname = "";
930 }
931
932
933 QStringList ex = config. readListEntry ( "NoStyle", ';' );
934 int nostyle = 0;
935 for ( QStringList::Iterator it = ex. begin ( ); it != ex. end ( ); ++it ) {
936 if ( QRegExp (( *it ). mid ( 1 ), false, true ). find ( appname, 0 ) >= 0 ) {
937 nostyle = ( *it ). left ( 1 ). toInt ( 0, 32 );
938 break;
939 }
940 }
941
910 // Widget style 942 // Widget style
911 QString style = config.readEntry( "Style", "Light" ); 943 QString style = config.readEntry( "Style", "Light" );
912 internalSetStyle( style ); 944
945 // don't set a custom style
946 if ( nostyle & 0x01 )
947 style = "Light";
948
949 internalSetStyle ( style );
913 950
914 // Colors 951 // Colors
915 QColor bgcolor( config.readEntry( "Background", "#E5E1D5" ) ); 952 QColor bgcolor( config.readEntry( "Background", "#E5E1D5" ) );
916 QColor btncolor( config.readEntry( "Button", "#D6CDBB" ) ); 953 QColor btncolor( config.readEntry( "Button", "#D6CDBB" ) );
917 QPalette pal( btncolor, bgcolor ); 954 QPalette pal( btncolor, bgcolor );
918 QString color = config.readEntry( "Highlight", "#800000" ); 955 QString color = config.readEntry( "Highlight", "#800000" );
919 pal.setColor( QColorGroup::Highlight, QColor( color ) ); 956 pal.setColor( QColorGroup::Highlight, QColor( color ) );
920 color = config.readEntry( "HighlightedText", "#FFFFFF" ); 957 color = config.readEntry( "HighlightedText", "#FFFFFF" );
921 pal.setColor( QColorGroup::HighlightedText, QColor( color ) ); 958 pal.setColor( QColorGroup::HighlightedText, QColor( color ) );
922 color = config.readEntry( "Text", "#000000" ); 959 color = config.readEntry( "Text", "#000000" );
923 pal.setColor( QColorGroup::Text, QColor( color ) ); 960 pal.setColor( QColorGroup::Text, QColor( color ) );
924 color = config.readEntry( "ButtonText", "#000000" ); 961 color = config.readEntry( "ButtonText", "#000000" );
925 pal.setColor( QPalette::Active, QColorGroup::ButtonText, QColor( color ) ); 962 pal.setColor( QPalette::Active, QColorGroup::ButtonText, QColor( color ) );
926 color = config.readEntry( "Base", "#FFFFFF" ); 963 color = config.readEntry( "Base", "#FFFFFF" );
927 pal.setColor( QColorGroup::Base, QColor( color ) ); 964 pal.setColor( QColorGroup::Base, QColor( color ) );
928 965
929 pal.setColor( QPalette::Disabled, QColorGroup::Text, 966 pal.setColor( QPalette::Disabled, QColorGroup::Text,
930 pal.color( QPalette::Active, QColorGroup::Background ).dark() ); 967 pal.color( QPalette::Active, QColorGroup::Background ).dark() );
931 968
932 setPalette( pal, TRUE ); 969 setPalette( pal, TRUE );
933 970
934 // Window Decoration 971 // Window Decoration
935 QString dec = config.readEntry( "Decoration", "Qtopia" ); 972 QString dec = config.readEntry( "Decoration", "Qtopia" );
973
974 // don't set a custom deco
975 if ( nostyle & 0x04 )
976 dec = "";
977
936 if ( dec != d->decorationName ) { 978 if ( dec != d->decorationName ) {
937 qwsSetDecoration( new QPEDecoration( dec ) ); 979 qwsSetDecoration( new QPEDecoration( dec ) );
938 d->decorationName = dec; 980 d->decorationName = dec;
939 } 981 }
940 982
941 // Font 983 // Font
942 QString ff = config.readEntry( "FontFamily", font().family() ); 984 QString ff = config.readEntry( "FontFamily", font().family() );
943 int fs = config.readNumEntry( "FontSize", font().pointSize() ); 985 int fs = config.readNumEntry( "FontSize", font().pointSize() );
986
987 // don't set a custom font
988 if ( nostyle & 0x02 ) {
989 ff = "Helvetica";
990 fs = 10;
991 }
992
944 setFont( QFont(ff, fs) ); 993 setFont( QFont(ff, fs) );
994
995 // revert to global blocking policy ...
996 opie_block_style = config. readBoolEntry ( "ForceStyle", false );
945} 997}
946 998
947void QPEApplication::systemMessage( const QCString& msg, const QByteArray& data ) 999void QPEApplication::systemMessage( const QCString& msg, const QByteArray& data )
948{ 1000{
949#ifdef Q_WS_QWS 1001#ifdef Q_WS_QWS
950 QDataStream stream( data, IO_ReadOnly ); 1002 QDataStream stream( data, IO_ReadOnly );
951 if ( msg == "applyStyle()" ) { 1003 if ( msg == "applyStyle()" ) {
952 applyStyle(); 1004 applyStyle();
953 } 1005 }
954 else if ( msg == "setDefaultRotation(int)" ) { 1006 else if ( msg == "setDefaultRotation(int)" ) {
955 if ( type() == GuiServer ) { 1007 if ( type() == GuiServer ) {
956 int r; 1008 int r;
957 stream >> r; 1009 stream >> r;
958 setDefaultRotation( r ); 1010 setDefaultRotation( r );
959 } 1011 }
960 } 1012 }
961 else if ( msg == "shutdown()" ) { 1013 else if ( msg == "shutdown()" ) {
962 if ( type() == GuiServer ) 1014 if ( type() == GuiServer )
963 shutdown(); 1015 shutdown();
964 } 1016 }
965 else if ( msg == "quit()" ) { 1017 else if ( msg == "quit()" ) {
966 if ( type() != GuiServer ) 1018 if ( type() != GuiServer )
967 tryQuit(); 1019 tryQuit();
968 } 1020 }
969 else if ( msg == "forceQuit()" ) { 1021 else if ( msg == "forceQuit()" ) {
970 if ( type() != GuiServer ) 1022 if ( type() != GuiServer )
971 quit(); 1023 quit();
972 } 1024 }
973 else if ( msg == "restart()" ) { 1025 else if ( msg == "restart()" ) {
974 if ( type() == GuiServer ) 1026 if ( type() == GuiServer )
975 restart(); 1027 restart();
976 } 1028 }
977 else if ( msg == "grabKeyboard(QString)" ) { 1029 else if ( msg == "grabKeyboard(QString)" ) {
978 QString who; 1030 QString who;
979 stream >> who; 1031 stream >> who;
980 if ( who.isEmpty() ) 1032 if ( who.isEmpty() )
981 d->kbgrabber = 0; 1033 d->kbgrabber = 0;
982 else if ( who != d->appName ) 1034 else if ( who != d->appName )
983 d->kbgrabber = 1; 1035 d->kbgrabber = 1;
984 else 1036 else
985 d->kbgrabber = 2; 1037 d->kbgrabber = 2;
986 } 1038 }
987 else if ( msg == "language(QString)" ) { 1039 else if ( msg == "language(QString)" ) {
988 if ( type() == GuiServer ) { 1040 if ( type() == GuiServer ) {
989 QString l; 1041 QString l;
990 stream >> l; 1042 stream >> l;
991 QString cl = getenv( "LANG" ); 1043 QString cl = getenv( "LANG" );
992 if ( cl != l ) { 1044 if ( cl != l ) {
993 if ( l.isNull() ) 1045 if ( l.isNull() )
994 unsetenv( "LANG" ); 1046 unsetenv( "LANG" );
995 else 1047 else
996 setenv( "LANG", l.latin1(), 1 ); 1048 setenv( "LANG", l.latin1(), 1 );
997 restart(); 1049 restart();
998 } 1050 }
999 } 1051 }
1000 } 1052 }
1001 else if ( msg == "timeChange(QString)" ) { 1053 else if ( msg == "timeChange(QString)" ) {
1002 QString t; 1054 QString t;
1003 stream >> t; 1055 stream >> t;
1004 if ( t.isNull() ) 1056 if ( t.isNull() )
1005 unsetenv( "TZ" ); 1057 unsetenv( "TZ" );
1006 else 1058 else
1007 setenv( "TZ", t.latin1(), 1 ); 1059 setenv( "TZ", t.latin1(), 1 );
1008 // emit the signal so everyone else knows... 1060 // emit the signal so everyone else knows...
1009 emit timeChanged(); 1061 emit timeChanged();
1010 } 1062 }
1011 else if ( msg == "execute(QString)" ) { 1063 else if ( msg == "execute(QString)" ) {
1012 if ( type() == GuiServer ) { 1064 if ( type() == GuiServer ) {
1013 QString t; 1065 QString t;
1014 stream >> t; 1066 stream >> t;
1015 Global::execute( t ); 1067 Global::execute( t );
1016 } 1068 }
1017 } 1069 }
1018 else if ( msg == "execute(QString,QString)" ) { 1070 else if ( msg == "execute(QString,QString)" ) {
1019 if ( type() == GuiServer ) { 1071 if ( type() == GuiServer ) {
1020 QString t, d; 1072 QString t, d;
1021 stream >> t >> d; 1073 stream >> t >> d;
1022 Global::execute( t, d ); 1074 Global::execute( t, d );
1023 } 1075 }
1024 } 1076 }
1025 else if ( msg == "addAlarm(QDateTime,QCString,QCString,int)" ) { 1077 else if ( msg == "addAlarm(QDateTime,QCString,QCString,int)" ) {
1026 if ( type() == GuiServer ) { 1078 if ( type() == GuiServer ) {
1027 QDateTime when; 1079 QDateTime when;
1028 QCString channel, message; 1080 QCString channel, message;
1029 int data; 1081 int data;
1030 stream >> when >> channel >> message >> data; 1082 stream >> when >> channel >> message >> data;
1031 AlarmServer::addAlarm( when, channel, message, data ); 1083 AlarmServer::addAlarm( when, channel, message, data );
1032 } 1084 }
1033 } 1085 }
1034 else if ( msg == "deleteAlarm(QDateTime,QCString,QCString,int)" ) { 1086 else if ( msg == "deleteAlarm(QDateTime,QCString,QCString,int)" ) {
1035 if ( type() == GuiServer ) { 1087 if ( type() == GuiServer ) {
1036 QDateTime when; 1088 QDateTime when;
1037 QCString channel, message; 1089 QCString channel, message;
1038 int data; 1090 int data;
1039 stream >> when >> channel >> message >> data; 1091 stream >> when >> channel >> message >> data;
1040 AlarmServer::deleteAlarm( when, channel, message, data ); 1092 AlarmServer::deleteAlarm( when, channel, message, data );
1041 } 1093 }
1042 } 1094 }
1043 else if ( msg == "clockChange(bool)" ) { 1095 else if ( msg == "clockChange(bool)" ) {
1044 int tmp; 1096 int tmp;
1045 stream >> tmp; 1097 stream >> tmp;
1046 emit clockChanged( tmp ); 1098 emit clockChanged( tmp );
1047 } 1099 }
1048 else if ( msg == "weekChange(bool)" ) { 1100 else if ( msg == "weekChange(bool)" ) {
1049 int tmp; 1101 int tmp;
1050 stream >> tmp; 1102 stream >> tmp;
1051 emit weekChanged( tmp ); 1103 emit weekChanged( tmp );
1052 } 1104 }
1053 else if ( msg == "setDateFormat(DateFormat)" ) { 1105 else if ( msg == "setDateFormat(DateFormat)" ) {
1054 DateFormat tmp; 1106 DateFormat tmp;
1055 stream >> tmp; 1107 stream >> tmp;
1056 emit dateFormatChanged( tmp ); 1108 emit dateFormatChanged( tmp );
1057 } 1109 }
1058 else if ( msg == "setVolume(int,int)" ) { 1110 else if ( msg == "setVolume(int,int)" ) {
1059 int t, v; 1111 int t, v;
1060 stream >> t >> v; 1112 stream >> t >> v;
1061 setVolume( t, v ); 1113 setVolume( t, v );
1062 emit volumeChanged( muted ); 1114 emit volumeChanged( muted );
1063 } 1115 }
1064 else if ( msg == "volumeChange(bool)" ) { 1116 else if ( msg == "volumeChange(bool)" ) {
1065 stream >> muted; 1117 stream >> muted;
1066 setVolume(); 1118 setVolume();
1067 emit volumeChanged( muted ); 1119 emit volumeChanged( muted );
1068 } 1120 }
1069 else if ( msg == "setMic(int,int)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com> 1121 else if ( msg == "setMic(int,int)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com>
1070 int t, v; 1122 int t, v;
1071 stream >> t >> v; 1123 stream >> t >> v;
1072 setMic( t, v ); 1124 setMic( t, v );
1073 emit micChanged( micMuted ); 1125 emit micChanged( micMuted );
1074 } 1126 }
1075 else if ( msg == "micChange(bool)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com> 1127 else if ( msg == "micChange(bool)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com>
1076 stream >> micMuted; 1128 stream >> micMuted;
1077 setMic(); 1129 setMic();
1078 emit micChanged( micMuted ); 1130 emit micChanged( micMuted );
1079 } 1131 }
1080#endif 1132#endif
1081} 1133}
1082 1134
1083/*! 1135/*!
1084 \internal 1136 \internal
1085*/ 1137*/
1086bool QPEApplication::raiseAppropriateWindow() 1138bool QPEApplication::raiseAppropriateWindow()
1087{ 1139{
1088 bool r = FALSE; 1140 bool r = FALSE;
1089 // ########## raise()ing main window should raise and set active 1141 // ########## raise()ing main window should raise and set active
1090 // ########## it and then all childen. This belongs in Qt/Embedded 1142 // ########## it and then all childen. This belongs in Qt/Embedded
1091 QWidget *top = d->qpe_main_widget; 1143 QWidget *top = d->qpe_main_widget;
1092 if ( !top ) 1144 if ( !top )
1093 top = mainWidget(); 1145 top = mainWidget();
1094 if ( top && d->keep_running ) { 1146 if ( top && d->keep_running ) {
1095 if ( top->isVisible() ) 1147 if ( top->isVisible() )
1096 r = TRUE; 1148 r = TRUE;
1097 else if (d->preloaded) { 1149 else if (d->preloaded) {
1098 // We are preloaded and not visible.. pretend we just started.. 1150 // We are preloaded and not visible.. pretend we just started..
1099 QCopEnvelope e("QPE/System", "fastAppShowing(QString)"); 1151 QCopEnvelope e("QPE/System", "fastAppShowing(QString)");
1100 e << d->appName; 1152 e << d->appName;
1101 } 1153 }
1102 1154
1103 d->show_mx(top, d->nomaximize); 1155 d->show_mx(top, d->nomaximize);
1104 top->raise(); 1156 top->raise();
1105 top->setActiveWindow(); 1157 top->setActiveWindow();
1106 } 1158 }
1107 QWidget *topm = activeModalWidget(); 1159 QWidget *topm = activeModalWidget();
1108 if ( topm && topm != top ) { 1160 if ( topm && topm != top ) {
1109 topm->show(); 1161 topm->show();
1110 topm->raise(); 1162 topm->raise();
1111 topm->setActiveWindow(); 1163 topm->setActiveWindow();
1112 // If we haven't already handled the fastAppShowing message 1164 // If we haven't already handled the fastAppShowing message
1113 if (!top && d->preloaded) { 1165 if (!top && d->preloaded) {
1114 QCopEnvelope e("QPE/System", "fastAppShowing(QString)"); 1166 QCopEnvelope e("QPE/System", "fastAppShowing(QString)");
1115 e << d->appName; 1167 e << d->appName;
1116 } 1168 }
1117 r = FALSE; 1169 r = FALSE;
1118 } 1170 }
1119 return r; 1171 return r;
1120} 1172}
1121 1173
1122void QPEApplication::pidMessage( const QCString& msg, const QByteArray& data) 1174void QPEApplication::pidMessage( const QCString& msg, const QByteArray& data)
1123{ 1175{
1124#ifdef Q_WS_QWS 1176#ifdef Q_WS_QWS
1125 1177
1126 if ( msg == "quit()" ) { 1178 if ( msg == "quit()" ) {
1127 tryQuit(); 1179 tryQuit();
1128 } 1180 }
1129 else if ( msg == "quitIfInvisible()" ) { 1181 else if ( msg == "quitIfInvisible()" ) {
1130 if ( d->qpe_main_widget && !d->qpe_main_widget->isVisible() ) 1182 if ( d->qpe_main_widget && !d->qpe_main_widget->isVisible() )
1131 quit(); 1183 quit();
1132 } 1184 }
1133 else if ( msg == "close()" ) { 1185 else if ( msg == "close()" ) {
1134 hideOrQuit(); 1186 hideOrQuit();
1135 } 1187 }
1136 else if ( msg == "disablePreload()" ) { 1188 else if ( msg == "disablePreload()" ) {
1137 d->preloaded = FALSE; 1189 d->preloaded = FALSE;
1138 d->keep_running = TRUE; 1190 d->keep_running = TRUE;
1139 /* so that quit will quit */ 1191 /* so that quit will quit */
1140 } 1192 }
1141 else if ( msg == "enablePreload()" ) { 1193 else if ( msg == "enablePreload()" ) {
1142 if (d->qpe_main_widget) 1194 if (d->qpe_main_widget)
1143 d->preloaded = TRUE; 1195 d->preloaded = TRUE;
1144 d->keep_running = TRUE; 1196 d->keep_running = TRUE;
1145 /* so next quit won't quit */ 1197 /* so next quit won't quit */
1146 } 1198 }
1147 else if ( msg == "raise()" ) { 1199 else if ( msg == "raise()" ) {
1148 d->keep_running = TRUE; 1200 d->keep_running = TRUE;
1149 d->notbusysent = FALSE; 1201 d->notbusysent = FALSE;
1150 raiseAppropriateWindow(); 1202 raiseAppropriateWindow();
1151 // Tell the system we're still chugging along... 1203 // Tell the system we're still chugging along...
1152 QCopEnvelope e("QPE/System", "appRaised(QString)"); 1204 QCopEnvelope e("QPE/System", "appRaised(QString)");
1153 e << d->appName; 1205 e << d->appName;
1154 } 1206 }
1155 else if ( msg == "flush()" ) { 1207 else if ( msg == "flush()" ) {
1156 emit flush(); 1208 emit flush();
1157 // we need to tell the desktop 1209 // we need to tell the desktop
1158 QCopEnvelope e( "QPE/Desktop", "flushDone(QString)" ); 1210 QCopEnvelope e( "QPE/Desktop", "flushDone(QString)" );
1159 e << d->appName; 1211 e << d->appName;
1160 } 1212 }
1161 else if ( msg == "reload()" ) { 1213 else if ( msg == "reload()" ) {
1162 emit reload(); 1214 emit reload();
1163 } 1215 }
1164 else if ( msg == "setDocument(QString)" ) { 1216 else if ( msg == "setDocument(QString)" ) {
1165 d->keep_running = TRUE; 1217 d->keep_running = TRUE;
1166 QDataStream stream( data, IO_ReadOnly ); 1218 QDataStream stream( data, IO_ReadOnly );
1167 QString doc; 1219 QString doc;
1168 stream >> doc; 1220 stream >> doc;
1169 QWidget *mw = mainWidget(); 1221 QWidget *mw = mainWidget();
1170 if ( !mw ) 1222 if ( !mw )
1171 mw = d->qpe_main_widget; 1223 mw = d->qpe_main_widget;
1172 if ( mw ) 1224 if ( mw )
1173 Global::setDocument( mw, doc ); 1225 Global::setDocument( mw, doc );
1174 } 1226 }
1175 else if ( msg == "nextView()" ) { 1227 else if ( msg == "nextView()" ) {
1176 qDebug("got nextView()"); 1228 qDebug("got nextView()");
1177 /* 1229 /*
1178 if ( raiseAppropriateWindow() ) 1230 if ( raiseAppropriateWindow() )
1179 */ 1231 */
1180 emit appMessage( msg, data); 1232 emit appMessage( msg, data);
1181 } 1233 }
1182 else { 1234 else {
1183 emit appMessage( msg, data); 1235 emit appMessage( msg, data);
1184 } 1236 }
1185 1237
1186#endif 1238#endif
1187} 1239}
1188 1240
1189 1241
1190/*! 1242/*!
1191 Sets widget \a mw as the mainWidget() and shows it. For small windows, 1243 Sets widget \a mw as the mainWidget() and shows it. For small windows,
1192 consider passing TRUE for \a nomaximize rather than the default FALSE. 1244 consider passing TRUE for \a nomaximize rather than the default FALSE.
1193 1245
1194 \sa showMainDocumentWidget() 1246 \sa showMainDocumentWidget()
1195*/ 1247*/
1196void QPEApplication::showMainWidget( QWidget* mw, bool nomaximize ) 1248void QPEApplication::showMainWidget( QWidget* mw, bool nomaximize )
1197{ 1249{
1198 d->show(mw, nomaximize ); 1250 d->show(mw, nomaximize );
1199} 1251}
1200 1252
1201/*! 1253/*!
1202 Sets widget \a mw as the mainWidget() and shows it. For small windows, 1254 Sets widget \a mw as the mainWidget() and shows it. For small windows,
1203 consider passing TRUE for \a nomaximize rather than the default FALSE. 1255 consider passing TRUE for \a nomaximize rather than the default FALSE.
1204 1256
1205 This calls designates the application as 1257 This calls designates the application as
1206 a \link docwidget.html document-oriented\endlink application. 1258 a \link docwidget.html document-oriented\endlink application.
1207 1259
1208 The \a mw widget \e must have this slot: setDocument(const QString&). 1260 The \a mw widget \e must have this slot: setDocument(const QString&).
1209 1261
1210 \sa showMainWidget() 1262 \sa showMainWidget()
1211*/ 1263*/
1212void QPEApplication::showMainDocumentWidget( QWidget* mw, bool nomaximize ) 1264void QPEApplication::showMainDocumentWidget( QWidget* mw, bool nomaximize )
1213{ 1265{
1214 if ( mw && argc() == 2 ) 1266 if ( mw && argc() == 2 )
1215 Global::setDocument( mw, QString::fromUtf8(argv()[1]) ); 1267 Global::setDocument( mw, QString::fromUtf8(argv()[1]) );
1216 1268
1217 d->show(mw, nomaximize ); 1269 d->show(mw, nomaximize );
1218} 1270}
1219 1271
1220 1272
1221/*! 1273/*!
1222 If an application is started via a \link qcop.html QCop\endlink 1274 If an application is started via a \link qcop.html QCop\endlink
1223 message, the application will process the \link qcop.html 1275 message, the application will process the \link qcop.html
1224 QCop\endlink message and then quit. If the application calls this 1276 QCop\endlink message and then quit. If the application calls this
1225 function while processing a \link qcop.html QCop\endlink message, 1277 function while processing a \link qcop.html QCop\endlink message,
1226 after processing its outstanding \link qcop.html QCop\endlink 1278 after processing its outstanding \link qcop.html QCop\endlink
1227 messages the application will start 'properly' and show itself. 1279 messages the application will start 'properly' and show itself.
1228 1280
1229 \sa keepRunning() 1281 \sa keepRunning()
1230*/ 1282*/
1231void QPEApplication::setKeepRunning() 1283void QPEApplication::setKeepRunning()
1232{ 1284{
1233 if ( qApp && qApp->inherits( "QPEApplication" ) ) { 1285 if ( qApp && qApp->inherits( "QPEApplication" ) ) {
1234 QPEApplication * qpeApp = ( QPEApplication* ) qApp; 1286 QPEApplication * qpeApp = ( QPEApplication* ) qApp;
1235 qpeApp->d->keep_running = TRUE; 1287 qpeApp->d->keep_running = TRUE;
1236 } 1288 }
1237} 1289}
1238 1290
1239/*! 1291/*!
1240 Returns TRUE if the application will quit after processing the 1292 Returns TRUE if the application will quit after processing the
1241 current list of qcop messages; otherwise returns FALSE. 1293 current list of qcop messages; otherwise returns FALSE.
1242 1294
1243 \sa setKeepRunning() 1295 \sa setKeepRunning()
1244*/ 1296*/
1245bool QPEApplication::keepRunning() const 1297bool QPEApplication::keepRunning() const
1246{ 1298{
1247 return d->keep_running; 1299 return d->keep_running;
1248} 1300}
1249 1301
1250/*! 1302/*!
1251 \internal 1303 \internal
1252*/ 1304*/
1253void QPEApplication::internalSetStyle( const QString &style ) 1305void QPEApplication::internalSetStyle( const QString &style )
1254{ 1306{
1255#if QT_VERSION >= 300 1307#if QT_VERSION >= 300
1256 if ( style == "QPE" ) { 1308 if ( style == "QPE" ) {
1257 setStyle( new QPEStyle ); 1309 setStyle( new QPEStyle );
1258 } 1310 }
1259 else { 1311 else {
1260 QStyle *s = QStyleFactory::create( style ); 1312 QStyle *s = QStyleFactory::create( style );
1261 if ( s ) 1313 if ( s )
1262 setStyle( s ); 1314 setStyle( s );
1263 } 1315 }
1264#else 1316#else
1265 if ( style == "Windows" ) { 1317 if ( style == "Windows" ) {
1266 setStyle( new QWindowsStyle ); 1318 setStyle( new QWindowsStyle );
1267 } 1319 }
1268 else if ( style == "QPE" ) { 1320 else if ( style == "QPE" ) {
1269 setStyle( new QPEStyle ); 1321 setStyle( new QPEStyle );
1270 } 1322 }
1271 else if ( style == "Light" ) { 1323 else if ( style == "Light" ) {
1272 setStyle( new LightStyle ); 1324 setStyle( new LightStyle );
1273 } 1325 }
1274#ifndef QT_NO_STYLE_PLATINUM 1326#ifndef QT_NO_STYLE_PLATINUM
1275 else if ( style == "Platinum" ) { 1327 else if ( style == "Platinum" ) {
1276 setStyle( new QPlatinumStyle ); 1328 setStyle( new QPlatinumStyle );
1277 } 1329 }
1278#endif 1330#endif
1279#ifndef QT_NO_STYLE_MOTIF 1331#ifndef QT_NO_STYLE_MOTIF
1280 else if ( style == "Motif" ) { 1332 else if ( style == "Motif" ) {
1281 setStyle( new QMotifStyle ); 1333 setStyle( new QMotifStyle );
1282 } 1334 }
1283#endif 1335#endif
1284#ifndef QT_NO_STYLE_MOTIFPLUS 1336#ifndef QT_NO_STYLE_MOTIFPLUS
1285 else if ( style == "MotifPlus" ) { 1337 else if ( style == "MotifPlus" ) {
1286 setStyle( new QMotifPlusStyle ); 1338 setStyle( new QMotifPlusStyle );
1287 } 1339 }
1288#endif 1340#endif
1289 1341
1290 else { 1342 else {
1291 QStyle *sty = 0; 1343 QStyle *sty = 0;
1292 QString path = QPEApplication::qpeDir ( ) + "/plugins/styles/"; 1344 QString path = QPEApplication::qpeDir ( ) + "/plugins/styles/";
1293 1345
1294 if ( style. find ( ".so" ) > 0 ) 1346 if ( style. find ( ".so" ) > 0 )
1295 path += style; 1347 path += style;
1296 else 1348 else
1297 path = path + "lib" + style. lower ( ) + ".so"; // compatibility 1349 path = path + "lib" + style. lower ( ) + ".so"; // compatibility
1298 1350
1299 static QLibrary *lastlib = 0; 1351 static QLibrary *lastlib = 0;
1300 static StyleInterface *lastiface = 0; 1352 static StyleInterface *lastiface = 0;
1301 1353
1302 QLibrary *lib = new QLibrary ( path ); 1354 QLibrary *lib = new QLibrary ( path );
1303 StyleInterface *iface = 0; 1355 StyleInterface *iface = 0;
1304 1356
1305 if (( lib-> queryInterface ( IID_Style, ( QUnknownInterface ** ) &iface ) == QS_OK ) && iface ) 1357 if (( lib-> queryInterface ( IID_Style, ( QUnknownInterface ** ) &iface ) == QS_OK ) && iface )
1306 sty = iface-> style ( ); 1358 sty = iface-> style ( );
1307 1359
1308 if ( sty ) { 1360 if ( sty ) {
1309 setStyle ( sty ); 1361 setStyle ( sty );
1310 1362
1311 if ( lastiface ) 1363 if ( lastiface )
1312 lastiface-> release ( ); 1364 lastiface-> release ( );
1313 lastiface = iface; 1365 lastiface = iface;
1314 1366
1315 if ( lastlib ) { 1367 if ( lastlib ) {
1316 lastlib-> unload ( ); 1368 lastlib-> unload ( );
1317 delete lastlib; 1369 delete lastlib;
1318 } 1370 }
1319 lastlib = lib; 1371 lastlib = lib;
1320 } 1372 }
1321 else { 1373 else {
1322 if ( iface ) 1374 if ( iface )
1323 iface-> release ( ); 1375 iface-> release ( );
1324 delete lib; 1376 delete lib;
1325 1377
1326 setStyle ( new QPEStyle ( )); 1378 setStyle ( new LightStyle ( ));
1327 } 1379 }
1328 } 1380 }
1329#endif 1381#endif
1330} 1382}
1331 1383
1332/*! 1384/*!
1333 \internal 1385 \internal
1334*/ 1386*/
1335void QPEApplication::prepareForTermination( bool willrestart ) 1387void QPEApplication::prepareForTermination( bool willrestart )
1336{ 1388{
1337 if ( willrestart ) { 1389 if ( willrestart ) {
1338 // Draw a big wait icon, the image can be altered in later revisions 1390 // Draw a big wait icon, the image can be altered in later revisions
1339 // QWidget *d = QApplication::desktop(); 1391 // QWidget *d = QApplication::desktop();
1340 QImage img = Resource::loadImage( "launcher/new_wait" ); 1392 QImage img = Resource::loadImage( "launcher/new_wait" );
1341 QPixmap pix; 1393 QPixmap pix;
1342 pix.convertFromImage( img.smoothScale( 1 * img.width(), 1 * img.height() ) ); 1394 pix.convertFromImage( img.smoothScale( 1 * img.width(), 1 * img.height() ) );
1343 QLabel *lblWait = new QLabel( 0, "wait hack!", QWidget::WStyle_Customize | 1395 QLabel *lblWait = new QLabel( 0, "wait hack!", QWidget::WStyle_Customize |
1344 QWidget::WStyle_NoBorder | QWidget::WStyle_Tool ); 1396 QWidget::WStyle_NoBorder | QWidget::WStyle_Tool );
1345 lblWait->setPixmap( pix ); 1397 lblWait->setPixmap( pix );
1346 lblWait->setAlignment( QWidget::AlignCenter ); 1398 lblWait->setAlignment( QWidget::AlignCenter );
1347 lblWait->show(); 1399 lblWait->show();
1348 lblWait->showMaximized(); 1400 lblWait->showMaximized();
1349 } 1401 }
1350#ifndef SINGLE_APP 1402#ifndef SINGLE_APP
1351 { QCopEnvelope envelope( "QPE/System", "forceQuit()" ); 1403 { QCopEnvelope envelope( "QPE/System", "forceQuit()" );
1352 } 1404 }
1353 processEvents(); // ensure the message goes out. 1405 processEvents(); // ensure the message goes out.
1354 sleep( 1 ); // You have 1 second to comply. 1406 sleep( 1 ); // You have 1 second to comply.
1355#endif 1407#endif
1356} 1408}
1357 1409
1358/*! 1410/*!
1359 \internal 1411 \internal
1360*/ 1412*/
1361void QPEApplication::shutdown() 1413void QPEApplication::shutdown()
1362{ 1414{
1363 // Implement in server's QPEApplication subclass 1415 // Implement in server's QPEApplication subclass
1364} 1416}
1365 1417
1366/*! 1418/*!
1367 \internal 1419 \internal
1368*/ 1420*/
1369void QPEApplication::restart() 1421void QPEApplication::restart()
1370{ 1422{
1371 // Implement in server's QPEApplication subclass 1423 // Implement in server's QPEApplication subclass
1372} 1424}
1373 1425
1374static QPtrDict<void>* stylusDict = 0; 1426static QPtrDict<void>* stylusDict = 0;
1375static void createDict() 1427static void createDict()
1376{ 1428{
1377 if ( !stylusDict ) 1429 if ( !stylusDict )
1378 stylusDict = new QPtrDict<void>; 1430 stylusDict = new QPtrDict<void>;
1379} 1431}
1380 1432
1381/*! 1433/*!
1382 Returns the current StylusMode for widget \a w. 1434 Returns the current StylusMode for widget \a w.
1383 1435
1384 \sa setStylusOperation() StylusMode 1436 \sa setStylusOperation() StylusMode
1385*/ 1437*/
1386QPEApplication::StylusMode QPEApplication::stylusOperation( QWidget* w ) 1438QPEApplication::StylusMode QPEApplication::stylusOperation( QWidget* w )
1387{ 1439{
1388 if ( stylusDict ) 1440 if ( stylusDict )
1389 return ( StylusMode ) ( int ) stylusDict->find( w ); 1441 return ( StylusMode ) ( int ) stylusDict->find( w );
1390 return LeftOnly; 1442 return LeftOnly;
1391} 1443}
1392 1444
1393/*! 1445/*!
1394 \enum QPEApplication::StylusMode 1446 \enum QPEApplication::StylusMode
1395 1447
1396 \value LeftOnly the stylus only generates LeftButton 1448 \value LeftOnly the stylus only generates LeftButton
1397 events (the default). 1449 events (the default).
1398 \value RightOnHold the stylus generates RightButton events 1450 \value RightOnHold the stylus generates RightButton events
1399 if the user uses the press-and-hold gesture. 1451 if the user uses the press-and-hold gesture.
1400 1452
1401 \sa setStylusOperation() stylusOperation() 1453 \sa setStylusOperation() stylusOperation()
1402*/ 1454*/
1403 1455
1404/*! 1456/*!
1405 Causes widget \a w to receive mouse events according to the stylus 1457 Causes widget \a w to receive mouse events according to the stylus
1406 \a mode. 1458 \a mode.
1407 1459
1408 \sa stylusOperation() StylusMode 1460 \sa stylusOperation() StylusMode
1409*/ 1461*/
1410void QPEApplication::setStylusOperation( QWidget * w, StylusMode mode ) 1462void QPEApplication::setStylusOperation( QWidget * w, StylusMode mode )
1411{ 1463{
1412 createDict(); 1464 createDict();
1413 if ( mode == LeftOnly ) { 1465 if ( mode == LeftOnly ) {
1414 stylusDict->remove 1466 stylusDict->remove
1415 ( w ); 1467 ( w );
1416 w->removeEventFilter( qApp ); 1468 w->removeEventFilter( qApp );
1417 } 1469 }
1418 else { 1470 else {
1419 stylusDict->insert( w, ( void* ) mode ); 1471 stylusDict->insert( w, ( void* ) mode );
1420 connect( w, SIGNAL( destroyed() ), qApp, SLOT( removeSenderFromStylusDict() ) ); 1472 connect( w, SIGNAL( destroyed() ), qApp, SLOT( removeSenderFromStylusDict() ) );
1421 w->installEventFilter( qApp ); 1473 w->installEventFilter( qApp );
1422 } 1474 }
1423} 1475}
1424 1476
1425 1477
1426/*! 1478/*!
1427 \reimp 1479 \reimp
1428*/ 1480*/
1429bool QPEApplication::eventFilter( QObject *o, QEvent *e ) 1481bool QPEApplication::eventFilter( QObject *o, QEvent *e )
1430{ 1482{
1431 if ( stylusDict && e->type() >= QEvent::MouseButtonPress && e->type() <= QEvent::MouseMove ) { 1483 if ( stylusDict && e->type() >= QEvent::MouseButtonPress && e->type() <= QEvent::MouseMove ) {
1432 QMouseEvent * me = ( QMouseEvent* ) e; 1484 QMouseEvent * me = ( QMouseEvent* ) e;
1433 StylusMode mode = (StylusMode)(int)stylusDict->find(o); 1485 StylusMode mode = (StylusMode)(int)stylusDict->find(o);
1434 switch (mode) { 1486 switch (mode) {
1435 case RightOnHold: 1487 case RightOnHold:
1436 switch ( me->type() ) { 1488 switch ( me->type() ) {
1437 case QEvent::MouseButtonPress: 1489 case QEvent::MouseButtonPress:
1438 if ( me->button() == LeftButton ) { 1490 if ( me->button() == LeftButton ) {
1439 d->presstimer = startTimer(500); // #### pref. 1491 d->presstimer = startTimer(500); // #### pref.
1440 d->presswidget = (QWidget*)o; 1492 d->presswidget = (QWidget*)o;
1441 d->presspos = me->pos(); 1493 d->presspos = me->pos();
1442 d->rightpressed = FALSE; 1494 d->rightpressed = FALSE;
1443 } 1495 }
1444 break; 1496 break;
1445 case QEvent::MouseMove: 1497 case QEvent::MouseMove:
1446 if (d->presstimer && (me->pos() - d->presspos).manhattanLength() > 8) { 1498 if (d->presstimer && (me->pos() - d->presspos).manhattanLength() > 8) {
1447 killTimer(d->presstimer); 1499 killTimer(d->presstimer);
1448 d->presstimer = 0; 1500 d->presstimer = 0;
1449 } 1501 }
1450 break; 1502 break;
1451 case QEvent::MouseButtonRelease: 1503 case QEvent::MouseButtonRelease:
1452 if ( me->button() == LeftButton ) { 1504 if ( me->button() == LeftButton ) {
1453 if ( d->presstimer ) { 1505 if ( d->presstimer ) {
1454 killTimer(d->presstimer); 1506 killTimer(d->presstimer);
1455 d->presstimer = 0; 1507 d->presstimer = 0;
1456 } 1508 }
1457 if ( d->rightpressed && d->presswidget ) { 1509 if ( d->rightpressed && d->presswidget ) {
1458 // Right released 1510 // Right released
1459 postEvent( d->presswidget, 1511 postEvent( d->presswidget,
1460 new QMouseEvent( QEvent::MouseButtonRelease, me->pos(), 1512 new QMouseEvent( QEvent::MouseButtonRelease, me->pos(),
1461 RightButton, LeftButton + RightButton ) ); 1513 RightButton, LeftButton + RightButton ) );
1462 // Left released, off-widget 1514 // Left released, off-widget
1463 postEvent( d->presswidget, 1515 postEvent( d->presswidget,
1464 new QMouseEvent( QEvent::MouseMove, QPoint( -1, -1), 1516 new QMouseEvent( QEvent::MouseMove, QPoint( -1, -1),
1465 LeftButton, LeftButton ) ); 1517 LeftButton, LeftButton ) );
1466 postEvent( d->presswidget, 1518 postEvent( d->presswidget,
1467 new QMouseEvent( QEvent::MouseButtonRelease, QPoint( -1, -1), 1519 new QMouseEvent( QEvent::MouseButtonRelease, QPoint( -1, -1),
1468 LeftButton, LeftButton ) ); 1520 LeftButton, LeftButton ) );
1469 d->rightpressed = FALSE; 1521 d->rightpressed = FALSE;
1470 return TRUE; // don't send the real Left release 1522 return TRUE; // don't send the real Left release
1471 } 1523 }
1472 } 1524 }
1473 break; 1525 break;
1474 default: 1526 default:
1475 break; 1527 break;
1476 } 1528 }
1477 break; 1529 break;
1478 default: 1530 default:
1479 ; 1531 ;
1480 } 1532 }
1481 } 1533 }
1482 else if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) { 1534 else if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) {
1483 QKeyEvent *ke = (QKeyEvent *)e; 1535 QKeyEvent *ke = (QKeyEvent *)e;
1484 if ( ke->key() == Key_Enter ) { 1536 if ( ke->key() == Key_Enter ) {
1485 if ( o->isA( "QRadioButton" ) || o->isA( "QCheckBox" ) ) { 1537 if ( o->isA( "QRadioButton" ) || o->isA( "QCheckBox" ) ) {
1486 postEvent( o, new QKeyEvent( e->type(), Key_Space, ' ', 1538 postEvent( o, new QKeyEvent( e->type(), Key_Space, ' ',
1487 ke->state(), " ", ke->isAutoRepeat(), ke->count() ) ); 1539 ke->state(), " ", ke->isAutoRepeat(), ke->count() ) );
1488 return TRUE; 1540 return TRUE;
1489 } 1541 }
1490 } 1542 }
1491 } 1543 }
1492 return FALSE; 1544 return FALSE;
1493} 1545}
1494 1546
1495/*! 1547/*!
1496 \reimp 1548 \reimp
1497*/ 1549*/
1498void QPEApplication::timerEvent( QTimerEvent *e ) 1550void QPEApplication::timerEvent( QTimerEvent *e )
1499{ 1551{
1500 if ( e->timerId() == d->presstimer && d->presswidget ) { 1552 if ( e->timerId() == d->presstimer && d->presswidget ) {
1501 // Right pressed 1553 // Right pressed
1502 postEvent( d->presswidget, 1554 postEvent( d->presswidget,
1503 new QMouseEvent( QEvent::MouseButtonPress, d->presspos, 1555 new QMouseEvent( QEvent::MouseButtonPress, d->presspos,
1504 RightButton, LeftButton ) ); 1556 RightButton, LeftButton ) );
1505 killTimer( d->presstimer ); 1557 killTimer( d->presstimer );
1506 d->presstimer = 0; 1558 d->presstimer = 0;
1507 d->rightpressed = TRUE; 1559 d->rightpressed = TRUE;
1508 } 1560 }
1509} 1561}
1510 1562
1511void QPEApplication::removeSenderFromStylusDict() 1563void QPEApplication::removeSenderFromStylusDict()
1512{ 1564{
1513 stylusDict->remove 1565 stylusDict->remove
1514 ( ( void* ) sender() ); 1566 ( ( void* ) sender() );
1515 if ( d->presswidget == sender() ) 1567 if ( d->presswidget == sender() )
1516 d->presswidget = 0; 1568 d->presswidget = 0;
1517} 1569}
1518 1570
1519/*! 1571/*!
1520 \internal 1572 \internal
1521*/ 1573*/
1522bool QPEApplication::keyboardGrabbed() const 1574bool QPEApplication::keyboardGrabbed() const
1523{ 1575{
1524 return d->kbgrabber; 1576 return d->kbgrabber;
1525} 1577}
1526 1578
1527 1579
1528/*! 1580/*!
1529 Reverses the effect of grabKeyboard(). This is called automatically 1581 Reverses the effect of grabKeyboard(). This is called automatically
1530 on program exit. 1582 on program exit.
1531*/ 1583*/
1532void QPEApplication::ungrabKeyboard() 1584void QPEApplication::ungrabKeyboard()
1533{ 1585{
1534 QPEApplicationData * d = ( ( QPEApplication* ) qApp ) ->d; 1586 QPEApplicationData * d = ( ( QPEApplication* ) qApp ) ->d;
1535 if ( d->kbgrabber == 2 ) { 1587 if ( d->kbgrabber == 2 ) {
1536#ifndef QT_NO_COP 1588#ifndef QT_NO_COP
1537 QCopEnvelope e( "QPE/System", "grabKeyboard(QString)" ); 1589 QCopEnvelope e( "QPE/System", "grabKeyboard(QString)" );
1538 e << QString::null; 1590 e << QString::null;
1539#endif 1591#endif
1540 1592
1541 d->kbregrab = FALSE; 1593 d->kbregrab = FALSE;
1542 d->kbgrabber = 0; 1594 d->kbgrabber = 0;
1543 } 1595 }
1544} 1596}
1545 1597
1546/*! 1598/*!
1547 Grabs the physical keyboard keys, e.g. the application's launching 1599 Grabs the physical keyboard keys, e.g. the application's launching
1548 keys. Instead of launching applications when these keys are pressed 1600 keys. Instead of launching applications when these keys are pressed
1549 the signals emitted are sent to this application instead. Some games 1601 the signals emitted are sent to this application instead. Some games
1550 programs take over the launch keys in this way to make interaction 1602 programs take over the launch keys in this way to make interaction
1551 easier. 1603 easier.
1552 1604
1553 \sa ungrabKeyboard() 1605 \sa ungrabKeyboard()
1554*/ 1606*/
1555void QPEApplication::grabKeyboard() 1607void QPEApplication::grabKeyboard()
1556{ 1608{
1557 QPEApplicationData * d = ( ( QPEApplication* ) qApp ) ->d; 1609 QPEApplicationData * d = ( ( QPEApplication* ) qApp ) ->d;
1558 if ( qApp->type() == QApplication::GuiServer ) 1610 if ( qApp->type() == QApplication::GuiServer )
1559 d->kbgrabber = 0; 1611 d->kbgrabber = 0;
1560 else { 1612 else {
1561#ifndef QT_NO_COP 1613#ifndef QT_NO_COP
1562 QCopEnvelope e( "QPE/System", "grabKeyboard(QString)" ); 1614 QCopEnvelope e( "QPE/System", "grabKeyboard(QString)" );
1563 e << d->appName; 1615 e << d->appName;
1564#endif 1616#endif
1565 1617
1566 d->kbgrabber = 2; // me 1618 d->kbgrabber = 2; // me
1567 } 1619 }
1568} 1620}
1569 1621
1570/*! 1622/*!
1571 \reimp 1623 \reimp
1572*/ 1624*/
1573int QPEApplication::exec() 1625int QPEApplication::exec()
1574{ 1626{
1575#ifndef QT_NO_COP 1627#ifndef QT_NO_COP
1576 d->sendQCopQ(); 1628 d->sendQCopQ();
1577#endif 1629#endif
1578 1630
1579 if ( d->keep_running ) 1631 if ( d->keep_running )
1580 //|| d->qpe_main_widget && d->qpe_main_widget->isVisible() ) 1632 //|| d->qpe_main_widget && d->qpe_main_widget->isVisible() )
1581 return QApplication::exec(); 1633 return QApplication::exec();
1582 1634
1583#ifndef QT_NO_COP 1635#ifndef QT_NO_COP
1584 1636
1585 { 1637 {
1586 QCopEnvelope e( "QPE/System", "closing(QString)" ); 1638 QCopEnvelope e( "QPE/System", "closing(QString)" );
1587 e << d->appName; 1639 e << d->appName;
1588 } 1640 }
1589#endif 1641#endif
1590 processEvents(); 1642 processEvents();
1591 return 0; 1643 return 0;
1592} 1644}
1593 1645
1594/*! 1646/*!
1595 \internal 1647 \internal
1596 External request for application to quit. Quits if possible without 1648 External request for application to quit. Quits if possible without
1597 loosing state. 1649 loosing state.
1598*/ 1650*/
1599void QPEApplication::tryQuit() 1651void QPEApplication::tryQuit()
1600{ 1652{
1601 if ( activeModalWidget() || strcmp( argv() [ 0 ], "embeddedkonsole" ) == 0 ) 1653 if ( activeModalWidget() || strcmp( argv() [ 0 ], "embeddedkonsole" ) == 0 )
1602 return ; // Inside modal loop or konsole. Too hard to save state. 1654 return ; // Inside modal loop or konsole. Too hard to save state.
1603#ifndef QT_NO_COP 1655#ifndef QT_NO_COP
1604 1656
1605 { 1657 {
1606 QCopEnvelope e( "QPE/System", "closing(QString)" ); 1658 QCopEnvelope e( "QPE/System", "closing(QString)" );
1607 e << d->appName; 1659 e << d->appName;
1608 } 1660 }
1609#endif 1661#endif
1610 processEvents(); 1662 processEvents();
1611 1663
1612 quit(); 1664 quit();
1613} 1665}
1614 1666
1615/*! 1667/*!
1616 \internal 1668 \internal
1617 User initiated quit. Makes the window 'Go Away'. If preloaded this means 1669 User initiated quit. Makes the window 'Go Away'. If preloaded this means
1618 hiding the window. If not it means quitting the application. 1670 hiding the window. If not it means quitting the application.
1619 As this is user initiated we don't need to check state. 1671 As this is user initiated we don't need to check state.
1620*/ 1672*/
1621void QPEApplication::hideOrQuit() 1673void QPEApplication::hideOrQuit()
1622{ 1674{
1623 processEvents(); 1675 processEvents();
1624 1676
1625 // If we are a preloaded application we don't actually quit, so emit 1677 // If we are a preloaded application we don't actually quit, so emit
1626 // a System message indicating we're quasi-closing. 1678 // a System message indicating we're quasi-closing.
1627 if ( d->preloaded && d->qpe_main_widget ) 1679 if ( d->preloaded && d->qpe_main_widget )
1628#ifndef QT_NO_COP 1680#ifndef QT_NO_COP
1629 1681
1630 { 1682 {
1631 QCopEnvelope e("QPE/System", "fastAppHiding(QString)" ); 1683 QCopEnvelope e("QPE/System", "fastAppHiding(QString)" );
1632 e << d->appName; 1684 e << d->appName;
1633 d->qpe_main_widget->hide(); 1685 d->qpe_main_widget->hide();
1634 } 1686 }
1635#endif 1687#endif
1636 else 1688 else
1637 quit(); 1689 quit();
1638} 1690}
1639 1691
1640#if defined(QT_QWS_IPAQ) || defined(QT_QWS_SHARP) 1692#if defined(QT_QWS_IPAQ) || defined(QT_QWS_SHARP)
1641 1693
1642// The libraries with the skiff package (and possibly others) have 1694// The libraries with the skiff package (and possibly others) have
1643// completely useless implementations of builtin new and delete that 1695// completely useless implementations of builtin new and delete that
1644// use about 50% of your CPU. Here we revert to the simple libc 1696// use about 50% of your CPU. Here we revert to the simple libc
1645// functions. 1697// functions.
1646 1698
1647void* operator new[]( size_t size ) 1699void* operator new[]( size_t size )
1648{ 1700{
1649 return malloc( size ); 1701 return malloc( size );
1650} 1702}
1651 1703
1652void* operator new( size_t size ) 1704void* operator new( size_t size )
1653{ 1705{
1654 return malloc( size ); 1706 return malloc( size );
1655} 1707}
1656 1708
1657void operator delete[]( void* p ) 1709void operator delete[]( void* p )
1658{ 1710{
1659 free( p ); 1711 free( p );
1660} 1712}
1661 1713
1662void operator delete[]( void* p, size_t /*size*/ ) 1714void operator delete[]( void* p, size_t /*size*/ )
1663{ 1715{
1664 free( p ); 1716 free( p );
1665} 1717}
1666 1718
1667void operator delete( void* p ) 1719void operator delete( void* p )
1668{ 1720{
1669 free( p ); 1721 free( p );
1670} 1722}
1671 1723
1672void operator delete( void* p, size_t /*size*/ ) 1724void operator delete( void* p, size_t /*size*/ )
1673{ 1725{
1674 free( p ); 1726 free( p );
1675} 1727}
1676 1728
1677#endif 1729#endif
1678 1730
1679#if ( QT_VERSION <= 230 ) && !defined(SINGLE_APP) 1731#if ( QT_VERSION <= 230 ) && !defined(SINGLE_APP)
1680#include <qwidgetlist.h> 1732#include <qwidgetlist.h>
1681#ifdef QWS 1733#ifdef QWS
1682#include <qgfx_qws.h> 1734#include <qgfx_qws.h>
1683extern QRect qt_maxWindowRect; 1735extern QRect qt_maxWindowRect;
1684void qt_setMaxWindowRect(const QRect& r ) 1736void qt_setMaxWindowRect(const QRect& r )
1685{ 1737{
1686 qt_maxWindowRect = qt_screen->mapFromDevice( r, 1738 qt_maxWindowRect = qt_screen->mapFromDevice( r,
1687 qt_screen->mapToDevice( QSize( qt_screen->width(), qt_screen->height() ) ) ); 1739 qt_screen->mapToDevice( QSize( qt_screen->width(), qt_screen->height() ) ) );
1688 // Re-resize any maximized windows 1740 // Re-resize any maximized windows
1689 QWidgetList* l = QApplication::topLevelWidgets(); 1741 QWidgetList* l = QApplication::topLevelWidgets();
1690 if ( l ) { 1742 if ( l ) {
1691 QWidget * w = l->first(); 1743 QWidget * w = l->first();
1692 while ( w ) { 1744 while ( w ) {
1693 if ( w->isVisible() && w->isMaximized() ) { 1745 if ( w->isVisible() && w->isMaximized() ) {
1694 w->showMaximized(); 1746 w->showMaximized();
1695 } 1747 }
1696 w = l->next(); 1748 w = l->next();
1697 } 1749 }
1698 delete l; 1750 delete l;
1699 } 1751 }
1700} 1752}
1701#endif 1753#endif
1702#endif 1754#endif