summaryrefslogtreecommitdiff
path: root/library/qpeapplication.cpp
Unidiff
Diffstat (limited to 'library/qpeapplication.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--library/qpeapplication.cpp2
1 files changed, 1 insertions, 1 deletions
diff --git a/library/qpeapplication.cpp b/library/qpeapplication.cpp
index b1c8750..5e88086 100644
--- a/library/qpeapplication.cpp
+++ b/library/qpeapplication.cpp
@@ -1,2299 +1,2299 @@
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 >= 300 63#if QT_VERSION >= 300
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 91
92#include <unistd.h> 92#include <unistd.h>
93#include <sys/file.h> 93#include <sys/file.h>
94#include <sys/ioctl.h> 94#include <sys/ioctl.h>
95#ifndef QT_NO_SOUND 95#ifndef QT_NO_SOUND
96#include <sys/soundcard.h> 96#include <sys/soundcard.h>
97#endif 97#endif
98#include "qt_override_p.h" 98#include "qt_override_p.h"
99 99
100static bool useBigPixmaps = 0; 100static bool useBigPixmaps = 0;
101 101
102class HackWidget : public QWidget 102class HackWidget : public QWidget
103{ 103{
104public: 104public:
105 bool needsOk() 105 bool needsOk()
106 { return (getWState() & WState_Reserved1 ); } 106 { return (getWState() & WState_Reserved1 ); }
107 107
108 QRect normalGeometry() 108 QRect normalGeometry()
109 { return topData()->normalGeometry; }; 109 { return topData()->normalGeometry; };
110}; 110};
111 111
112class QPEApplicationData 112class QPEApplicationData
113{ 113{
114public: 114public:
115 QPEApplicationData ( ) 115 QPEApplicationData ( )
116 : presstimer( 0 ), presswidget( 0 ), rightpressed( false ), kbgrabbed( false ), 116 : presstimer( 0 ), presswidget( 0 ), rightpressed( false ), kbgrabbed( false ),
117 notbusysent( false ), preloaded( false ), forceshow( false ), nomaximize( false ), 117 notbusysent( false ), preloaded( false ), forceshow( false ), nomaximize( false ),
118 keep_running( true ), qcopQok( false ), 118 keep_running( true ), qcopQok( false ),
119 fontFamily( "Vera" ), fontSize( 10 ), smallIconSize( 14 ), 119 fontFamily( "Vera" ), fontSize( 10 ), smallIconSize( 14 ),
120 bigIconSize( 32 ), qpe_main_widget( 0 ) 120 bigIconSize( 32 ), qpe_main_widget( 0 )
121 { 121 {
122 Config cfg( "qpe" ); 122 Config cfg( "qpe" );
123 cfg.setGroup( "Appearance" ); 123 cfg.setGroup( "Appearance" );
124 useBigPixmaps = cfg.readBoolEntry( "useBigPixmaps", false ); 124 useBigPixmaps = cfg.readBoolEntry( "useBigPixmaps", false );
125 fontFamily = cfg.readEntry( "FontFamily", "Vera" ); 125 fontFamily = cfg.readEntry( "FontFamily", "Vera" );
126 fontSize = cfg.readNumEntry( "FontSize", 10 ); 126 fontSize = cfg.readNumEntry( "FontSize", 10 );
127 smallIconSize = cfg.readNumEntry( "SmallIconSize", 14 ); 127 smallIconSize = cfg.readNumEntry( "SmallIconSize", 14 );
128 bigIconSize = cfg.readNumEntry( "BigIconSize", 32 ); 128 bigIconSize = cfg.readNumEntry( "BigIconSize", 32 );
129 } 129 }
130 130
131 int presstimer; 131 int presstimer;
132 QWidget* presswidget; 132 QWidget* presswidget;
133 QPoint presspos; 133 QPoint presspos;
134 134
135 bool rightpressed : 1; 135 bool rightpressed : 1;
136 bool kbgrabbed : 1; 136 bool kbgrabbed : 1;
137 bool notbusysent : 1; 137 bool notbusysent : 1;
138 bool preloaded : 1; 138 bool preloaded : 1;
139 bool forceshow : 1; 139 bool forceshow : 1;
140 bool nomaximize : 1; 140 bool nomaximize : 1;
141 bool keep_running : 1; 141 bool keep_running : 1;
142 bool qcopQok : 1; 142 bool qcopQok : 1;
143 143
144 QCString fontFamily; 144 QCString fontFamily;
145 int fontSize; 145 int fontSize;
146 int smallIconSize; 146 int smallIconSize;
147 int bigIconSize; 147 int bigIconSize;
148 148
149 QStringList langs; 149 QStringList langs;
150 QString appName; 150 QString appName;
151 struct QCopRec 151 struct QCopRec
152 { 152 {
153 QCopRec( const QCString &ch, const QCString &msg, 153 QCopRec( const QCString &ch, const QCString &msg,
154 const QByteArray &d ) : 154 const QByteArray &d ) :
155 channel( ch ), message( msg ), data( d ) 155 channel( ch ), message( msg ), data( d )
156 { } 156 { }
157 157
158 QCString channel; 158 QCString channel;
159 QCString message; 159 QCString message;
160 QByteArray data; 160 QByteArray data;
161 }; 161 };
162 QWidget* qpe_main_widget; 162 QWidget* qpe_main_widget;
163 QGuardedPtr<QWidget> lastraised; 163 QGuardedPtr<QWidget> lastraised;
164 QQueue<QCopRec> qcopq; 164 QQueue<QCopRec> qcopq;
165 QString styleName; 165 QString styleName;
166 QString decorationName; 166 QString decorationName;
167 167
168 void enqueueQCop( const QCString &ch, const QCString &msg, 168 void enqueueQCop( const QCString &ch, const QCString &msg,
169 const QByteArray &data ) 169 const QByteArray &data )
170 { 170 {
171 qcopq.enqueue( new QCopRec( ch, msg, data ) ); 171 qcopq.enqueue( new QCopRec( ch, msg, data ) );
172 } 172 }
173 void sendQCopQ() 173 void sendQCopQ()
174 { 174 {
175 if (!qcopQok ) 175 if (!qcopQok )
176 return; 176 return;
177 177
178 QCopRec * r; 178 QCopRec * r;
179 179
180 while((r=qcopq.dequeue())) { 180 while((r=qcopq.dequeue())) {
181 // remove from queue before sending... 181 // remove from queue before sending...
182 // event loop can come around again before getting 182 // event loop can come around again before getting
183 // back from sendLocally 183 // back from sendLocally
184#ifndef QT_NO_COP 184#ifndef QT_NO_COP
185 QCopChannel::sendLocally( r->channel, r->message, r->data ); 185 QCopChannel::sendLocally( r->channel, r->message, r->data );
186#endif 186#endif
187 187
188 delete r; 188 delete r;
189 } 189 }
190 } 190 }
191 191
192 static void show_mx(QWidget* mw, bool nomaximize, QString &strName) 192 static void show_mx(QWidget* mw, bool nomaximize, QString &strName)
193 { 193 {
194 if ( mw->inherits("QMainWindow") || mw->isA("QMainWindow") ) 194 if ( mw->inherits("QMainWindow") || mw->isA("QMainWindow") )
195 { 195 {
196 ( ( QMainWindow* ) mw )->setUsesBigPixmaps( useBigPixmaps ); 196 ( ( QMainWindow* ) mw )->setUsesBigPixmaps( useBigPixmaps );
197 } 197 }
198 QPoint p; 198 QPoint p;
199 QSize s; 199 QSize s;
200 bool max; 200 bool max;
201 if ( mw->isVisible() ) { 201 if ( mw->isVisible() ) {
202 if ( read_widget_rect(strName, max, p, s) && validate_widget_size(mw, p, s) ) { 202 if ( read_widget_rect(strName, max, p, s) && validate_widget_size(mw, p, s) ) {
203 mw->resize(s); 203 mw->resize(s);
204 mw->move(p); 204 mw->move(p);
205 } 205 }
206 mw->raise(); 206 mw->raise();
207 } else { 207 } else {
208 208
209 if ( mw->layout() && mw->inherits("QDialog") ) { 209 if ( mw->layout() && mw->inherits("QDialog") ) {
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 if ( max && !nomaximize ) { 214 if ( max && !nomaximize ) {
215 mw->showMaximized(); 215 mw->showMaximized();
216 } else { 216 } else {
217 mw->show(); 217 mw->show();
218 } 218 }
219 } else { 219 } else {
220 qpe_show_dialog((QDialog*)mw,nomaximize); 220 qpe_show_dialog((QDialog*)mw,nomaximize);
221 } 221 }
222 } else { 222 } else {
223 if ( read_widget_rect(strName, max, p, s) && validate_widget_size(mw, p, s) ) { 223 if ( read_widget_rect(strName, max, p, s) && validate_widget_size(mw, p, s) ) {
224 mw->resize(s); 224 mw->resize(s);
225 mw->move(p); 225 mw->move(p);
226 } else { //no stored rectangle, make an estimation 226 } else { //no stored rectangle, make an estimation
227 int x = (qApp->desktop()->width()-mw->frameGeometry().width())/2; 227 int x = (qApp->desktop()->width()-mw->frameGeometry().width())/2;
228 int y = (qApp->desktop()->height()-mw->frameGeometry().height())/2; 228 int y = (qApp->desktop()->height()-mw->frameGeometry().height())/2;
229 mw->move( QMAX(x,0), QMAX(y,0) ); 229 mw->move( QMAX(x,0), QMAX(y,0) );
230#ifdef Q_WS_QWS 230#ifdef Q_WS_QWS
231 if ( !nomaximize ) 231 if ( !nomaximize )
232 mw->showMaximized(); 232 mw->showMaximized();
233#endif 233#endif
234 } 234 }
235 if ( max && !nomaximize ) 235 if ( max && !nomaximize )
236 mw->showMaximized(); 236 mw->showMaximized();
237 else 237 else
238 mw->show(); 238 mw->show();
239 } 239 }
240 } 240 }
241 } 241 }
242 242
243static void qpe_show_dialog( QDialog* d, bool nomax ) 243static void qpe_show_dialog( QDialog* d, bool nomax )
244{ 244{
245 QSize sh = d->sizeHint(); 245 QSize sh = d->sizeHint();
246 int w = QMAX(sh.width(),d->width()); 246 int w = QMAX(sh.width(),d->width());
247 int h = QMAX(sh.height(),d->height()); 247 int h = QMAX(sh.height(),d->height());
248 248
249 if ( d->parentWidget() && !d->parentWidget()->topLevelWidget()->isMaximized() ) 249 if ( d->parentWidget() && !d->parentWidget()->topLevelWidget()->isMaximized() )
250 nomax = TRUE; 250 nomax = TRUE;
251 251
252#ifndef Q_WS_QWS 252#ifndef Q_WS_QWS
253 QSize s(qApp->desktop()->width(), qApp->desktop()->height() ); 253 QSize s(qApp->desktop()->width(), qApp->desktop()->height() );
254#else 254#else
255 QSize s(qt_maxWindowRect.width(), qt_maxWindowRect.height() ); 255 QSize s(qt_maxWindowRect.width(), qt_maxWindowRect.height() );
256#endif 256#endif
257 257
258 int maxX = s.width() - (d->frameGeometry().width() - d->geometry().width()); 258 int maxX = s.width() - (d->frameGeometry().width() - d->geometry().width());
259 int maxY = s.height() - (d->frameGeometry().height() - d->geometry().height()); 259 int maxY = s.height() - (d->frameGeometry().height() - d->geometry().height());
260 260
261 if ( (w >= maxX && h >= maxY) || ( (!nomax) && ( w > s.width()*3/4 || h > s.height()*3/4 ) ) ) { 261 if ( (w >= maxX && h >= maxY) || ( (!nomax) && ( w > s.width()*3/4 || h > s.height()*3/4 ) ) ) {
262 d->showMaximized(); 262 d->showMaximized();
263 } else { 263 } else {
264 // try centering the dialog around its parent 264 // try centering the dialog around its parent
265 QPoint p(0,0); 265 QPoint p(0,0);
266 if ( d->parentWidget() ) { 266 if ( d->parentWidget() ) {
267 QPoint pp = d->parentWidget()->mapToGlobal( QPoint(0,0) ); 267 QPoint pp = d->parentWidget()->mapToGlobal( QPoint(0,0) );
268 p = QPoint( pp.x() + d->parentWidget()->width()/2, 268 p = QPoint( pp.x() + d->parentWidget()->width()/2,
269 pp.y() + d->parentWidget()->height()/ 2 ); 269 pp.y() + d->parentWidget()->height()/ 2 );
270 } else { 270 } else {
271 p = QPoint( maxX/2, maxY/2 ); 271 p = QPoint( maxX/2, maxY/2 );
272 } 272 }
273 273
274 p = QPoint( p.x() - w/2, p.y() - h/2 ); 274 p = QPoint( p.x() - w/2, p.y() - h/2 );
275// qDebug("p(x,y) is %d %d", p.x(), p.y() ); 275// qDebug("p(x,y) is %d %d", p.x(), p.y() );
276 276
277 if ( w >= maxX ) { 277 if ( w >= maxX ) {
278 if ( p.y() < 0 ) 278 if ( p.y() < 0 )
279 p.setY(0); 279 p.setY(0);
280 if ( p.y() + h > maxY ) 280 if ( p.y() + h > maxY )
281 p.setY( maxY - h); 281 p.setY( maxY - h);
282 282
283 d->resize(maxX, h); 283 d->resize(maxX, h);
284 d->move(0, p.y() ); 284 d->move(0, p.y() );
285 } else if ( h >= maxY ) { 285 } else if ( h >= maxY ) {
286 if ( p.x() < 0 ) 286 if ( p.x() < 0 )
287 p.setX(0); 287 p.setX(0);
288 if ( p.x() + w > maxX ) 288 if ( p.x() + w > maxX )
289 p.setX( maxX - w); 289 p.setX( maxX - w);
290 290
291 d->resize(w, maxY); 291 d->resize(w, maxY);
292 d->move(p.x(),0); 292 d->move(p.x(),0);
293 } else { 293 } else {
294 d->resize(w, h); 294 d->resize(w, h);
295 } 295 }
296 296
297 d->show(); 297 d->show();
298 } 298 }
299} 299}
300 300
301 static bool read_widget_rect(const QString &app, bool &maximized, QPoint &p, QSize &s) 301 static bool read_widget_rect(const QString &app, bool &maximized, QPoint &p, QSize &s)
302 { 302 {
303 maximized = TRUE; 303 maximized = TRUE;
304 // 350 is the trigger in qwsdefaultdecoration for providing a resize button 304 // 350 is the trigger in qwsdefaultdecoration for providing a resize button
305 if ( qApp->desktop()->width() <= 350 ) 305 if ( qApp->desktop()->width() <= 350 )
306 return FALSE; 306 return FALSE;
307 307
308 Config cfg( "qpe" ); 308 Config cfg( "qpe" );
309 cfg.setGroup("ApplicationPositions"); 309 cfg.setGroup("ApplicationPositions");
310 QString str = cfg.readEntry( app, QString::null ); 310 QString str = cfg.readEntry( app, QString::null );
311 QStringList l = QStringList::split(",", str); 311 QStringList l = QStringList::split(",", str);
312 312
313 if ( l.count() == 5) { 313 if ( l.count() == 5) {
314 p.setX( l[0].toInt() ); 314 p.setX( l[0].toInt() );
315 p.setY( l[1].toInt() ); 315 p.setY( l[1].toInt() );
316 316
317 s.setWidth( l[2].toInt() ); 317 s.setWidth( l[2].toInt() );
318 s.setHeight( l[3].toInt() ); 318 s.setHeight( l[3].toInt() );
319 319
320 maximized = l[4].toInt(); 320 maximized = l[4].toInt();
321 321
322 return TRUE; 322 return TRUE;
323 } 323 }
324 324
325 return FALSE; 325 return FALSE;
326 } 326 }
327 327
328 328
329 static bool validate_widget_size(const QWidget *w, QPoint &p, QSize &s) 329 static bool validate_widget_size(const QWidget *w, QPoint &p, QSize &s)
330 { 330 {
331#ifndef Q_WS_QWS 331#ifndef Q_WS_QWS
332 QRect qt_maxWindowRect = qApp->desktop()->geometry(); 332 QRect qt_maxWindowRect = qApp->desktop()->geometry();
333#endif 333#endif
334 int maxX = qt_maxWindowRect.width(); 334 int maxX = qt_maxWindowRect.width();
335 int maxY = qt_maxWindowRect.height(); 335 int maxY = qt_maxWindowRect.height();
336 int wWidth = s.width() + ( w->frameGeometry().width() - w->geometry().width() ); 336 int wWidth = s.width() + ( w->frameGeometry().width() - w->geometry().width() );
337 int wHeight = s.height() + ( w->frameGeometry().height() - w->geometry().height() ); 337 int wHeight = s.height() + ( w->frameGeometry().height() - w->geometry().height() );
338 338
339 // total window size is not allowed to be larger than desktop window size 339 // total window size is not allowed to be larger than desktop window size
340 if ( ( wWidth >= maxX ) && ( wHeight >= maxY ) ) 340 if ( ( wWidth >= maxX ) && ( wHeight >= maxY ) )
341 return FALSE; 341 return FALSE;
342 342
343 if ( wWidth > maxX ) { 343 if ( wWidth > maxX ) {
344 s.setWidth( maxX - (w->frameGeometry().width() - w->geometry().width() ) ); 344 s.setWidth( maxX - (w->frameGeometry().width() - w->geometry().width() ) );
345 wWidth = maxX; 345 wWidth = maxX;
346 } 346 }
347 347
348 if ( wHeight > maxY ) { 348 if ( wHeight > maxY ) {
349 s.setHeight( maxY - (w->frameGeometry().height() - w->geometry().height() ) ); 349 s.setHeight( maxY - (w->frameGeometry().height() - w->geometry().height() ) );
350 wHeight = maxY; 350 wHeight = maxY;
351 } 351 }
352 352
353 // any smaller than this and the maximize/close/help buttons will be overlapping 353 // any smaller than this and the maximize/close/help buttons will be overlapping
354 if ( wWidth < 80 || wHeight < 60 ) 354 if ( wWidth < 80 || wHeight < 60 )
355 return FALSE; 355 return FALSE;
356 356
357 if ( p.x() < 0 ) 357 if ( p.x() < 0 )
358 p.setX(0); 358 p.setX(0);
359 if ( p.y() < 0 ) 359 if ( p.y() < 0 )
360 p.setY(0); 360 p.setY(0);
361 361
362 if ( p.x() + wWidth > maxX ) 362 if ( p.x() + wWidth > maxX )
363 p.setX( maxX - wWidth ); 363 p.setX( maxX - wWidth );
364 if ( p.y() + wHeight > maxY ) 364 if ( p.y() + wHeight > maxY )
365 p.setY( maxY - wHeight ); 365 p.setY( maxY - wHeight );
366 366
367 return TRUE; 367 return TRUE;
368 } 368 }
369 369
370 static void store_widget_rect(QWidget *w, QString &app) 370 static void store_widget_rect(QWidget *w, QString &app)
371 { 371 {
372 // 350 is the trigger in qwsdefaultdecoration for providing a resize button 372 // 350 is the trigger in qwsdefaultdecoration for providing a resize button
373 if ( qApp->desktop()->width() <= 350 ) 373 if ( qApp->desktop()->width() <= 350 )
374 return; 374 return;
375 // we use these to map the offset of geometry and pos. ( we can only use normalGeometry to 375 // we use these to map the offset of geometry and pos. ( we can only use normalGeometry to
376 // get the non-maximized version, so we have to do it the hard way ) 376 // get the non-maximized version, so we have to do it the hard way )
377 int offsetX = w->x() - w->geometry().left(); 377 int offsetX = w->x() - w->geometry().left();
378 int offsetY = w->y() - w->geometry().top(); 378 int offsetY = w->y() - w->geometry().top();
379 379
380 QRect r; 380 QRect r;
381 if ( w->isMaximized() ) 381 if ( w->isMaximized() )
382 r = ( (HackWidget *) w)->normalGeometry(); 382 r = ( (HackWidget *) w)->normalGeometry();
383 else 383 else
384 r = w->geometry(); 384 r = w->geometry();
385 385
386 // Stores the window placement as pos(), size() (due to the offset mapping) 386 // Stores the window placement as pos(), size() (due to the offset mapping)
387 Config cfg( "qpe" ); 387 Config cfg( "qpe" );
388 cfg.setGroup("ApplicationPositions"); 388 cfg.setGroup("ApplicationPositions");
389 QString s; 389 QString s;
390 s.sprintf("%d,%d,%d,%d,%d", r.left() + offsetX, r.top() + offsetY, r.width(), r.height(), w->isMaximized() ); 390 s.sprintf("%d,%d,%d,%d,%d", r.left() + offsetX, r.top() + offsetY, r.width(), r.height(), w->isMaximized() );
391 cfg.writeEntry( app, s ); 391 cfg.writeEntry( app, s );
392 } 392 }
393 393
394 static bool setWidgetCaptionFromAppName( QWidget* /*mw*/, const QString& /*appName*/, const QString& /*appsPath*/ ) 394 static bool setWidgetCaptionFromAppName( QWidget* /*mw*/, const QString& /*appName*/, const QString& /*appsPath*/ )
395 { 395 {
396 /* 396 /*
397 // This works but disable it for now until it is safe to apply 397 // This works but disable it for now until it is safe to apply
398 // What is does is scan the .desktop files of all the apps for 398 // What is does is scan the .desktop files of all the apps for
399 // the applnk that has the corresponding argv[0] as this program 399 // the applnk that has the corresponding argv[0] as this program
400 // then it uses the name stored in the .desktop file as the caption 400 // then it uses the name stored in the .desktop file as the caption
401 // for the main widget. This saves duplicating translations for 401 // for the main widget. This saves duplicating translations for
402 // the app name in the program and in the .desktop files. 402 // the app name in the program and in the .desktop files.
403 403
404 AppLnkSet apps( appsPath ); 404 AppLnkSet apps( appsPath );
405 405
406 QList<AppLnk> appsList = apps.children(); 406 QList<AppLnk> appsList = apps.children();
407 for ( QListIterator<AppLnk> it(appsList); it.current(); ++it ) { 407 for ( QListIterator<AppLnk> it(appsList); it.current(); ++it ) {
408 if ( (*it)->exec() == appName ) { 408 if ( (*it)->exec() == appName ) {
409 mw->setCaption( (*it)->name() ); 409 mw->setCaption( (*it)->name() );
410 return TRUE; 410 return TRUE;
411 } 411 }
412 } 412 }
413 */ 413 */
414 return FALSE; 414 return FALSE;
415 } 415 }
416 416
417 417
418 void show(QWidget* mw, bool nomax) 418 void show(QWidget* mw, bool nomax)
419 { 419 {
420 setWidgetCaptionFromAppName( mw, appName, QPEApplication::qpeDir() + "apps" ); 420 setWidgetCaptionFromAppName( mw, appName, QPEApplication::qpeDir() + "apps" );
421 nomaximize = nomax; 421 nomaximize = nomax;
422 qpe_main_widget = mw; 422 qpe_main_widget = mw;
423 qcopQok = TRUE; 423 qcopQok = TRUE;
424#ifndef QT_NO_COP 424#ifndef QT_NO_COP
425 425
426 sendQCopQ(); 426 sendQCopQ();
427#endif 427#endif
428 428
429 if ( preloaded ) { 429 if ( preloaded ) {
430 if (forceshow) 430 if (forceshow)
431 show_mx(mw, nomax, appName); 431 show_mx(mw, nomax, appName);
432 } 432 }
433 else if ( keep_running ) { 433 else if ( keep_running ) {
434 show_mx(mw, nomax, appName); 434 show_mx(mw, nomax, appName);
435 } 435 }
436 } 436 }
437 437
438 void loadTextCodecs() 438 void loadTextCodecs()
439 { 439 {
440 QString path = QPEApplication::qpeDir() + "/plugins/textcodecs"; 440 QString path = QPEApplication::qpeDir() + "/plugins/textcodecs";
441#ifdef Q_OS_MACX 441#ifdef Q_OS_MACX
442 QDir dir( path, "lib*.dylib" ); 442 QDir dir( path, "lib*.dylib" );
443#else 443#else
444 QDir dir( path, "lib*.so" ); 444 QDir dir( path, "lib*.so" );
445#endif 445#endif
446 QStringList list; 446 QStringList list;
447 if ( dir. exists ( )) 447 if ( dir. exists ( ))
448 list = dir.entryList(); 448 list = dir.entryList();
449 QStringList::Iterator it; 449 QStringList::Iterator it;
450 for ( it = list.begin(); it != list.end(); ++it ) { 450 for ( it = list.begin(); it != list.end(); ++it ) {
451 TextCodecInterface *iface = 0; 451 TextCodecInterface *iface = 0;
452 QLibrary *lib = new QLibrary( path + "/" + *it ); 452 QLibrary *lib = new QLibrary( path + "/" + *it );
453 if ( lib->queryInterface( IID_QtopiaTextCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) { 453 if ( lib->queryInterface( IID_QtopiaTextCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) {
454 QValueList<int> mibs = iface->mibEnums(); 454 QValueList<int> mibs = iface->mibEnums();
455 for (QValueList<int>::ConstIterator i = mibs.begin(); i != mibs.end(); ++i) { 455 for (QValueList<int>::ConstIterator i = mibs.begin(); i != mibs.end(); ++i) {
456 (void)iface->createForMib(*i); 456 (void)iface->createForMib(*i);
457 // ### it exists now; need to remember if we can delete it 457 // ### it exists now; need to remember if we can delete it
458 } 458 }
459 } 459 }
460 else { 460 else {
461 lib->unload(); 461 lib->unload();
462 delete lib; 462 delete lib;
463 } 463 }
464 } 464 }
465 } 465 }
466 466
467 void loadImageCodecs() 467 void loadImageCodecs()
468 { 468 {
469 QString path = QPEApplication::qpeDir() + "/plugins/imagecodecs"; 469 QString path = QPEApplication::qpeDir() + "/plugins/imagecodecs";
470#ifdef Q_OS_MACX 470#ifdef Q_OS_MACX
471 QDir dir( path, "lib*.dylib" ); 471 QDir dir( path, "lib*.dylib" );
472#else 472#else
473 QDir dir( path, "lib*.so" ); 473 QDir dir( path, "lib*.so" );
474#endif 474#endif
475 QStringList list; 475 QStringList list;
476 if ( dir. exists ( )) 476 if ( dir. exists ( ))
477 list = dir.entryList(); 477 list = dir.entryList();
478 QStringList::Iterator it; 478 QStringList::Iterator it;
479 for ( it = list.begin(); it != list.end(); ++it ) { 479 for ( it = list.begin(); it != list.end(); ++it ) {
480 ImageCodecInterface *iface = 0; 480 ImageCodecInterface *iface = 0;
481 QLibrary *lib = new QLibrary( path + "/" + *it ); 481 QLibrary *lib = new QLibrary( path + "/" + *it );
482 if ( lib->queryInterface( IID_QtopiaImageCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) { 482 if ( lib->queryInterface( IID_QtopiaImageCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) {
483 QStringList formats = iface->keys(); 483 QStringList formats = iface->keys();
484 for (QStringList::ConstIterator i = formats.begin(); i != formats.end(); ++i) { 484 for (QStringList::ConstIterator i = formats.begin(); i != formats.end(); ++i) {
485 (void)iface->installIOHandler(*i); 485 (void)iface->installIOHandler(*i);
486 // ### it exists now; need to remember if we can delete it 486 // ### it exists now; need to remember if we can delete it
487 } 487 }
488 } 488 }
489 else { 489 else {
490 lib->unload(); 490 lib->unload();
491 delete lib; 491 delete lib;
492 } 492 }
493 } 493 }
494 } 494 }
495}; 495};
496 496
497class ResourceMimeFactory : public QMimeSourceFactory 497class ResourceMimeFactory : public QMimeSourceFactory
498{ 498{
499public: 499public:
500 ResourceMimeFactory() : resImage( 0 ) 500 ResourceMimeFactory() : resImage( 0 )
501 { 501 {
502 setFilePath( Global::helpPath() ); 502 setFilePath( Global::helpPath() );
503 setExtensionType( "html", "text/html;charset=UTF-8" ); 503 setExtensionType( "html", "text/html;charset=UTF-8" );
504 } 504 }
505 ~ResourceMimeFactory() { 505 ~ResourceMimeFactory() {
506 delete resImage; 506 delete resImage;
507 } 507 }
508 508
509 const QMimeSource* data( const QString& abs_name ) const 509 const QMimeSource* data( const QString& abs_name ) const
510 { 510 {
511 const QMimeSource * r = QMimeSourceFactory::data( abs_name ); 511 const QMimeSource * r = QMimeSourceFactory::data( abs_name );
512 if ( !r ) { 512 if ( !r ) {
513 int sl = abs_name.length(); 513 int sl = abs_name.length();
514 do { 514 do {
515 sl = abs_name.findRev( '/', sl - 1 ); 515 sl = abs_name.findRev( '/', sl - 1 );
516 QString name = sl >= 0 ? abs_name.mid( sl + 1 ) : abs_name; 516 QString name = sl >= 0 ? abs_name.mid( sl + 1 ) : abs_name;
517 int dot = name.findRev( '.' ); 517 int dot = name.findRev( '.' );
518 if ( dot >= 0 ) 518 if ( dot >= 0 )
519 name = name.left( dot ); 519 name = name.left( dot );
520 QImage img = Resource::loadImage( name ); 520 QImage img = Resource::loadImage( name );
521 if ( !img.isNull() ) { 521 if ( !img.isNull() ) {
522 delete resImage; 522 delete resImage;
523 resImage = new QImageDrag( img ); 523 resImage = new QImageDrag( img );
524 r = resImage; 524 r = resImage;
525 } 525 }
526 } 526 }
527 while ( !r && sl > 0 ); 527 while ( !r && sl > 0 );
528 } 528 }
529 return r; 529 return r;
530 } 530 }
531private: 531private:
532 mutable QImageDrag *resImage; 532 mutable QImageDrag *resImage;
533}; 533};
534 534
535static int& hack(int& i) 535static int& hack(int& i)
536{ 536{
537#if QT_VERSION <= 230 && defined(QT_NO_CODECS) 537#if QT_VERSION <= 230 && defined(QT_NO_CODECS)
538 // These should be created, but aren't in Qt 2.3.0 538 // These should be created, but aren't in Qt 2.3.0
539 (void)new QUtf8Codec; 539 (void)new QUtf8Codec;
540 (void)new QUtf16Codec; 540 (void)new QUtf16Codec;
541#endif 541#endif
542 return i; 542 return i;
543} 543}
544 544
545static int muted = 0; 545static int muted = 0;
546static int micMuted = 0; 546static int micMuted = 0;
547 547
548static void setVolume( int t = 0, int percent = -1 ) 548static void setVolume( int t = 0, int percent = -1 )
549{ 549{
550 switch ( t ) { 550 switch ( t ) {
551 case 0: { 551 case 0: {
552 Config cfg( "qpe" ); 552 Config cfg( "qpe" );
553 cfg.setGroup( "Volume" ); 553 cfg.setGroup( "Volume" );
554 if ( percent < 0 ) 554 if ( percent < 0 )
555 percent = cfg.readNumEntry( "VolumePercent", 50 ); 555 percent = cfg.readNumEntry( "VolumePercent", 50 );
556#ifndef QT_NO_SOUND 556#ifndef QT_NO_SOUND
557 int fd = 0; 557 int fd = 0;
558 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) { 558 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) {
559 int vol = muted ? 0 : percent; 559 int vol = muted ? 0 : percent;
560 // set both channels to same volume 560 // set both channels to same volume
561 vol |= vol << 8; 561 vol |= vol << 8;
562 ioctl( fd, MIXER_WRITE( SOUND_MIXER_VOLUME ), &vol ); 562 ioctl( fd, MIXER_WRITE( SOUND_MIXER_VOLUME ), &vol );
563 ::close( fd ); 563 ::close( fd );
564 } 564 }
565#endif 565#endif
566 } 566 }
567 break; 567 break;
568 } 568 }
569} 569}
570 570
571static void setMic( int t = 0, int percent = -1 ) 571static void setMic( int t = 0, int percent = -1 )
572{ 572{
573 switch ( t ) { 573 switch ( t ) {
574 case 0: { 574 case 0: {
575 Config cfg( "qpe" ); 575 Config cfg( "qpe" );
576 cfg.setGroup( "Volume" ); 576 cfg.setGroup( "Volume" );
577 if ( percent < 0 ) 577 if ( percent < 0 )
578 percent = cfg.readNumEntry( "Mic", 50 ); 578 percent = cfg.readNumEntry( "Mic", 50 );
579 579
580#ifndef QT_NO_SOUND 580#ifndef QT_NO_SOUND
581 int fd = 0; 581 int fd = 0;
582 int mic = micMuted ? 0 : percent; 582 int mic = micMuted ? 0 : percent;
583 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) { 583 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) {
584 ioctl( fd, MIXER_WRITE( SOUND_MIXER_MIC ), &mic ); 584 ioctl( fd, MIXER_WRITE( SOUND_MIXER_MIC ), &mic );
585 ::close( fd ); 585 ::close( fd );
586 } 586 }
587#endif 587#endif
588 } 588 }
589 break; 589 break;
590 } 590 }
591} 591}
592 592
593 593
594static void setBass( int t = 0, int percent = -1 ) 594static void setBass( int t = 0, int percent = -1 )
595{ 595{
596 switch ( t ) { 596 switch ( t ) {
597 case 0: { 597 case 0: {
598 Config cfg( "qpe" ); 598 Config cfg( "qpe" );
599 cfg.setGroup( "Volume" ); 599 cfg.setGroup( "Volume" );
600 if ( percent < 0 ) 600 if ( percent < 0 )
601 percent = cfg.readNumEntry( "BassPercent", 50 ); 601 percent = cfg.readNumEntry( "BassPercent", 50 );
602 602
603#ifndef QT_NO_SOUND 603#ifndef QT_NO_SOUND
604 int fd = 0; 604 int fd = 0;
605 int bass = percent; 605 int bass = percent;
606 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) { 606 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) {
607 ioctl( fd, MIXER_WRITE( SOUND_MIXER_BASS ), &bass ); 607 ioctl( fd, MIXER_WRITE( SOUND_MIXER_BASS ), &bass );
608 ::close( fd ); 608 ::close( fd );
609 } 609 }
610#endif 610#endif
611 } 611 }
612 break; 612 break;
613 } 613 }
614} 614}
615 615
616 616
617static void setTreble( int t = 0, int percent = -1 ) 617static void setTreble( int t = 0, int percent = -1 )
618{ 618{
619 switch ( t ) { 619 switch ( t ) {
620 case 0: { 620 case 0: {
621 Config cfg( "qpe" ); 621 Config cfg( "qpe" );
622 cfg.setGroup( "Volume" ); 622 cfg.setGroup( "Volume" );
623 if ( percent < 0 ) 623 if ( percent < 0 )
624 percent = cfg.readNumEntry( "TreblePercent", 50 ); 624 percent = cfg.readNumEntry( "TreblePercent", 50 );
625 625
626#ifndef QT_NO_SOUND 626#ifndef QT_NO_SOUND
627 int fd = 0; 627 int fd = 0;
628 int treble = percent; 628 int treble = percent;
629 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) { 629 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) {
630 ioctl( fd, MIXER_WRITE( SOUND_MIXER_TREBLE ), &treble ); 630 ioctl( fd, MIXER_WRITE( SOUND_MIXER_TREBLE ), &treble );
631 ::close( fd ); 631 ::close( fd );
632 } 632 }
633#endif 633#endif
634 } 634 }
635 break; 635 break;
636 } 636 }
637} 637}
638 638
639 639
640/** 640/**
641 \class QPEApplication 641 \class QPEApplication
642 \brief The QPEApplication class implements various system services 642 \brief The QPEApplication class implements various system services
643 that are available to all Qtopia applications. 643 that are available to all Qtopia applications.
644 644
645 Simply by using QPEApplication instead of QApplication, a standard Qt 645 Simply by using QPEApplication instead of QApplication, a standard Qt
646 application becomes a Qtopia application. It automatically follows 646 application becomes a Qtopia application. It automatically follows
647 style changes, quits and raises, and in the 647 style changes, quits and raises, and in the
648 case of \link docwidget.html document-oriented\endlink applications, 648 case of \link docwidget.html document-oriented\endlink applications,
649 changes the currently displayed document in response to the environment. 649 changes the currently displayed document in response to the environment.
650 650
651 To create a \link docwidget.html document-oriented\endlink 651 To create a \link docwidget.html document-oriented\endlink
652 application use showMainDocumentWidget(); to create a 652 application use showMainDocumentWidget(); to create a
653 non-document-oriented application use showMainWidget(). The 653 non-document-oriented application use showMainWidget(). The
654 keepRunning() function indicates whether the application will 654 keepRunning() function indicates whether the application will
655 continue running after it's processed the last \link qcop.html 655 continue running after it's processed the last \link qcop.html
656 QCop\endlink message. This can be changed using setKeepRunning(). 656 QCop\endlink message. This can be changed using setKeepRunning().
657 657
658 A variety of signals are emitted when certain events occur, for 658 A variety of signals are emitted when certain events occur, for
659 example, timeChanged(), clockChanged(), weekChanged(), 659 example, timeChanged(), clockChanged(), weekChanged(),
660 dateFormatChanged() and volumeChanged(). If the application receives 660 dateFormatChanged() and volumeChanged(). If the application receives
661 a \link qcop.html QCop\endlink message on the application's 661 a \link qcop.html QCop\endlink message on the application's
662 QPE/Application/\e{appname} channel, the appMessage() signal is 662 QPE/Application/\e{appname} channel, the appMessage() signal is
663 emitted. There are also flush() and reload() signals, which 663 emitted. There are also flush() and reload() signals, which
664 are emitted when synching begins and ends respectively - upon these 664 are emitted when synching begins and ends respectively - upon these
665 signals, the application should save and reload any data 665 signals, the application should save and reload any data
666 files that are involved in synching. Most of these signals will initially 666 files that are involved in synching. Most of these signals will initially
667 be received and unfiltered through the appMessage() signal. 667 be received and unfiltered through the appMessage() signal.
668 668
669 This class also provides a set of useful static functions. The 669 This class also provides a set of useful static functions. The
670 qpeDir() and documentDir() functions return the respective paths. 670 qpeDir() and documentDir() functions return the respective paths.
671 The grabKeyboard() and ungrabKeyboard() functions are used to 671 The grabKeyboard() and ungrabKeyboard() functions are used to
672 control whether the application takes control of the device's 672 control whether the application takes control of the device's
673 physical buttons (e.g. application launch keys). The stylus' mode of 673 physical buttons (e.g. application launch keys). The stylus' mode of
674 operation is set with setStylusOperation() and retrieved with 674 operation is set with setStylusOperation() and retrieved with
675 stylusOperation(). There are also setInputMethodHint() and 675 stylusOperation(). There are also setInputMethodHint() and
676 inputMethodHint() functions. 676 inputMethodHint() functions.
677 677
678 \ingroup qtopiaemb 678 \ingroup qtopiaemb
679*/ 679*/
680 680
681/*! 681/*!
682 \fn void QPEApplication::clientMoused() 682 \fn void QPEApplication::clientMoused()
683 683
684 \internal 684 \internal
685*/ 685*/
686 686
687/*! 687/*!
688 \fn void QPEApplication::timeChanged(); 688 \fn void QPEApplication::timeChanged();
689 This signal is emitted when the time changes outside the normal 689 This signal is emitted when the time changes outside the normal
690 passage of time, i.e. if the time is set backwards or forwards. 690 passage of time, i.e. if the time is set backwards or forwards.
691*/ 691*/
692 692
693/*! 693/*!
694 \fn void QPEApplication::clockChanged( bool ampm ); 694 \fn void QPEApplication::clockChanged( bool ampm );
695 695
696 This signal is emitted when the user changes the clock's style. If 696 This signal is emitted when the user changes the clock's style. If
697 \a ampm is TRUE, the user wants a 12-hour AM/PM clock, otherwise, 697 \a ampm is TRUE, the user wants a 12-hour AM/PM clock, otherwise,
698 they want a 24-hour clock. 698 they want a 24-hour clock.
699*/ 699*/
700 700
701/*! 701/*!
702 \fn void QPEApplication::volumeChanged( bool muted ) 702 \fn void QPEApplication::volumeChanged( bool muted )
703 703
704 This signal is emitted whenever the mute state is changed. If \a 704 This signal is emitted whenever the mute state is changed. If \a
705 muted is TRUE, then sound output has been muted. 705 muted is TRUE, then sound output has been muted.
706*/ 706*/
707 707
708/*! 708/*!
709 \fn void QPEApplication::weekChanged( bool startOnMonday ) 709 \fn void QPEApplication::weekChanged( bool startOnMonday )
710 710
711 This signal is emitted if the week start day is changed. If \a 711 This signal is emitted if the week start day is changed. If \a
712 startOnMonday is TRUE then the first day of the week is Monday; if 712 startOnMonday is TRUE then the first day of the week is Monday; if
713 \a startOnMonday is FALSE then the first day of the week is 713 \a startOnMonday is FALSE then the first day of the week is
714 Sunday. 714 Sunday.
715*/ 715*/
716 716
717/*! 717/*!
718 \fn void QPEApplication::dateFormatChanged(DateFormat) 718 \fn void QPEApplication::dateFormatChanged(DateFormat)
719 719
720 This signal is emitted whenever the date format is changed. 720 This signal is emitted whenever the date format is changed.
721*/ 721*/
722 722
723/*! 723/*!
724 \fn void QPEApplication::flush() 724 \fn void QPEApplication::flush()
725 725
726 ### 726 ###
727*/ 727*/
728 728
729/*! 729/*!
730 \fn void QPEApplication::reload() 730 \fn void QPEApplication::reload()
731 731
732*/ 732*/
733 733
734 734
735 735
736void QPEApplication::processQCopFile() 736void QPEApplication::processQCopFile()
737{ 737{
738 QString qcopfn("/tmp/qcop-msg-"); 738 QString qcopfn("/tmp/qcop-msg-");
739 qcopfn += d->appName; // append command name 739 qcopfn += d->appName; // append command name
740 740
741 QFile f(qcopfn); 741 QFile f(qcopfn);
742 if ( f.open(IO_ReadWrite) ) { 742 if ( f.open(IO_ReadWrite) ) {
743#ifndef Q_OS_WIN32 743#ifndef Q_OS_WIN32
744 flock(f.handle(), LOCK_EX); 744 flock(f.handle(), LOCK_EX);
745#endif 745#endif
746 QDataStream ds(&f); 746 QDataStream ds(&f);
747 QCString channel, message; 747 QCString channel, message;
748 QByteArray data; 748 QByteArray data;
749 while(!ds.atEnd()) { 749 while(!ds.atEnd()) {
750 ds >> channel >> message >> data; 750 ds >> channel >> message >> data;
751 d->enqueueQCop(channel,message,data); 751 d->enqueueQCop(channel,message,data);
752 } 752 }
753 ::ftruncate(f.handle(), 0); 753 ::ftruncate(f.handle(), 0);
754#ifndef Q_OS_WIN32 754#ifndef Q_OS_WIN32
755 f.flush(); 755 f.flush();
756 flock(f.handle(), LOCK_UN); 756 flock(f.handle(), LOCK_UN);
757#endif 757#endif
758 } 758 }
759#endif 759#endif
760} 760}
761 761
762 762
763/*! 763/*!
764 \fn void QPEApplication::appMessage( const QCString& msg, const QByteArray& data ) 764 \fn void QPEApplication::appMessage( const QCString& msg, const QByteArray& data )
765 765
766 This signal is emitted when a message is received on this 766 This signal is emitted when a message is received on this
767 application's QPE/Application/<i>appname</i> \link qcop.html 767 application's QPE/Application/<i>appname</i> \link qcop.html
768 QCop\endlink channel. 768 QCop\endlink channel.
769 769
770 The slot to which you connect this signal uses \a msg and \a data 770 The slot to which you connect this signal uses \a msg and \a data
771 in the following way: 771 in the following way:
772 772
773\code 773\code
774 void MyWidget::receive( const QCString& msg, const QByteArray& data ) 774 void MyWidget::receive( const QCString& msg, const QByteArray& data )
775 { 775 {
776 QDataStream stream( data, IO_ReadOnly ); 776 QDataStream stream( data, IO_ReadOnly );
777 if ( msg == "someMessage(int,int,int)" ) { 777 if ( msg == "someMessage(int,int,int)" ) {
778 int a,b,c; 778 int a,b,c;
779 stream >> a >> b >> c; 779 stream >> a >> b >> c;
780 ... 780 ...
781 } else if ( msg == "otherMessage(QString)" ) { 781 } else if ( msg == "otherMessage(QString)" ) {
782 ... 782 ...
783 } 783 }
784 } 784 }
785\endcode 785\endcode
786 786
787 \sa qcop.html 787 \sa qcop.html
788 Note that messages received here may be processed by qpe application 788 Note that messages received here may be processed by qpe application
789 and emitted as signals, such as flush() and reload(). 789 and emitted as signals, such as flush() and reload().
790*/ 790*/
791 791
792/*! 792/*!
793 Constructs a QPEApplication just as you would construct 793 Constructs a QPEApplication just as you would construct
794 a QApplication, passing \a argc, \a argv, and \a t. 794 a QApplication, passing \a argc, \a argv, and \a t.
795 795
796 For applications, \a t should be the default, GuiClient. Only 796 For applications, \a t should be the default, GuiClient. Only
797 the Qtopia server passes GuiServer. 797 the Qtopia server passes GuiServer.
798*/ 798*/
799QPEApplication::QPEApplication( int & argc, char **argv, Type t ) 799QPEApplication::QPEApplication( int & argc, char **argv, Type t )
800 : QApplication( hack(argc), argv, t ), pidChannel( 0 ) 800 : QApplication( hack(argc), argv, t ), pidChannel( 0 )
801{ 801{
802 QPixmapCache::setCacheLimit(256); // sensible default for smaller devices. 802 QPixmapCache::setCacheLimit(256); // sensible default for smaller devices.
803 803
804 d = new QPEApplicationData; 804 d = new QPEApplicationData;
805 d->loadTextCodecs(); 805 d->loadTextCodecs();
806 d->loadImageCodecs(); 806 d->loadImageCodecs();
807 807
808 setFont( QFont( d->fontFamily, d->fontSize ) ); 808 setFont( QFont( d->fontFamily, d->fontSize ) );
809 AppLnk::setSmallIconSize( d->smallIconSize ); 809 AppLnk::setSmallIconSize( d->smallIconSize );
810 AppLnk::setBigIconSize( d->bigIconSize ); 810 AppLnk::setBigIconSize( d->bigIconSize );
811 811
812 QMimeSourceFactory::setDefaultFactory( new ResourceMimeFactory ); 812 QMimeSourceFactory::setDefaultFactory( new ResourceMimeFactory );
813 813
814 connect( this, SIGNAL( lastWindowClosed() ), this, SLOT( hideOrQuit() ) ); 814 connect( this, SIGNAL( lastWindowClosed() ), this, SLOT( hideOrQuit() ) );
815 815
816 816
817 sysChannel = new QCopChannel( "QPE/System", this ); 817 sysChannel = new QCopChannel( "QPE/System", this );
818 connect( sysChannel, SIGNAL( received(const QCString&,const QByteArray&) ), 818 connect( sysChannel, SIGNAL( received(const QCString&,const QByteArray&) ),
819 this, SLOT( systemMessage(const QCString&,const QByteArray&) ) ); 819 this, SLOT( systemMessage(const QCString&,const QByteArray&) ) );
820 820
821/* COde now in initapp */ 821/* COde now in initapp */
822#if 0 822#if 0
823#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 823#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
824 824
825 QString qcopfn( "/tmp/qcop-msg-" ); 825 QString qcopfn( "/tmp/qcop-msg-" );
826 qcopfn += QString( argv[ 0 ] ); // append command name 826 qcopfn += QString( argv[ 0 ] ); // append command name
827 827
828 QFile f( qcopfn ); 828 QFile f( qcopfn );
829 if ( f.open( IO_ReadOnly ) ) { 829 if ( f.open( IO_ReadOnly ) ) {
830 flock( f.handle(), LOCK_EX ); 830 flock( f.handle(), LOCK_EX );
831 } 831 }
832 832
833 833
834 834
835 QCString channel = QCString( argv[ 0 ] ); 835 QCString channel = QCString( argv[ 0 ] );
836 channel.replace( QRegExp( ".*/" ), "" ); 836 channel.replace( QRegExp( ".*/" ), "" );
837 d->appName = channel; 837 d->appName = channel;
838 channel = "QPE/Application/" + channel; 838 channel = "QPE/Application/" + channel;
839 pidChannel = new QCopChannel( channel, this ); 839 pidChannel = new QCopChannel( channel, this );
840 connect( pidChannel, SIGNAL( received(const QCString&,const QByteArray&) ), 840 connect( pidChannel, SIGNAL( received(const QCString&,const QByteArray&) ),
841 this, SLOT( pidMessage(const QCString&,const QByteArray&) ) ); 841 this, SLOT( pidMessage(const QCString&,const QByteArray&) ) );
842 842
843 if ( f.isOpen() ) { 843 if ( f.isOpen() ) {
844 d->keep_running = FALSE; 844 d->keep_running = FALSE;
845 QDataStream ds( &f ); 845 QDataStream ds( &f );
846 QCString channel, message; 846 QCString channel, message;
847 QByteArray data; 847 QByteArray data;
848 while ( !ds.atEnd() ) { 848 while ( !ds.atEnd() ) {
849 ds >> channel >> message >> data; 849 ds >> channel >> message >> data;
850 d->enqueueQCop( channel, message, data ); 850 d->enqueueQCop( channel, message, data );
851 } 851 }
852 852
853 flock( f.handle(), LOCK_UN ); 853 flock( f.handle(), LOCK_UN );
854 f.close(); 854 f.close();
855 f.remove(); 855 f.remove();
856 } 856 }
857 857
858 for ( int a = 0; a < argc; a++ ) { 858 for ( int a = 0; a < argc; a++ ) {
859 if ( qstrcmp( argv[ a ], "-preload" ) == 0 ) { 859 if ( qstrcmp( argv[ a ], "-preload" ) == 0 ) {
860 argv[ a ] = argv[ a + 1 ]; 860 argv[ a ] = argv[ a + 1 ];
861 a++; 861 a++;
862 d->preloaded = TRUE; 862 d->preloaded = TRUE;
863 argc -= 1; 863 argc -= 1;
864 } 864 }
865 else if ( qstrcmp( argv[ a ], "-preload-show" ) == 0 ) { 865 else if ( qstrcmp( argv[ a ], "-preload-show" ) == 0 ) {
866 argv[ a ] = argv[ a + 1 ]; 866 argv[ a ] = argv[ a + 1 ];
867 a++; 867 a++;
868 d->preloaded = TRUE; 868 d->preloaded = TRUE;
869 d->forceshow = TRUE; 869 d->forceshow = TRUE;
870 argc -= 1; 870 argc -= 1;
871 } 871 }
872 } 872 }
873 873
874 /* overide stored arguments */ 874 /* overide stored arguments */
875 setArgs( argc, argv ); 875 setArgs( argc, argv );
876 876
877#endif 877#endif
878#else 878#else
879 initApp( argc, argv ); 879 initApp( argc, argv );
880#endif 880#endif
881#ifdef Q_WS_QWS 881#ifdef Q_WS_QWS
882 /* load the font renderer factories */ 882 /* load the font renderer factories */
883 FontDatabase::loadRenderers(); 883 FontDatabase::loadRenderers();
884#endif 884#endif
885#ifndef QT_NO_TRANSLATION 885#ifndef QT_NO_TRANSLATION
886 886
887 d->langs = Global::languageList(); 887 d->langs = Global::languageList();
888 for ( QStringList::ConstIterator it = d->langs.begin(); it != d->langs.end(); ++it ) { 888 for ( QStringList::ConstIterator it = d->langs.begin(); it != d->langs.end(); ++it ) {
889 QString lang = *it; 889 QString lang = *it;
890 890
891 installTranslation( lang + "/libopie.qm"); 891 installTranslation( lang + "/libopie.qm");
892 installTranslation( lang + "/libqpe.qm" ); 892 installTranslation( lang + "/libqpe.qm" );
893 installTranslation( lang + "/" + d->appName + ".qm" ); 893 installTranslation( lang + "/" + d->appName + ".qm" );
894 894
895 895
896 //###language/font hack; should look it up somewhere 896 //###language/font hack; should look it up somewhere
897#ifdef QWS 897#ifdef QWS
898 898
899 if ( lang == "ja" || lang == "zh_CN" || lang == "zh_TW" || lang == "ko" ) { 899 if ( lang == "ja" || lang == "zh_CN" || lang == "zh_TW" || lang == "ko" ) {
900 QFont fn = FontManager::unicodeFont( FontManager::Proportional ); 900 QFont fn = FontManager::unicodeFont( FontManager::Proportional );
901 setFont( fn ); 901 setFont( fn );
902 } 902 }
903#endif 903#endif
904 } 904 }
905#endif 905#endif
906 906
907 applyStyle(); 907 applyStyle();
908 908
909 if ( type() == GuiServer ) { 909 if ( type() == GuiServer ) {
910 setVolume(); 910 setVolume();
911 } 911 }
912 912
913 installEventFilter( this ); 913 installEventFilter( this );
914 914
915 QPEMenuToolFocusManager::initialize(); 915 QPEMenuToolFocusManager::initialize();
916 916
917#ifdef QT_NO_QWS_CURSOR 917#ifdef QT_NO_QWS_CURSOR
918 // if we have no cursor, probably don't want tooltips 918 // if we have no cursor, probably don't want tooltips
919 QToolTip::setEnabled( FALSE ); 919 QToolTip::setEnabled( FALSE );
920#endif 920#endif
921} 921}
922 922
923 923
924#ifdef QTOPIA_INTERNAL_INITAPP 924#ifdef QTOPIA_INTERNAL_INITAPP
925void QPEApplication::initApp( int argc, char **argv ) 925void QPEApplication::initApp( int argc, char **argv )
926{ 926{
927 delete pidChannel; 927 delete pidChannel;
928 d->keep_running = TRUE; 928 d->keep_running = TRUE;
929 d->preloaded = FALSE; 929 d->preloaded = FALSE;
930 d->forceshow = FALSE; 930 d->forceshow = FALSE;
931 931
932 QCString channel = QCString(argv[0]); 932 QCString channel = QCString(argv[0]);
933 933
934 channel.replace(QRegExp(".*/"),""); 934 channel.replace(QRegExp(".*/"),"");
935 d->appName = channel; 935 d->appName = channel;
936 936
937 #if QT_VERSION > 235 937 #if QT_VERSION > 235
938 qt_fbdpy->setIdentity( channel ); // In Qt/E 2.3.6 938 qt_fbdpy->setIdentity( channel ); // In Qt/E 2.3.6
939 #endif 939 #endif
940 940
941 channel = "QPE/Application/" + channel; 941 channel = "QPE/Application/" + channel;
942 pidChannel = new QCopChannel( channel, this); 942 pidChannel = new QCopChannel( channel, this);
943 connect( pidChannel, SIGNAL(received(const QCString&,const QByteArray&)), 943 connect( pidChannel, SIGNAL(received(const QCString&,const QByteArray&)),
944 this, SLOT(pidMessage(const QCString&,const QByteArray&))); 944 this, SLOT(pidMessage(const QCString&,const QByteArray&)));
945 945
946 946
947 947
948 processQCopFile(); 948 processQCopFile();
949 d->keep_running = d->qcopq.isEmpty(); 949 d->keep_running = d->qcopq.isEmpty();
950 950
951 for (int a=0; a<argc; a++) { 951 for (int a=0; a<argc; a++) {
952 if ( qstrcmp(argv[a],"-preload")==0 ) { 952 if ( qstrcmp(argv[a],"-preload")==0 ) {
953 argv[a] = argv[a+1]; 953 argv[a] = argv[a+1];
954 a++; 954 a++;
955 d->preloaded = TRUE; 955 d->preloaded = TRUE;
956 argc-=1; 956 argc-=1;
957 } else if ( qstrcmp(argv[a],"-preload-show")==0 ) { 957 } else if ( qstrcmp(argv[a],"-preload-show")==0 ) {
958 argv[a] = argv[a+1]; 958 argv[a] = argv[a+1];
959 a++; 959 a++;
960 d->preloaded = TRUE; 960 d->preloaded = TRUE;
961 d->forceshow = TRUE; 961 d->forceshow = TRUE;
962 argc-=1; 962 argc-=1;
963 } 963 }
964 } 964 }
965 965
966 /* overide stored arguments */ 966 /* overide stored arguments */
967 setArgs(argc, argv); 967 setArgs(argc, argv);
968 968
969 /* install translation here */ 969 /* install translation here */
970 for ( QStringList::ConstIterator it = d->langs.begin(); it != d->langs.end(); ++it ) 970 for ( QStringList::ConstIterator it = d->langs.begin(); it != d->langs.end(); ++it )
971 installTranslation( (*it) + "/" + d->appName + ".qm" ); 971 installTranslation( (*it) + "/" + d->appName + ".qm" );
972} 972}
973#endif 973#endif
974 974
975 975
976static QPtrDict<void>* inputMethodDict = 0; 976static QPtrDict<void>* inputMethodDict = 0;
977static void createInputMethodDict() 977static void createInputMethodDict()
978{ 978{
979 if ( !inputMethodDict ) 979 if ( !inputMethodDict )
980 inputMethodDict = new QPtrDict<void>; 980 inputMethodDict = new QPtrDict<void>;
981} 981}
982 982
983/*! 983/*!
984 Returns the currently set hint to the system as to whether 984 Returns the currently set hint to the system as to whether
985 widget \a w has any use for text input methods. 985 widget \a w has any use for text input methods.
986 986
987 987
988 \sa setInputMethodHint() InputMethodHint 988 \sa setInputMethodHint() InputMethodHint
989*/ 989*/
990QPEApplication::InputMethodHint QPEApplication::inputMethodHint( QWidget * w ) 990QPEApplication::InputMethodHint QPEApplication::inputMethodHint( QWidget * w )
991{ 991{
992 if ( inputMethodDict && w ) 992 if ( inputMethodDict && w )
993 return ( InputMethodHint ) ( int ) inputMethodDict->find( w ); 993 return ( InputMethodHint ) ( int ) inputMethodDict->find( w );
994 return Normal; 994 return Normal;
995} 995}
996 996
997/*! 997/*!
998 \enum QPEApplication::InputMethodHint 998 \enum QPEApplication::InputMethodHint
999 999
1000 \value Normal the application sometimes needs text input (the default). 1000 \value Normal the application sometimes needs text input (the default).
1001 \value AlwaysOff the application never needs text input. 1001 \value AlwaysOff the application never needs text input.
1002 \value AlwaysOn the application always needs text input. 1002 \value AlwaysOn the application always needs text input.
1003*/ 1003*/
1004 1004
1005/*! 1005/*!
1006 Hints to the system that widget \a w has use for text input methods 1006 Hints to the system that widget \a w has use for text input methods
1007 as specified by \a mode. 1007 as specified by \a mode.
1008 1008
1009 \sa inputMethodHint() InputMethodHint 1009 \sa inputMethodHint() InputMethodHint
1010*/ 1010*/
1011void QPEApplication::setInputMethodHint( QWidget * w, InputMethodHint mode ) 1011void QPEApplication::setInputMethodHint( QWidget * w, InputMethodHint mode )
1012{ 1012{
1013 createInputMethodDict(); 1013 createInputMethodDict();
1014 if ( mode == Normal ) { 1014 if ( mode == Normal ) {
1015 inputMethodDict->remove 1015 inputMethodDict->remove
1016 ( w ); 1016 ( w );
1017 } 1017 }
1018 else { 1018 else {
1019 inputMethodDict->insert( w, ( void* ) mode ); 1019 inputMethodDict->insert( w, ( void* ) mode );
1020 } 1020 }
1021} 1021}
1022 1022
1023class HackDialog : public QDialog 1023class HackDialog : public QDialog
1024{ 1024{
1025public: 1025public:
1026 void acceptIt() 1026 void acceptIt()
1027 { 1027 {
1028 accept(); 1028 accept();
1029 } 1029 }
1030 void rejectIt() 1030 void rejectIt()
1031 { 1031 {
1032 reject(); 1032 reject();
1033 } 1033 }
1034}; 1034};
1035 1035
1036 1036
1037void QPEApplication::mapToDefaultAction( QWSKeyEvent * ke, int key ) 1037void QPEApplication::mapToDefaultAction( QWSKeyEvent * ke, int key )
1038{ 1038{
1039 // specialised actions for certain widgets. May want to 1039 // specialised actions for certain widgets. May want to
1040 // add more stuff here. 1040 // add more stuff here.
1041 if ( activePopupWidget() && activePopupWidget() ->inherits( "QListBox" ) 1041 if ( activePopupWidget() && activePopupWidget() ->inherits( "QListBox" )
1042 && activePopupWidget() ->parentWidget() 1042 && activePopupWidget() ->parentWidget()
1043 && activePopupWidget() ->parentWidget() ->inherits( "QComboBox" ) ) 1043 && activePopupWidget() ->parentWidget() ->inherits( "QComboBox" ) )
1044 key = Qt::Key_Return; 1044 key = Qt::Key_Return;
1045 1045
1046 if ( activePopupWidget() && activePopupWidget() ->inherits( "QPopupMenu" ) ) 1046 if ( activePopupWidget() && activePopupWidget() ->inherits( "QPopupMenu" ) )
1047 key = Qt::Key_Return; 1047 key = Qt::Key_Return;
1048 1048
1049#ifdef QWS 1049#ifdef QWS
1050 1050
1051 ke->simpleData.keycode = key; 1051 ke->simpleData.keycode = key;
1052#endif 1052#endif
1053} 1053}
1054 1054
1055 1055
1056/*! 1056/*!
1057 \internal 1057 \internal
1058*/ 1058*/
1059 1059
1060#ifdef QWS 1060#ifdef QWS
1061bool QPEApplication::qwsEventFilter( QWSEvent * e ) 1061bool QPEApplication::qwsEventFilter( QWSEvent * e )
1062{ 1062{
1063 if ( !d->notbusysent && e->type == QWSEvent::Focus ) { 1063 if ( !d->notbusysent && e->type == QWSEvent::Focus ) {
1064 if ( qApp->type() != QApplication::GuiServer ) { 1064 if ( qApp->type() != QApplication::GuiServer ) {
1065 QCopEnvelope e( "QPE/System", "notBusy(QString)" ); 1065 QCopEnvelope e( "QPE/System", "notBusy(QString)" );
1066 e << d->appName; 1066 e << d->appName;
1067 } 1067 }
1068 d->notbusysent = TRUE; 1068 d->notbusysent = TRUE;
1069 } 1069 }
1070 if ( type() == GuiServer ) { 1070 if ( type() == GuiServer ) {
1071 switch ( e->type ) { 1071 switch ( e->type ) {
1072 case QWSEvent::Mouse: 1072 case QWSEvent::Mouse:
1073 if ( e->asMouse() ->simpleData.state && !QWidget::find( e->window() ) ) 1073 if ( e->asMouse() ->simpleData.state && !QWidget::find( e->window() ) )
1074 emit clientMoused(); 1074 emit clientMoused();
1075 break; 1075 break;
1076 default: 1076 default:
1077 break; 1077 break;
1078 } 1078 }
1079 } 1079 }
1080 if ( e->type == QWSEvent::Key ) { 1080 if ( e->type == QWSEvent::Key ) {
1081 QWSKeyEvent *ke = ( QWSKeyEvent * ) e; 1081 QWSKeyEvent *ke = ( QWSKeyEvent * ) e;
1082 if ( ke->simpleData.keycode == Qt::Key_F33 ) { 1082 if ( ke->simpleData.keycode == Qt::Key_F33 ) {
1083 // Use special "OK" key to press "OK" on top level widgets 1083 // Use special "OK" key to press "OK" on top level widgets
1084 QWidget * active = activeWindow(); 1084 QWidget * active = activeWindow();
1085 QWidget *popup = 0; 1085 QWidget *popup = 0;
1086 if ( active && active->isPopup() ) { 1086 if ( active && active->isPopup() ) {
1087 popup = active; 1087 popup = active;
1088 active = active->parentWidget(); 1088 active = active->parentWidget();
1089 } 1089 }
1090 if ( active && ( int ) active->winId() == ke->simpleData.window && 1090 if ( active && ( int ) active->winId() == ke->simpleData.window &&
1091 !active->testWFlags( WStyle_Customize | WType_Popup | WType_Desktop ) ) { 1091 !active->testWFlags( WStyle_Customize | WType_Popup | WType_Desktop ) ) {
1092 if ( ke->simpleData.is_press ) { 1092 if ( ke->simpleData.is_press ) {
1093 if ( popup ) 1093 if ( popup )
1094 popup->close(); 1094 popup->close();
1095 if ( active->inherits( "QDialog" ) ) { 1095 if ( active->inherits( "QDialog" ) ) {
1096 HackDialog * d = ( HackDialog * ) active; 1096 HackDialog * d = ( HackDialog * ) active;
1097 d->acceptIt(); 1097 d->acceptIt();
1098 return TRUE; 1098 return TRUE;
1099 } 1099 }
1100 else if ( ( ( HackWidget * ) active ) ->needsOk() ) { 1100 else if ( ( ( HackWidget * ) active ) ->needsOk() ) {
1101 QSignal s; 1101 QSignal s;
1102 s.connect( active, SLOT( accept() ) ); 1102 s.connect( active, SLOT( accept() ) );
1103 s.activate(); 1103 s.activate();
1104 } 1104 }
1105 else { 1105 else {
1106 // do the same as with the select key: Map to the default action of the widget: 1106 // do the same as with the select key: Map to the default action of the widget:
1107 mapToDefaultAction( ke, Qt::Key_Return ); 1107 mapToDefaultAction( ke, Qt::Key_Return );
1108 } 1108 }
1109 } 1109 }
1110 } 1110 }
1111 } 1111 }
1112 else if ( ke->simpleData.keycode == Qt::Key_F30 ) { 1112 else if ( ke->simpleData.keycode == Qt::Key_F30 ) {
1113 // Use special "select" key to do whatever default action a widget has 1113 // Use special "select" key to do whatever default action a widget has
1114 mapToDefaultAction( ke, Qt::Key_Space ); 1114 mapToDefaultAction( ke, Qt::Key_Space );
1115 } 1115 }
1116 else if ( ke->simpleData.keycode == Qt::Key_Escape && 1116 else if ( ke->simpleData.keycode == Qt::Key_Escape &&
1117 ke->simpleData.is_press ) { 1117 ke->simpleData.is_press ) {
1118 // Escape key closes app if focus on toplevel 1118 // Escape key closes app if focus on toplevel
1119 QWidget * active = activeWindow(); 1119 QWidget * active = activeWindow();
1120 if ( active && active->testWFlags( WType_TopLevel ) && 1120 if ( active && active->testWFlags( WType_TopLevel ) &&
1121 ( int ) active->winId() == ke->simpleData.window && 1121 ( int ) active->winId() == ke->simpleData.window &&
1122 !active->testWFlags( WStyle_Dialog | WStyle_Customize | WType_Popup | WType_Desktop ) ) { 1122 !active->testWFlags( WStyle_Dialog | WStyle_Customize | WType_Popup | WType_Desktop ) ) {
1123 if ( active->inherits( "QDialog" ) ) { 1123 if ( active->inherits( "QDialog" ) ) {
1124 HackDialog * d = ( HackDialog * ) active; 1124 HackDialog * d = ( HackDialog * ) active;
1125 d->rejectIt(); 1125 d->rejectIt();
1126 return TRUE; 1126 return TRUE;
1127 } else /*if ( strcmp( argv() [ 0 ], "embeddedkonsole" ) != 0 )*/ { 1127 } else /*if ( strcmp( argv() [ 0 ], "embeddedkonsole" ) != 0 )*/ {
1128 active->close(); 1128 active->close();
1129 } 1129 }
1130 } 1130 }
1131 1131
1132 } 1132 }
1133 else if ( ke->simpleData.keycode >= Qt::Key_F1 && ke->simpleData.keycode <= Qt::Key_F29 ) { 1133 else if ( ke->simpleData.keycode >= Qt::Key_F1 && ke->simpleData.keycode <= Qt::Key_F29 ) {
1134 // this should be if ( ODevice::inst ( )-> buttonForKeycode ( ... )) 1134 // this should be if ( ODevice::inst ( )-> buttonForKeycode ( ... ))
1135 // but we cannot access libopie function within libqpe :( 1135 // but we cannot access libopie function within libqpe :(
1136 1136
1137 QWidget * active = activeWindow ( ); 1137 QWidget * active = activeWindow ( );
1138 if ( active && ((int) active-> winId ( ) == ke-> simpleData.window )) { 1138 if ( active && ((int) active-> winId ( ) == ke-> simpleData.window )) {
1139 if ( d-> kbgrabbed ) { // we grabbed the keyboard 1139 if ( d-> kbgrabbed ) { // we grabbed the keyboard
1140 QChar ch ( ke-> simpleData.unicode ); 1140 QChar ch ( ke-> simpleData.unicode );
1141 QKeyEvent qke ( ke-> simpleData. is_press ? QEvent::KeyPress : QEvent::KeyRelease, 1141 QKeyEvent qke ( ke-> simpleData. is_press ? QEvent::KeyPress : QEvent::KeyRelease,
1142 ke-> simpleData.keycode, 1142 ke-> simpleData.keycode,
1143 ch. latin1 ( ), 1143 ch. latin1 ( ),
1144 ke-> simpleData.modifiers, 1144 ke-> simpleData.modifiers,
1145 QString ( ch ), 1145 QString ( ch ),
1146 ke-> simpleData.is_auto_repeat, 1 ); 1146 ke-> simpleData.is_auto_repeat, 1 );
1147 1147
1148 QObject *which = QWidget::keyboardGrabber ( ); 1148 QObject *which = QWidget::keyboardGrabber ( );
1149 if ( !which ) 1149 if ( !which )
1150 which = QApplication::focusWidget ( ); 1150 which = QApplication::focusWidget ( );
1151 if ( !which ) 1151 if ( !which )
1152 which = QApplication::activeWindow ( ); 1152 which = QApplication::activeWindow ( );
1153 if ( !which ) 1153 if ( !which )
1154 which = qApp; 1154 which = qApp;
1155 1155
1156 QApplication::sendEvent ( which, &qke ); 1156 QApplication::sendEvent ( which, &qke );
1157 } 1157 }
1158 else { // we didn't grab the keyboard, so send the event to the launcher 1158 else { // we didn't grab the keyboard, so send the event to the launcher
1159 QCopEnvelope e ( "QPE/Launcher", "deviceButton(int,int,int)" ); 1159 QCopEnvelope e ( "QPE/Launcher", "deviceButton(int,int,int)" );
1160 e << int( ke-> simpleData.keycode ) << int( ke-> simpleData. is_press ) << int( ke-> simpleData.is_auto_repeat ); 1160 e << int( ke-> simpleData.keycode ) << int( ke-> simpleData. is_press ) << int( ke-> simpleData.is_auto_repeat );
1161 } 1161 }
1162 } 1162 }
1163 return true; 1163 return true;
1164 } 1164 }
1165 } 1165 }
1166 if ( e->type == QWSEvent::Focus ) { 1166 if ( e->type == QWSEvent::Focus ) {
1167 QWSFocusEvent * fe = ( QWSFocusEvent* ) e; 1167 QWSFocusEvent * fe = ( QWSFocusEvent* ) e;
1168 if ( !fe->simpleData.get_focus ) { 1168 if ( !fe->simpleData.get_focus ) {
1169 QWidget * active = activeWindow(); 1169 QWidget * active = activeWindow();
1170 while ( active && active->isPopup() ) { 1170 while ( active && active->isPopup() ) {
1171 active->close(); 1171 active->close();
1172 active = activeWindow(); 1172 active = activeWindow();
1173 } 1173 }
1174 } 1174 }
1175 else { 1175 else {
1176 // make sure our modal widget is ALWAYS on top 1176 // make sure our modal widget is ALWAYS on top
1177 QWidget *topm = activeModalWidget(); 1177 QWidget *topm = activeModalWidget();
1178 if ( topm && static_cast<int>( topm->winId() ) != fe->simpleData.window) { 1178 if ( topm && static_cast<int>( topm->winId() ) != fe->simpleData.window) {
1179 topm->raise(); 1179 topm->raise();
1180 } 1180 }
1181 } 1181 }
1182 if ( fe->simpleData.get_focus && inputMethodDict ) { 1182 if ( fe->simpleData.get_focus && inputMethodDict ) {
1183 InputMethodHint m = inputMethodHint( QWidget::find( e->window() ) ); 1183 InputMethodHint m = inputMethodHint( QWidget::find( e->window() ) );
1184 if ( m == AlwaysOff ) 1184 if ( m == AlwaysOff )
1185 Global::hideInputMethod(); 1185 Global::hideInputMethod();
1186 if ( m == AlwaysOn ) 1186 if ( m == AlwaysOn )
1187 Global::showInputMethod(); 1187 Global::showInputMethod();
1188 } 1188 }
1189 } 1189 }
1190 1190
1191 1191
1192 return QApplication::qwsEventFilter( e ); 1192 return QApplication::qwsEventFilter( e );
1193} 1193}
1194#endif 1194#endif
1195 1195
1196/*! 1196/*!
1197 Destroys the QPEApplication. 1197 Destroys the QPEApplication.
1198*/ 1198*/
1199QPEApplication::~QPEApplication() 1199QPEApplication::~QPEApplication()
1200{ 1200{
1201 ungrabKeyboard(); 1201 ungrabKeyboard();
1202#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 1202#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
1203 // Need to delete QCopChannels early, since the display will 1203 // Need to delete QCopChannels early, since the display will
1204 // be gone by the time we get to ~QObject(). 1204 // be gone by the time we get to ~QObject().
1205 delete sysChannel; 1205 delete sysChannel;
1206 delete pidChannel; 1206 delete pidChannel;
1207#endif 1207#endif
1208 1208
1209 delete d; 1209 delete d;
1210} 1210}
1211 1211
1212/*! 1212/*!
1213 Returns <tt>$OPIEDIR/</tt>. 1213 Returns <tt>$OPIEDIR/</tt>.
1214*/ 1214*/
1215QString QPEApplication::qpeDir() 1215QString QPEApplication::qpeDir()
1216{ 1216{
1217 const char * base = getenv( "OPIEDIR" ); 1217 const char * base = getenv( "OPIEDIR" );
1218 if ( base ) 1218 if ( base )
1219 return QString( base ) + "/"; 1219 return QString( base ) + "/";
1220 1220
1221 return QString( "../" ); 1221 return QString( "../" );
1222} 1222}
1223 1223
1224/*! 1224/*!
1225 Returns the user's current Document directory. There is a trailing "/". 1225 Returns the user's current Document directory. There is a trailing "/".
1226 .. well, it does now,, and there's no trailing '/' 1226 .. well, it does now,, and there's no trailing '/'
1227*/ 1227*/
1228QString QPEApplication::documentDir() 1228QString QPEApplication::documentDir()
1229{ 1229{
1230 const char* base = getenv( "HOME"); 1230 const char* base = getenv( "HOME");
1231 if ( base ) 1231 if ( base )
1232 return QString( base ) + "/Documents"; 1232 return QString( base ) + "/Documents";
1233 1233
1234 return QString( "../Documents" ); 1234 return QString( "../Documents" );
1235} 1235}
1236 1236
1237static int deforient = -1; 1237static int deforient = -1;
1238 1238
1239/*! 1239/*!
1240 \internal 1240 \internal
1241*/ 1241*/
1242int QPEApplication::defaultRotation() 1242int QPEApplication::defaultRotation()
1243{ 1243{
1244 if ( deforient < 0 ) { 1244 if ( deforient < 0 ) {
1245 QString d = getenv( "QWS_DISPLAY" ); 1245 QString d = getenv( "QWS_DISPLAY" );
1246 if ( d.contains( "Rot90" ) ) { 1246 if ( d.contains( "Rot90" ) ) {
1247 deforient = 90; 1247 deforient = 90;
1248 } 1248 }
1249 else if ( d.contains( "Rot180" ) ) { 1249 else if ( d.contains( "Rot180" ) ) {
1250 deforient = 180; 1250 deforient = 180;
1251 } 1251 }
1252 else if ( d.contains( "Rot270" ) ) { 1252 else if ( d.contains( "Rot270" ) ) {
1253 deforient = 270; 1253 deforient = 270;
1254 } 1254 }
1255 else { 1255 else {
1256 deforient = 0; 1256 deforient = 0;
1257 } 1257 }
1258 } 1258 }
1259 return deforient; 1259 return deforient;
1260} 1260}
1261 1261
1262/*! 1262/*!
1263 \internal 1263 \internal
1264*/ 1264*/
1265void QPEApplication::setDefaultRotation( int r ) 1265void QPEApplication::setDefaultRotation( int r )
1266{ 1266{
1267 if ( qApp->type() == GuiServer ) { 1267 if ( qApp->type() == GuiServer ) {
1268 deforient = r; 1268 deforient = r;
1269 setenv( "QWS_DISPLAY", QString( "Transformed:Rot%1:0" ).arg( r ).latin1(), 1 ); 1269 setenv( "QWS_DISPLAY", QString( "Transformed:Rot%1:0" ).arg( r ).latin1(), 1 );
1270 Config config("qpe"); 1270 Config config("qpe");
1271 config.setGroup( "Rotation" ); 1271 config.setGroup( "Rotation" );
1272 config.writeEntry( "Rot", r ); 1272 config.writeEntry( "Rot", r );
1273 } 1273 }
1274 else { 1274 else {
1275#ifndef QT_NO_COP 1275#ifndef QT_NO_COP
1276 { QCopEnvelope e( "QPE/System", "setDefaultRotation(int)" ); 1276 { QCopEnvelope e( "QPE/System", "setDefaultRotation(int)" );
1277 e << r; 1277 e << r;
1278 } 1278 }
1279#endif 1279#endif
1280 1280
1281 } 1281 }
1282} 1282}
1283 1283
1284#include <qgfx_qws.h> 1284#include <qgfx_qws.h>
1285#include <qwindowsystem_qws.h> 1285#include <qwindowsystem_qws.h>
1286 1286
1287extern void qws_clearLoadedFonts(); 1287extern void qws_clearLoadedFonts();
1288 1288
1289void QPEApplication::setCurrentMode( int x, int y, int depth ) 1289void QPEApplication::setCurrentMode( int x, int y, int depth )
1290{ 1290{
1291 // Reset the caches 1291 // Reset the caches
1292 qws_clearLoadedFonts(); 1292 qws_clearLoadedFonts();
1293 QPixmapCache::clear(); 1293 QPixmapCache::clear();
1294 1294
1295 // Change the screen mode 1295 // Change the screen mode
1296 qt_screen->setMode(x, y, depth); 1296 qt_screen->setMode(x, y, depth);
1297 1297
1298 if ( qApp->type() == GuiServer ) { 1298 if ( qApp->type() == GuiServer ) {
1299 // Reconfigure the GuiServer 1299 // Reconfigure the GuiServer
1300 qwsServer->beginDisplayReconfigure(); 1300 qwsServer->beginDisplayReconfigure();
1301 qwsServer->endDisplayReconfigure(); 1301 qwsServer->endDisplayReconfigure();
1302 1302
1303 // Get all the running apps to reset 1303 // Get all the running apps to reset
1304 QCopEnvelope env( "QPE/System", "reset()" ); 1304 QCopEnvelope env( "QPE/System", "reset()" );
1305 } 1305 }
1306} 1306}
1307 1307
1308void QPEApplication::reset() { 1308void QPEApplication::reset() {
1309 // Reconnect to the screen 1309 // Reconnect to the screen
1310 qt_screen->disconnect(); 1310 qt_screen->disconnect();
1311 qt_screen->connect( QString::null ); 1311 qt_screen->connect( QString::null );
1312 1312
1313 // Redraw everything 1313 // Redraw everything
1314 applyStyle(); 1314 applyStyle();
1315} 1315}
1316 1316
1317#if (QT_VERSION < 238) && Q_OS_MACX 1317#if (QT_VERSION < 238) && defined Q_OS_MACX
1318bool qt_left_hand_scrollbars = false; 1318bool qt_left_hand_scrollbars = false;
1319#else 1319#else
1320#ifdef Q_OS_MACX 1320#ifdef Q_OS_MACX
1321#define WEAK_SYMBOL __attribute__((weak_import)) 1321#define WEAK_SYMBOL __attribute__((weak_import))
1322#else 1322#else
1323#define WEAK_SYMBOL __attribute__((weak)) 1323#define WEAK_SYMBOL __attribute__((weak))
1324#endif 1324#endif
1325extern bool qt_left_hand_scrollbars WEAK_SYMBOL; 1325extern bool qt_left_hand_scrollbars WEAK_SYMBOL;
1326#endif 1326#endif
1327 1327
1328/*! 1328/*!
1329 \internal 1329 \internal
1330*/ 1330*/
1331void QPEApplication::applyStyle() 1331void QPEApplication::applyStyle()
1332{ 1332{
1333 Config config( "qpe" ); 1333 Config config( "qpe" );
1334 config.setGroup( "Appearance" ); 1334 config.setGroup( "Appearance" );
1335 1335
1336#if QT_VERSION > 233 1336#if QT_VERSION > 233
1337#if !defined(OPIE_NO_OVERRIDE_QT) 1337#if !defined(OPIE_NO_OVERRIDE_QT)
1338 // don't block ourselves ... 1338 // don't block ourselves ...
1339 Opie::force_appearance = 0; 1339 Opie::force_appearance = 0;
1340 1340
1341 static QString appname = Opie::binaryName ( ); 1341 static QString appname = Opie::binaryName ( );
1342 1342
1343 QStringList ex = config. readListEntry ( "NoStyle", ';' ); 1343 QStringList ex = config. readListEntry ( "NoStyle", ';' );
1344 int nostyle = 0; 1344 int nostyle = 0;
1345 for ( QStringList::Iterator it = ex. begin ( ); it != ex. end ( ); ++it ) { 1345 for ( QStringList::Iterator it = ex. begin ( ); it != ex. end ( ); ++it ) {
1346 if ( QRegExp (( *it ). mid ( 1 ), false, true ). find ( appname, 0 ) >= 0 ) { 1346 if ( QRegExp (( *it ). mid ( 1 ), false, true ). find ( appname, 0 ) >= 0 ) {
1347 nostyle = ( *it ). left ( 1 ). toInt ( 0, 32 ); 1347 nostyle = ( *it ). left ( 1 ). toInt ( 0, 32 );
1348 break; 1348 break;
1349 } 1349 }
1350 } 1350 }
1351#else 1351#else
1352 int nostyle = 0; 1352 int nostyle = 0;
1353#endif 1353#endif
1354 1354
1355 // Widget style 1355 // Widget style
1356 QString style = config.readEntry( "Style", "FlatStyle" ); 1356 QString style = config.readEntry( "Style", "FlatStyle" );
1357 1357
1358 // don't set a custom style 1358 // don't set a custom style
1359 if ( nostyle & Opie::Force_Style ) 1359 if ( nostyle & Opie::Force_Style )
1360 style = "FlatStyle"; 1360 style = "FlatStyle";
1361 1361
1362 internalSetStyle ( style ); 1362 internalSetStyle ( style );
1363 1363
1364 // Colors - from /etc/colors/Liquid.scheme 1364 // Colors - from /etc/colors/Liquid.scheme
1365 QColor bgcolor( config.readEntry( "Background", "#E0E0E0" ) ); 1365 QColor bgcolor( config.readEntry( "Background", "#E0E0E0" ) );
1366 QColor btncolor( config.readEntry( "Button", "#96c8fa" ) ); 1366 QColor btncolor( config.readEntry( "Button", "#96c8fa" ) );
1367 QPalette pal( btncolor, bgcolor ); 1367 QPalette pal( btncolor, bgcolor );
1368 QString color = config.readEntry( "Highlight", "#73adef" ); 1368 QString color = config.readEntry( "Highlight", "#73adef" );
1369 pal.setColor( QColorGroup::Highlight, QColor( color ) ); 1369 pal.setColor( QColorGroup::Highlight, QColor( color ) );
1370 color = config.readEntry( "HighlightedText", "#FFFFFF" ); 1370 color = config.readEntry( "HighlightedText", "#FFFFFF" );
1371 pal.setColor( QColorGroup::HighlightedText, QColor( color ) ); 1371 pal.setColor( QColorGroup::HighlightedText, QColor( color ) );
1372 color = config.readEntry( "Text", "#000000" ); 1372 color = config.readEntry( "Text", "#000000" );
1373 pal.setColor( QColorGroup::Text, QColor( color ) ); 1373 pal.setColor( QColorGroup::Text, QColor( color ) );
1374 color = config.readEntry( "ButtonText", "#000000" ); 1374 color = config.readEntry( "ButtonText", "#000000" );
1375 pal.setColor( QPalette::Active, QColorGroup::ButtonText, QColor( color ) ); 1375 pal.setColor( QPalette::Active, QColorGroup::ButtonText, QColor( color ) );
1376 color = config.readEntry( "Base", "#FFFFFF" ); 1376 color = config.readEntry( "Base", "#FFFFFF" );
1377 pal.setColor( QColorGroup::Base, QColor( color ) ); 1377 pal.setColor( QColorGroup::Base, QColor( color ) );
1378 1378
1379 pal.setColor( QPalette::Disabled, QColorGroup::Text, 1379 pal.setColor( QPalette::Disabled, QColorGroup::Text,
1380 pal.color( QPalette::Active, QColorGroup::Background ).dark() ); 1380 pal.color( QPalette::Active, QColorGroup::Background ).dark() );
1381 1381
1382 setPalette( pal, TRUE ); 1382 setPalette( pal, TRUE );
1383 1383
1384 1384
1385 // Set the ScrollBar on the 'right' side but only if the weak symbol is present 1385 // Set the ScrollBar on the 'right' side but only if the weak symbol is present
1386 if (&qt_left_hand_scrollbars ) 1386 if (&qt_left_hand_scrollbars )
1387 qt_left_hand_scrollbars = config.readBoolEntry( "LeftHand", false ); 1387 qt_left_hand_scrollbars = config.readBoolEntry( "LeftHand", false );
1388 1388
1389 // Window Decoration 1389 // Window Decoration
1390 QString dec = config.readEntry( "Decoration", "Flat" ); 1390 QString dec = config.readEntry( "Decoration", "Flat" );
1391 1391
1392 // don't set a custom deco 1392 // don't set a custom deco
1393 if ( nostyle & Opie::Force_Decoration ) 1393 if ( nostyle & Opie::Force_Decoration )
1394 dec = ""; 1394 dec = "";
1395 1395
1396 1396
1397 if ( dec != d->decorationName ) { 1397 if ( dec != d->decorationName ) {
1398 qwsSetDecoration( new QPEDecoration( dec ) ); 1398 qwsSetDecoration( new QPEDecoration( dec ) );
1399 d->decorationName = dec; 1399 d->decorationName = dec;
1400 } 1400 }
1401 1401
1402 // Font 1402 // Font
1403 QString ff = config.readEntry( "FontFamily", font().family() ); 1403 QString ff = config.readEntry( "FontFamily", font().family() );
1404 int fs = config.readNumEntry( "FontSize", font().pointSize() ); 1404 int fs = config.readNumEntry( "FontSize", font().pointSize() );
1405 1405
1406 // don't set a custom font 1406 // don't set a custom font
1407 if ( nostyle & Opie::Force_Font ) { 1407 if ( nostyle & Opie::Force_Font ) {
1408 ff = "Vera"; 1408 ff = "Vera";
1409 fs = 10; 1409 fs = 10;
1410 } 1410 }
1411 1411
1412 setFont ( QFont ( ff, fs ), true ); 1412 setFont ( QFont ( ff, fs ), true );
1413 1413
1414#if !defined(OPIE_NO_OVERRIDE_QT) 1414#if !defined(OPIE_NO_OVERRIDE_QT)
1415 // revert to global blocking policy ... 1415 // revert to global blocking policy ...
1416 Opie::force_appearance = config. readBoolEntry ( "ForceStyle", false ) ? Opie::Force_All : Opie::Force_None; 1416 Opie::force_appearance = config. readBoolEntry ( "ForceStyle", false ) ? Opie::Force_All : Opie::Force_None;
1417 Opie::force_appearance &= ~nostyle; 1417 Opie::force_appearance &= ~nostyle;
1418#endif 1418#endif
1419#endif 1419#endif
1420} 1420}
1421 1421
1422void QPEApplication::systemMessage( const QCString& msg, const QByteArray& data ) 1422void QPEApplication::systemMessage( const QCString& msg, const QByteArray& data )
1423{ 1423{
1424#ifdef Q_WS_QWS 1424#ifdef Q_WS_QWS
1425 QDataStream stream( data, IO_ReadOnly ); 1425 QDataStream stream( data, IO_ReadOnly );
1426 if ( msg == "applyStyle()" ) { 1426 if ( msg == "applyStyle()" ) {
1427 applyStyle(); 1427 applyStyle();
1428 } 1428 }
1429 else if ( msg == "toggleApplicationMenu()" ) { 1429 else if ( msg == "toggleApplicationMenu()" ) {
1430 QWidget *active = activeWindow ( ); 1430 QWidget *active = activeWindow ( );
1431 1431
1432 if ( active ) { 1432 if ( active ) {
1433 QPEMenuToolFocusManager *man = QPEMenuToolFocusManager::manager ( ); 1433 QPEMenuToolFocusManager *man = QPEMenuToolFocusManager::manager ( );
1434 bool oldactive = man-> isActive ( ); 1434 bool oldactive = man-> isActive ( );
1435 1435
1436 man-> setActive( !man-> isActive() ); 1436 man-> setActive( !man-> isActive() );
1437 1437
1438 if ( !oldactive && !man-> isActive ( )) { // no menubar to toggle -> try O-Menu 1438 if ( !oldactive && !man-> isActive ( )) { // no menubar to toggle -> try O-Menu
1439 QCopEnvelope e ( "QPE/TaskBar", "toggleStartMenu()" ); 1439 QCopEnvelope e ( "QPE/TaskBar", "toggleStartMenu()" );
1440 } 1440 }
1441 } 1441 }
1442 } 1442 }
1443 else if ( msg == "setDefaultRotation(int)" ) { 1443 else if ( msg == "setDefaultRotation(int)" ) {
1444 if ( type() == GuiServer ) { 1444 if ( type() == GuiServer ) {
1445 int r; 1445 int r;
1446 stream >> r; 1446 stream >> r;
1447 setDefaultRotation( r ); 1447 setDefaultRotation( r );
1448 } 1448 }
1449 } 1449 }
1450 else if ( msg == "setCurrentMode(int,int,int)" ) { // Added: 2003-06-11 by Tim Ansell <mithro@mithis.net> 1450 else if ( msg == "setCurrentMode(int,int,int)" ) { // Added: 2003-06-11 by Tim Ansell <mithro@mithis.net>
1451 if ( type() == GuiServer ) { 1451 if ( type() == GuiServer ) {
1452 int x, y, depth; 1452 int x, y, depth;
1453 stream >> x; 1453 stream >> x;
1454 stream >> y; 1454 stream >> y;
1455 stream >> depth; 1455 stream >> depth;
1456 setCurrentMode( x, y, depth ); 1456 setCurrentMode( x, y, depth );
1457 } 1457 }
1458 } 1458 }
1459 else if ( msg == "reset()" ) { 1459 else if ( msg == "reset()" ) {
1460 if ( type() != GuiServer ) 1460 if ( type() != GuiServer )
1461 reset(); 1461 reset();
1462 } 1462 }
1463 else if ( msg == "setCurrentRotation(int)" ) { 1463 else if ( msg == "setCurrentRotation(int)" ) {
1464 int r; 1464 int r;
1465 stream >> r; 1465 stream >> r;
1466 setCurrentRotation( r ); 1466 setCurrentRotation( r );
1467 } 1467 }
1468 else if ( msg == "shutdown()" ) { 1468 else if ( msg == "shutdown()" ) {
1469 if ( type() == GuiServer ) 1469 if ( type() == GuiServer )
1470 shutdown(); 1470 shutdown();
1471 } 1471 }
1472 else if ( msg == "quit()" ) { 1472 else if ( msg == "quit()" ) {
1473 if ( type() != GuiServer ) 1473 if ( type() != GuiServer )
1474 tryQuit(); 1474 tryQuit();
1475 } 1475 }
1476 else if ( msg == "forceQuit()" ) { 1476 else if ( msg == "forceQuit()" ) {
1477 if ( type() != GuiServer ) 1477 if ( type() != GuiServer )
1478 quit(); 1478 quit();
1479 } 1479 }
1480 else if ( msg == "restart()" ) { 1480 else if ( msg == "restart()" ) {
1481 if ( type() == GuiServer ) 1481 if ( type() == GuiServer )
1482 restart(); 1482 restart();
1483 } 1483 }
1484 else if ( msg == "language(QString)" ) { 1484 else if ( msg == "language(QString)" ) {
1485 if ( type() == GuiServer ) { 1485 if ( type() == GuiServer ) {
1486 QString l; 1486 QString l;
1487 stream >> l; 1487 stream >> l;
1488 QString cl = getenv( "LANG" ); 1488 QString cl = getenv( "LANG" );
1489 if ( cl != l ) { 1489 if ( cl != l ) {
1490 if ( l.isNull() ) 1490 if ( l.isNull() )
1491 unsetenv( "LANG" ); 1491 unsetenv( "LANG" );
1492 else 1492 else
1493 setenv( "LANG", l.latin1(), 1 ); 1493 setenv( "LANG", l.latin1(), 1 );
1494 restart(); 1494 restart();
1495 } 1495 }
1496 } 1496 }
1497 } 1497 }
1498 else if ( msg == "timeChange(QString)" ) { 1498 else if ( msg == "timeChange(QString)" ) {
1499 QString t; 1499 QString t;
1500 stream >> t; 1500 stream >> t;
1501 if ( t.isNull() ) 1501 if ( t.isNull() )
1502 unsetenv( "TZ" ); 1502 unsetenv( "TZ" );
1503 else 1503 else
1504 setenv( "TZ", t.latin1(), 1 ); 1504 setenv( "TZ", t.latin1(), 1 );
1505 // emit the signal so everyone else knows... 1505 // emit the signal so everyone else knows...
1506 emit timeChanged(); 1506 emit timeChanged();
1507 } 1507 }
1508 else if ( msg == "addAlarm(QDateTime,QCString,QCString,int)" ) { 1508 else if ( msg == "addAlarm(QDateTime,QCString,QCString,int)" ) {
1509 if ( type() == GuiServer ) { 1509 if ( type() == GuiServer ) {
1510 QDateTime when; 1510 QDateTime when;
1511 QCString channel, message; 1511 QCString channel, message;
1512 int data; 1512 int data;
1513 stream >> when >> channel >> message >> data; 1513 stream >> when >> channel >> message >> data;
1514 AlarmServer::addAlarm( when, channel, message, data ); 1514 AlarmServer::addAlarm( when, channel, message, data );
1515 } 1515 }
1516 } 1516 }
1517 else if ( msg == "deleteAlarm(QDateTime,QCString,QCString,int)" ) { 1517 else if ( msg == "deleteAlarm(QDateTime,QCString,QCString,int)" ) {
1518 if ( type() == GuiServer ) { 1518 if ( type() == GuiServer ) {
1519 QDateTime when; 1519 QDateTime when;
1520 QCString channel, message; 1520 QCString channel, message;
1521 int data; 1521 int data;
1522 stream >> when >> channel >> message >> data; 1522 stream >> when >> channel >> message >> data;
1523 AlarmServer::deleteAlarm( when, channel, message, data ); 1523 AlarmServer::deleteAlarm( when, channel, message, data );
1524 } 1524 }
1525 } 1525 }
1526 else if ( msg == "clockChange(bool)" ) { 1526 else if ( msg == "clockChange(bool)" ) {
1527 int tmp; 1527 int tmp;
1528 stream >> tmp; 1528 stream >> tmp;
1529 emit clockChanged( tmp ); 1529 emit clockChanged( tmp );
1530 } 1530 }
1531 else if ( msg == "weekChange(bool)" ) { 1531 else if ( msg == "weekChange(bool)" ) {
1532 int tmp; 1532 int tmp;
1533 stream >> tmp; 1533 stream >> tmp;
1534 emit weekChanged( tmp ); 1534 emit weekChanged( tmp );
1535 } 1535 }
1536 else if ( msg == "setDateFormat(DateFormat)" ) { 1536 else if ( msg == "setDateFormat(DateFormat)" ) {
1537 DateFormat tmp; 1537 DateFormat tmp;
1538 stream >> tmp; 1538 stream >> tmp;
1539 emit dateFormatChanged( tmp ); 1539 emit dateFormatChanged( tmp );
1540 } 1540 }
1541 else if ( msg == "setVolume(int,int)" ) { 1541 else if ( msg == "setVolume(int,int)" ) {
1542 int t, v; 1542 int t, v;
1543 stream >> t >> v; 1543 stream >> t >> v;
1544 setVolume( t, v ); 1544 setVolume( t, v );
1545 emit volumeChanged( muted ); 1545 emit volumeChanged( muted );
1546 } 1546 }
1547 else if ( msg == "volumeChange(bool)" ) { 1547 else if ( msg == "volumeChange(bool)" ) {
1548 stream >> muted; 1548 stream >> muted;
1549 setVolume(); 1549 setVolume();
1550 emit volumeChanged( muted ); 1550 emit volumeChanged( muted );
1551 } 1551 }
1552 else if ( msg == "setMic(int,int)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com> 1552 else if ( msg == "setMic(int,int)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com>
1553 int t, v; 1553 int t, v;
1554 stream >> t >> v; 1554 stream >> t >> v;
1555 setMic( t, v ); 1555 setMic( t, v );
1556 emit micChanged( micMuted ); 1556 emit micChanged( micMuted );
1557 } 1557 }
1558 else if ( msg == "micChange(bool)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com> 1558 else if ( msg == "micChange(bool)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com>
1559 stream >> micMuted; 1559 stream >> micMuted;
1560 setMic(); 1560 setMic();
1561 emit micChanged( micMuted ); 1561 emit micChanged( micMuted );
1562 } 1562 }
1563 else if ( msg == "setBass(int,int)" ) { // Added: 2002-12-13 by Maximilian Reiss <harlekin@handhelds.org> 1563 else if ( msg == "setBass(int,int)" ) { // Added: 2002-12-13 by Maximilian Reiss <harlekin@handhelds.org>
1564 int t, v; 1564 int t, v;
1565 stream >> t >> v; 1565 stream >> t >> v;
1566 setBass( t, v ); 1566 setBass( t, v );
1567 } 1567 }
1568 else if ( msg == "bassChange(bool)" ) { // Added: 2002-12-13 by Maximilian Reiss <harlekin@handhelds.org> 1568 else if ( msg == "bassChange(bool)" ) { // Added: 2002-12-13 by Maximilian Reiss <harlekin@handhelds.org>
1569 setBass(); 1569 setBass();
1570 } 1570 }
1571 else if ( msg == "setTreble(int,int)" ) { // Added: 2002-12-13 by Maximilian Reiss <harlekin@handhelds.org> 1571 else if ( msg == "setTreble(int,int)" ) { // Added: 2002-12-13 by Maximilian Reiss <harlekin@handhelds.org>
1572 int t, v; 1572 int t, v;
1573 stream >> t >> v; 1573 stream >> t >> v;
1574 setTreble( t, v ); 1574 setTreble( t, v );
1575 } 1575 }
1576 else if ( msg == "trebleChange(bool)" ) { // Added: 2002-12-13 by Maximilian Reiss <harlekin@handhelds.org> 1576 else if ( msg == "trebleChange(bool)" ) { // Added: 2002-12-13 by Maximilian Reiss <harlekin@handhelds.org>
1577 setTreble(); 1577 setTreble();
1578 } else if ( msg == "getMarkedText()" ) { 1578 } else if ( msg == "getMarkedText()" ) {
1579 if ( type() == GuiServer ) { 1579 if ( type() == GuiServer ) {
1580 const ushort unicode = 'C'-'@'; 1580 const ushort unicode = 'C'-'@';
1581 const int scan = Key_C; 1581 const int scan = Key_C;
1582 qwsServer->processKeyEvent( unicode, scan, ControlButton, TRUE, FALSE ); 1582 qwsServer->processKeyEvent( unicode, scan, ControlButton, TRUE, FALSE );
1583 qwsServer->processKeyEvent( unicode, scan, ControlButton, FALSE, FALSE ); 1583 qwsServer->processKeyEvent( unicode, scan, ControlButton, FALSE, FALSE );
1584 } 1584 }
1585 } else if ( msg == "newChannel(QString)") { 1585 } else if ( msg == "newChannel(QString)") {
1586 QString myChannel = "QPE/Application/" + d->appName; 1586 QString myChannel = "QPE/Application/" + d->appName;
1587 QString channel; 1587 QString channel;
1588 stream >> channel; 1588 stream >> channel;
1589 if (channel == myChannel) { 1589 if (channel == myChannel) {
1590 processQCopFile(); 1590 processQCopFile();
1591 d->sendQCopQ(); 1591 d->sendQCopQ();
1592 } 1592 }
1593 } 1593 }
1594 1594
1595 1595
1596#endif 1596#endif
1597} 1597}
1598 1598
1599 1599
1600 1600
1601 1601
1602 1602
1603/*! 1603/*!
1604 \internal 1604 \internal
1605*/ 1605*/
1606bool QPEApplication::raiseAppropriateWindow() 1606bool QPEApplication::raiseAppropriateWindow()
1607{ 1607{
1608 bool r=FALSE; 1608 bool r=FALSE;
1609 1609
1610 // 1. Raise the main widget 1610 // 1. Raise the main widget
1611 QWidget *top = d->qpe_main_widget; 1611 QWidget *top = d->qpe_main_widget;
1612 if ( !top ) top = mainWidget(); 1612 if ( !top ) top = mainWidget();
1613 1613
1614 if ( top && d->keep_running ) { 1614 if ( top && d->keep_running ) {
1615 if ( top->isVisible() ) 1615 if ( top->isVisible() )
1616 r = TRUE; 1616 r = TRUE;
1617 else if (d->preloaded) { 1617 else if (d->preloaded) {
1618 // We are preloaded and not visible.. pretend we just started.. 1618 // We are preloaded and not visible.. pretend we just started..
1619#ifndef QT_NO_COP 1619#ifndef QT_NO_COP
1620 QCopEnvelope e("QPE/System", "fastAppShowing(QString)"); 1620 QCopEnvelope e("QPE/System", "fastAppShowing(QString)");
1621 e << d->appName; 1621 e << d->appName;
1622#endif 1622#endif
1623 } 1623 }
1624 1624
1625 d->show_mx(top,d->nomaximize, d->appName); 1625 d->show_mx(top,d->nomaximize, d->appName);
1626 top->raise(); 1626 top->raise();
1627 } 1627 }
1628 1628
1629 QWidget *topm = activeModalWidget(); 1629 QWidget *topm = activeModalWidget();
1630 1630
1631 // 2. Raise any parentless widgets (except top and topm, as they 1631 // 2. Raise any parentless widgets (except top and topm, as they
1632 // are raised before and after this loop). Order from most 1632 // are raised before and after this loop). Order from most
1633 // recently raised as deepest to least recently as top, so 1633 // recently raised as deepest to least recently as top, so
1634 // that repeated calls cycle through widgets. 1634 // that repeated calls cycle through widgets.
1635 QWidgetList *list = topLevelWidgets(); 1635 QWidgetList *list = topLevelWidgets();
1636 if ( list ) { 1636 if ( list ) {
1637 bool foundlast = FALSE; 1637 bool foundlast = FALSE;
1638 QWidget* topsub = 0; 1638 QWidget* topsub = 0;
1639 if ( d->lastraised ) { 1639 if ( d->lastraised ) {
1640 for (QWidget* w = list->first(); w; w = list->next()) { 1640 for (QWidget* w = list->first(); w; w = list->next()) {
1641 if ( !w->parentWidget() && w != topm && w->isVisible() && !w->isDesktop() ) { 1641 if ( !w->parentWidget() && w != topm && w->isVisible() && !w->isDesktop() ) {
1642 if ( w == d->lastraised ) 1642 if ( w == d->lastraised )
1643 foundlast = TRUE; 1643 foundlast = TRUE;
1644 if ( foundlast ) { 1644 if ( foundlast ) {
1645 w->raise(); 1645 w->raise();
1646 topsub = w; 1646 topsub = w;
1647 } 1647 }
1648 } 1648 }
1649 } 1649 }
1650 } 1650 }
1651 for (QWidget* w = list->first(); w; w = list->next()) { 1651 for (QWidget* w = list->first(); w; w = list->next()) {
1652 if ( !w->parentWidget() && w != topm && w->isVisible() && !w->isDesktop() ) { 1652 if ( !w->parentWidget() && w != topm && w->isVisible() && !w->isDesktop() ) {
1653 if ( w == d->lastraised ) 1653 if ( w == d->lastraised )
1654 break; 1654 break;
1655 w->raise(); 1655 w->raise();
1656 topsub = w; 1656 topsub = w;
1657 } 1657 }
1658 } 1658 }
1659 d->lastraised = topsub; 1659 d->lastraised = topsub;
1660 delete list; 1660 delete list;
1661 } 1661 }
1662 1662
1663 // 3. Raise the active modal widget. 1663 // 3. Raise the active modal widget.
1664 if ( topm ) { 1664 if ( topm ) {
1665 topm->show(); 1665 topm->show();
1666 topm->raise(); 1666 topm->raise();
1667 // If we haven't already handled the fastAppShowing message 1667 // If we haven't already handled the fastAppShowing message
1668 if (!top && d->preloaded) { 1668 if (!top && d->preloaded) {
1669#ifndef QT_NO_COP 1669#ifndef QT_NO_COP
1670 QCopEnvelope e("QPE/System", "fastAppShowing(QString)"); 1670 QCopEnvelope e("QPE/System", "fastAppShowing(QString)");
1671 e << d->appName; 1671 e << d->appName;
1672#endif 1672#endif
1673 } 1673 }
1674 r = FALSE; 1674 r = FALSE;
1675 } 1675 }
1676 1676
1677 return r; 1677 return r;
1678} 1678}
1679 1679
1680 1680
1681void QPEApplication::pidMessage( const QCString& msg, const QByteArray& data) 1681void QPEApplication::pidMessage( const QCString& msg, const QByteArray& data)
1682{ 1682{
1683#ifdef Q_WS_QWS 1683#ifdef Q_WS_QWS
1684 1684
1685 if ( msg == "quit()" ) { 1685 if ( msg == "quit()" ) {
1686 tryQuit(); 1686 tryQuit();
1687 } 1687 }
1688 else if ( msg == "quitIfInvisible()" ) { 1688 else if ( msg == "quitIfInvisible()" ) {
1689 if ( d->qpe_main_widget && !d->qpe_main_widget->isVisible() ) 1689 if ( d->qpe_main_widget && !d->qpe_main_widget->isVisible() )
1690 quit(); 1690 quit();
1691 } 1691 }
1692 else if ( msg == "close()" ) { 1692 else if ( msg == "close()" ) {
1693 hideOrQuit(); 1693 hideOrQuit();
1694 } 1694 }
1695 else if ( msg == "disablePreload()" ) { 1695 else if ( msg == "disablePreload()" ) {
1696 d->preloaded = FALSE; 1696 d->preloaded = FALSE;
1697 d->keep_running = TRUE; 1697 d->keep_running = TRUE;
1698 /* so that quit will quit */ 1698 /* so that quit will quit */
1699 } 1699 }
1700 else if ( msg == "enablePreload()" ) { 1700 else if ( msg == "enablePreload()" ) {
1701 if (d->qpe_main_widget) 1701 if (d->qpe_main_widget)
1702 d->preloaded = TRUE; 1702 d->preloaded = TRUE;
1703 d->keep_running = TRUE; 1703 d->keep_running = TRUE;
1704 /* so next quit won't quit */ 1704 /* so next quit won't quit */
1705 } 1705 }
1706 else if ( msg == "raise()" ) { 1706 else if ( msg == "raise()" ) {
1707 d->keep_running = TRUE; 1707 d->keep_running = TRUE;
1708 d->notbusysent = FALSE; 1708 d->notbusysent = FALSE;
1709 raiseAppropriateWindow(); 1709 raiseAppropriateWindow();
1710 // Tell the system we're still chugging along... 1710 // Tell the system we're still chugging along...
1711 QCopEnvelope e("QPE/System", "appRaised(QString)"); 1711 QCopEnvelope e("QPE/System", "appRaised(QString)");
1712 e << d->appName; 1712 e << d->appName;
1713 } 1713 }
1714 else if ( msg == "flush()" ) { 1714 else if ( msg == "flush()" ) {
1715 emit flush(); 1715 emit flush();
1716 // we need to tell the desktop 1716 // we need to tell the desktop
1717 QCopEnvelope e( "QPE/Desktop", "flushDone(QString)" ); 1717 QCopEnvelope e( "QPE/Desktop", "flushDone(QString)" );
1718 e << d->appName; 1718 e << d->appName;
1719 } 1719 }
1720 else if ( msg == "reload()" ) { 1720 else if ( msg == "reload()" ) {
1721 emit reload(); 1721 emit reload();
1722 } 1722 }
1723 else if ( msg == "setDocument(QString)" ) { 1723 else if ( msg == "setDocument(QString)" ) {
1724 d->keep_running = TRUE; 1724 d->keep_running = TRUE;
1725 QDataStream stream( data, IO_ReadOnly ); 1725 QDataStream stream( data, IO_ReadOnly );
1726 QString doc; 1726 QString doc;
1727 stream >> doc; 1727 stream >> doc;
1728 QWidget *mw = mainWidget(); 1728 QWidget *mw = mainWidget();
1729 if ( !mw ) 1729 if ( !mw )
1730 mw = d->qpe_main_widget; 1730 mw = d->qpe_main_widget;
1731 if ( mw ) 1731 if ( mw )
1732 Global::setDocument( mw, doc ); 1732 Global::setDocument( mw, doc );
1733 1733
1734 } else if ( msg == "QPEProcessQCop()" ) { 1734 } else if ( msg == "QPEProcessQCop()" ) {
1735 processQCopFile(); 1735 processQCopFile();
1736 d->sendQCopQ(); 1736 d->sendQCopQ();
1737 }else 1737 }else
1738 { 1738 {
1739 bool p = d->keep_running; 1739 bool p = d->keep_running;
1740 d->keep_running = FALSE; 1740 d->keep_running = FALSE;
1741 emit appMessage( msg, data); 1741 emit appMessage( msg, data);
1742 if ( d->keep_running ) { 1742 if ( d->keep_running ) {
1743 d->notbusysent = FALSE; 1743 d->notbusysent = FALSE;
1744 raiseAppropriateWindow(); 1744 raiseAppropriateWindow();
1745 if ( !p ) { 1745 if ( !p ) {
1746 // Tell the system we're still chugging along... 1746 // Tell the system we're still chugging along...
1747#ifndef QT_NO_COP 1747#ifndef QT_NO_COP
1748 QCopEnvelope e("QPE/System", "appRaised(QString)"); 1748 QCopEnvelope e("QPE/System", "appRaised(QString)");
1749 e << d->appName; 1749 e << d->appName;
1750#endif 1750#endif
1751 } 1751 }
1752 } 1752 }
1753 if ( p ) 1753 if ( p )
1754 d->keep_running = p; 1754 d->keep_running = p;
1755 } 1755 }
1756#endif 1756#endif
1757} 1757}
1758 1758
1759 1759
1760/*! 1760/*!
1761 Sets widget \a mw as the mainWidget() and shows it. For small windows, 1761 Sets widget \a mw as the mainWidget() and shows it. For small windows,
1762 consider passing TRUE for \a nomaximize rather than the default FALSE. 1762 consider passing TRUE for \a nomaximize rather than the default FALSE.
1763 1763
1764 \sa showMainDocumentWidget() 1764 \sa showMainDocumentWidget()
1765*/ 1765*/
1766void QPEApplication::showMainWidget( QWidget* mw, bool nomaximize ) 1766void QPEApplication::showMainWidget( QWidget* mw, bool nomaximize )
1767{ 1767{
1768// setMainWidget(mw); this breaks FastLoading because lastWindowClose() would quit 1768// setMainWidget(mw); this breaks FastLoading because lastWindowClose() would quit
1769 d->show(mw, nomaximize ); 1769 d->show(mw, nomaximize );
1770} 1770}
1771 1771
1772/*! 1772/*!
1773 Sets widget \a mw as the mainWidget() and shows it. For small windows, 1773 Sets widget \a mw as the mainWidget() and shows it. For small windows,
1774 consider passing TRUE for \a nomaximize rather than the default FALSE. 1774 consider passing TRUE for \a nomaximize rather than the default FALSE.
1775 1775
1776 This calls designates the application as 1776 This calls designates the application as
1777 a \link docwidget.html document-oriented\endlink application. 1777 a \link docwidget.html document-oriented\endlink application.
1778 1778
1779 The \a mw widget \e must have this slot: setDocument(const QString&). 1779 The \a mw widget \e must have this slot: setDocument(const QString&).
1780 1780
1781 \sa showMainWidget() 1781 \sa showMainWidget()
1782*/ 1782*/
1783void QPEApplication::showMainDocumentWidget( QWidget* mw, bool nomaximize ) 1783void QPEApplication::showMainDocumentWidget( QWidget* mw, bool nomaximize )
1784{ 1784{
1785 if ( mw && argc() == 2 ) 1785 if ( mw && argc() == 2 )
1786 Global::setDocument( mw, QString::fromUtf8(argv()[1]) ); 1786 Global::setDocument( mw, QString::fromUtf8(argv()[1]) );
1787 1787
1788 1788
1789// setMainWidget(mw); see above 1789// setMainWidget(mw); see above
1790 d->show(mw, nomaximize ); 1790 d->show(mw, nomaximize );
1791} 1791}
1792 1792
1793 1793
1794/*! 1794/*!
1795 If an application is started via a \link qcop.html QCop\endlink 1795 If an application is started via a \link qcop.html QCop\endlink
1796 message, the application will process the \link qcop.html 1796 message, the application will process the \link qcop.html
1797 QCop\endlink message and then quit. If the application calls this 1797 QCop\endlink message and then quit. If the application calls this
1798 function while processing a \link qcop.html QCop\endlink message, 1798 function while processing a \link qcop.html QCop\endlink message,
1799 after processing its outstanding \link qcop.html QCop\endlink 1799 after processing its outstanding \link qcop.html QCop\endlink
1800 messages the application will start 'properly' and show itself. 1800 messages the application will start 'properly' and show itself.
1801 1801
1802 \sa keepRunning() 1802 \sa keepRunning()
1803*/ 1803*/
1804void QPEApplication::setKeepRunning() 1804void QPEApplication::setKeepRunning()
1805{ 1805{
1806 if ( qApp && qApp->inherits( "QPEApplication" ) ) { 1806 if ( qApp && qApp->inherits( "QPEApplication" ) ) {
1807 QPEApplication * qpeApp = ( QPEApplication* ) qApp; 1807 QPEApplication * qpeApp = ( QPEApplication* ) qApp;
1808 qpeApp->d->keep_running = TRUE; 1808 qpeApp->d->keep_running = TRUE;
1809 } 1809 }
1810} 1810}
1811 1811
1812/*! 1812/*!
1813 Returns TRUE if the application will quit after processing the 1813 Returns TRUE if the application will quit after processing the
1814 current list of qcop messages; otherwise returns FALSE. 1814 current list of qcop messages; otherwise returns FALSE.
1815 1815
1816 \sa setKeepRunning() 1816 \sa setKeepRunning()
1817*/ 1817*/
1818bool QPEApplication::keepRunning() const 1818bool QPEApplication::keepRunning() const
1819{ 1819{
1820 return d->keep_running; 1820 return d->keep_running;
1821} 1821}
1822 1822
1823/*! 1823/*!
1824 \internal 1824 \internal
1825*/ 1825*/
1826void QPEApplication::internalSetStyle( const QString &style ) 1826void QPEApplication::internalSetStyle( const QString &style )
1827{ 1827{
1828#if QT_VERSION >= 300 1828#if QT_VERSION >= 300
1829 if ( style == "QPE" ) { 1829 if ( style == "QPE" ) {
1830 setStyle( new QPEStyle ); 1830 setStyle( new QPEStyle );
1831 } 1831 }
1832 else { 1832 else {
1833 QStyle *s = QStyleFactory::create( style ); 1833 QStyle *s = QStyleFactory::create( style );
1834 if ( s ) 1834 if ( s )
1835 setStyle( s ); 1835 setStyle( s );
1836 } 1836 }
1837#else 1837#else
1838 if ( style == "Windows" ) { 1838 if ( style == "Windows" ) {
1839 setStyle( new QWindowsStyle ); 1839 setStyle( new QWindowsStyle );
1840 } 1840 }
1841 else if ( style == "QPE" ) { 1841 else if ( style == "QPE" ) {
1842 setStyle( new QPEStyle ); 1842 setStyle( new QPEStyle );
1843 } 1843 }
1844 else if ( style == "Light" ) { 1844 else if ( style == "Light" ) {
1845 setStyle( new LightStyle ); 1845 setStyle( new LightStyle );
1846 } 1846 }
1847#ifndef QT_NO_STYLE_PLATINUM 1847#ifndef QT_NO_STYLE_PLATINUM
1848 else if ( style == "Platinum" ) { 1848 else if ( style == "Platinum" ) {
1849 setStyle( new QPlatinumStyle ); 1849 setStyle( new QPlatinumStyle );
1850 } 1850 }
1851#endif 1851#endif
1852#ifndef QT_NO_STYLE_MOTIF 1852#ifndef QT_NO_STYLE_MOTIF
1853 else if ( style == "Motif" ) { 1853 else if ( style == "Motif" ) {
1854 setStyle( new QMotifStyle ); 1854 setStyle( new QMotifStyle );
1855 } 1855 }
1856#endif 1856#endif
1857#ifndef QT_NO_STYLE_MOTIFPLUS 1857#ifndef QT_NO_STYLE_MOTIFPLUS
1858 else if ( style == "MotifPlus" ) { 1858 else if ( style == "MotifPlus" ) {
1859 setStyle( new QMotifPlusStyle ); 1859 setStyle( new QMotifPlusStyle );
1860 } 1860 }
1861#endif 1861#endif
1862 1862
1863 else { 1863 else {
1864 QStyle *sty = 0; 1864 QStyle *sty = 0;
1865 QString path = QPEApplication::qpeDir ( ) + "/plugins/styles/"; 1865 QString path = QPEApplication::qpeDir ( ) + "/plugins/styles/";
1866 1866
1867#ifdef Q_OS_MACX 1867#ifdef Q_OS_MACX
1868 if ( style. find ( ".dylib" ) > 0 ) 1868 if ( style. find ( ".dylib" ) > 0 )
1869 path += style; 1869 path += style;
1870 else 1870 else
1871 path = path + "lib" + style. lower ( ) + ".dylib"; // compatibility 1871 path = path + "lib" + style. lower ( ) + ".dylib"; // compatibility
1872#else 1872#else
1873 if ( style. find ( ".so" ) > 0 ) 1873 if ( style. find ( ".so" ) > 0 )
1874 path += style; 1874 path += style;
1875 else 1875 else
1876 path = path + "lib" + style. lower ( ) + ".so"; // compatibility 1876 path = path + "lib" + style. lower ( ) + ".so"; // compatibility
1877#endif 1877#endif
1878 static QLibrary *lastlib = 0; 1878 static QLibrary *lastlib = 0;
1879 static StyleInterface *lastiface = 0; 1879 static StyleInterface *lastiface = 0;
1880 1880
1881 QLibrary *lib = new QLibrary ( path ); 1881 QLibrary *lib = new QLibrary ( path );
1882 StyleInterface *iface = 0; 1882 StyleInterface *iface = 0;
1883 1883
1884 if (( lib-> queryInterface ( IID_Style, ( QUnknownInterface ** ) &iface ) == QS_OK ) && iface ) 1884 if (( lib-> queryInterface ( IID_Style, ( QUnknownInterface ** ) &iface ) == QS_OK ) && iface )
1885 sty = iface-> style ( ); 1885 sty = iface-> style ( );
1886 1886
1887 if ( sty ) { 1887 if ( sty ) {
1888 setStyle ( sty ); 1888 setStyle ( sty );
1889 1889
1890 if ( lastiface ) 1890 if ( lastiface )
1891 lastiface-> release ( ); 1891 lastiface-> release ( );
1892 lastiface = iface; 1892 lastiface = iface;
1893 1893
1894 if ( lastlib ) { 1894 if ( lastlib ) {
1895 lastlib-> unload ( ); 1895 lastlib-> unload ( );
1896 delete lastlib; 1896 delete lastlib;
1897 } 1897 }
1898 lastlib = lib; 1898 lastlib = lib;
1899 } 1899 }
1900 else { 1900 else {
1901 if ( iface ) 1901 if ( iface )
1902 iface-> release ( ); 1902 iface-> release ( );
1903 delete lib; 1903 delete lib;
1904 1904
1905 setStyle ( new LightStyle ( )); 1905 setStyle ( new LightStyle ( ));
1906 } 1906 }
1907 } 1907 }
1908#endif 1908#endif
1909} 1909}
1910 1910
1911/*! 1911/*!
1912 \internal 1912 \internal
1913*/ 1913*/
1914void QPEApplication::prepareForTermination( bool willrestart ) 1914void QPEApplication::prepareForTermination( bool willrestart )
1915{ 1915{
1916 if ( willrestart ) { 1916 if ( willrestart ) {
1917 // Draw a big wait icon, the image can be altered in later revisions 1917 // Draw a big wait icon, the image can be altered in later revisions
1918 // QWidget *d = QApplication::desktop(); 1918 // QWidget *d = QApplication::desktop();
1919 QImage img = Resource::loadImage( "launcher/new_wait" ); 1919 QImage img = Resource::loadImage( "launcher/new_wait" );
1920 QPixmap pix; 1920 QPixmap pix;
1921 pix.convertFromImage( img.smoothScale( 1 * img.width(), 1 * img.height() ) ); 1921 pix.convertFromImage( img.smoothScale( 1 * img.width(), 1 * img.height() ) );
1922 QLabel *lblWait = new QLabel( 0, "wait hack!", QWidget::WStyle_Customize | 1922 QLabel *lblWait = new QLabel( 0, "wait hack!", QWidget::WStyle_Customize |
1923 QWidget::WStyle_NoBorder | QWidget::WStyle_Tool ); 1923 QWidget::WStyle_NoBorder | QWidget::WStyle_Tool );
1924 lblWait->setPixmap( pix ); 1924 lblWait->setPixmap( pix );
1925 lblWait->setAlignment( QWidget::AlignCenter ); 1925 lblWait->setAlignment( QWidget::AlignCenter );
1926 lblWait->show(); 1926 lblWait->show();
1927 lblWait->showMaximized(); 1927 lblWait->showMaximized();
1928 } 1928 }
1929#ifndef SINGLE_APP 1929#ifndef SINGLE_APP
1930 { QCopEnvelope envelope( "QPE/System", "forceQuit()" ); 1930 { QCopEnvelope envelope( "QPE/System", "forceQuit()" );
1931 } 1931 }
1932 processEvents(); // ensure the message goes out. 1932 processEvents(); // ensure the message goes out.
1933 sleep( 1 ); // You have 1 second to comply. 1933 sleep( 1 ); // You have 1 second to comply.
1934#endif 1934#endif
1935} 1935}
1936 1936
1937/*! 1937/*!
1938 \internal 1938 \internal
1939*/ 1939*/
1940void QPEApplication::shutdown() 1940void QPEApplication::shutdown()
1941{ 1941{
1942 // Implement in server's QPEApplication subclass 1942 // Implement in server's QPEApplication subclass
1943} 1943}
1944 1944
1945/*! 1945/*!
1946 \internal 1946 \internal
1947*/ 1947*/
1948void QPEApplication::restart() 1948void QPEApplication::restart()
1949{ 1949{
1950 // Implement in server's QPEApplication subclass 1950 // Implement in server's QPEApplication subclass
1951} 1951}
1952 1952
1953static QPtrDict<void>* stylusDict = 0; 1953static QPtrDict<void>* stylusDict = 0;
1954static void createDict() 1954static void createDict()
1955{ 1955{
1956 if ( !stylusDict ) 1956 if ( !stylusDict )
1957 stylusDict = new QPtrDict<void>; 1957 stylusDict = new QPtrDict<void>;
1958} 1958}
1959 1959
1960/*! 1960/*!
1961 Returns the current StylusMode for widget \a w. 1961 Returns the current StylusMode for widget \a w.
1962 1962
1963 \sa setStylusOperation() StylusMode 1963 \sa setStylusOperation() StylusMode
1964*/ 1964*/
1965QPEApplication::StylusMode QPEApplication::stylusOperation( QWidget* w ) 1965QPEApplication::StylusMode QPEApplication::stylusOperation( QWidget* w )
1966{ 1966{
1967 if ( stylusDict ) 1967 if ( stylusDict )
1968 return ( StylusMode ) ( int ) stylusDict->find( w ); 1968 return ( StylusMode ) ( int ) stylusDict->find( w );
1969 return LeftOnly; 1969 return LeftOnly;
1970} 1970}
1971 1971
1972/*! 1972/*!
1973 \enum QPEApplication::StylusMode 1973 \enum QPEApplication::StylusMode
1974 1974
1975 \value LeftOnly the stylus only generates LeftButton 1975 \value LeftOnly the stylus only generates LeftButton
1976 events (the default). 1976 events (the default).
1977 \value RightOnHold the stylus generates RightButton events 1977 \value RightOnHold the stylus generates RightButton events
1978 if the user uses the press-and-hold gesture. 1978 if the user uses the press-and-hold gesture.
1979 1979
1980 \sa setStylusOperation() stylusOperation() 1980 \sa setStylusOperation() stylusOperation()
1981*/ 1981*/
1982 1982
1983/*! 1983/*!
1984 Causes widget \a w to receive mouse events according to the stylus 1984 Causes widget \a w to receive mouse events according to the stylus
1985 \a mode. 1985 \a mode.
1986 1986
1987 \sa stylusOperation() StylusMode 1987 \sa stylusOperation() StylusMode
1988*/ 1988*/
1989void QPEApplication::setStylusOperation( QWidget * w, StylusMode mode ) 1989void QPEApplication::setStylusOperation( QWidget * w, StylusMode mode )
1990{ 1990{
1991 createDict(); 1991 createDict();
1992 if ( mode == LeftOnly ) { 1992 if ( mode == LeftOnly ) {
1993 stylusDict->remove 1993 stylusDict->remove
1994 ( w ); 1994 ( w );
1995 w->removeEventFilter( qApp ); 1995 w->removeEventFilter( qApp );
1996 } 1996 }
1997 else { 1997 else {
1998 stylusDict->insert( w, ( void* ) mode ); 1998 stylusDict->insert( w, ( void* ) mode );
1999 connect( w, SIGNAL( destroyed() ), qApp, SLOT( removeSenderFromStylusDict() ) ); 1999 connect( w, SIGNAL( destroyed() ), qApp, SLOT( removeSenderFromStylusDict() ) );
2000 w->installEventFilter( qApp ); 2000 w->installEventFilter( qApp );
2001 } 2001 }
2002} 2002}
2003 2003
2004 2004
2005/*! 2005/*!
2006 \reimp 2006 \reimp
2007*/ 2007*/
2008bool QPEApplication::eventFilter( QObject *o, QEvent *e ) 2008bool QPEApplication::eventFilter( QObject *o, QEvent *e )
2009{ 2009{
2010 if ( !o->isWidgetType() ) 2010 if ( !o->isWidgetType() )
2011 return FALSE; 2011 return FALSE;
2012 2012
2013 if ( stylusDict && e->type() >= QEvent::MouseButtonPress && e->type() <= QEvent::MouseMove ) { 2013 if ( stylusDict && e->type() >= QEvent::MouseButtonPress && e->type() <= QEvent::MouseMove ) {
2014 QMouseEvent * me = ( QMouseEvent* ) e; 2014 QMouseEvent * me = ( QMouseEvent* ) e;
2015 StylusMode mode = (StylusMode)(int)stylusDict->find(o); 2015 StylusMode mode = (StylusMode)(int)stylusDict->find(o);
2016 switch (mode) { 2016 switch (mode) {
2017 case RightOnHold: 2017 case RightOnHold:
2018 switch ( me->type() ) { 2018 switch ( me->type() ) {
2019 case QEvent::MouseButtonPress: 2019 case QEvent::MouseButtonPress:
2020 if ( me->button() == LeftButton ) { 2020 if ( me->button() == LeftButton ) {
2021 if (!d->presstimer ) 2021 if (!d->presstimer )
2022 d->presstimer = startTimer(500); // #### pref. 2022 d->presstimer = startTimer(500); // #### pref.
2023 d->presswidget = (QWidget*)o; 2023 d->presswidget = (QWidget*)o;
2024 d->presspos = me->pos(); 2024 d->presspos = me->pos();
2025 d->rightpressed = FALSE; 2025 d->rightpressed = FALSE;
2026 } 2026 }
2027 break; 2027 break;
2028 case QEvent::MouseMove: 2028 case QEvent::MouseMove:
2029 if (d->presstimer && (me->pos() - d->presspos).manhattanLength() > 8) { 2029 if (d->presstimer && (me->pos() - d->presspos).manhattanLength() > 8) {
2030 killTimer(d->presstimer); 2030 killTimer(d->presstimer);
2031 d->presstimer = 0; 2031 d->presstimer = 0;
2032 } 2032 }
2033 break; 2033 break;
2034 case QEvent::MouseButtonRelease: 2034 case QEvent::MouseButtonRelease:
2035 if ( me->button() == LeftButton ) { 2035 if ( me->button() == LeftButton ) {
2036 if ( d->presstimer ) { 2036 if ( d->presstimer ) {
2037 killTimer(d->presstimer); 2037 killTimer(d->presstimer);
2038 d->presstimer = 0; 2038 d->presstimer = 0;
2039 } 2039 }
2040 if ( d->rightpressed && d->presswidget ) { 2040 if ( d->rightpressed && d->presswidget ) {
2041 // Right released 2041 // Right released
2042 postEvent( d->presswidget, 2042 postEvent( d->presswidget,
2043 new QMouseEvent( QEvent::MouseButtonRelease, me->pos(), 2043 new QMouseEvent( QEvent::MouseButtonRelease, me->pos(),
2044 RightButton, LeftButton + RightButton ) ); 2044 RightButton, LeftButton + RightButton ) );
2045 // Left released, off-widget 2045 // Left released, off-widget
2046 postEvent( d->presswidget, 2046 postEvent( d->presswidget,
2047 new QMouseEvent( QEvent::MouseMove, QPoint( -1, -1), 2047 new QMouseEvent( QEvent::MouseMove, QPoint( -1, -1),
2048 LeftButton, LeftButton ) ); 2048 LeftButton, LeftButton ) );
2049 postEvent( d->presswidget, 2049 postEvent( d->presswidget,
2050 new QMouseEvent( QEvent::MouseButtonRelease, QPoint( -1, -1), 2050 new QMouseEvent( QEvent::MouseButtonRelease, QPoint( -1, -1),
2051 LeftButton, LeftButton ) ); 2051 LeftButton, LeftButton ) );
2052 d->rightpressed = FALSE; 2052 d->rightpressed = FALSE;
2053 return TRUE; // don't send the real Left release 2053 return TRUE; // don't send the real Left release
2054 } 2054 }
2055 } 2055 }
2056 break; 2056 break;
2057 default: 2057 default:
2058 break; 2058 break;
2059 } 2059 }
2060 break; 2060 break;
2061 default: 2061 default:
2062 ; 2062 ;
2063 } 2063 }
2064 } 2064 }
2065 else if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) { 2065 else if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) {
2066 QKeyEvent *ke = (QKeyEvent *)e; 2066 QKeyEvent *ke = (QKeyEvent *)e;
2067 if ( ke->key() == Key_Enter ) { 2067 if ( ke->key() == Key_Enter ) {
2068 if ( o->isA( "QRadioButton" ) || o->isA( "QCheckBox" ) ) { 2068 if ( o->isA( "QRadioButton" ) || o->isA( "QCheckBox" ) ) {
2069 postEvent( o, new QKeyEvent( e->type(), Key_Space, ' ', 2069 postEvent( o, new QKeyEvent( e->type(), Key_Space, ' ',
2070 ke->state(), " ", ke->isAutoRepeat(), ke->count() ) ); 2070 ke->state(), " ", ke->isAutoRepeat(), ke->count() ) );
2071 return TRUE; 2071 return TRUE;
2072 } 2072 }
2073 } 2073 }
2074 } 2074 }
2075 return FALSE; 2075 return FALSE;
2076} 2076}
2077 2077
2078/*! 2078/*!
2079 \reimp 2079 \reimp
2080*/ 2080*/
2081void QPEApplication::timerEvent( QTimerEvent *e ) 2081void QPEApplication::timerEvent( QTimerEvent *e )
2082{ 2082{
2083 if ( e->timerId() == d->presstimer && d->presswidget ) { 2083 if ( e->timerId() == d->presstimer && d->presswidget ) {
2084 // Right pressed 2084 // Right pressed
2085 postEvent( d->presswidget, 2085 postEvent( d->presswidget,
2086 new QMouseEvent( QEvent::MouseButtonPress, d->presspos, 2086 new QMouseEvent( QEvent::MouseButtonPress, d->presspos,
2087 RightButton, LeftButton ) ); 2087 RightButton, LeftButton ) );
2088 killTimer( d->presstimer ); 2088 killTimer( d->presstimer );
2089 d->presstimer = 0; 2089 d->presstimer = 0;
2090 d->rightpressed = TRUE; 2090 d->rightpressed = TRUE;
2091 } 2091 }
2092} 2092}
2093 2093
2094void QPEApplication::removeSenderFromStylusDict() 2094void QPEApplication::removeSenderFromStylusDict()
2095{ 2095{
2096 stylusDict->remove 2096 stylusDict->remove
2097 ( ( void* ) sender() ); 2097 ( ( void* ) sender() );
2098 if ( d->presswidget == sender() ) 2098 if ( d->presswidget == sender() )
2099 d->presswidget = 0; 2099 d->presswidget = 0;
2100} 2100}
2101 2101
2102/*! 2102/*!
2103 \internal 2103 \internal
2104*/ 2104*/
2105bool QPEApplication::keyboardGrabbed() const 2105bool QPEApplication::keyboardGrabbed() const
2106{ 2106{
2107 return d->kbgrabbed; 2107 return d->kbgrabbed;
2108} 2108}
2109 2109
2110 2110
2111/*! 2111/*!
2112 Reverses the effect of grabKeyboard(). This is called automatically 2112 Reverses the effect of grabKeyboard(). This is called automatically
2113 on program exit. 2113 on program exit.
2114*/ 2114*/
2115void QPEApplication::ungrabKeyboard() 2115void QPEApplication::ungrabKeyboard()
2116{ 2116{
2117 ((QPEApplication *) qApp )-> d-> kbgrabbed = false; 2117 ((QPEApplication *) qApp )-> d-> kbgrabbed = false;
2118} 2118}
2119 2119
2120/*! 2120/*!
2121 Grabs the physical keyboard keys, e.g. the application's launching 2121 Grabs the physical keyboard keys, e.g. the application's launching
2122 keys. Instead of launching applications when these keys are pressed 2122 keys. Instead of launching applications when these keys are pressed
2123 the signals emitted are sent to this application instead. Some games 2123 the signals emitted are sent to this application instead. Some games
2124 programs take over the launch keys in this way to make interaction 2124 programs take over the launch keys in this way to make interaction
2125 easier. 2125 easier.
2126 2126
2127 \sa ungrabKeyboard() 2127 \sa ungrabKeyboard()
2128*/ 2128*/
2129void QPEApplication::grabKeyboard() 2129void QPEApplication::grabKeyboard()
2130{ 2130{
2131 ((QPEApplication *) qApp )-> d-> kbgrabbed = true; 2131 ((QPEApplication *) qApp )-> d-> kbgrabbed = true;
2132} 2132}
2133 2133
2134/*! 2134/*!
2135 \reimp 2135 \reimp
2136*/ 2136*/
2137int QPEApplication::exec() 2137int QPEApplication::exec()
2138{ 2138{
2139 d->qcopQok = true; 2139 d->qcopQok = true;
2140#ifndef QT_NO_COP 2140#ifndef QT_NO_COP
2141 d->sendQCopQ(); 2141 d->sendQCopQ();
2142 if ( !d->keep_running ) 2142 if ( !d->keep_running )
2143 processEvents(); // we may have received QCop messages in the meantime. 2143 processEvents(); // we may have received QCop messages in the meantime.
2144#endif 2144#endif
2145 2145
2146 if ( d->keep_running ) 2146 if ( d->keep_running )
2147 //|| d->qpe_main_widget && d->qpe_main_widget->isVisible() ) 2147 //|| d->qpe_main_widget && d->qpe_main_widget->isVisible() )
2148 return QApplication::exec(); 2148 return QApplication::exec();
2149 2149
2150#ifndef QT_NO_COP 2150#ifndef QT_NO_COP
2151 2151
2152 { 2152 {
2153 QCopEnvelope e( "QPE/System", "closing(QString)" ); 2153 QCopEnvelope e( "QPE/System", "closing(QString)" );
2154 e << d->appName; 2154 e << d->appName;
2155 } 2155 }
2156#endif 2156#endif
2157 processEvents(); 2157 processEvents();
2158 return 0; 2158 return 0;
2159} 2159}
2160 2160
2161/*! 2161/*!
2162 \internal 2162 \internal
2163 External request for application to quit. Quits if possible without 2163 External request for application to quit. Quits if possible without
2164 loosing state. 2164 loosing state.
2165*/ 2165*/
2166void QPEApplication::tryQuit() 2166void QPEApplication::tryQuit()
2167{ 2167{
2168 if ( activeModalWidget() ) 2168 if ( activeModalWidget() )
2169 return ; // Inside modal loop or konsole. Too hard to save state. 2169 return ; // Inside modal loop or konsole. Too hard to save state.
2170#ifndef QT_NO_COP 2170#ifndef QT_NO_COP
2171 2171
2172 { 2172 {
2173 QCopEnvelope e( "QPE/System", "closing(QString)" ); 2173 QCopEnvelope e( "QPE/System", "closing(QString)" );
2174 e << d->appName; 2174 e << d->appName;
2175 } 2175 }
2176#endif 2176#endif
2177 if ( d->keep_running ) 2177 if ( d->keep_running )
2178 d->store_widget_rect(d->qpe_main_widget, d->appName); 2178 d->store_widget_rect(d->qpe_main_widget, d->appName);
2179 processEvents(); 2179 processEvents();
2180 2180
2181 quit(); 2181 quit();
2182} 2182}
2183 2183
2184/*! 2184/*!
2185 \internal 2185 \internal
2186*/ 2186*/
2187void QPEApplication::installTranslation( const QString& baseName ) { 2187void QPEApplication::installTranslation( const QString& baseName ) {
2188 QTranslator* trans = new QTranslator(this); 2188 QTranslator* trans = new QTranslator(this);
2189 QString tfn = qpeDir() + "/i18n/"+baseName; 2189 QString tfn = qpeDir() + "/i18n/"+baseName;
2190 if ( trans->load( tfn ) ) 2190 if ( trans->load( tfn ) )
2191 installTranslator( trans ); 2191 installTranslator( trans );
2192 else 2192 else
2193 delete trans; 2193 delete trans;
2194} 2194}
2195 2195
2196/*! 2196/*!
2197 \internal 2197 \internal
2198 User initiated quit. Makes the window 'Go Away'. If preloaded this means 2198 User initiated quit. Makes the window 'Go Away'. If preloaded this means
2199 hiding the window. If not it means quitting the application. 2199 hiding the window. If not it means quitting the application.
2200 As this is user initiated we don't need to check state. 2200 As this is user initiated we don't need to check state.
2201*/ 2201*/
2202void QPEApplication::hideOrQuit() 2202void QPEApplication::hideOrQuit()
2203{ 2203{
2204 if ( d->keep_running ) 2204 if ( d->keep_running )
2205 d->store_widget_rect(d->qpe_main_widget, d->appName); 2205 d->store_widget_rect(d->qpe_main_widget, d->appName);
2206 processEvents(); 2206 processEvents();
2207 2207
2208 // If we are a preloaded application we don't actually quit, so emit 2208 // If we are a preloaded application we don't actually quit, so emit
2209 // a System message indicating we're quasi-closing. 2209 // a System message indicating we're quasi-closing.
2210 if ( d->preloaded && d->qpe_main_widget ) 2210 if ( d->preloaded && d->qpe_main_widget )
2211#ifndef QT_NO_COP 2211#ifndef QT_NO_COP
2212 2212
2213 { 2213 {
2214 QCopEnvelope e("QPE/System", "fastAppHiding(QString)" ); 2214 QCopEnvelope e("QPE/System", "fastAppHiding(QString)" );
2215 e << d->appName; 2215 e << d->appName;
2216 d->qpe_main_widget->hide(); 2216 d->qpe_main_widget->hide();
2217 } 2217 }
2218#endif 2218#endif
2219 else 2219 else
2220 quit(); 2220 quit();
2221} 2221}
2222 2222
2223#if (__GNUC__ > 2 ) 2223#if (__GNUC__ > 2 )
2224extern "C" void __cxa_pure_virtual(); 2224extern "C" void __cxa_pure_virtual();
2225 2225
2226void __cxa_pure_virtual() 2226void __cxa_pure_virtual()
2227{ 2227{
2228 fprintf( stderr, "Pure virtual called\n"); 2228 fprintf( stderr, "Pure virtual called\n");
2229 abort(); 2229 abort();
2230 2230
2231} 2231}
2232 2232
2233#endif 2233#endif
2234 2234
2235 2235
2236#if defined(OPIE_NEW_MALLOC) 2236#if defined(OPIE_NEW_MALLOC)
2237 2237
2238// The libraries with the skiff package (and possibly others) have 2238// The libraries with the skiff package (and possibly others) have
2239// completely useless implementations of builtin new and delete that 2239// completely useless implementations of builtin new and delete that
2240// use about 50% of your CPU. Here we revert to the simple libc 2240// use about 50% of your CPU. Here we revert to the simple libc
2241// functions. 2241// functions.
2242 2242
2243void* operator new[]( size_t size ) 2243void* operator new[]( size_t size )
2244{ 2244{
2245 return malloc( size ); 2245 return malloc( size );
2246} 2246}
2247 2247
2248void* operator new( size_t size ) 2248void* operator new( size_t size )
2249{ 2249{
2250 return malloc( size ); 2250 return malloc( size );
2251} 2251}
2252 2252
2253void operator delete[]( void* p ) 2253void operator delete[]( void* p )
2254{ 2254{
2255 free( p ); 2255 free( p );
2256} 2256}
2257 2257
2258void operator delete[]( void* p, size_t /*size*/ ) 2258void operator delete[]( void* p, size_t /*size*/ )
2259{ 2259{
2260 free( p ); 2260 free( p );
2261} 2261}
2262 2262
2263 2263
2264void operator delete( void* p ) 2264void operator delete( void* p )
2265{ 2265{
2266 free( p ); 2266 free( p );
2267} 2267}
2268 2268
2269void operator delete( void* p, size_t /*size*/ ) 2269void operator delete( void* p, size_t /*size*/ )
2270{ 2270{
2271 free( p ); 2271 free( p );
2272} 2272}
2273 2273
2274#endif 2274#endif
2275 2275
2276#if ( QT_VERSION <= 230 ) && !defined(SINGLE_APP) 2276#if ( QT_VERSION <= 230 ) && !defined(SINGLE_APP)
2277#include <qwidgetlist.h> 2277#include <qwidgetlist.h>
2278#ifdef QWS 2278#ifdef QWS
2279#include <qgfx_qws.h> 2279#include <qgfx_qws.h>
2280extern QRect qt_maxWindowRect; 2280extern QRect qt_maxWindowRect;
2281void qt_setMaxWindowRect(const QRect& r ) 2281void qt_setMaxWindowRect(const QRect& r )
2282{ 2282{
2283 qt_maxWindowRect = qt_screen->mapFromDevice( r, 2283 qt_maxWindowRect = qt_screen->mapFromDevice( r,
2284 qt_screen->mapToDevice( QSize( qt_screen->width(), qt_screen->height() ) ) ); 2284 qt_screen->mapToDevice( QSize( qt_screen->width(), qt_screen->height() ) ) );
2285 // Re-resize any maximized windows 2285 // Re-resize any maximized windows
2286 QWidgetList* l = QApplication::topLevelWidgets(); 2286 QWidgetList* l = QApplication::topLevelWidgets();
2287 if ( l ) { 2287 if ( l ) {
2288 QWidget * w = l->first(); 2288 QWidget * w = l->first();
2289 while ( w ) { 2289 while ( w ) {
2290 if ( w->isVisible() && w->isMaximized() ) { 2290 if ( w->isVisible() && w->isMaximized() ) {
2291 w->showMaximized(); 2291 w->showMaximized();
2292 } 2292 }
2293 w = l->next(); 2293 w = l->next();
2294 } 2294 }
2295 delete l; 2295 delete l;
2296 } 2296 }
2297} 2297}
2298#endif 2298#endif
2299#endif 2299#endif