summaryrefslogtreecommitdiff
path: root/library
authorzecke <zecke>2003-08-29 06:52:04 (UTC)
committer zecke <zecke>2003-08-29 06:52:04 (UTC)
commitd8fadaf4f510803983d0b8b99994fd70e770ccab (patch) (unidiff)
tree3921c576b3dbd0dc4fd3ccfe4d39204522bf57a6 /library
parentb9861471966f8bb0e3bea2db58a0d1289add1d4f (diff)
downloadopie-d8fadaf4f510803983d0b8b99994fd70e770ccab.zip
opie-d8fadaf4f510803983d0b8b99994fd70e770ccab.tar.gz
opie-d8fadaf4f510803983d0b8b99994fd70e770ccab.tar.bz2
-IF the app is visible and has more than once topLevel widget
iterate over the list and activate the next one. -Install translation in .qm -Add an else again ( was lost in a merge )
Diffstat (limited to 'library') (more/less context) (show whitespace changes)
-rw-r--r--library/qpeapplication.cpp124
-rw-r--r--library/qpeapplication.h5
2 files changed, 98 insertions, 31 deletions
diff --git a/library/qpeapplication.cpp b/library/qpeapplication.cpp
index 9286f9f..149e6bb 100644
--- a/library/qpeapplication.cpp
+++ b/library/qpeapplication.cpp
@@ -7,27 +7,25 @@
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19** $Id$ 19*/
20**
21**********************************************************************/
22#define QTOPIA_INTERNAL_LANGLIST 20#define QTOPIA_INTERNAL_LANGLIST
23#include <stdlib.h> 21#include <stdlib.h>
24#include <unistd.h> 22#include <unistd.h>
25#include <linux/limits.h> // needed for some toolchains (PATH_MAX) 23#include <linux/limits.h> // needed for some toolchains (PATH_MAX)
26#include <qfile.h> 24#include <qfile.h>
27#ifdef Q_WS_QWS 25#ifdef Q_WS_QWS
28#ifndef QT_NO_COP 26#ifndef QT_NO_COP
29#if QT_VERSION <= 231 27#if QT_VERSION <= 231
30#define private public 28#define private public
31#define sendLocally processEvent 29#define sendLocally processEvent
32#include "qcopenvelope_qws.h" 30#include "qcopenvelope_qws.h"
33#undef private 31#undef private
@@ -42,24 +40,25 @@
42#include <qbuffer.h> 40#include <qbuffer.h>
43#include <qptrdict.h> 41#include <qptrdict.h>
44#include <qregexp.h> 42#include <qregexp.h>
45#include <qdir.h> 43#include <qdir.h>
46#include <qlabel.h> 44#include <qlabel.h>
47#include <qdialog.h> 45#include <qdialog.h>
48#include <qdragobject.h> 46#include <qdragobject.h>
49#include <qtextcodec.h> 47#include <qtextcodec.h>
50#include <qevent.h> 48#include <qevent.h>
51#include <qtooltip.h> 49#include <qtooltip.h>
52#include <qsignal.h> 50#include <qsignal.h>
53#include <qmainwindow.h> 51#include <qmainwindow.h>
52#include <qwidgetlist.h>
54 53
55#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 54#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
56#define QTOPIA_INTERNAL_INITAPP 55#define QTOPIA_INTERNAL_INITAPP
57#include "qpeapplication.h" 56#include "qpeapplication.h"
58#include "qpestyle.h" 57#include "qpestyle.h"
59#include "styleinterface.h" 58#include "styleinterface.h"
60#if QT_VERSION >= 300 59#if QT_VERSION >= 300
61#include <qstylefactory.h> 60#include <qstylefactory.h>
62#else 61#else
63#include <qplatinumstyle.h> 62#include <qplatinumstyle.h>
64#include <qwindowsstyle.h> 63#include <qwindowsstyle.h>
65#include <qmotifstyle.h> 64#include <qmotifstyle.h>
@@ -108,38 +107,42 @@ public:
108 int presstimer; 107 int presstimer;
109 QWidget* presswidget; 108 QWidget* presswidget;
110 QPoint presspos; 109 QPoint presspos;
111 110
112 bool rightpressed : 1; 111 bool rightpressed : 1;
113 bool kbgrabbed : 1; 112 bool kbgrabbed : 1;
114 bool notbusysent : 1; 113 bool notbusysent : 1;
115 bool preloaded : 1; 114 bool preloaded : 1;
116 bool forceshow : 1; 115 bool forceshow : 1;
117 bool nomaximize : 1; 116 bool nomaximize : 1;
118 bool keep_running : 1; 117 bool keep_running : 1;
119 118
119 QStringList langs;
120 QString appName; 120 QString appName;
121 struct QCopRec 121 struct QCopRec
122 { 122 {
123 QCopRec( const QCString &ch, const QCString &msg, 123 QCopRec( const QCString &ch, const QCString &msg,
124 const QByteArray &d ) : 124 const QByteArray &d ) :
125 channel( ch ), message( msg ), data( d ) 125 channel( ch ), message( msg ), data( d )
126 { } 126 { }
127 127
128 QCString channel; 128 QCString channel;
129 QCString message; 129 QCString message;
130 QByteArray data; 130 QByteArray data;
131 }; 131 };
132 QWidget* qpe_main_widget; 132 QWidget* qpe_main_widget;
133 QGuardedPtr<QWidget> lastWidget;
133 QList<QCopRec> qcopq; 134 QList<QCopRec> qcopq;
135 QString styleName;
136 QString decorationName;
134 137
135 void enqueueQCop( const QCString &ch, const QCString &msg, 138 void enqueueQCop( const QCString &ch, const QCString &msg,
136 const QByteArray &data ) 139 const QByteArray &data )
137 { 140 {
138 qcopq.append( new QCopRec( ch, msg, data ) ); 141 qcopq.append( new QCopRec( ch, msg, data ) );
139 } 142 }
140 void sendQCopQ() 143 void sendQCopQ()
141 { 144 {
142 QCopRec * r; 145 QCopRec * r;
143#ifndef QT_NO_COP 146#ifndef QT_NO_COP
144 147
145 for ( QListIterator<QCopRec> it( qcopq ); ( r = it.current() ); ++it ) 148 for ( QListIterator<QCopRec> it( qcopq ); ( r = it.current() ); ++it )
@@ -257,26 +260,24 @@ public:
257 QStringList formats = iface->keys(); 260 QStringList formats = iface->keys();
258 for (QStringList::ConstIterator i = formats.begin(); i != formats.end(); ++i) { 261 for (QStringList::ConstIterator i = formats.begin(); i != formats.end(); ++i) {
259 (void)iface->installIOHandler(*i); 262 (void)iface->installIOHandler(*i);
260 // ### it exists now; need to remember if we can delete it 263 // ### it exists now; need to remember if we can delete it
261 } 264 }
262 } 265 }
263 else { 266 else {
264 lib->unload(); 267 lib->unload();
265 delete lib; 268 delete lib;
266 } 269 }
267 } 270 }
268 } 271 }
269 QString styleName;
270 QString decorationName;
271}; 272};
272 273
273class ResourceMimeFactory : public QMimeSourceFactory 274class ResourceMimeFactory : public QMimeSourceFactory
274{ 275{
275public: 276public:
276 ResourceMimeFactory() : resImage( 0 ) 277 ResourceMimeFactory() : resImage( 0 )
277 { 278 {
278 setFilePath( Global::helpPath() ); 279 setFilePath( Global::helpPath() );
279 setExtensionType( "html", "text/html;charset=UTF-8" ); 280 setExtensionType( "html", "text/html;charset=UTF-8" );
280 } 281 }
281 ~ResourceMimeFactory() { 282 ~ResourceMimeFactory() {
282 delete resImage; 283 delete resImage;
@@ -654,26 +655,26 @@ QPEApplication::QPEApplication( int & argc, char **argv, Type t )
654 655
655 /* overide stored arguments */ 656 /* overide stored arguments */
656 setArgs( argc, argv ); 657 setArgs( argc, argv );
657 658
658#endif 659#endif
659#else 660#else
660 initApp( argc, argv ); 661 initApp( argc, argv );
661#endif 662#endif
662 // qwsSetDecoration( new QPEDecoration() ); 663 // qwsSetDecoration( new QPEDecoration() );
663 664
664#ifndef QT_NO_TRANSLATION 665#ifndef QT_NO_TRANSLATION
665 666
666 QStringList langs = Global::languageList(); 667 d->langs = Global::languageList();
667 for ( QStringList::ConstIterator it = langs.begin(); it != langs.end(); ++it ) { 668 for ( QStringList::ConstIterator it = d->langs.begin(); it != d->langs.end(); ++it ) {
668 QString lang = *it; 669 QString lang = *it;
669 670
670 installTranslation( lang + "/libopie.qm"); 671 installTranslation( lang + "/libopie.qm");
671 installTranslation( lang + "/libqpe.qm" ); 672 installTranslation( lang + "/libqpe.qm" );
672 installTranslation( lang + "/" + d->appName + ".qm" ); 673 installTranslation( lang + "/" + d->appName + ".qm" );
673 674
674 675
675 //###language/font hack; should look it up somewhere 676 //###language/font hack; should look it up somewhere
676#ifdef QWS 677#ifdef QWS
677 678
678 if ( lang == "ja" || lang == "zh_CN" || lang == "zh_TW" || lang == "ko" ) { 679 if ( lang == "ja" || lang == "zh_CN" || lang == "zh_TW" || lang == "ko" ) {
679 QFont fn = FontManager::unicodeFont( FontManager::Proportional ); 680 QFont fn = FontManager::unicodeFont( FontManager::Proportional );
@@ -733,24 +734,28 @@ void QPEApplication::initApp( int argc, char **argv )
733 argc-=1; 734 argc-=1;
734 } else if ( qstrcmp(argv[a],"-preload-show")==0 ) { 735 } else if ( qstrcmp(argv[a],"-preload-show")==0 ) {
735 argv[a] = argv[a+1]; 736 argv[a] = argv[a+1];
736 a++; 737 a++;
737 d->preloaded = TRUE; 738 d->preloaded = TRUE;
738 d->forceshow = TRUE; 739 d->forceshow = TRUE;
739 argc-=1; 740 argc-=1;
740 } 741 }
741 } 742 }
742 743
743 /* overide stored arguments */ 744 /* overide stored arguments */
744 setArgs(argc, argv); 745 setArgs(argc, argv);
746
747 /* install translation here */
748 for ( QStringList::ConstIterator it = d->langs.begin(); it != d->langs.end(); ++it )
749 installTranslation( (*it) + "/" + d->appName + ".qm" );
745} 750}
746#endif 751#endif
747 752
748 753
749static QPtrDict<void>* inputMethodDict = 0; 754static QPtrDict<void>* inputMethodDict = 0;
750static void createInputMethodDict() 755static void createInputMethodDict()
751{ 756{
752 if ( !inputMethodDict ) 757 if ( !inputMethodDict )
753 inputMethodDict = new QPtrDict<void>; 758 inputMethodDict = new QPtrDict<void>;
754} 759}
755 760
756/*! 761/*!
@@ -1302,63 +1307,121 @@ void QPEApplication::systemMessage( const QCString& msg, const QByteArray& data
1302 QString channel; 1307 QString channel;
1303 stream >> channel; 1308 stream >> channel;
1304 if (channel == myChannel) { 1309 if (channel == myChannel) {
1305 processQCopFile(); 1310 processQCopFile();
1306 d->sendQCopQ(); 1311 d->sendQCopQ();
1307 } 1312 }
1308 } 1313 }
1309 1314
1310 1315
1311#endif 1316#endif
1312} 1317}
1313 1318
1319#include <qmetaobject.h>
1320
1321QWidget *QPEApplication::nextWidget(QWidgetList* list, QWidget* _wid) {
1322 QWidget *next = 0;
1323 if ( list->isEmpty() || list->count() == 1 )
1324 next = _wid;
1325 else{
1326 QWidget* wid;
1327 uint idx = list->findRef( _wid );
1328 uint count = list->count();
1329
1330 /* one time through the list hacky we may not start with idx but end with it*/
1331 for (uint i = (idx + 1)%count; true; i=(i+1)%count ) {
1332 wid = list->at(i);
1333 if ( wid == _wid ) {
1334 next = _wid;
1335 break;
1336 }else if ((( wid->inherits("QMainWindow") ||
1337 wid->inherits("QDialog") ) &&
1338 wid != qApp->desktop() && !wid->isHidden() ) ||
1339 ( wid == mainWidget() || wid == d->qpe_main_widget ) ){
1340 next = wid;
1341 break;
1342 }
1343 }
1344 }
1345
1346 delete list;
1347 return next;
1348}
1314/*! 1349/*!
1315 \internal 1350 \internal
1316*/ 1351*/
1352// ########## raise()ing main window should raise and set active
1353// ########## it and then all childen. This belongs in Qt/Embedded
1354/*
1355 * slightly change in behaviour to kill the need of modality in Opie
1356 * If any of the topLevelWidgets !isFullyObscured we highlight the next
1357 * top level window
1358 * 1)If visible and not modal we iterate over the list of top level widgets
1359 * 2)If modal we we make the modal and its parent toplevel widget visible if available
1360 * 3)else make topLevel visible
1361 *
1362 * send qcop if necessary and save current visible widget if not modal
1363 */
1317bool QPEApplication::raiseAppropriateWindow() 1364bool QPEApplication::raiseAppropriateWindow()
1318{ 1365{
1319 bool r = FALSE; 1366 bool r = FALSE;
1320 // ########## raise()ing main window should raise and set active
1321 // ########## it and then all childen. This belongs in Qt/Embedded
1322 QWidget *top = d->qpe_main_widget;
1323 if ( !top )
1324 top = mainWidget();
1325 if ( top && d->keep_running ) {
1326 if ( top->isVisible() )
1327 r = TRUE;
1328 else if (d->preloaded) {
1329 // We are preloaded and not visible.. pretend we just started..
1330 QCopEnvelope e("QPE/System", "fastAppShowing(QString)");
1331 e << d->appName;
1332 }
1333 1367
1368 QWidget *top = d->qpe_main_widget ? d->qpe_main_widget : mainWidget();
1369 /* 1. */
1370 if ( ( top && (top->isVisible() ) || ( d->lastWidget && d->lastWidget->isVisible() ) ) &&
1371 !activeModalWidget() ) {
1372 r = TRUE;
1373 /*wid will be valid and topLevelWidgets will be deleted properly.. */
1374 QWidget *wid = nextWidget( topLevelWidgets(),
1375 d->lastWidget ? (QWidget*)d->lastWidget : top );
1376 /* keep the size window got but not for root*/
1377 if ( top == wid )
1378 d->show_mx(top, d->nomaximize );
1379 else
1380 wid->show();
1381
1382 wid->raise();
1383 wid->setActiveWindow();
1384 d->lastWidget = wid;
1385 }else if ( activeModalWidget() ) {
1386 QWidget* mod = activeModalWidget();
1387 /* get the parent of the modal and its topLevelWidget as background widget */
1388 QWidget* par = activeModalWidget()->parentWidget() ? activeModalWidget()->parentWidget()->topLevelWidget() : 0;
1389 if (par ) {
1390 if (par == top )
1391 d->show_mx(par, d->nomaximize );
1392 else
1393 par->show();
1394 par->raise();
1395 par->setActiveWindow();
1396 }
1397 mod->show();
1398 mod->raise();
1399 mod->setActiveWindow();
1400 }else if (top){
1334 d->show_mx(top, d->nomaximize); 1401 d->show_mx(top, d->nomaximize);
1335 top->raise(); 1402 top->raise();
1336 top->setActiveWindow(); 1403 top->setActiveWindow();
1404 d->lastWidget = top;
1337 } 1405 }
1338 QWidget *topm = activeModalWidget(); 1406
1339 if ( topm && topm != top ) { 1407 if (!r && d->preloaded ) {
1340 topm->show();
1341 topm->raise();
1342 topm->setActiveWindow();
1343 // If we haven't already handled the fastAppShowing message
1344 if (!top && d->preloaded) {
1345 QCopEnvelope e("QPE/System", "fastAppShowing(QString)"); 1408 QCopEnvelope e("QPE/System", "fastAppShowing(QString)");
1346 e << d->appName; 1409 e << d->appName;
1347 } 1410 }
1348 r = FALSE; 1411
1349 }
1350 return r; 1412 return r;
1351} 1413}
1352 1414
1415
1353void QPEApplication::pidMessage( const QCString& msg, const QByteArray& data) 1416void QPEApplication::pidMessage( const QCString& msg, const QByteArray& data)
1354{ 1417{
1355#ifdef Q_WS_QWS 1418#ifdef Q_WS_QWS
1356 1419
1357 if ( msg == "quit()" ) { 1420 if ( msg == "quit()" ) {
1358 tryQuit(); 1421 tryQuit();
1359 } 1422 }
1360 else if ( msg == "quitIfInvisible()" ) { 1423 else if ( msg == "quitIfInvisible()" ) {
1361 if ( d->qpe_main_widget && !d->qpe_main_widget->isVisible() ) 1424 if ( d->qpe_main_widget && !d->qpe_main_widget->isVisible() )
1362 quit(); 1425 quit();
1363 } 1426 }
1364 else if ( msg == "close()" ) { 1427 else if ( msg == "close()" ) {
@@ -1393,28 +1456,29 @@ void QPEApplication::pidMessage( const QCString& msg, const QByteArray& data)
1393 emit reload(); 1456 emit reload();
1394 } 1457 }
1395 else if ( msg == "setDocument(QString)" ) { 1458 else if ( msg == "setDocument(QString)" ) {
1396 d->keep_running = TRUE; 1459 d->keep_running = TRUE;
1397 QDataStream stream( data, IO_ReadOnly ); 1460 QDataStream stream( data, IO_ReadOnly );
1398 QString doc; 1461 QString doc;
1399 stream >> doc; 1462 stream >> doc;
1400 QWidget *mw = mainWidget(); 1463 QWidget *mw = mainWidget();
1401 if ( !mw ) 1464 if ( !mw )
1402 mw = d->qpe_main_widget; 1465 mw = d->qpe_main_widget;
1403 if ( mw ) 1466 if ( mw )
1404 Global::setDocument( mw, doc ); 1467 Global::setDocument( mw, doc );
1468
1405 } else if ( msg == "QPEProcessQCop()" ) { 1469 } else if ( msg == "QPEProcessQCop()" ) {
1406 processQCopFile(); 1470 processQCopFile();
1407 d->sendQCopQ(); 1471 d->sendQCopQ();
1408 } 1472 }else
1409 { 1473 {
1410 bool p = d->keep_running; 1474 bool p = d->keep_running;
1411 d->keep_running = FALSE; 1475 d->keep_running = FALSE;
1412 emit appMessage( msg, data); 1476 emit appMessage( msg, data);
1413 if ( d->keep_running ) { 1477 if ( d->keep_running ) {
1414 d->notbusysent = FALSE; 1478 d->notbusysent = FALSE;
1415 raiseAppropriateWindow(); 1479 raiseAppropriateWindow();
1416 if ( !p ) { 1480 if ( !p ) {
1417 // Tell the system we're still chugging along... 1481 // Tell the system we're still chugging along...
1418#ifndef QT_NO_COP 1482#ifndef QT_NO_COP
1419 QCopEnvelope e("QPE/System", "appRaised(QString)"); 1483 QCopEnvelope e("QPE/System", "appRaised(QString)");
1420 e << d->appName; 1484 e << d->appName;
diff --git a/library/qpeapplication.h b/library/qpeapplication.h
index 770ea23..343e0b9 100644
--- a/library/qpeapplication.h
+++ b/library/qpeapplication.h
@@ -104,24 +104,27 @@ signals:
104 void weekChanged( bool startOnMonday ); 104 void weekChanged( bool startOnMonday );
105 void dateFormatChanged( DateFormat ); 105 void dateFormatChanged( DateFormat );
106 void flush(); 106 void flush();
107 void reload(); 107 void reload();
108 /* linkChanged signal */ 108 /* linkChanged signal */
109 109
110private slots: 110private slots:
111 void systemMessage( const QCString &msg, const QByteArray &data ); 111 void systemMessage( const QCString &msg, const QByteArray &data );
112 void pidMessage( const QCString &msg, const QByteArray &data ); 112 void pidMessage( const QCString &msg, const QByteArray &data );
113 void removeSenderFromStylusDict(); 113 void removeSenderFromStylusDict();
114 void hideOrQuit(); 114 void hideOrQuit();
115 115
116private:
117 inline QWidget *nextWidget( QWidgetList*, QWidget* );
118
116protected: 119protected:
117 bool qwsEventFilter( QWSEvent * ); 120 bool qwsEventFilter( QWSEvent * );
118 void internalSetStyle( const QString &style ); 121 void internalSetStyle( const QString &style );
119 void prepareForTermination(bool willrestart); 122 void prepareForTermination(bool willrestart);
120 virtual void restart(); 123 virtual void restart();
121 virtual void shutdown(); 124 virtual void shutdown();
122 bool eventFilter( QObject *, QEvent * ); 125 bool eventFilter( QObject *, QEvent * );
123 void timerEvent( QTimerEvent * ); 126 void timerEvent( QTimerEvent * );
124 bool raiseAppropriateWindow(); 127 bool raiseAppropriateWindow();
125 virtual void tryQuit(); 128 virtual void tryQuit();
126#if QT_VERSION > 233 129#if QT_VERSION > 233
127 virtual void polish ( QWidget * ); // this is actually implemented in qt_override.cpp (!) 130 virtual void polish ( QWidget * ); // this is actually implemented in qt_override.cpp (!)
@@ -184,21 +187,21 @@ inline Transformation DegToTrans ( int d )
184/* 187/*
185 * Set current rotation of Opie, and rotation for newly started apps. 188 * Set current rotation of Opie, and rotation for newly started apps.
186 * Differs from setDefaultRotation in that 1) it rotates currently running apps, 189 * Differs from setDefaultRotation in that 1) it rotates currently running apps,
187 * and 2) does not set deforient or save orientation to qpe.conf. 190 * and 2) does not set deforient or save orientation to qpe.conf.
188 */ 191 */
189 192
190inline void QPEApplication::setCurrentRotation( int r ) 193inline void QPEApplication::setCurrentRotation( int r )
191{ 194{
192 // setTransformation has been introduced in Qt/Embedded 2.3.4 snapshots 195 // setTransformation has been introduced in Qt/Embedded 2.3.4 snapshots
193 // for compatibility with the SharpROM use fallback to setDefaultTransformation() 196 // for compatibility with the SharpROM use fallback to setDefaultTransformation()
194 #if QT_VERSION > 233 197 #if QT_VERSION > 233
195 Transformation e = DegToTrans( r ); 198 Transformation e = DegToTrans( r );
196 setenv( "QWS_DISPLAY", QString( "Transformed:Rot%1:0" ).arg( r ).latin1(), 1 ); 199 ::setenv( "QWS_DISPLAY", QString( "Transformed:Rot%1:0" ).arg( r ).latin1(), 1 );
197 qApp->desktop()->qwsDisplay()->setTransformation( e ); 200 qApp->desktop()->qwsDisplay()->setTransformation( e );
198 #else 201 #else
199 setDefaultRotation( r ); 202 setDefaultRotation( r );
200 #endif 203 #endif
201} 204}
202 205
203 206
204#endif 207#endif