summaryrefslogtreecommitdiff
authorzecke <zecke>2005-03-06 23:30:41 (UTC)
committer zecke <zecke>2005-03-06 23:30:41 (UTC)
commitf312f32d624c6198c63890e141e8658bc492cf37 (patch) (unidiff)
treec76e9caad09226113e42e0477d08e13d6388af2e
parent578cc81bc489015320351efd4fabcbed3355ac23 (diff)
downloadopie-f312f32d624c6198c63890e141e8658bc492cf37.zip
opie-f312f32d624c6198c63890e141e8658bc492cf37.tar.gz
opie-f312f32d624c6198c63890e141e8658bc492cf37.tar.bz2
The mainwidget could be deleted before the qpeapplication will be destructed or
the event loop will be left. Use a QGuardedPtr to not save widget coordinates on a not anymore existing mainwidget
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--library/qpeapplication.cpp5
1 files changed, 4 insertions, 1 deletions
diff --git a/library/qpeapplication.cpp b/library/qpeapplication.cpp
index 2bd7cbe..953f9d0 100644
--- a/library/qpeapplication.cpp
+++ b/library/qpeapplication.cpp
@@ -1,705 +1,708 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. 2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of the Qtopia Environment. 4** This file is part of the Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
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*/ 19*/
20#define QTOPIA_INTERNAL_LANGLIST 20#define QTOPIA_INTERNAL_LANGLIST
21#include <stdlib.h> 21#include <stdlib.h>
22#include <unistd.h> 22#include <unistd.h>
23#ifndef Q_OS_MACX 23#ifndef Q_OS_MACX
24#include <linux/limits.h> // needed for some toolchains (PATH_MAX) 24#include <linux/limits.h> // needed for some toolchains (PATH_MAX)
25#endif 25#endif
26#include <qfile.h> 26#include <qfile.h>
27#include <qqueue.h> 27#include <qqueue.h>
28#ifdef Q_WS_QWS 28#ifdef Q_WS_QWS
29#ifndef QT_NO_COP 29#ifndef QT_NO_COP
30#if QT_VERSION <= 231 30#if QT_VERSION <= 231
31#define private public 31#define private public
32#define sendLocally processEvent 32#define sendLocally processEvent
33#include "qcopenvelope_qws.h" 33#include "qcopenvelope_qws.h"
34#undef private 34#undef private
35#else 35#else
36#include "qcopenvelope_qws.h" 36#include "qcopenvelope_qws.h"
37#endif 37#endif
38#endif 38#endif
39#include <qwindowsystem_qws.h> 39#include <qwindowsystem_qws.h>
40#endif 40#endif
41#include <qtextstream.h> 41#include <qtextstream.h>
42#include <qpalette.h> 42#include <qpalette.h>
43#include <qbuffer.h> 43#include <qbuffer.h>
44#include <qptrdict.h> 44#include <qptrdict.h>
45#include <qregexp.h> 45#include <qregexp.h>
46#include <qdir.h> 46#include <qdir.h>
47#include <qlabel.h> 47#include <qlabel.h>
48#include <qdialog.h> 48#include <qdialog.h>
49#include <qdragobject.h> 49#include <qdragobject.h>
50#include <qtextcodec.h> 50#include <qtextcodec.h>
51#include <qevent.h> 51#include <qevent.h>
52#include <qtooltip.h> 52#include <qtooltip.h>
53#include <qsignal.h> 53#include <qsignal.h>
54#include <qmainwindow.h> 54#include <qmainwindow.h>
55#include <qwidgetlist.h> 55#include <qwidgetlist.h>
56#include <qpixmapcache.h> 56#include <qpixmapcache.h>
57 57
58#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 58#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
59#define QTOPIA_INTERNAL_INITAPP 59#define QTOPIA_INTERNAL_INITAPP
60#include "qpeapplication.h" 60#include "qpeapplication.h"
61#include "qpestyle.h" 61#include "qpestyle.h"
62#include "styleinterface.h" 62#include "styleinterface.h"
63#if QT_VERSION >= 0x030000 63#if QT_VERSION >= 0x030000
64#include <qstylefactory.h> 64#include <qstylefactory.h>
65#else 65#else
66#include <qplatinumstyle.h> 66#include <qplatinumstyle.h>
67#include <qwindowsstyle.h> 67#include <qwindowsstyle.h>
68#include <qmotifstyle.h> 68#include <qmotifstyle.h>
69#include <qmotifplusstyle.h> 69#include <qmotifplusstyle.h>
70#include "lightstyle.h" 70#include "lightstyle.h"
71 71
72#include <qpe/qlibrary.h> 72#include <qpe/qlibrary.h>
73#endif 73#endif
74#include "global.h" 74#include "global.h"
75#include "resource.h" 75#include "resource.h"
76#if QT_VERSION <= 230 && defined(QT_NO_CODECS) 76#if QT_VERSION <= 230 && defined(QT_NO_CODECS)
77#include "qutfcodec.h" 77#include "qutfcodec.h"
78#endif 78#endif
79#include "config.h" 79#include "config.h"
80#include "network.h" 80#include "network.h"
81#ifdef QWS 81#ifdef QWS
82#include "fontmanager.h" 82#include "fontmanager.h"
83#include "fontdatabase.h" 83#include "fontdatabase.h"
84#endif 84#endif
85 85
86#include "alarmserver.h" 86#include "alarmserver.h"
87#include "applnk.h" 87#include "applnk.h"
88#include "qpemenubar.h" 88#include "qpemenubar.h"
89#include "textcodecinterface.h" 89#include "textcodecinterface.h"
90#include "imagecodecinterface.h" 90#include "imagecodecinterface.h"
91#include <qtopia/qpeglobal.h> 91#include <qtopia/qpeglobal.h>
92 92
93#include <unistd.h> 93#include <unistd.h>
94#include <sys/file.h> 94#include <sys/file.h>
95#include <sys/ioctl.h> 95#include <sys/ioctl.h>
96#ifndef QT_NO_SOUND 96#ifndef QT_NO_SOUND
97#include <sys/soundcard.h> 97#include <sys/soundcard.h>
98#endif 98#endif
99 99
100#include <backend/rohfeedback.h> 100#include <backend/rohfeedback.h>
101 101
102 102
103static bool useBigPixmaps = 0; 103static bool useBigPixmaps = 0;
104 104
105class HackWidget : public QWidget 105class HackWidget : public QWidget
106{ 106{
107public: 107public:
108 bool needsOk() 108 bool needsOk()
109 { return (getWState() & WState_Reserved1 ); } 109 { return (getWState() & WState_Reserved1 ); }
110 110
111 QRect normalGeometry() 111 QRect normalGeometry()
112 { return topData()->normalGeometry; }; 112 { return topData()->normalGeometry; };
113}; 113};
114 114
115class QPEApplicationData 115class QPEApplicationData
116{ 116{
117public: 117public:
118 QPEApplicationData ( ) : 118 QPEApplicationData ( ) :
119 presstimer( 0 ), presswidget( 0 ), rightpressed( false ), kbgrabbed( false ), 119 presstimer( 0 ), presswidget( 0 ), rightpressed( false ), kbgrabbed( false ),
120 notbusysent( false ), preloaded( false ), forceshow( false ), nomaximize( false ), 120 notbusysent( false ), preloaded( false ), forceshow( false ), nomaximize( false ),
121 keep_running( true ), qcopQok( false ), 121 keep_running( true ), qcopQok( false ),
122 fontFamily( "Vera" ), fontSize( 10 ), smallIconSize( 14 ), 122 fontFamily( "Vera" ), fontSize( 10 ), smallIconSize( 14 ),
123 bigIconSize( 32 ), qpe_main_widget( 0 ) 123 bigIconSize( 32 ), qpe_main_widget( 0 )
124 { 124 {
125 Config cfg( "qpe" ); 125 Config cfg( "qpe" );
126 cfg.setGroup( "Appearance" ); 126 cfg.setGroup( "Appearance" );
127 useBigPixmaps = cfg.readBoolEntry( "useBigPixmaps", false ); 127 useBigPixmaps = cfg.readBoolEntry( "useBigPixmaps", false );
128 fontFamily = cfg.readEntry( "FontFamily", "Vera" ); 128 fontFamily = cfg.readEntry( "FontFamily", "Vera" );
129 fontSize = cfg.readNumEntry( "FontSize", 10 ); 129 fontSize = cfg.readNumEntry( "FontSize", 10 );
130 smallIconSize = cfg.readNumEntry( "SmallIconSize", 14 ); 130 smallIconSize = cfg.readNumEntry( "SmallIconSize", 14 );
131 bigIconSize = cfg.readNumEntry( "BigIconSize", 32 ); 131 bigIconSize = cfg.readNumEntry( "BigIconSize", 32 );
132#ifdef OPIE_WITHROHFEEDBACK 132#ifdef OPIE_WITHROHFEEDBACK
133 RoH = 0; 133 RoH = 0;
134#endif 134#endif
135 } 135 }
136 136
137 int presstimer; 137 int presstimer;
138 QWidget* presswidget; 138 QWidget* presswidget;
139 QPoint presspos; 139 QPoint presspos;
140#ifdef OPIE_WITHROHFEEDBACK 140#ifdef OPIE_WITHROHFEEDBACK
141 Opie::Internal::RoHFeedback *RoH; 141 Opie::Internal::RoHFeedback *RoH;
142#endif 142#endif
143 143
144 bool rightpressed : 1; 144 bool rightpressed : 1;
145 bool kbgrabbed : 1; 145 bool kbgrabbed : 1;
146 bool notbusysent : 1; 146 bool notbusysent : 1;
147 bool preloaded : 1; 147 bool preloaded : 1;
148 bool forceshow : 1; 148 bool forceshow : 1;
149 bool nomaximize : 1; 149 bool nomaximize : 1;
150 bool keep_running : 1; 150 bool keep_running : 1;
151 bool qcopQok : 1; 151 bool qcopQok : 1;
152 152
153 QCString fontFamily; 153 QCString fontFamily;
154 int fontSize; 154 int fontSize;
155 int smallIconSize; 155 int smallIconSize;
156 int bigIconSize; 156 int bigIconSize;
157 157
158 QString appName; 158 QString appName;
159 struct QCopRec 159 struct QCopRec
160 { 160 {
161 QCopRec( const QCString &ch, const QCString &msg, 161 QCopRec( const QCString &ch, const QCString &msg,
162 const QByteArray &d ) : 162 const QByteArray &d ) :
163 channel( ch ), message( msg ), data( d ) 163 channel( ch ), message( msg ), data( d )
164 { } 164 { }
165 165
166 QCString channel; 166 QCString channel;
167 QCString message; 167 QCString message;
168 QByteArray data; 168 QByteArray data;
169 }; 169 };
170 QWidget* qpe_main_widget; 170 QGuardedPtr<QWidget> qpe_main_widget;
171 QGuardedPtr<QWidget> lastraised; 171 QGuardedPtr<QWidget> lastraised;
172 QQueue<QCopRec> qcopq; 172 QQueue<QCopRec> qcopq;
173 QString styleName; 173 QString styleName;
174 QString decorationName; 174 QString decorationName;
175 175
176 void enqueueQCop( const QCString &ch, const QCString &msg, 176 void enqueueQCop( const QCString &ch, const QCString &msg,
177 const QByteArray &data ) 177 const QByteArray &data )
178 { 178 {
179 qcopq.enqueue( new QCopRec( ch, msg, data ) ); 179 qcopq.enqueue( new QCopRec( ch, msg, data ) );
180 } 180 }
181 void sendQCopQ() 181 void sendQCopQ()
182 { 182 {
183 if (!qcopQok ) 183 if (!qcopQok )
184 return; 184 return;
185 185
186 QCopRec * r; 186 QCopRec * r;
187 187
188 while((r=qcopq.dequeue())) { 188 while((r=qcopq.dequeue())) {
189 // remove from queue before sending... 189 // remove from queue before sending...
190 // event loop can come around again before getting 190 // event loop can come around again before getting
191 // back from sendLocally 191 // back from sendLocally
192#ifndef QT_NO_COP 192#ifndef QT_NO_COP
193 QCopChannel::sendLocally( r->channel, r->message, r->data ); 193 QCopChannel::sendLocally( r->channel, r->message, r->data );
194#endif 194#endif
195 195
196 delete r; 196 delete r;
197 } 197 }
198 } 198 }
199 199
200 static void show_mx(QWidget* mw, bool nomaximize, QString &strName) { 200 static void show_mx(QWidget* mw, bool nomaximize, QString &strName) {
201 if ( mw->inherits("QMainWindow") || mw->isA("QMainWindow") ) 201 if ( mw->inherits("QMainWindow") || mw->isA("QMainWindow") )
202 { 202 {
203 ( ( QMainWindow* ) mw )->setUsesBigPixmaps( useBigPixmaps ); 203 ( ( QMainWindow* ) mw )->setUsesBigPixmaps( useBigPixmaps );
204 } 204 }
205 QPoint p; 205 QPoint p;
206 QSize s; 206 QSize s;
207 bool max; 207 bool max;
208 208
209 if ( mw->isVisible() ) { 209 if ( mw->isVisible() ) {
210 if ( read_widget_rect(strName, max, p, s) && validate_widget_size(mw, p, s) ) { 210 if ( read_widget_rect(strName, max, p, s) && validate_widget_size(mw, p, s) ) {
211 mw->resize(s); 211 mw->resize(s);
212 mw->move(p); 212 mw->move(p);
213 } 213 }
214 mw->raise(); 214 mw->raise();
215 } else { 215 } else {
216 216
217 if ( mw->layout() && mw->inherits("QDialog") ) { 217 if ( mw->layout() && mw->inherits("QDialog") ) {
218 if ( read_widget_rect(strName, max, p, s) && validate_widget_size(mw, p, s) ) { 218 if ( read_widget_rect(strName, max, p, s) && validate_widget_size(mw, p, s) ) {
219 mw->resize(s); 219 mw->resize(s);
220 mw->move(p); 220 mw->move(p);
221 221
222 if ( max && !nomaximize ) { 222 if ( max && !nomaximize ) {
223 mw->showMaximized(); 223 mw->showMaximized();
224 } else { 224 } else {
225 mw->show(); 225 mw->show();
226 } 226 }
227 } else { 227 } else {
228 QPEApplication::showDialog((QDialog*)mw,nomaximize); 228 QPEApplication::showDialog((QDialog*)mw,nomaximize);
229 } 229 }
230 } else { 230 } else {
231 if ( read_widget_rect(strName, max, p, s) && validate_widget_size(mw, p, s) ) { 231 if ( read_widget_rect(strName, max, p, s) && validate_widget_size(mw, p, s) ) {
232 mw->resize(s); 232 mw->resize(s);
233 mw->move(p); 233 mw->move(p);
234 } else { //no stored rectangle, make an estimation 234 } else { //no stored rectangle, make an estimation
235 int x = (qApp->desktop()->width()-mw->frameGeometry().width())/2; 235 int x = (qApp->desktop()->width()-mw->frameGeometry().width())/2;
236 int y = (qApp->desktop()->height()-mw->frameGeometry().height())/2; 236 int y = (qApp->desktop()->height()-mw->frameGeometry().height())/2;
237 mw->move( QMAX(x,0), QMAX(y,0) ); 237 mw->move( QMAX(x,0), QMAX(y,0) );
238#ifdef Q_WS_QWS 238#ifdef Q_WS_QWS
239 if ( !nomaximize ) 239 if ( !nomaximize )
240 mw->showMaximized(); 240 mw->showMaximized();
241#endif 241#endif
242 } 242 }
243 if ( max && !nomaximize ) 243 if ( max && !nomaximize )
244 mw->showMaximized(); 244 mw->showMaximized();
245 else 245 else
246 mw->show(); 246 mw->show();
247 } 247 }
248 } 248 }
249 } 249 }
250 250
251 static bool read_widget_rect(const QString &app, bool &maximized, QPoint &p, QSize &s) 251 static bool read_widget_rect(const QString &app, bool &maximized, QPoint &p, QSize &s)
252 { 252 {
253 maximized = TRUE; 253 maximized = TRUE;
254 // 350 is the trigger in qwsdefaultdecoration for providing a resize button 254 // 350 is the trigger in qwsdefaultdecoration for providing a resize button
255 if ( qApp->desktop()->width() <= 350 ) 255 if ( qApp->desktop()->width() <= 350 )
256 return FALSE; 256 return FALSE;
257 257
258 Config cfg( "qpe" ); 258 Config cfg( "qpe" );
259 cfg.setGroup("ApplicationPositions"); 259 cfg.setGroup("ApplicationPositions");
260 QString str = cfg.readEntry( app, QString::null ); 260 QString str = cfg.readEntry( app, QString::null );
261 QStringList l = QStringList::split(",", str); 261 QStringList l = QStringList::split(",", str);
262 262
263 if ( l.count() == 5) { 263 if ( l.count() == 5) {
264 p.setX( l[0].toInt() ); 264 p.setX( l[0].toInt() );
265 p.setY( l[1].toInt() ); 265 p.setY( l[1].toInt() );
266 266
267 s.setWidth( l[2].toInt() ); 267 s.setWidth( l[2].toInt() );
268 s.setHeight( l[3].toInt() ); 268 s.setHeight( l[3].toInt() );
269 269
270 maximized = l[4].toInt(); 270 maximized = l[4].toInt();
271 271
272 return TRUE; 272 return TRUE;
273 } 273 }
274 274
275 return FALSE; 275 return FALSE;
276 } 276 }
277 277
278 278
279 static bool validate_widget_size(const QWidget *w, QPoint &p, QSize &s) 279 static bool validate_widget_size(const QWidget *w, QPoint &p, QSize &s)
280 { 280 {
281#ifndef Q_WS_QWS 281#ifndef Q_WS_QWS
282 QRect qt_maxWindowRect = qApp->desktop()->geometry(); 282 QRect qt_maxWindowRect = qApp->desktop()->geometry();
283#endif 283#endif
284 int maxX = qt_maxWindowRect.width(); 284 int maxX = qt_maxWindowRect.width();
285 int maxY = qt_maxWindowRect.height(); 285 int maxY = qt_maxWindowRect.height();
286 int wWidth = s.width() + ( w->frameGeometry().width() - w->geometry().width() ); 286 int wWidth = s.width() + ( w->frameGeometry().width() - w->geometry().width() );
287 int wHeight = s.height() + ( w->frameGeometry().height() - w->geometry().height() ); 287 int wHeight = s.height() + ( w->frameGeometry().height() - w->geometry().height() );
288 288
289 // total window size is not allowed to be larger than desktop window size 289 // total window size is not allowed to be larger than desktop window size
290 if ( ( wWidth >= maxX ) && ( wHeight >= maxY ) ) 290 if ( ( wWidth >= maxX ) && ( wHeight >= maxY ) )
291 return FALSE; 291 return FALSE;
292 292
293 if ( wWidth > maxX ) { 293 if ( wWidth > maxX ) {
294 s.setWidth( maxX - (w->frameGeometry().width() - w->geometry().width() ) ); 294 s.setWidth( maxX - (w->frameGeometry().width() - w->geometry().width() ) );
295 wWidth = maxX; 295 wWidth = maxX;
296 } 296 }
297 297
298 if ( wHeight > maxY ) { 298 if ( wHeight > maxY ) {
299 s.setHeight( maxY - (w->frameGeometry().height() - w->geometry().height() ) ); 299 s.setHeight( maxY - (w->frameGeometry().height() - w->geometry().height() ) );
300 wHeight = maxY; 300 wHeight = maxY;
301 } 301 }
302 302
303 // any smaller than this and the maximize/close/help buttons will be overlapping 303 // any smaller than this and the maximize/close/help buttons will be overlapping
304 if ( wWidth < 80 || wHeight < 60 ) 304 if ( wWidth < 80 || wHeight < 60 )
305 return FALSE; 305 return FALSE;
306 306
307 if ( p.x() < 0 ) 307 if ( p.x() < 0 )
308 p.setX(0); 308 p.setX(0);
309 if ( p.y() < 0 ) 309 if ( p.y() < 0 )
310 p.setY(0); 310 p.setY(0);
311 311
312 if ( p.x() + wWidth > maxX ) 312 if ( p.x() + wWidth > maxX )
313 p.setX( maxX - wWidth ); 313 p.setX( maxX - wWidth );
314 if ( p.y() + wHeight > maxY ) 314 if ( p.y() + wHeight > maxY )
315 p.setY( maxY - wHeight ); 315 p.setY( maxY - wHeight );
316 316
317 return TRUE; 317 return TRUE;
318 } 318 }
319 319
320 static void store_widget_rect(QWidget *w, QString &app) 320 static void store_widget_rect(QWidget *w, QString &app)
321 { 321 {
322 if( !w )
323 return;
324
322 // 350 is the trigger in qwsdefaultdecoration for providing a resize button 325 // 350 is the trigger in qwsdefaultdecoration for providing a resize button
323 if ( qApp->desktop()->width() <= 350 ) 326 if ( qApp->desktop()->width() <= 350 )
324 return; 327 return;
325 // we use these to map the offset of geometry and pos. ( we can only use normalGeometry to 328 // we use these to map the offset of geometry and pos. ( we can only use normalGeometry to
326 // get the non-maximized version, so we have to do it the hard way ) 329 // get the non-maximized version, so we have to do it the hard way )
327 int offsetX = w->x() - w->geometry().left(); 330 int offsetX = w->x() - w->geometry().left();
328 int offsetY = w->y() - w->geometry().top(); 331 int offsetY = w->y() - w->geometry().top();
329 332
330 QRect r; 333 QRect r;
331 if ( w->isMaximized() ) 334 if ( w->isMaximized() )
332 r = ( (HackWidget *) w)->normalGeometry(); 335 r = ( (HackWidget *) w)->normalGeometry();
333 else 336 else
334 r = w->geometry(); 337 r = w->geometry();
335 338
336 // Stores the window placement as pos(), size() (due to the offset mapping) 339 // Stores the window placement as pos(), size() (due to the offset mapping)
337 Config cfg( "qpe" ); 340 Config cfg( "qpe" );
338 cfg.setGroup("ApplicationPositions"); 341 cfg.setGroup("ApplicationPositions");
339 QString s; 342 QString s;
340 s.sprintf("%d,%d,%d,%d,%d", r.left() + offsetX, r.top() + offsetY, r.width(), r.height(), w->isMaximized() ); 343 s.sprintf("%d,%d,%d,%d,%d", r.left() + offsetX, r.top() + offsetY, r.width(), r.height(), w->isMaximized() );
341 cfg.writeEntry( app, s ); 344 cfg.writeEntry( app, s );
342 } 345 }
343 346
344 static bool setWidgetCaptionFromAppName( QWidget* /*mw*/, const QString& /*appName*/, const QString& /*appsPath*/ ) 347 static bool setWidgetCaptionFromAppName( QWidget* /*mw*/, const QString& /*appName*/, const QString& /*appsPath*/ )
345 { 348 {
346 /* 349 /*
347 // This works but disable it for now until it is safe to apply 350 // This works but disable it for now until it is safe to apply
348 // What is does is scan the .desktop files of all the apps for 351 // What is does is scan the .desktop files of all the apps for
349 // the applnk that has the corresponding argv[0] as this program 352 // the applnk that has the corresponding argv[0] as this program
350 // then it uses the name stored in the .desktop file as the caption 353 // then it uses the name stored in the .desktop file as the caption
351 // for the main widget. This saves duplicating translations for 354 // for the main widget. This saves duplicating translations for
352 // the app name in the program and in the .desktop files. 355 // the app name in the program and in the .desktop files.
353 356
354 AppLnkSet apps( appsPath ); 357 AppLnkSet apps( appsPath );
355 358
356 QList<AppLnk> appsList = apps.children(); 359 QList<AppLnk> appsList = apps.children();
357 for ( QListIterator<AppLnk> it(appsList); it.current(); ++it ) { 360 for ( QListIterator<AppLnk> it(appsList); it.current(); ++it ) {
358 if ( (*it)->exec() == appName ) { 361 if ( (*it)->exec() == appName ) {
359 mw->setCaption( (*it)->name() ); 362 mw->setCaption( (*it)->name() );
360 return TRUE; 363 return TRUE;
361 } 364 }
362 } 365 }
363 */ 366 */
364 return FALSE; 367 return FALSE;
365 } 368 }
366 369
367 370
368 void show(QWidget* mw, bool nomax) 371 void show(QWidget* mw, bool nomax)
369 { 372 {
370 setWidgetCaptionFromAppName( mw, appName, QPEApplication::qpeDir() + "apps" ); 373 setWidgetCaptionFromAppName( mw, appName, QPEApplication::qpeDir() + "apps" );
371 nomaximize = nomax; 374 nomaximize = nomax;
372 qpe_main_widget = mw; 375 qpe_main_widget = mw;
373 qcopQok = TRUE; 376 qcopQok = TRUE;
374#ifndef QT_NO_COP 377#ifndef QT_NO_COP
375 378
376 sendQCopQ(); 379 sendQCopQ();
377#endif 380#endif
378 381
379 if ( preloaded ) { 382 if ( preloaded ) {
380 if (forceshow) 383 if (forceshow)
381 show_mx(mw, nomax, appName); 384 show_mx(mw, nomax, appName);
382 } 385 }
383 else if ( keep_running ) { 386 else if ( keep_running ) {
384 show_mx(mw, nomax, appName); 387 show_mx(mw, nomax, appName);
385 } 388 }
386 } 389 }
387 390
388 void loadTextCodecs() 391 void loadTextCodecs()
389 { 392 {
390 QString path = QPEApplication::qpeDir() + "plugins/textcodecs"; 393 QString path = QPEApplication::qpeDir() + "plugins/textcodecs";
391#ifdef Q_OS_MACX 394#ifdef Q_OS_MACX
392 QDir dir( path, "lib*.dylib" ); 395 QDir dir( path, "lib*.dylib" );
393#else 396#else
394 QDir dir( path, "lib*.so" ); 397 QDir dir( path, "lib*.so" );
395#endif 398#endif
396 QStringList list; 399 QStringList list;
397 if ( dir. exists ( )) 400 if ( dir. exists ( ))
398 list = dir.entryList(); 401 list = dir.entryList();
399 QStringList::Iterator it; 402 QStringList::Iterator it;
400 for ( it = list.begin(); it != list.end(); ++it ) { 403 for ( it = list.begin(); it != list.end(); ++it ) {
401 TextCodecInterface *iface = 0; 404 TextCodecInterface *iface = 0;
402 QLibrary *lib = new QLibrary( path + "/" + *it ); 405 QLibrary *lib = new QLibrary( path + "/" + *it );
403 if ( lib->queryInterface( IID_QtopiaTextCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) { 406 if ( lib->queryInterface( IID_QtopiaTextCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) {
404 QValueList<int> mibs = iface->mibEnums(); 407 QValueList<int> mibs = iface->mibEnums();
405 for (QValueList<int>::ConstIterator i = mibs.begin(); i != mibs.end(); ++i) { 408 for (QValueList<int>::ConstIterator i = mibs.begin(); i != mibs.end(); ++i) {
406 (void)iface->createForMib(*i); 409 (void)iface->createForMib(*i);
407 // ### it exists now; need to remember if we can delete it 410 // ### it exists now; need to remember if we can delete it
408 } 411 }
409 } 412 }
410 else { 413 else {
411 lib->unload(); 414 lib->unload();
412 delete lib; 415 delete lib;
413 } 416 }
414 } 417 }
415 } 418 }
416 419
417 void loadImageCodecs() 420 void loadImageCodecs()
418 { 421 {
419 QString path = QPEApplication::qpeDir() + "plugins/imagecodecs"; 422 QString path = QPEApplication::qpeDir() + "plugins/imagecodecs";
420#ifdef Q_OS_MACX 423#ifdef Q_OS_MACX
421 QDir dir( path, "lib*.dylib" ); 424 QDir dir( path, "lib*.dylib" );
422#else 425#else
423 QDir dir( path, "lib*.so" ); 426 QDir dir( path, "lib*.so" );
424#endif 427#endif
425 QStringList list; 428 QStringList list;
426 if ( dir. exists ( )) 429 if ( dir. exists ( ))
427 list = dir.entryList(); 430 list = dir.entryList();
428 QStringList::Iterator it; 431 QStringList::Iterator it;
429 for ( it = list.begin(); it != list.end(); ++it ) { 432 for ( it = list.begin(); it != list.end(); ++it ) {
430 ImageCodecInterface *iface = 0; 433 ImageCodecInterface *iface = 0;
431 QLibrary *lib = new QLibrary( path + "/" + *it ); 434 QLibrary *lib = new QLibrary( path + "/" + *it );
432 if ( lib->queryInterface( IID_QtopiaImageCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) { 435 if ( lib->queryInterface( IID_QtopiaImageCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) {
433 QStringList formats = iface->keys(); 436 QStringList formats = iface->keys();
434 for (QStringList::ConstIterator i = formats.begin(); i != formats.end(); ++i) { 437 for (QStringList::ConstIterator i = formats.begin(); i != formats.end(); ++i) {
435 (void)iface->installIOHandler(*i); 438 (void)iface->installIOHandler(*i);
436 // ### it exists now; need to remember if we can delete it 439 // ### it exists now; need to remember if we can delete it
437 } 440 }
438 } 441 }
439 else { 442 else {
440 lib->unload(); 443 lib->unload();
441 delete lib; 444 delete lib;
442 } 445 }
443 } 446 }
444 } 447 }
445 448
446}; 449};
447 450
448class ResourceMimeFactory : public QMimeSourceFactory 451class ResourceMimeFactory : public QMimeSourceFactory
449{ 452{
450public: 453public:
451 ResourceMimeFactory() : resImage( 0 ) 454 ResourceMimeFactory() : resImage( 0 )
452 { 455 {
453 setFilePath( Global::helpPath() ); 456 setFilePath( Global::helpPath() );
454 setExtensionType( "html", "text/html;charset=UTF-8" ); 457 setExtensionType( "html", "text/html;charset=UTF-8" );
455 } 458 }
456 ~ResourceMimeFactory() { 459 ~ResourceMimeFactory() {
457 delete resImage; 460 delete resImage;
458 } 461 }
459 462
460 const QMimeSource* data( const QString& abs_name ) const 463 const QMimeSource* data( const QString& abs_name ) const
461 { 464 {
462 const QMimeSource * r = QMimeSourceFactory::data( abs_name ); 465 const QMimeSource * r = QMimeSourceFactory::data( abs_name );
463 if ( !r ) { 466 if ( !r ) {
464 int sl = abs_name.length(); 467 int sl = abs_name.length();
465 do { 468 do {
466 sl = abs_name.findRev( '/', sl - 1 ); 469 sl = abs_name.findRev( '/', sl - 1 );
467 QString name = sl >= 0 ? abs_name.mid( sl + 1 ) : abs_name; 470 QString name = sl >= 0 ? abs_name.mid( sl + 1 ) : abs_name;
468 int dot = name.findRev( '.' ); 471 int dot = name.findRev( '.' );
469 if ( dot >= 0 ) 472 if ( dot >= 0 )
470 name = name.left( dot ); 473 name = name.left( dot );
471 QImage img = Resource::loadImage( name ); 474 QImage img = Resource::loadImage( name );
472 if ( !img.isNull() ) { 475 if ( !img.isNull() ) {
473 delete resImage; 476 delete resImage;
474 resImage = new QImageDrag( img ); 477 resImage = new QImageDrag( img );
475 r = resImage; 478 r = resImage;
476 } 479 }
477 } 480 }
478 while ( !r && sl > 0 ); 481 while ( !r && sl > 0 );
479 } 482 }
480 return r; 483 return r;
481 } 484 }
482private: 485private:
483 mutable QImageDrag *resImage; 486 mutable QImageDrag *resImage;
484}; 487};
485 488
486static int& hack(int& i) 489static int& hack(int& i)
487{ 490{
488#if QT_VERSION <= 230 && defined(QT_NO_CODECS) 491#if QT_VERSION <= 230 && defined(QT_NO_CODECS)
489 // These should be created, but aren't in Qt 2.3.0 492 // These should be created, but aren't in Qt 2.3.0
490 (void)new QUtf8Codec; 493 (void)new QUtf8Codec;
491 (void)new QUtf16Codec; 494 (void)new QUtf16Codec;
492#endif 495#endif
493 return i; 496 return i;
494} 497}
495 498
496static int muted = 0; 499static int muted = 0;
497static int micMuted = 0; 500static int micMuted = 0;
498 501
499static void setVolume( int t = 0, int percent = -1 ) 502static void setVolume( int t = 0, int percent = -1 )
500{ 503{
501 switch ( t ) { 504 switch ( t ) {
502 case 0: { 505 case 0: {
503 Config cfg( "qpe" ); 506 Config cfg( "qpe" );
504 cfg.setGroup( "Volume" ); 507 cfg.setGroup( "Volume" );
505 if ( percent < 0 ) 508 if ( percent < 0 )
506 percent = cfg.readNumEntry( "VolumePercent", 50 ); 509 percent = cfg.readNumEntry( "VolumePercent", 50 );
507#ifndef QT_NO_SOUND 510#ifndef QT_NO_SOUND
508 int fd = 0; 511 int fd = 0;
509#ifdef QT_QWS_DEVFS 512#ifdef QT_QWS_DEVFS
510 if ( ( fd = open( "/dev/sound/mixer", O_RDWR ) ) >= 0 ) { 513 if ( ( fd = open( "/dev/sound/mixer", O_RDWR ) ) >= 0 ) {
511#else 514#else
512 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) { 515 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) {
513#endif 516#endif
514 int vol = muted ? 0 : percent; 517 int vol = muted ? 0 : percent;
515 // set both channels to same volume 518 // set both channels to same volume
516 vol |= vol << 8; 519 vol |= vol << 8;
517 ioctl( fd, MIXER_WRITE( SOUND_MIXER_VOLUME ), &vol ); 520 ioctl( fd, MIXER_WRITE( SOUND_MIXER_VOLUME ), &vol );
518 ::close( fd ); 521 ::close( fd );
519 } 522 }
520#endif 523#endif
521 } 524 }
522 break; 525 break;
523 } 526 }
524} 527}
525 528
526static void setMic( int t = 0, int percent = -1 ) 529static void setMic( int t = 0, int percent = -1 )
527{ 530{
528 switch ( t ) { 531 switch ( t ) {
529 case 0: { 532 case 0: {
530 Config cfg( "qpe" ); 533 Config cfg( "qpe" );
531 cfg.setGroup( "Volume" ); 534 cfg.setGroup( "Volume" );
532 if ( percent < 0 ) 535 if ( percent < 0 )
533 percent = cfg.readNumEntry( "Mic", 50 ); 536 percent = cfg.readNumEntry( "Mic", 50 );
534 537
535#ifndef QT_NO_SOUND 538#ifndef QT_NO_SOUND
536 int fd = 0; 539 int fd = 0;
537 int mic = micMuted ? 0 : percent; 540 int mic = micMuted ? 0 : percent;
538#ifdef QT_QWS_DEVFS 541#ifdef QT_QWS_DEVFS
539 if ( ( fd = open( "/dev/sound/mixer", O_RDWR ) ) >= 0 ) { 542 if ( ( fd = open( "/dev/sound/mixer", O_RDWR ) ) >= 0 ) {
540#else 543#else
541 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) { 544 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) {
542#endif 545#endif
543 ioctl( fd, MIXER_WRITE( SOUND_MIXER_MIC ), &mic ); 546 ioctl( fd, MIXER_WRITE( SOUND_MIXER_MIC ), &mic );
544 ::close( fd ); 547 ::close( fd );
545 } 548 }
546#endif 549#endif
547 } 550 }
548 break; 551 break;
549 } 552 }
550} 553}
551 554
552 555
553static void setBass( int t = 0, int percent = -1 ) 556static void setBass( int t = 0, int percent = -1 )
554{ 557{
555 switch ( t ) { 558 switch ( t ) {
556 case 0: { 559 case 0: {
557 Config cfg( "qpe" ); 560 Config cfg( "qpe" );
558 cfg.setGroup( "Volume" ); 561 cfg.setGroup( "Volume" );
559 if ( percent < 0 ) 562 if ( percent < 0 )
560 percent = cfg.readNumEntry( "BassPercent", 50 ); 563 percent = cfg.readNumEntry( "BassPercent", 50 );
561 564
562#ifndef QT_NO_SOUND 565#ifndef QT_NO_SOUND
563 int fd = 0; 566 int fd = 0;
564 int bass = percent; 567 int bass = percent;
565#ifdef QT_QWS_DEVFS 568#ifdef QT_QWS_DEVFS
566 if ( ( fd = open( "/dev/sound/mixer", O_RDWR ) ) >= 0 ) { 569 if ( ( fd = open( "/dev/sound/mixer", O_RDWR ) ) >= 0 ) {
567#else 570#else
568 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) { 571 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) {
569#endif 572#endif
570 ioctl( fd, MIXER_WRITE( SOUND_MIXER_BASS ), &bass ); 573 ioctl( fd, MIXER_WRITE( SOUND_MIXER_BASS ), &bass );
571 ::close( fd ); 574 ::close( fd );
572 } 575 }
573#endif 576#endif
574 } 577 }
575 break; 578 break;
576 } 579 }
577} 580}
578 581
579 582
580static void setTreble( int t = 0, int percent = -1 ) 583static void setTreble( int t = 0, int percent = -1 )
581{ 584{
582 switch ( t ) { 585 switch ( t ) {
583 case 0: { 586 case 0: {
584 Config cfg( "qpe" ); 587 Config cfg( "qpe" );
585 cfg.setGroup( "Volume" ); 588 cfg.setGroup( "Volume" );
586 if ( percent < 0 ) 589 if ( percent < 0 )
587 percent = cfg.readNumEntry( "TreblePercent", 50 ); 590 percent = cfg.readNumEntry( "TreblePercent", 50 );
588 591
589#ifndef QT_NO_SOUND 592#ifndef QT_NO_SOUND
590 int fd = 0; 593 int fd = 0;
591 int treble = percent; 594 int treble = percent;
592#ifdef QT_QWS_DEVFS 595#ifdef QT_QWS_DEVFS
593 if ( ( fd = open( "/dev/sound/mixer", O_RDWR ) ) >= 0 ) { 596 if ( ( fd = open( "/dev/sound/mixer", O_RDWR ) ) >= 0 ) {
594#else 597#else
595 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) { 598 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) {
596#endif 599#endif
597 ioctl( fd, MIXER_WRITE( SOUND_MIXER_TREBLE ), &treble ); 600 ioctl( fd, MIXER_WRITE( SOUND_MIXER_TREBLE ), &treble );
598 ::close( fd ); 601 ::close( fd );
599 } 602 }
600#endif 603#endif
601 } 604 }
602 break; 605 break;
603 } 606 }
604} 607}
605 608
606 609
607/** 610/**
608 \class QPEApplication 611 \class QPEApplication
609 \brief The QPEApplication class implements various system services 612 \brief The QPEApplication class implements various system services
610 that are available to all Qtopia applications. 613 that are available to all Qtopia applications.
611 614
612 Simply by using QPEApplication instead of QApplication, a standard Qt 615 Simply by using QPEApplication instead of QApplication, a standard Qt
613 application becomes a Qtopia application. It automatically follows 616 application becomes a Qtopia application. It automatically follows
614 style changes, quits and raises, and in the 617 style changes, quits and raises, and in the
615 case of \link docwidget.html document-oriented\endlink applications, 618 case of \link docwidget.html document-oriented\endlink applications,
616 changes the currently displayed document in response to the environment. 619 changes the currently displayed document in response to the environment.
617 620
618 To create a \link docwidget.html document-oriented\endlink 621 To create a \link docwidget.html document-oriented\endlink
619 application use showMainDocumentWidget(); to create a 622 application use showMainDocumentWidget(); to create a
620 non-document-oriented application use showMainWidget(). The 623 non-document-oriented application use showMainWidget(). The
621 keepRunning() function indicates whether the application will 624 keepRunning() function indicates whether the application will
622 continue running after it's processed the last \link qcop.html 625 continue running after it's processed the last \link qcop.html
623 QCop\endlink message. This can be changed using setKeepRunning(). 626 QCop\endlink message. This can be changed using setKeepRunning().
624 627
625 A variety of signals are emitted when certain events occur, for 628 A variety of signals are emitted when certain events occur, for
626 example, timeChanged(), clockChanged(), weekChanged(), 629 example, timeChanged(), clockChanged(), weekChanged(),
627 dateFormatChanged() and volumeChanged(). If the application receives 630 dateFormatChanged() and volumeChanged(). If the application receives
628 a \link qcop.html QCop\endlink message on the application's 631 a \link qcop.html QCop\endlink message on the application's
629 QPE/Application/\e{appname} channel, the appMessage() signal is 632 QPE/Application/\e{appname} channel, the appMessage() signal is
630 emitted. There are also flush() and reload() signals, which 633 emitted. There are also flush() and reload() signals, which
631 are emitted when synching begins and ends respectively - upon these 634 are emitted when synching begins and ends respectively - upon these
632 signals, the application should save and reload any data 635 signals, the application should save and reload any data
633 files that are involved in synching. Most of these signals will initially 636 files that are involved in synching. Most of these signals will initially
634 be received and unfiltered through the appMessage() signal. 637 be received and unfiltered through the appMessage() signal.
635 638
636 This class also provides a set of useful static functions. The 639 This class also provides a set of useful static functions. The
637 qpeDir() and documentDir() functions return the respective paths. 640 qpeDir() and documentDir() functions return the respective paths.
638 The grabKeyboard() and ungrabKeyboard() functions are used to 641 The grabKeyboard() and ungrabKeyboard() functions are used to
639 control whether the application takes control of the device's 642 control whether the application takes control of the device's
640 physical buttons (e.g. application launch keys). The stylus' mode of 643 physical buttons (e.g. application launch keys). The stylus' mode of
641 operation is set with setStylusOperation() and retrieved with 644 operation is set with setStylusOperation() and retrieved with
642 stylusOperation(). There are also setInputMethodHint() and 645 stylusOperation(). There are also setInputMethodHint() and
643 inputMethodHint() functions. 646 inputMethodHint() functions.
644 647
645 \ingroup qtopiaemb 648 \ingroup qtopiaemb
646*/ 649*/
647 650
648/*! 651/*!
649 \fn void QPEApplication::clientMoused() 652 \fn void QPEApplication::clientMoused()
650 653
651 \internal 654 \internal
652*/ 655*/
653 656
654/*! 657/*!
655 \fn void QPEApplication::timeChanged(); 658 \fn void QPEApplication::timeChanged();
656 This signal is emitted when the time changes outside the normal 659 This signal is emitted when the time changes outside the normal
657 passage of time, i.e. if the time is set backwards or forwards. 660 passage of time, i.e. if the time is set backwards or forwards.
658*/ 661*/
659 662
660/*! 663/*!
661 \fn void QPEApplication::clockChanged( bool ampm ); 664 \fn void QPEApplication::clockChanged( bool ampm );
662 665
663 This signal is emitted when the user changes the clock's style. If 666 This signal is emitted when the user changes the clock's style. If
664 \a ampm is TRUE, the user wants a 12-hour AM/PM clock, otherwise, 667 \a ampm is TRUE, the user wants a 12-hour AM/PM clock, otherwise,
665 they want a 24-hour clock. 668 they want a 24-hour clock.
666*/ 669*/
667 670
668/*! 671/*!
669 \fn void QPEApplication::volumeChanged( bool muted ) 672 \fn void QPEApplication::volumeChanged( bool muted )
670 673
671 This signal is emitted whenever the mute state is changed. If \a 674 This signal is emitted whenever the mute state is changed. If \a
672 muted is TRUE, then sound output has been muted. 675 muted is TRUE, then sound output has been muted.
673*/ 676*/
674 677
675/*! 678/*!
676 \fn void QPEApplication::weekChanged( bool startOnMonday ) 679 \fn void QPEApplication::weekChanged( bool startOnMonday )
677 680
678 This signal is emitted if the week start day is changed. If \a 681 This signal is emitted if the week start day is changed. If \a
679 startOnMonday is TRUE then the first day of the week is Monday; if 682 startOnMonday is TRUE then the first day of the week is Monday; if
680 \a startOnMonday is FALSE then the first day of the week is 683 \a startOnMonday is FALSE then the first day of the week is
681 Sunday. 684 Sunday.
682*/ 685*/
683 686
684/*! 687/*!
685 \fn void QPEApplication::dateFormatChanged(DateFormat) 688 \fn void QPEApplication::dateFormatChanged(DateFormat)
686 689
687 This signal is emitted whenever the date format is changed. 690 This signal is emitted whenever the date format is changed.
688*/ 691*/
689 692
690/*! 693/*!
691 \fn void QPEApplication::flush() 694 \fn void QPEApplication::flush()
692 695
693 ### 696 ###
694*/ 697*/
695 698
696/*! 699/*!
697 \fn void QPEApplication::reload() 700 \fn void QPEApplication::reload()
698 701
699*/ 702*/
700 703
701 704
702 705
703void QPEApplication::processQCopFile() 706void QPEApplication::processQCopFile()
704{ 707{
705 QString qcopfn("/tmp/qcop-msg-"); 708 QString qcopfn("/tmp/qcop-msg-");