summaryrefslogtreecommitdiff
authorsandman <sandman>2002-11-17 02:32:39 (UTC)
committer sandman <sandman>2002-11-17 02:32:39 (UTC)
commit22108a3617e8b79acaddea61c1f7f6a0a5117306 (patch) (unidiff)
tree84d896d80e1228b1c39b48cc732bb17cf9960053
parent9ed0a6022d4c3bcd8428096cdf28cad1e0355ab2 (diff)
downloadopie-22108a3617e8b79acaddea61c1f7f6a0a5117306.zip
opie-22108a3617e8b79acaddea61c1f7f6a0a5117306.tar.gz
opie-22108a3617e8b79acaddea61c1f7f6a0a5117306.tar.bz2
- another QT_QWS_EBX -> QT_QWS_SHARP
- since OZ is going to use opieatd/opiealarm, we can ditch the "custom atd" support
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--library/alarmserver.cpp11
-rw-r--r--library/qpeapplication.cpp2
2 files changed, 2 insertions, 11 deletions
diff --git a/library/alarmserver.cpp b/library/alarmserver.cpp
index 7e6e515..5e4dd18 100644
--- a/library/alarmserver.cpp
+++ b/library/alarmserver.cpp
@@ -1,401 +1,392 @@
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 20
21#include <qdir.h> 21#include <qdir.h>
22#include <qfile.h> 22#include <qfile.h>
23#include <qmessagebox.h> 23#include <qmessagebox.h>
24#include <qtextstream.h> 24#include <qtextstream.h>
25 25
26 26
27#include <qpe/qpeapplication.h> 27#include <qpe/qpeapplication.h>
28#include "global.h" 28#include "global.h"
29#include "resource.h" 29#include "resource.h"
30 30
31#include <qpe/qcopenvelope_qws.h> 31#include <qpe/qcopenvelope_qws.h>
32#include "alarmserver.h" 32#include "alarmserver.h"
33#include <qpe/timeconversion.h> 33#include <qpe/timeconversion.h>
34 34
35#include <sys/types.h> 35#include <sys/types.h>
36#include <sys/stat.h> 36#include <sys/stat.h>
37 37
38#include <stdlib.h> 38#include <stdlib.h>
39#include <unistd.h> 39#include <unistd.h>
40 40
41struct timerEventItem { 41struct timerEventItem {
42 time_t UTCtime; 42 time_t UTCtime;
43 QCString channel, message; 43 QCString channel, message;
44 int data; 44 int data;
45 bool operator==( const timerEventItem &right ) const 45 bool operator==( const timerEventItem &right ) const
46 { 46 {
47 return ( UTCtime == right.UTCtime 47 return ( UTCtime == right.UTCtime
48 && channel == right.channel 48 && channel == right.channel
49 && message == right.message 49 && message == right.message
50 && data == right.data ); 50 && data == right.data );
51 } 51 }
52}; 52};
53 53
54class TimerReceiverObject : public QObject 54class TimerReceiverObject : public QObject
55{ 55{
56public: 56public:
57 TimerReceiverObject() { } 57 TimerReceiverObject() { }
58 ~TimerReceiverObject() { } 58 ~TimerReceiverObject() { }
59 void resetTimer(); 59 void resetTimer();
60 void setTimerEventItem(); 60 void setTimerEventItem();
61 void deleteTimer(); 61 void deleteTimer();
62protected: 62protected:
63 void timerEvent( QTimerEvent *te ); 63 void timerEvent( QTimerEvent *te );
64private: 64private:
65 QString atfilename; 65 QString atfilename;
66}; 66};
67 67
68TimerReceiverObject *timerEventReceiver = NULL; 68TimerReceiverObject *timerEventReceiver = NULL;
69QList<timerEventItem> timerEventList; 69QList<timerEventItem> timerEventList;
70timerEventItem *nearestTimerEvent = NULL; 70timerEventItem *nearestTimerEvent = NULL;
71 71
72 72
73// set the timer to go off on the next event in the list 73// set the timer to go off on the next event in the list
74void setNearestTimerEvent() 74void setNearestTimerEvent()
75{ 75{
76 nearestTimerEvent = NULL; 76 nearestTimerEvent = NULL;
77 QListIterator<timerEventItem> it( timerEventList ); 77 QListIterator<timerEventItem> it( timerEventList );
78 if ( *it ) 78 if ( *it )
79 nearestTimerEvent = *it; 79 nearestTimerEvent = *it;
80 for ( ; *it; ++it ) 80 for ( ; *it; ++it )
81 if ( (*it)->UTCtime < nearestTimerEvent->UTCtime ) 81 if ( (*it)->UTCtime < nearestTimerEvent->UTCtime )
82 nearestTimerEvent = *it; 82 nearestTimerEvent = *it;
83 if (nearestTimerEvent) 83 if (nearestTimerEvent)
84 timerEventReceiver->resetTimer(); 84 timerEventReceiver->resetTimer();
85 else 85 else
86 timerEventReceiver->deleteTimer(); 86 timerEventReceiver->deleteTimer();
87} 87}
88 88
89 89
90//store current state to file 90//store current state to file
91//Simple implementation. Should run on a timer. 91//Simple implementation. Should run on a timer.
92 92
93static void saveState() 93static void saveState()
94{ 94{
95 QString savefilename = Global::applicationFileName( "AlarmServer", "saveFile" ); 95 QString savefilename = Global::applicationFileName( "AlarmServer", "saveFile" );
96 if ( timerEventList.isEmpty() ) { 96 if ( timerEventList.isEmpty() ) {
97 unlink( savefilename ); 97 unlink( savefilename );
98 return; 98 return;
99 } 99 }
100 100
101 QFile savefile(savefilename+".new"); 101 QFile savefile(savefilename+".new");
102 if ( savefile.open(IO_WriteOnly) ) { 102 if ( savefile.open(IO_WriteOnly) ) {
103 QDataStream ds( &savefile ); 103 QDataStream ds( &savefile );
104 104
105 //save 105 //save
106 106
107 QListIterator<timerEventItem> it( timerEventList ); 107 QListIterator<timerEventItem> it( timerEventList );
108 for ( ; *it; ++it ) { 108 for ( ; *it; ++it ) {
109 ds << it.current()->UTCtime; 109 ds << it.current()->UTCtime;
110 ds << it.current()->channel; 110 ds << it.current()->channel;
111 ds << it.current()->message; 111 ds << it.current()->message;
112 ds << it.current()->data; 112 ds << it.current()->data;
113 } 113 }
114 114
115 115
116 savefile.close(); 116 savefile.close();
117 unlink( savefilename ); 117 unlink( savefilename );
118 QDir d; d.rename(savefilename+".new",savefilename); 118 QDir d; d.rename(savefilename+".new",savefilename);
119 119
120 } 120 }
121} 121}
122 122
123/*! 123/*!
124 Sets up the alarm server. Restoring to previous state (session management). 124 Sets up the alarm server. Restoring to previous state (session management).
125 */ 125 */
126void AlarmServer::initialize() 126void AlarmServer::initialize()
127{ 127{
128 //read autosave file and put events in timerEventList 128 //read autosave file and put events in timerEventList
129 129
130 QString savefilename = Global::applicationFileName( "AlarmServer", "saveFile" ); 130 QString savefilename = Global::applicationFileName( "AlarmServer", "saveFile" );
131 131
132 QFile savefile(savefilename); 132 QFile savefile(savefilename);
133 if ( savefile.open(IO_ReadOnly) ) { 133 if ( savefile.open(IO_ReadOnly) ) {
134 QDataStream ds( &savefile ); 134 QDataStream ds( &savefile );
135 while ( !ds.atEnd() ) { 135 while ( !ds.atEnd() ) {
136 timerEventItem *newTimerEventItem = new timerEventItem; 136 timerEventItem *newTimerEventItem = new timerEventItem;
137 ds >> newTimerEventItem->UTCtime; 137 ds >> newTimerEventItem->UTCtime;
138 ds >> newTimerEventItem->channel; 138 ds >> newTimerEventItem->channel;
139 ds >> newTimerEventItem->message; 139 ds >> newTimerEventItem->message;
140 ds >> newTimerEventItem->data; 140 ds >> newTimerEventItem->data;
141 timerEventList.append( newTimerEventItem ); 141 timerEventList.append( newTimerEventItem );
142 } 142 }
143 savefile.close(); 143 savefile.close();
144 if (!timerEventReceiver) 144 if (!timerEventReceiver)
145 timerEventReceiver = new TimerReceiverObject; 145 timerEventReceiver = new TimerReceiverObject;
146 setNearestTimerEvent(); 146 setNearestTimerEvent();
147 } 147 }
148} 148}
149 149
150 150
151 151
152 152
153static const char* atdir = "/var/spool/at/"; 153static const char* atdir = "/var/spool/at/";
154 154
155static bool triggerAtd( bool writeHWClock = FALSE ) 155static bool triggerAtd( bool writeHWClock = FALSE )
156{ 156{
157 QFile trigger(QString(atdir) + "trigger"); 157 QFile trigger(QString(atdir) + "trigger");
158 if ( trigger.open(IO_WriteOnly|IO_Raw) ) { 158 if ( trigger.open(IO_WriteOnly|IO_Raw) ) {
159 159 if ( trigger.writeBlock("\n",2) != 2 ) {
160 const char* data =
161#ifdef QT_QWS_SHARP
162 //custom atd only writes HW Clock if we write a 'W'
163 ( writeHWClock ) ? "W\n" :
164#endif
165 data = "\n";
166 int len = strlen(data);
167 int total_written = trigger.writeBlock(data,len);
168 if ( total_written != len ) {
169 QMessageBox::critical( 0, QObject::tr( "Out of Space" ), 160 QMessageBox::critical( 0, QObject::tr( "Out of Space" ),
170 QObject::tr( "Unable to schedule alarm.\nFree some memory and try again." ) ); 161 QObject::tr( "Unable to schedule alarm.\nFree some memory and try again." ) );
171 trigger.close(); 162 trigger.close();
172 QFile::remove( trigger.name() ); 163 QFile::remove( trigger.name() );
173 return FALSE; 164 return FALSE;
174 } 165 }
175 return TRUE; 166 return TRUE;
176 } 167 }
177 return FALSE; 168 return FALSE;
178} 169}
179 170
180void TimerReceiverObject::deleteTimer() 171void TimerReceiverObject::deleteTimer()
181{ 172{
182 if ( !atfilename.isEmpty() ) { 173 if ( !atfilename.isEmpty() ) {
183 unlink( atfilename ); 174 unlink( atfilename );
184 atfilename = QString::null; 175 atfilename = QString::null;
185 triggerAtd( FALSE ); 176 triggerAtd( FALSE );
186 } 177 }
187} 178}
188 179
189void TimerReceiverObject::resetTimer() 180void TimerReceiverObject::resetTimer()
190{ 181{
191 const int maxsecs = 2147000; 182 const int maxsecs = 2147000;
192 int total_written; 183 int total_written;
193 QDateTime nearest = TimeConversion::fromUTC(nearestTimerEvent->UTCtime); 184 QDateTime nearest = TimeConversion::fromUTC(nearestTimerEvent->UTCtime);
194 QDateTime now = QDateTime::currentDateTime(); 185 QDateTime now = QDateTime::currentDateTime();
195 if ( nearest < now ) 186 if ( nearest < now )
196 nearest = now; 187 nearest = now;
197 int secs = TimeConversion::secsTo( now, nearest ); 188 int secs = TimeConversion::secsTo( now, nearest );
198 if ( secs > maxsecs ) { 189 if ( secs > maxsecs ) {
199 // too far for millisecond timing 190 // too far for millisecond timing
200 secs = maxsecs; 191 secs = maxsecs;
201 } 192 }
202 193
203 // System timer (needed so that we wake from deep sleep), 194 // System timer (needed so that we wake from deep sleep),
204 // from the Epoch in seconds. 195 // from the Epoch in seconds.
205 // 196 //
206 int at_secs = TimeConversion::toUTC(nearest); 197 int at_secs = TimeConversion::toUTC(nearest);
207 // qDebug("reset timer to %d seconds from Epoch",at_secs); 198 // qDebug("reset timer to %d seconds from Epoch",at_secs);
208 QString fn = atdir + QString::number(at_secs) + "." 199 QString fn = atdir + QString::number(at_secs) + "."
209 + QString::number(getpid()); 200 + QString::number(getpid());
210 if ( fn != atfilename ) { 201 if ( fn != atfilename ) {
211 QFile atfile(fn+".new"); 202 QFile atfile(fn+".new");
212 if ( atfile.open(IO_WriteOnly|IO_Raw) ) { 203 if ( atfile.open(IO_WriteOnly|IO_Raw) ) {
213 // just wake up and delete the at file 204 // just wake up and delete the at file
214 QString cmd = "#!/bin/sh\nrm " + fn; 205 QString cmd = "#!/bin/sh\nrm " + fn;
215 total_written = atfile.writeBlock(cmd.latin1(),cmd.length()); 206 total_written = atfile.writeBlock(cmd.latin1(),cmd.length());
216 if ( total_written != int(cmd.length()) ) { 207 if ( total_written != int(cmd.length()) ) {
217 QMessageBox::critical( 0, tr("Out of Space"), 208 QMessageBox::critical( 0, tr("Out of Space"),
218 tr("Unable to schedule alarm.\n" 209 tr("Unable to schedule alarm.\n"
219 "Please free up space and try again") ); 210 "Please free up space and try again") );
220 atfile.close(); 211 atfile.close();
221 QFile::remove( atfile.name() ); 212 QFile::remove( atfile.name() );
222 return; 213 return;
223 } 214 }
224 atfile.close(); 215 atfile.close();
225 unlink( atfilename ); 216 unlink( atfilename );
226 QDir d; d.rename(fn+".new",fn); 217 QDir d; d.rename(fn+".new",fn);
227 chmod(fn.latin1(),0755); 218 chmod(fn.latin1(),0755);
228 atfilename = fn; 219 atfilename = fn;
229 triggerAtd( FALSE ); 220 triggerAtd( FALSE );
230 } else { 221 } else {
231 qWarning("Cannot open atd file %s",fn.latin1()); 222 qWarning("Cannot open atd file %s",fn.latin1());
232 } 223 }
233 } 224 }
234 // Qt timers (does the actual alarm) 225 // Qt timers (does the actual alarm)
235 // from now in milliseconds 226 // from now in milliseconds
236 // 227 //
237 qDebug("AlarmServer waiting %d seconds",secs); 228 qDebug("AlarmServer waiting %d seconds",secs);
238 startTimer( 1000 * secs + 500 ); 229 startTimer( 1000 * secs + 500 );
239} 230}
240 231
241void TimerReceiverObject::timerEvent( QTimerEvent * ) 232void TimerReceiverObject::timerEvent( QTimerEvent * )
242{ 233{
243 bool needSave = FALSE; 234 bool needSave = FALSE;
244 killTimers(); 235 killTimers();
245 if (nearestTimerEvent) { 236 if (nearestTimerEvent) {
246 if ( nearestTimerEvent->UTCtime 237 if ( nearestTimerEvent->UTCtime
247 <= TimeConversion::toUTC(QDateTime::currentDateTime()) ) { 238 <= TimeConversion::toUTC(QDateTime::currentDateTime()) ) {
248#ifndef QT_NO_COP 239#ifndef QT_NO_COP
249 QCopEnvelope e( nearestTimerEvent->channel, 240 QCopEnvelope e( nearestTimerEvent->channel,
250 nearestTimerEvent->message ); 241 nearestTimerEvent->message );
251 e << TimeConversion::fromUTC( nearestTimerEvent->UTCtime ) 242 e << TimeConversion::fromUTC( nearestTimerEvent->UTCtime )
252 << nearestTimerEvent->data; 243 << nearestTimerEvent->data;
253#endif 244#endif
254 timerEventList.remove( nearestTimerEvent ); 245 timerEventList.remove( nearestTimerEvent );
255 needSave = TRUE; 246 needSave = TRUE;
256 } 247 }
257 setNearestTimerEvent(); 248 setNearestTimerEvent();
258 } else { 249 } else {
259 resetTimer(); 250 resetTimer();
260 } 251 }
261 if ( needSave ) 252 if ( needSave )
262 saveState(); 253 saveState();
263} 254}
264 255
265/*! 256/*!
266 \class AlarmServer alarmserver.h 257 \class AlarmServer alarmserver.h
267 \brief The AlarmServer class allows alarms to be scheduled and unscheduled. 258 \brief The AlarmServer class allows alarms to be scheduled and unscheduled.
268 259
269 Applications can schedule alarms with addAlarm() and can 260 Applications can schedule alarms with addAlarm() and can
270 unschedule alarms with deleteAlarm(). When the time for an alarm 261 unschedule alarms with deleteAlarm(). When the time for an alarm
271 to go off is reached the specified \link qcop.html QCop\endlink 262 to go off is reached the specified \link qcop.html QCop\endlink
272 message is sent on the specified channel (optionally with 263 message is sent on the specified channel (optionally with
273 additional data). 264 additional data).
274 265
275 Scheduling an alarm using this class is important (rather just using 266 Scheduling an alarm using this class is important (rather just using
276 a QTimer) since the machine may be asleep and needs to get woken up using 267 a QTimer) since the machine may be asleep and needs to get woken up using
277 the Linux kernel which implements this at the kernel level to minimize 268 the Linux kernel which implements this at the kernel level to minimize
278 battery usage while asleep. 269 battery usage while asleep.
279 270
280 \ingroup qtopiaemb 271 \ingroup qtopiaemb
281 \sa QCopEnvelope 272 \sa QCopEnvelope
282*/ 273*/
283 274
284/*! 275/*!
285 Schedules an alarm to go off at (or soon after) time \a when. When 276 Schedules an alarm to go off at (or soon after) time \a when. When
286 the alarm goes off, the \link qcop.html QCop\endlink \a message will 277 the alarm goes off, the \link qcop.html QCop\endlink \a message will
287 be sent to \a channel, with \a data as a parameter. 278 be sent to \a channel, with \a data as a parameter.
288 279
289 If this function is called with exactly the same data as a previous 280 If this function is called with exactly the same data as a previous
290 call the subsequent call is ignored, so there is only ever one alarm 281 call the subsequent call is ignored, so there is only ever one alarm
291 with a given set of parameters. 282 with a given set of parameters.
292 283
293 \sa deleteAlarm() 284 \sa deleteAlarm()
294*/ 285*/
295void AlarmServer::addAlarm ( QDateTime when, const QCString& channel, 286void AlarmServer::addAlarm ( QDateTime when, const QCString& channel,
296 const QCString& message, int data) 287 const QCString& message, int data)
297{ 288{
298 if ( qApp->type() == QApplication::GuiServer ) { 289 if ( qApp->type() == QApplication::GuiServer ) {
299 bool needSave = FALSE; 290 bool needSave = FALSE;
300 // Here we are the server so either it has been directly called from 291 // Here we are the server so either it has been directly called from
301 // within the server or it has been sent to us from a client via QCop 292 // within the server or it has been sent to us from a client via QCop
302 if (!timerEventReceiver) 293 if (!timerEventReceiver)
303 timerEventReceiver = new TimerReceiverObject; 294 timerEventReceiver = new TimerReceiverObject;
304 295
305 timerEventItem *newTimerEventItem = new timerEventItem; 296 timerEventItem *newTimerEventItem = new timerEventItem;
306 newTimerEventItem->UTCtime = TimeConversion::toUTC( when ); 297 newTimerEventItem->UTCtime = TimeConversion::toUTC( when );
307 newTimerEventItem->channel = channel; 298 newTimerEventItem->channel = channel;
308 newTimerEventItem->message = message; 299 newTimerEventItem->message = message;
309 newTimerEventItem->data = data; 300 newTimerEventItem->data = data;
310 // explore the case of already having the event in here... 301 // explore the case of already having the event in here...
311 QListIterator<timerEventItem> it( timerEventList ); 302 QListIterator<timerEventItem> it( timerEventList );
312 for ( ; *it; ++it ) 303 for ( ; *it; ++it )
313 if ( *(*it) == *newTimerEventItem ) 304 if ( *(*it) == *newTimerEventItem )
314 return; 305 return;
315 // if we made it here, it is okay to add the item... 306 // if we made it here, it is okay to add the item...
316 timerEventList.append( newTimerEventItem ); 307 timerEventList.append( newTimerEventItem );
317 needSave = TRUE; 308 needSave = TRUE;
318 // quicker than using setNearestTimerEvent() 309 // quicker than using setNearestTimerEvent()
319 if ( nearestTimerEvent ) { 310 if ( nearestTimerEvent ) {
320 if (newTimerEventItem->UTCtime < nearestTimerEvent->UTCtime) { 311 if (newTimerEventItem->UTCtime < nearestTimerEvent->UTCtime) {
321 nearestTimerEvent = newTimerEventItem; 312 nearestTimerEvent = newTimerEventItem;
322 timerEventReceiver->killTimers(); 313 timerEventReceiver->killTimers();
323 timerEventReceiver->resetTimer(); 314 timerEventReceiver->resetTimer();
324 } 315 }
325 } else { 316 } else {
326 nearestTimerEvent = newTimerEventItem; 317 nearestTimerEvent = newTimerEventItem;
327 timerEventReceiver->resetTimer(); 318 timerEventReceiver->resetTimer();
328 } 319 }
329 if ( needSave ) 320 if ( needSave )
330 saveState(); 321 saveState();
331 } else { 322 } else {
332#ifndef QT_NO_COP 323#ifndef QT_NO_COP
333 QCopEnvelope e( "QPE/System", "addAlarm(QDateTime,QCString,QCString,int)" ); 324 QCopEnvelope e( "QPE/System", "addAlarm(QDateTime,QCString,QCString,int)" );
334 e << when << channel << message << data; 325 e << when << channel << message << data;
335#endif 326#endif
336 } 327 }
337} 328}
338 329
339/*! 330/*!
340 Deletes previously scheduled alarms which match \a when, \a channel, 331 Deletes previously scheduled alarms which match \a when, \a channel,
341 \a message, and \a data. 332 \a message, and \a data.
342 333
343 Passing null values for \a when, \a channel, or for the \link 334 Passing null values for \a when, \a channel, or for the \link
344 qcop.html QCop\endlink \a message, acts as a wildcard meaning "any". 335 qcop.html QCop\endlink \a message, acts as a wildcard meaning "any".
345 Similarly, passing -1 for \a data indicates "any". 336 Similarly, passing -1 for \a data indicates "any".
346 337
347 If there is no matching alarm, nothing happens. 338 If there is no matching alarm, nothing happens.
348 339
349 \sa addAlarm() 340 \sa addAlarm()
350 341
351*/ 342*/
352void AlarmServer::deleteAlarm (QDateTime when, const QCString& channel, const QCString& message, int data) 343void AlarmServer::deleteAlarm (QDateTime when, const QCString& channel, const QCString& message, int data)
353{ 344{
354 if ( qApp->type() == QApplication::GuiServer) { 345 if ( qApp->type() == QApplication::GuiServer) {
355 bool needSave = FALSE; 346 bool needSave = FALSE;
356 if ( timerEventReceiver != NULL ) { 347 if ( timerEventReceiver != NULL ) {
357 timerEventReceiver->killTimers(); 348 timerEventReceiver->killTimers();
358 349
359 // iterate over the list of events 350 // iterate over the list of events
360 QListIterator<timerEventItem> it( timerEventList ); 351 QListIterator<timerEventItem> it( timerEventList );
361 time_t deleteTime = TimeConversion::toUTC( when ); 352 time_t deleteTime = TimeConversion::toUTC( when );
362 for ( ; *it; ++it ) { 353 for ( ; *it; ++it ) {
363 // if its a match, delete it 354 // if its a match, delete it
364 if ( ( (*it)->UTCtime == deleteTime || when.isNull() ) 355 if ( ( (*it)->UTCtime == deleteTime || when.isNull() )
365 && ( channel.isNull() || (*it)->channel == channel ) 356 && ( channel.isNull() || (*it)->channel == channel )
366 && ( message.isNull() || (*it)->message == message ) 357 && ( message.isNull() || (*it)->message == message )
367 && ( data==-1 || (*it)->data == data ) ) 358 && ( data==-1 || (*it)->data == data ) )
368 { 359 {
369 // if it's first, then we need to update the timer 360 // if it's first, then we need to update the timer
370 if ( (*it) == nearestTimerEvent ) { 361 if ( (*it) == nearestTimerEvent ) {
371 timerEventList.remove(*it); 362 timerEventList.remove(*it);
372 setNearestTimerEvent(); 363 setNearestTimerEvent();
373 } else { 364 } else {
374 timerEventList.remove(*it); 365 timerEventList.remove(*it);
375 } 366 }
376 needSave = TRUE; 367 needSave = TRUE;
377 } 368 }
378 } 369 }
379 if ( nearestTimerEvent ) 370 if ( nearestTimerEvent )
380 timerEventReceiver->resetTimer(); 371 timerEventReceiver->resetTimer();
381 } 372 }
382 if ( needSave ) 373 if ( needSave )
383 saveState(); 374 saveState();
384 } else { 375 } else {
385#ifndef QT_NO_COP 376#ifndef QT_NO_COP
386 QCopEnvelope e( "QPE/System", "deleteAlarm(QDateTime,QCString,QCString,int)" ); 377 QCopEnvelope e( "QPE/System", "deleteAlarm(QDateTime,QCString,QCString,int)" );
387 e << when << channel << message << data; 378 e << when << channel << message << data;
388#endif 379#endif
389 } 380 }
390} 381}
391 382
392/*! 383/*!
393 Writes the system clock to the hardware clock. 384 Writes the system clock to the hardware clock.
394*/ 385*/
395void Global::writeHWClock() 386void Global::writeHWClock()
396{ 387{
397 if ( !triggerAtd( TRUE ) ) { 388 if ( !triggerAtd( TRUE ) ) {
398 // atd not running? set it ourselves 389 // atd not running? set it ourselves
399 system("/sbin/hwclock --systohc"); // ##### UTC? 390 system("/sbin/hwclock --systohc"); // ##### UTC?
400 } 391 }
401} 392}
diff --git a/library/qpeapplication.cpp b/library/qpeapplication.cpp
index 65fac84..efa65bc 100644
--- a/library/qpeapplication.cpp
+++ b/library/qpeapplication.cpp
@@ -1,1702 +1,1702 @@
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** $Id$ 19** $Id$
20** 20**
21**********************************************************************/ 21**********************************************************************/
22#define QTOPIA_INTERNAL_LANGLIST 22#define QTOPIA_INTERNAL_LANGLIST
23#include <stdlib.h> 23#include <stdlib.h>
24#include <unistd.h> 24#include <unistd.h>
25#include <qfile.h> 25#include <qfile.h>
26#ifdef Q_WS_QWS 26#ifdef Q_WS_QWS
27#ifndef QT_NO_COP 27#ifndef QT_NO_COP
28#if QT_VERSION <= 231 28#if QT_VERSION <= 231
29#define private public 29#define private public
30#define sendLocally processEvent 30#define sendLocally processEvent
31#include "qcopenvelope_qws.h" 31#include "qcopenvelope_qws.h"
32#undef private 32#undef private
33#else 33#else
34#include "qcopenvelope_qws.h" 34#include "qcopenvelope_qws.h"
35#endif 35#endif
36#endif 36#endif
37#include <qwindowsystem_qws.h> 37#include <qwindowsystem_qws.h>
38#endif 38#endif
39#include <qtextstream.h> 39#include <qtextstream.h>
40#include <qpalette.h> 40#include <qpalette.h>
41#include <qbuffer.h> 41#include <qbuffer.h>
42#include <qptrdict.h> 42#include <qptrdict.h>
43#include <qregexp.h> 43#include <qregexp.h>
44#include <qdir.h> 44#include <qdir.h>
45#include <qlabel.h> 45#include <qlabel.h>
46#include <qdialog.h> 46#include <qdialog.h>
47#include <qdragobject.h> 47#include <qdragobject.h>
48#include <qtextcodec.h> 48#include <qtextcodec.h>
49#include <qevent.h> 49#include <qevent.h>
50#include <qtooltip.h> 50#include <qtooltip.h>
51#include <qsignal.h> 51#include <qsignal.h>
52#include "qpeapplication.h" 52#include "qpeapplication.h"
53#include "qpestyle.h" 53#include "qpestyle.h"
54#include "styleinterface.h" 54#include "styleinterface.h"
55#if QT_VERSION >= 300 55#if QT_VERSION >= 300
56#include <qstylefactory.h> 56#include <qstylefactory.h>
57#else 57#else
58#include <qplatinumstyle.h> 58#include <qplatinumstyle.h>
59#include <qwindowsstyle.h> 59#include <qwindowsstyle.h>
60#include <qmotifstyle.h> 60#include <qmotifstyle.h>
61#include <qmotifplusstyle.h> 61#include <qmotifplusstyle.h>
62#include "lightstyle.h" 62#include "lightstyle.h"
63 63
64#include <qpe/qlibrary.h> 64#include <qpe/qlibrary.h>
65#endif 65#endif
66#include "global.h" 66#include "global.h"
67#include "resource.h" 67#include "resource.h"
68#if QT_VERSION <= 230 && defined(QT_NO_CODECS) 68#if QT_VERSION <= 230 && defined(QT_NO_CODECS)
69#include "qutfcodec.h" 69#include "qutfcodec.h"
70#endif 70#endif
71#include "config.h" 71#include "config.h"
72#include "network.h" 72#include "network.h"
73#ifdef QWS 73#ifdef QWS
74#include "fontmanager.h" 74#include "fontmanager.h"
75#endif 75#endif
76 76
77#include "alarmserver.h" 77#include "alarmserver.h"
78#include "applnk.h" 78#include "applnk.h"
79#include "qpemenubar.h" 79#include "qpemenubar.h"
80#include "textcodecinterface.h" 80#include "textcodecinterface.h"
81#include "imagecodecinterface.h" 81#include "imagecodecinterface.h"
82 82
83#include <unistd.h> 83#include <unistd.h>
84#include <sys/file.h> 84#include <sys/file.h>
85#include <sys/ioctl.h> 85#include <sys/ioctl.h>
86#include <sys/soundcard.h> 86#include <sys/soundcard.h>
87 87
88 88
89class QPEApplicationData 89class QPEApplicationData
90{ 90{
91public: 91public:
92 QPEApplicationData() : presstimer( 0 ), presswidget( 0 ), rightpressed( FALSE ), 92 QPEApplicationData() : presstimer( 0 ), presswidget( 0 ), rightpressed( FALSE ),
93 kbgrabber( 0 ), kbregrab( FALSE ), notbusysent( FALSE ), preloaded( FALSE ), 93 kbgrabber( 0 ), kbregrab( FALSE ), notbusysent( FALSE ), preloaded( FALSE ),
94 forceshow( FALSE ), nomaximize( FALSE ), qpe_main_widget( 0 ), 94 forceshow( FALSE ), nomaximize( FALSE ), qpe_main_widget( 0 ),
95 keep_running( TRUE ) 95 keep_running( TRUE )
96 { 96 {
97 qcopq.setAutoDelete( TRUE ); 97 qcopq.setAutoDelete( TRUE );
98 } 98 }
99 99
100 int presstimer; 100 int presstimer;
101 QWidget* presswidget; 101 QWidget* presswidget;
102 QPoint presspos; 102 QPoint presspos;
103bool rightpressed : 103bool rightpressed :
104 1; // AEH why not use uint foobar :1; if it's tt style -zecke 104 1; // AEH why not use uint foobar :1; if it's tt style -zecke
105 int kbgrabber; 105 int kbgrabber;
106bool kbregrab : 106bool kbregrab :
107 1; 107 1;
108bool notbusysent : 108bool notbusysent :
109 1; 109 1;
110 QString appName; 110 QString appName;
111 struct QCopRec 111 struct QCopRec
112 { 112 {
113 QCopRec( const QCString &ch, const QCString &msg, 113 QCopRec( const QCString &ch, const QCString &msg,
114 const QByteArray &d ) : 114 const QByteArray &d ) :
115 channel( ch ), message( msg ), data( d ) 115 channel( ch ), message( msg ), data( d )
116 { } 116 { }
117 117
118 QCString channel; 118 QCString channel;
119 QCString message; 119 QCString message;
120 QByteArray data; 120 QByteArray data;
121 }; 121 };
122bool preloaded : 122bool preloaded :
123 1; 123 1;
124bool forceshow : 124bool forceshow :
125 1; 125 1;
126bool nomaximize : 126bool nomaximize :
127 1; 127 1;
128 QWidget* qpe_main_widget; 128 QWidget* qpe_main_widget;
129bool keep_running : 129bool keep_running :
130 1; 130 1;
131 QList<QCopRec> qcopq; 131 QList<QCopRec> qcopq;
132 132
133 void enqueueQCop( const QCString &ch, const QCString &msg, 133 void enqueueQCop( const QCString &ch, const QCString &msg,
134 const QByteArray &data ) 134 const QByteArray &data )
135 { 135 {
136 qcopq.append( new QCopRec( ch, msg, data ) ); 136 qcopq.append( new QCopRec( ch, msg, data ) );
137 } 137 }
138 void sendQCopQ() 138 void sendQCopQ()
139 { 139 {
140 QCopRec * r; 140 QCopRec * r;
141#ifndef QT_NO_COP 141#ifndef QT_NO_COP
142 142
143 for ( QListIterator<QCopRec> it( qcopq ); ( r = it.current() ); ++it ) 143 for ( QListIterator<QCopRec> it( qcopq ); ( r = it.current() ); ++it )
144 QCopChannel::sendLocally( r->channel, r->message, r->data ); 144 QCopChannel::sendLocally( r->channel, r->message, r->data );
145#endif 145#endif
146 146
147 qcopq.clear(); 147 qcopq.clear();
148 } 148 }
149 static void show_mx(QWidget* mw, bool nomaximize) 149 static void show_mx(QWidget* mw, bool nomaximize)
150 { 150 {
151 if ( mw->layout() && mw->inherits("QDialog") ) { 151 if ( mw->layout() && mw->inherits("QDialog") ) {
152 QPEApplication::showDialog((QDialog*)mw, nomaximize); 152 QPEApplication::showDialog((QDialog*)mw, nomaximize);
153 } 153 }
154 else { 154 else {
155#ifdef Q_WS_QWS 155#ifdef Q_WS_QWS
156 if ( !nomaximize ) 156 if ( !nomaximize )
157 mw->showMaximized(); 157 mw->showMaximized();
158 else 158 else
159#endif 159#endif
160 160
161 mw->show(); 161 mw->show();
162 } 162 }
163 } 163 }
164 static bool setWidgetCaptionFromAppName( QWidget* /*mw*/, const QString& /*appName*/, const QString& /*appsPath*/ ) 164 static bool setWidgetCaptionFromAppName( QWidget* /*mw*/, const QString& /*appName*/, const QString& /*appsPath*/ )
165 { 165 {
166 /* 166 /*
167 // This works but disable it for now until it is safe to apply 167 // This works but disable it for now until it is safe to apply
168 // What is does is scan the .desktop files of all the apps for 168 // What is does is scan the .desktop files of all the apps for
169 // the applnk that has the corresponding argv[0] as this program 169 // the applnk that has the corresponding argv[0] as this program
170 // then it uses the name stored in the .desktop file as the caption 170 // then it uses the name stored in the .desktop file as the caption
171 // for the main widget. This saves duplicating translations for 171 // for the main widget. This saves duplicating translations for
172 // the app name in the program and in the .desktop files. 172 // the app name in the program and in the .desktop files.
173 173
174 AppLnkSet apps( appsPath ); 174 AppLnkSet apps( appsPath );
175 175
176 QList<AppLnk> appsList = apps.children(); 176 QList<AppLnk> appsList = apps.children();
177 for ( QListIterator<AppLnk> it(appsList); it.current(); ++it ) { 177 for ( QListIterator<AppLnk> it(appsList); it.current(); ++it ) {
178 if ( (*it)->exec() == appName ) { 178 if ( (*it)->exec() == appName ) {
179 mw->setCaption( (*it)->name() ); 179 mw->setCaption( (*it)->name() );
180 return TRUE; 180 return TRUE;
181 } 181 }
182 } 182 }
183 */ 183 */
184 return FALSE; 184 return FALSE;
185 } 185 }
186 186
187 187
188 void show(QWidget* mw, bool nomax) 188 void show(QWidget* mw, bool nomax)
189 { 189 {
190 setWidgetCaptionFromAppName( mw, appName, QPEApplication::qpeDir() + "apps" ); 190 setWidgetCaptionFromAppName( mw, appName, QPEApplication::qpeDir() + "apps" );
191 nomaximize = nomax; 191 nomaximize = nomax;
192 qpe_main_widget = mw; 192 qpe_main_widget = mw;
193#ifndef QT_NO_COP 193#ifndef QT_NO_COP
194 194
195 sendQCopQ(); 195 sendQCopQ();
196#endif 196#endif
197 197
198 if ( preloaded ) { 198 if ( preloaded ) {
199 if (forceshow) 199 if (forceshow)
200 show_mx(mw, nomax); 200 show_mx(mw, nomax);
201 } 201 }
202 else if ( keep_running ) { 202 else if ( keep_running ) {
203 show_mx(mw, nomax); 203 show_mx(mw, nomax);
204 } 204 }
205 } 205 }
206 206
207 void loadTextCodecs() 207 void loadTextCodecs()
208 { 208 {
209 QString path = QPEApplication::qpeDir() + "/plugins/textcodecs"; 209 QString path = QPEApplication::qpeDir() + "/plugins/textcodecs";
210 QDir dir( path, "lib*.so" ); 210 QDir dir( path, "lib*.so" );
211 QStringList list = dir.entryList(); 211 QStringList list = dir.entryList();
212 QStringList::Iterator it; 212 QStringList::Iterator it;
213 for ( it = list.begin(); it != list.end(); ++it ) { 213 for ( it = list.begin(); it != list.end(); ++it ) {
214 TextCodecInterface *iface = 0; 214 TextCodecInterface *iface = 0;
215 QLibrary *lib = new QLibrary( path + "/" + *it ); 215 QLibrary *lib = new QLibrary( path + "/" + *it );
216 if ( lib->queryInterface( IID_QtopiaTextCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) { 216 if ( lib->queryInterface( IID_QtopiaTextCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) {
217 QValueList<int> mibs = iface->mibEnums(); 217 QValueList<int> mibs = iface->mibEnums();
218 for (QValueList<int>::ConstIterator i = mibs.begin(); i != mibs.end(); ++i) { 218 for (QValueList<int>::ConstIterator i = mibs.begin(); i != mibs.end(); ++i) {
219 (void)iface->createForMib(*i); 219 (void)iface->createForMib(*i);
220 // ### it exists now; need to remember if we can delete it 220 // ### it exists now; need to remember if we can delete it
221 } 221 }
222 } 222 }
223 else { 223 else {
224 lib->unload(); 224 lib->unload();
225 delete lib; 225 delete lib;
226 } 226 }
227 } 227 }
228 } 228 }
229 229
230 void loadImageCodecs() 230 void loadImageCodecs()
231 { 231 {
232 QString path = QPEApplication::qpeDir() + "/plugins/imagecodecs"; 232 QString path = QPEApplication::qpeDir() + "/plugins/imagecodecs";
233 QDir dir( path, "lib*.so" ); 233 QDir dir( path, "lib*.so" );
234 QStringList list = dir.entryList(); 234 QStringList list = dir.entryList();
235 QStringList::Iterator it; 235 QStringList::Iterator it;
236 for ( it = list.begin(); it != list.end(); ++it ) { 236 for ( it = list.begin(); it != list.end(); ++it ) {
237 ImageCodecInterface *iface = 0; 237 ImageCodecInterface *iface = 0;
238 QLibrary *lib = new QLibrary( path + "/" + *it ); 238 QLibrary *lib = new QLibrary( path + "/" + *it );
239 if ( lib->queryInterface( IID_QtopiaImageCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) { 239 if ( lib->queryInterface( IID_QtopiaImageCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) {
240 QStringList formats = iface->keys(); 240 QStringList formats = iface->keys();
241 for (QStringList::ConstIterator i = formats.begin(); i != formats.end(); ++i) { 241 for (QStringList::ConstIterator i = formats.begin(); i != formats.end(); ++i) {
242 (void)iface->installIOHandler(*i); 242 (void)iface->installIOHandler(*i);
243 // ### it exists now; need to remember if we can delete it 243 // ### it exists now; need to remember if we can delete it
244 } 244 }
245 } 245 }
246 else { 246 else {
247 lib->unload(); 247 lib->unload();
248 delete lib; 248 delete lib;
249 } 249 }
250 } 250 }
251 } 251 }
252 QString styleName; 252 QString styleName;
253 QString decorationName; 253 QString decorationName;
254}; 254};
255 255
256class ResourceMimeFactory : public QMimeSourceFactory 256class ResourceMimeFactory : public QMimeSourceFactory
257{ 257{
258public: 258public:
259 ResourceMimeFactory() 259 ResourceMimeFactory()
260 { 260 {
261 setFilePath( Global::helpPath() ); 261 setFilePath( Global::helpPath() );
262 setExtensionType( "html", "text/html;charset=UTF-8" ); 262 setExtensionType( "html", "text/html;charset=UTF-8" );
263 } 263 }
264 264
265 const QMimeSource* data( const QString& abs_name ) const 265 const QMimeSource* data( const QString& abs_name ) const
266 { 266 {
267 const QMimeSource * r = QMimeSourceFactory::data( abs_name ); 267 const QMimeSource * r = QMimeSourceFactory::data( abs_name );
268 if ( !r ) { 268 if ( !r ) {
269 int sl = abs_name.length(); 269 int sl = abs_name.length();
270 do { 270 do {
271 sl = abs_name.findRev( '/', sl - 1 ); 271 sl = abs_name.findRev( '/', sl - 1 );
272 QString name = sl >= 0 ? abs_name.mid( sl + 1 ) : abs_name; 272 QString name = sl >= 0 ? abs_name.mid( sl + 1 ) : abs_name;
273 int dot = name.findRev( '.' ); 273 int dot = name.findRev( '.' );
274 if ( dot >= 0 ) 274 if ( dot >= 0 )
275 name = name.left( dot ); 275 name = name.left( dot );
276 QImage img = Resource::loadImage( name ); 276 QImage img = Resource::loadImage( name );
277 if ( !img.isNull() ) 277 if ( !img.isNull() )
278 r = new QImageDrag( img ); 278 r = new QImageDrag( img );
279 } 279 }
280 while ( !r && sl > 0 ); 280 while ( !r && sl > 0 );
281 } 281 }
282 return r; 282 return r;
283 } 283 }
284}; 284};
285 285
286static int muted = 0; 286static int muted = 0;
287static int micMuted = 0; 287static int micMuted = 0;
288 288
289static void setVolume( int t = 0, int percent = -1 ) 289static void setVolume( int t = 0, int percent = -1 )
290{ 290{
291 switch ( t ) { 291 switch ( t ) {
292 case 0: { 292 case 0: {
293 Config cfg( "qpe" ); 293 Config cfg( "qpe" );
294 cfg.setGroup( "Volume" ); 294 cfg.setGroup( "Volume" );
295 if ( percent < 0 ) 295 if ( percent < 0 )
296 percent = cfg.readNumEntry( "VolumePercent", 50 ); 296 percent = cfg.readNumEntry( "VolumePercent", 50 );
297 int fd = 0; 297 int fd = 0;
298 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) { 298 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) {
299 int vol = muted ? 0 : percent; 299 int vol = muted ? 0 : percent;
300 // set both channels to same volume 300 // set both channels to same volume
301 vol |= vol << 8; 301 vol |= vol << 8;
302 ioctl( fd, MIXER_WRITE( 0 ), &vol ); 302 ioctl( fd, MIXER_WRITE( 0 ), &vol );
303 ::close( fd ); 303 ::close( fd );
304 } 304 }
305 } 305 }
306 break; 306 break;
307 } 307 }
308} 308}
309 309
310static void setMic( int t = 0, int percent = -1 ) 310static void setMic( int t = 0, int percent = -1 )
311{ 311{
312 switch ( t ) { 312 switch ( t ) {
313 case 0: { 313 case 0: {
314 Config cfg( "qpe" ); 314 Config cfg( "qpe" );
315 cfg.setGroup( "Volume" ); 315 cfg.setGroup( "Volume" );
316 if ( percent < 0 ) 316 if ( percent < 0 )
317 percent = cfg.readNumEntry( "Mic", 50 ); 317 percent = cfg.readNumEntry( "Mic", 50 );
318 318
319 int fd = 0; 319 int fd = 0;
320 int mic = micMuted ? 0 : percent; 320 int mic = micMuted ? 0 : percent;
321 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) { 321 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) {
322 ioctl( fd, MIXER_WRITE( SOUND_MIXER_MIC ), &mic ); 322 ioctl( fd, MIXER_WRITE( SOUND_MIXER_MIC ), &mic );
323 ::close( fd ); 323 ::close( fd );
324 } 324 }
325 } 325 }
326 break; 326 break;
327 } 327 }
328} 328}
329 329
330 330
331/*! 331/*!
332 \class QPEApplication qpeapplication.h 332 \class QPEApplication qpeapplication.h
333 \brief The QPEApplication class implements various system services 333 \brief The QPEApplication class implements various system services
334 that are available to all Qtopia applications. 334 that are available to all Qtopia applications.
335 335
336 Simply by using QPEApplication instead of QApplication, a standard Qt 336 Simply by using QPEApplication instead of QApplication, a standard Qt
337 application becomes a Qtopia application. It automatically follows 337 application becomes a Qtopia application. It automatically follows
338 style changes, quits and raises, and in the 338 style changes, quits and raises, and in the
339 case of \link docwidget.html document-oriented\endlink applications, 339 case of \link docwidget.html document-oriented\endlink applications,
340 changes the currently displayed document in response to the environment. 340 changes the currently displayed document in response to the environment.
341 341
342 To create a \link docwidget.html document-oriented\endlink 342 To create a \link docwidget.html document-oriented\endlink
343 application use showMainDocumentWidget(); to create a 343 application use showMainDocumentWidget(); to create a
344 non-document-oriented application use showMainWidget(). The 344 non-document-oriented application use showMainWidget(). The
345 keepRunning() function indicates whether the application will 345 keepRunning() function indicates whether the application will
346 continue running after it's processed the last \link qcop.html 346 continue running after it's processed the last \link qcop.html
347 QCop\endlink message. This can be changed using setKeepRunning(). 347 QCop\endlink message. This can be changed using setKeepRunning().
348 348
349 A variety of signals are emitted when certain events occur, for 349 A variety of signals are emitted when certain events occur, for
350 example, timeChanged(), clockChanged(), weekChanged(), 350 example, timeChanged(), clockChanged(), weekChanged(),
351 dateFormatChanged() and volumeChanged(). If the application receives 351 dateFormatChanged() and volumeChanged(). If the application receives
352 a \link qcop.html QCop\endlink message on the application's 352 a \link qcop.html QCop\endlink message on the application's
353 QPE/Application/\e{appname} channel, the appMessage() signal is 353 QPE/Application/\e{appname} channel, the appMessage() signal is
354 emitted. There are also flush() and reload() signals, which 354 emitted. There are also flush() and reload() signals, which
355 are emitted when synching begins and ends respectively - upon these 355 are emitted when synching begins and ends respectively - upon these
356 signals, the application should save and reload any data 356 signals, the application should save and reload any data
357 files that are involved in synching. Most of these signals will initially 357 files that are involved in synching. Most of these signals will initially
358 be received and unfiltered through the appMessage() signal. 358 be received and unfiltered through the appMessage() signal.
359 359
360 This class also provides a set of useful static functions. The 360 This class also provides a set of useful static functions. The
361 qpeDir() and documentDir() functions return the respective paths. 361 qpeDir() and documentDir() functions return the respective paths.
362 The grabKeyboard() and ungrabKeyboard() functions are used to 362 The grabKeyboard() and ungrabKeyboard() functions are used to
363 control whether the application takes control of the device's 363 control whether the application takes control of the device's
364 physical buttons (e.g. application launch keys). The stylus' mode of 364 physical buttons (e.g. application launch keys). The stylus' mode of
365 operation is set with setStylusOperation() and retrieved with 365 operation is set with setStylusOperation() and retrieved with
366 stylusOperation(). There are also setInputMethodHint() and 366 stylusOperation(). There are also setInputMethodHint() and
367 inputMethodHint() functions. 367 inputMethodHint() functions.
368 368
369 \ingroup qtopiaemb 369 \ingroup qtopiaemb
370*/ 370*/
371 371
372/*! 372/*!
373 \fn void QPEApplication::clientMoused() 373 \fn void QPEApplication::clientMoused()
374 374
375 \internal 375 \internal
376*/ 376*/
377 377
378/*! 378/*!
379 \fn void QPEApplication::timeChanged(); 379 \fn void QPEApplication::timeChanged();
380 This signal is emitted when the time changes outside the normal 380 This signal is emitted when the time changes outside the normal
381 passage of time, i.e. if the time is set backwards or forwards. 381 passage of time, i.e. if the time is set backwards or forwards.
382*/ 382*/
383 383
384/*! 384/*!
385 \fn void QPEApplication::clockChanged( bool ampm ); 385 \fn void QPEApplication::clockChanged( bool ampm );
386 386
387 This signal is emitted when the user changes the clock's style. If 387 This signal is emitted when the user changes the clock's style. If
388 \a ampm is TRUE, the user wants a 12-hour AM/PM clock, otherwise, 388 \a ampm is TRUE, the user wants a 12-hour AM/PM clock, otherwise,
389 they want a 24-hour clock. 389 they want a 24-hour clock.
390*/ 390*/
391 391
392/*! 392/*!
393 \fn void QPEApplication::volumeChanged( bool muted ) 393 \fn void QPEApplication::volumeChanged( bool muted )
394 394
395 This signal is emitted whenever the mute state is changed. If \a 395 This signal is emitted whenever the mute state is changed. If \a
396 muted is TRUE, then sound output has been muted. 396 muted is TRUE, then sound output has been muted.
397*/ 397*/
398 398
399/*! 399/*!
400 \fn void QPEApplication::weekChanged( bool startOnMonday ) 400 \fn void QPEApplication::weekChanged( bool startOnMonday )
401 401
402 This signal is emitted if the week start day is changed. If \a 402 This signal is emitted if the week start day is changed. If \a
403 startOnMonday is TRUE then the first day of the week is Monday; if 403 startOnMonday is TRUE then the first day of the week is Monday; if
404 \a startOnMonday is FALSE then the first day of the week is 404 \a startOnMonday is FALSE then the first day of the week is
405 Sunday. 405 Sunday.
406*/ 406*/
407 407
408/*! 408/*!
409 \fn void QPEApplication::dateFormatChanged() 409 \fn void QPEApplication::dateFormatChanged()
410 410
411 This signal is emitted whenever the date format is changed. 411 This signal is emitted whenever the date format is changed.
412*/ 412*/
413 413
414/*! 414/*!
415 \fn void QPEApplication::flush() 415 \fn void QPEApplication::flush()
416 416
417 ### 417 ###
418*/ 418*/
419 419
420/*! 420/*!
421 \fn void QPEApplication::reload() 421 \fn void QPEApplication::reload()
422 422
423*/ 423*/
424 424
425/*! 425/*!
426 \fn void QPEApplication::appMessage( const QCString& msg, const QByteArray& data ) 426 \fn void QPEApplication::appMessage( const QCString& msg, const QByteArray& data )
427 427
428 This signal is emitted when a message is received on this 428 This signal is emitted when a message is received on this
429 application's QPE/Application/<i>appname</i> \link qcop.html 429 application's QPE/Application/<i>appname</i> \link qcop.html
430 QCop\endlink channel. 430 QCop\endlink channel.
431 431
432 The slot to which you connect this signal uses \a msg and \a data 432 The slot to which you connect this signal uses \a msg and \a data
433 in the following way: 433 in the following way:
434 434
435\code 435\code
436 void MyWidget::receive( const QCString& msg, const QByteArray& data ) 436 void MyWidget::receive( const QCString& msg, const QByteArray& data )
437 { 437 {
438 QDataStream stream( data, IO_ReadOnly ); 438 QDataStream stream( data, IO_ReadOnly );
439 if ( msg == "someMessage(int,int,int)" ) { 439 if ( msg == "someMessage(int,int,int)" ) {
440 int a,b,c; 440 int a,b,c;
441 stream >> a >> b >> c; 441 stream >> a >> b >> c;
442 ... 442 ...
443 } else if ( msg == "otherMessage(QString)" ) { 443 } else if ( msg == "otherMessage(QString)" ) {
444 ... 444 ...
445 } 445 }
446 } 446 }
447\endcode 447\endcode
448 448
449 \sa qcop.html 449 \sa qcop.html
450 Note that messages received here may be processed by qpe application 450 Note that messages received here may be processed by qpe application
451 and emitted as signals, such as flush() and reload(). 451 and emitted as signals, such as flush() and reload().
452*/ 452*/
453 453
454/*! 454/*!
455 Constructs a QPEApplication just as you would construct 455 Constructs a QPEApplication just as you would construct
456 a QApplication, passing \a argc, \a argv, and \a t. 456 a QApplication, passing \a argc, \a argv, and \a t.
457 457
458 For applications, \a t should be the default, GuiClient. Only 458 For applications, \a t should be the default, GuiClient. Only
459 the Qtopia server passes GuiServer. 459 the Qtopia server passes GuiServer.
460*/ 460*/
461QPEApplication::QPEApplication( int & argc, char **argv, Type t ) 461QPEApplication::QPEApplication( int & argc, char **argv, Type t )
462 : QApplication( argc, argv, t ) 462 : QApplication( argc, argv, t )
463{ 463{
464 d = new QPEApplicationData; 464 d = new QPEApplicationData;
465 d->loadTextCodecs(); 465 d->loadTextCodecs();
466 d->loadImageCodecs(); 466 d->loadImageCodecs();
467 int dw = desktop() ->width(); 467 int dw = desktop() ->width();
468 qWarning( "Width %d", dw ); 468 qWarning( "Width %d", dw );
469 if ( dw < 200 ) { 469 if ( dw < 200 ) {
470 setFont( QFont( "helvetica", 8 ) ); 470 setFont( QFont( "helvetica", 8 ) );
471 AppLnk::setSmallIconSize( 10 ); 471 AppLnk::setSmallIconSize( 10 );
472 AppLnk::setBigIconSize( 28 ); 472 AppLnk::setBigIconSize( 28 );
473 } 473 }
474 else if ( dw > 600 ) { 474 else if ( dw > 600 ) {
475 setFont( QFont( "helvetica", 12 ) ); 475 setFont( QFont( "helvetica", 12 ) );
476 AppLnk::setSmallIconSize( 24 ); 476 AppLnk::setSmallIconSize( 24 );
477 AppLnk::setBigIconSize( 48 ); 477 AppLnk::setBigIconSize( 48 );
478 } 478 }
479 else if ( dw > 200 ) { 479 else if ( dw > 200 ) {
480 setFont( QFont( "helvetica", 10 ) ); 480 setFont( QFont( "helvetica", 10 ) );
481 AppLnk::setSmallIconSize( 16 ); 481 AppLnk::setSmallIconSize( 16 );
482 AppLnk::setBigIconSize( 32 ); 482 AppLnk::setBigIconSize( 32 );
483 } 483 }
484 484
485 485
486 QMimeSourceFactory::setDefaultFactory( new ResourceMimeFactory ); 486 QMimeSourceFactory::setDefaultFactory( new ResourceMimeFactory );
487 487
488 connect( this, SIGNAL( lastWindowClosed() ), this, SLOT( hideOrQuit() ) ); 488 connect( this, SIGNAL( lastWindowClosed() ), this, SLOT( hideOrQuit() ) );
489#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 489#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
490 490
491 QString qcopfn( "/tmp/qcop-msg-" ); 491 QString qcopfn( "/tmp/qcop-msg-" );
492 qcopfn += QString( argv[ 0 ] ); // append command name 492 qcopfn += QString( argv[ 0 ] ); // append command name
493 493
494 QFile f( qcopfn ); 494 QFile f( qcopfn );
495 if ( f.open( IO_ReadOnly ) ) { 495 if ( f.open( IO_ReadOnly ) ) {
496 flock( f.handle(), LOCK_EX ); 496 flock( f.handle(), LOCK_EX );
497 } 497 }
498 498
499 sysChannel = new QCopChannel( "QPE/System", this ); 499 sysChannel = new QCopChannel( "QPE/System", this );
500 connect( sysChannel, SIGNAL( received( const QCString &, const QByteArray & ) ), 500 connect( sysChannel, SIGNAL( received( const QCString &, const QByteArray & ) ),
501 this, SLOT( systemMessage( const QCString &, const QByteArray & ) ) ); 501 this, SLOT( systemMessage( const QCString &, const QByteArray & ) ) );
502 502
503 QCString channel = QCString( argv[ 0 ] ); 503 QCString channel = QCString( argv[ 0 ] );
504 channel.replace( QRegExp( ".*/" ), "" ); 504 channel.replace( QRegExp( ".*/" ), "" );
505 d->appName = channel; 505 d->appName = channel;
506 channel = "QPE/Application/" + channel; 506 channel = "QPE/Application/" + channel;
507 pidChannel = new QCopChannel( channel, this ); 507 pidChannel = new QCopChannel( channel, this );
508 connect( pidChannel, SIGNAL( received( const QCString &, const QByteArray & ) ), 508 connect( pidChannel, SIGNAL( received( const QCString &, const QByteArray & ) ),
509 this, SLOT( pidMessage( const QCString &, const QByteArray & ) ) ); 509 this, SLOT( pidMessage( const QCString &, const QByteArray & ) ) );
510 510
511 if ( f.isOpen() ) { 511 if ( f.isOpen() ) {
512 d->keep_running = FALSE; 512 d->keep_running = FALSE;
513 QDataStream ds( &f ); 513 QDataStream ds( &f );
514 QCString channel, message; 514 QCString channel, message;
515 QByteArray data; 515 QByteArray data;
516 while ( !ds.atEnd() ) { 516 while ( !ds.atEnd() ) {
517 ds >> channel >> message >> data; 517 ds >> channel >> message >> data;
518 d->enqueueQCop( channel, message, data ); 518 d->enqueueQCop( channel, message, data );
519 } 519 }
520 520
521 flock( f.handle(), LOCK_UN ); 521 flock( f.handle(), LOCK_UN );
522 f.close(); 522 f.close();
523 f.remove(); 523 f.remove();
524 } 524 }
525 525
526 for ( int a = 0; a < argc; a++ ) { 526 for ( int a = 0; a < argc; a++ ) {
527 if ( qstrcmp( argv[ a ], "-preload" ) == 0 ) { 527 if ( qstrcmp( argv[ a ], "-preload" ) == 0 ) {
528 argv[ a ] = argv[ a + 1 ]; 528 argv[ a ] = argv[ a + 1 ];
529 a++; 529 a++;
530 d->preloaded = TRUE; 530 d->preloaded = TRUE;
531 argc -= 1; 531 argc -= 1;
532 } 532 }
533 else if ( qstrcmp( argv[ a ], "-preload-show" ) == 0 ) { 533 else if ( qstrcmp( argv[ a ], "-preload-show" ) == 0 ) {
534 argv[ a ] = argv[ a + 1 ]; 534 argv[ a ] = argv[ a + 1 ];
535 a++; 535 a++;
536 d->preloaded = TRUE; 536 d->preloaded = TRUE;
537 d->forceshow = TRUE; 537 d->forceshow = TRUE;
538 argc -= 1; 538 argc -= 1;
539 } 539 }
540 } 540 }
541 541
542 /* overide stored arguments */ 542 /* overide stored arguments */
543 setArgs( argc, argv ); 543 setArgs( argc, argv );
544 544
545#endif 545#endif
546 546
547 // qwsSetDecoration( new QPEDecoration() ); 547 // qwsSetDecoration( new QPEDecoration() );
548 548
549#ifndef QT_NO_TRANSLATION 549#ifndef QT_NO_TRANSLATION
550 550
551 QStringList langs = Global::languageList(); 551 QStringList langs = Global::languageList();
552 for ( QStringList::ConstIterator it = langs.begin(); it != langs.end(); ++it ) { 552 for ( QStringList::ConstIterator it = langs.begin(); it != langs.end(); ++it ) {
553 QString lang = *it; 553 QString lang = *it;
554 554
555 QTranslator * trans; 555 QTranslator * trans;
556 QString tfn; 556 QString tfn;
557 557
558 trans = new QTranslator( this ); 558 trans = new QTranslator( this );
559 tfn = qpeDir() + "/i18n/" + lang + "/libqpe.qm"; 559 tfn = qpeDir() + "/i18n/" + lang + "/libqpe.qm";
560 if ( trans->load( tfn ) ) 560 if ( trans->load( tfn ) )
561 installTranslator( trans ); 561 installTranslator( trans );
562 else 562 else
563 delete trans; 563 delete trans;
564 564
565 trans = new QTranslator( this ); 565 trans = new QTranslator( this );
566 tfn = qpeDir() + "/i18n/" + lang + "/" + d->appName + ".qm"; 566 tfn = qpeDir() + "/i18n/" + lang + "/" + d->appName + ".qm";
567 if ( trans->load( tfn ) ) 567 if ( trans->load( tfn ) )
568 installTranslator( trans ); 568 installTranslator( trans );
569 else 569 else
570 delete trans; 570 delete trans;
571 571
572 //###language/font hack; should look it up somewhere 572 //###language/font hack; should look it up somewhere
573#ifdef QWS 573#ifdef QWS
574 574
575 if ( lang == "ja" || lang == "zh_CN" || lang == "zh_TW" || lang == "ko" ) { 575 if ( lang == "ja" || lang == "zh_CN" || lang == "zh_TW" || lang == "ko" ) {
576 QFont fn = FontManager::unicodeFont( FontManager::Proportional ); 576 QFont fn = FontManager::unicodeFont( FontManager::Proportional );
577 setFont( fn ); 577 setFont( fn );
578 } 578 }
579#endif 579#endif
580 580
581 } 581 }
582#endif 582#endif
583 583
584 applyStyle(); 584 applyStyle();
585 585
586 if ( type() == GuiServer ) { 586 if ( type() == GuiServer ) {
587 setVolume(); 587 setVolume();
588 } 588 }
589 589
590 installEventFilter( this ); 590 installEventFilter( this );
591 591
592 QPEMenuToolFocusManager::initialize(); 592 QPEMenuToolFocusManager::initialize();
593 593
594#ifdef QT_NO_QWS_CURSOR 594#ifdef QT_NO_QWS_CURSOR
595 // if we have no cursor, probably don't want tooltips 595 // if we have no cursor, probably don't want tooltips
596 QToolTip::setEnabled( FALSE ); 596 QToolTip::setEnabled( FALSE );
597#endif 597#endif
598} 598}
599 599
600static QPtrDict<void>* inputMethodDict = 0; 600static QPtrDict<void>* inputMethodDict = 0;
601static void createInputMethodDict() 601static void createInputMethodDict()
602{ 602{
603 if ( !inputMethodDict ) 603 if ( !inputMethodDict )
604 inputMethodDict = new QPtrDict<void>; 604 inputMethodDict = new QPtrDict<void>;
605} 605}
606 606
607/*! 607/*!
608 Returns the currently set hint to the system as to whether 608 Returns the currently set hint to the system as to whether
609 widget \a w has any use for text input methods. 609 widget \a w has any use for text input methods.
610 610
611 611
612 \sa setInputMethodHint() InputMethodHint 612 \sa setInputMethodHint() InputMethodHint
613*/ 613*/
614QPEApplication::InputMethodHint QPEApplication::inputMethodHint( QWidget * w ) 614QPEApplication::InputMethodHint QPEApplication::inputMethodHint( QWidget * w )
615{ 615{
616 if ( inputMethodDict && w ) 616 if ( inputMethodDict && w )
617 return ( InputMethodHint ) ( int ) inputMethodDict->find( w ); 617 return ( InputMethodHint ) ( int ) inputMethodDict->find( w );
618 return Normal; 618 return Normal;
619} 619}
620 620
621/*! 621/*!
622 \enum QPEApplication::InputMethodHint 622 \enum QPEApplication::InputMethodHint
623 623
624 \value Normal the application sometimes needs text input (the default). 624 \value Normal the application sometimes needs text input (the default).
625 \value AlwaysOff the application never needs text input. 625 \value AlwaysOff the application never needs text input.
626 \value AlwaysOn the application always needs text input. 626 \value AlwaysOn the application always needs text input.
627*/ 627*/
628 628
629/*! 629/*!
630 Hints to the system that widget \a w has use for text input methods 630 Hints to the system that widget \a w has use for text input methods
631 as specified by \a mode. 631 as specified by \a mode.
632 632
633 \sa inputMethodHint() InputMethodHint 633 \sa inputMethodHint() InputMethodHint
634*/ 634*/
635void QPEApplication::setInputMethodHint( QWidget * w, InputMethodHint mode ) 635void QPEApplication::setInputMethodHint( QWidget * w, InputMethodHint mode )
636{ 636{
637 createInputMethodDict(); 637 createInputMethodDict();
638 if ( mode == Normal ) { 638 if ( mode == Normal ) {
639 inputMethodDict->remove 639 inputMethodDict->remove
640 ( w ); 640 ( w );
641 } 641 }
642 else { 642 else {
643 inputMethodDict->insert( w, ( void* ) mode ); 643 inputMethodDict->insert( w, ( void* ) mode );
644 } 644 }
645} 645}
646 646
647class HackDialog : public QDialog 647class HackDialog : public QDialog
648{ 648{
649public: 649public:
650 void acceptIt() 650 void acceptIt()
651 { 651 {
652 accept(); 652 accept();
653 } 653 }
654 void rejectIt() 654 void rejectIt()
655 { 655 {
656 reject(); 656 reject();
657 } 657 }
658}; 658};
659 659
660 660
661void QPEApplication::mapToDefaultAction( QWSKeyEvent * ke, int key ) 661void QPEApplication::mapToDefaultAction( QWSKeyEvent * ke, int key )
662{ 662{
663 // specialised actions for certain widgets. May want to 663 // specialised actions for certain widgets. May want to
664 // add more stuff here. 664 // add more stuff here.
665 if ( activePopupWidget() && activePopupWidget() ->inherits( "QListBox" ) 665 if ( activePopupWidget() && activePopupWidget() ->inherits( "QListBox" )
666 && activePopupWidget() ->parentWidget() 666 && activePopupWidget() ->parentWidget()
667 && activePopupWidget() ->parentWidget() ->inherits( "QComboBox" ) ) 667 && activePopupWidget() ->parentWidget() ->inherits( "QComboBox" ) )
668 key = Qt::Key_Return; 668 key = Qt::Key_Return;
669 669
670 if ( activePopupWidget() && activePopupWidget() ->inherits( "QPopupMenu" ) ) 670 if ( activePopupWidget() && activePopupWidget() ->inherits( "QPopupMenu" ) )
671 key = Qt::Key_Return; 671 key = Qt::Key_Return;
672 672
673#ifdef QWS 673#ifdef QWS
674 674
675 ke->simpleData.keycode = key; 675 ke->simpleData.keycode = key;
676#endif 676#endif
677} 677}
678 678
679class HackWidget : public QWidget 679class HackWidget : public QWidget
680{ 680{
681public: 681public:
682 bool needsOk() 682 bool needsOk()
683 { 683 {
684 return ( getWState() & WState_Reserved1 ); 684 return ( getWState() & WState_Reserved1 );
685 } 685 }
686}; 686};
687 687
688/*! 688/*!
689 \internal 689 \internal
690*/ 690*/
691 691
692#ifdef QWS 692#ifdef QWS
693bool QPEApplication::qwsEventFilter( QWSEvent * e ) 693bool QPEApplication::qwsEventFilter( QWSEvent * e )
694{ 694{
695 if ( !d->notbusysent && e->type == QWSEvent::Focus ) { 695 if ( !d->notbusysent && e->type == QWSEvent::Focus ) {
696 if ( qApp->type() != QApplication::GuiServer ) { 696 if ( qApp->type() != QApplication::GuiServer ) {
697 QCopEnvelope e( "QPE/System", "notBusy(QString)" ); 697 QCopEnvelope e( "QPE/System", "notBusy(QString)" );
698 e << d->appName; 698 e << d->appName;
699 } 699 }
700 d->notbusysent = TRUE; 700 d->notbusysent = TRUE;
701 } 701 }
702 if ( type() == GuiServer ) { 702 if ( type() == GuiServer ) {
703 switch ( e->type ) { 703 switch ( e->type ) {
704 case QWSEvent::Mouse: 704 case QWSEvent::Mouse:
705 if ( e->asMouse() ->simpleData.state && !QWidget::find( e->window() ) ) 705 if ( e->asMouse() ->simpleData.state && !QWidget::find( e->window() ) )
706 emit clientMoused(); 706 emit clientMoused();
707 break; 707 break;
708 default: 708 default:
709 break; 709 break;
710 } 710 }
711 } 711 }
712 if ( e->type == QWSEvent::Key ) { 712 if ( e->type == QWSEvent::Key ) {
713 if ( d->kbgrabber == 1 ) 713 if ( d->kbgrabber == 1 )
714 return TRUE; 714 return TRUE;
715 QWSKeyEvent *ke = ( QWSKeyEvent * ) e; 715 QWSKeyEvent *ke = ( QWSKeyEvent * ) e;
716 if ( ke->simpleData.keycode == Qt::Key_F33 ) { 716 if ( ke->simpleData.keycode == Qt::Key_F33 ) {
717 // Use special "OK" key to press "OK" on top level widgets 717 // Use special "OK" key to press "OK" on top level widgets
718 QWidget * active = activeWindow(); 718 QWidget * active = activeWindow();
719 QWidget *popup = 0; 719 QWidget *popup = 0;
720 if ( active && active->isPopup() ) { 720 if ( active && active->isPopup() ) {
721 popup = active; 721 popup = active;
722 active = active->parentWidget(); 722 active = active->parentWidget();
723 } 723 }
724 if ( active && ( int ) active->winId() == ke->simpleData.window && 724 if ( active && ( int ) active->winId() == ke->simpleData.window &&
725 !active->testWFlags( WStyle_Customize | WType_Popup | WType_Desktop ) ) { 725 !active->testWFlags( WStyle_Customize | WType_Popup | WType_Desktop ) ) {
726 if ( ke->simpleData.is_press ) { 726 if ( ke->simpleData.is_press ) {
727 if ( popup ) 727 if ( popup )
728 popup->close(); 728 popup->close();
729 if ( active->inherits( "QDialog" ) ) { 729 if ( active->inherits( "QDialog" ) ) {
730 HackDialog * d = ( HackDialog * ) active; 730 HackDialog * d = ( HackDialog * ) active;
731 d->acceptIt(); 731 d->acceptIt();
732 return TRUE; 732 return TRUE;
733 } 733 }
734 else if ( ( ( HackWidget * ) active ) ->needsOk() ) { 734 else if ( ( ( HackWidget * ) active ) ->needsOk() ) {
735 QSignal s; 735 QSignal s;
736 s.connect( active, SLOT( accept() ) ); 736 s.connect( active, SLOT( accept() ) );
737 s.activate(); 737 s.activate();
738 } 738 }
739 else { 739 else {
740 // do the same as with the select key: Map to the default action of the widget: 740 // do the same as with the select key: Map to the default action of the widget:
741 mapToDefaultAction( ke, Qt::Key_Return ); 741 mapToDefaultAction( ke, Qt::Key_Return );
742 } 742 }
743 } 743 }
744 } 744 }
745 } 745 }
746 else if ( ke->simpleData.keycode == Qt::Key_F30 ) { 746 else if ( ke->simpleData.keycode == Qt::Key_F30 ) {
747 // Use special "select" key to do whatever default action a widget has 747 // Use special "select" key to do whatever default action a widget has
748 mapToDefaultAction( ke, Qt::Key_Space ); 748 mapToDefaultAction( ke, Qt::Key_Space );
749 } 749 }
750 else if ( ke->simpleData.keycode == Qt::Key_Escape && 750 else if ( ke->simpleData.keycode == Qt::Key_Escape &&
751 ke->simpleData.is_press ) { 751 ke->simpleData.is_press ) {
752 // Escape key closes app if focus on toplevel 752 // Escape key closes app if focus on toplevel
753 QWidget * active = activeWindow(); 753 QWidget * active = activeWindow();
754 if ( active && active->testWFlags( WType_TopLevel ) && 754 if ( active && active->testWFlags( WType_TopLevel ) &&
755 ( int ) active->winId() == ke->simpleData.window && 755 ( int ) active->winId() == ke->simpleData.window &&
756 !active->testWFlags( WStyle_Dialog | WStyle_Customize | WType_Popup | WType_Desktop ) ) { 756 !active->testWFlags( WStyle_Dialog | WStyle_Customize | WType_Popup | WType_Desktop ) ) {
757 if ( active->inherits( "QDialog" ) ) { 757 if ( active->inherits( "QDialog" ) ) {
758 HackDialog * d = ( HackDialog * ) active; 758 HackDialog * d = ( HackDialog * ) active;
759 d->rejectIt(); 759 d->rejectIt();
760 return TRUE; 760 return TRUE;
761 } 761 }
762 else if ( strcmp( argv() [ 0 ], "embeddedkonsole" ) != 0 ) { 762 else if ( strcmp( argv() [ 0 ], "embeddedkonsole" ) != 0 ) {
763 active->close(); 763 active->close();
764 } 764 }
765 } 765 }
766 } 766 }
767 767
768#if QT_VERSION < 231 768#if QT_VERSION < 231
769 // Filter out the F4/Launcher key from apps 769 // Filter out the F4/Launcher key from apps
770 // ### The launcher key may not always be F4 on all devices 770 // ### The launcher key may not always be F4 on all devices
771 if ( ( ( QWSKeyEvent * ) e ) ->simpleData.keycode == Qt::Key_F4 ) 771 if ( ( ( QWSKeyEvent * ) e ) ->simpleData.keycode == Qt::Key_F4 )
772 return TRUE; 772 return TRUE;
773#endif 773#endif
774 774
775 } 775 }
776 if ( e->type == QWSEvent::Focus ) { 776 if ( e->type == QWSEvent::Focus ) {
777 QWSFocusEvent * fe = ( QWSFocusEvent* ) e; 777 QWSFocusEvent * fe = ( QWSFocusEvent* ) e;
778 QWidget* nfw = QWidget::find( e->window() ); 778 QWidget* nfw = QWidget::find( e->window() );
779 if ( !fe->simpleData.get_focus ) { 779 if ( !fe->simpleData.get_focus ) {
780 QWidget * active = activeWindow(); 780 QWidget * active = activeWindow();
781 while ( active && active->isPopup() ) { 781 while ( active && active->isPopup() ) {
782 active->close(); 782 active->close();
783 active = activeWindow(); 783 active = activeWindow();
784 } 784 }
785 if ( !nfw && d->kbgrabber == 2 ) { 785 if ( !nfw && d->kbgrabber == 2 ) {
786 ungrabKeyboard(); 786 ungrabKeyboard();
787 d->kbregrab = TRUE; // want kb back when we're active 787 d->kbregrab = TRUE; // want kb back when we're active
788 } 788 }
789 } 789 }
790 else { 790 else {
791 // make sure our modal widget is ALWAYS on top 791 // make sure our modal widget is ALWAYS on top
792 QWidget *topm = activeModalWidget(); 792 QWidget *topm = activeModalWidget();
793 if ( topm ) { 793 if ( topm ) {
794 topm->raise(); 794 topm->raise();
795 } 795 }
796 if ( d->kbregrab ) { 796 if ( d->kbregrab ) {
797 grabKeyboard(); 797 grabKeyboard();
798 d->kbregrab = FALSE; 798 d->kbregrab = FALSE;
799 } 799 }
800 } 800 }
801 if ( fe->simpleData.get_focus && inputMethodDict ) { 801 if ( fe->simpleData.get_focus && inputMethodDict ) {
802 InputMethodHint m = inputMethodHint( QWidget::find( e->window() ) ); 802 InputMethodHint m = inputMethodHint( QWidget::find( e->window() ) );
803 if ( m == AlwaysOff ) 803 if ( m == AlwaysOff )
804 Global::hideInputMethod(); 804 Global::hideInputMethod();
805 if ( m == AlwaysOn ) 805 if ( m == AlwaysOn )
806 Global::showInputMethod(); 806 Global::showInputMethod();
807 } 807 }
808 } 808 }
809 return QApplication::qwsEventFilter( e ); 809 return QApplication::qwsEventFilter( e );
810} 810}
811#endif 811#endif
812 812
813/*! 813/*!
814 Destroys the QPEApplication. 814 Destroys the QPEApplication.
815*/ 815*/
816QPEApplication::~QPEApplication() 816QPEApplication::~QPEApplication()
817{ 817{
818 ungrabKeyboard(); 818 ungrabKeyboard();
819#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 819#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
820 // Need to delete QCopChannels early, since the display will 820 // Need to delete QCopChannels early, since the display will
821 // be gone by the time we get to ~QObject(). 821 // be gone by the time we get to ~QObject().
822 delete sysChannel; 822 delete sysChannel;
823 delete pidChannel; 823 delete pidChannel;
824#endif 824#endif
825 825
826 delete d; 826 delete d;
827} 827}
828 828
829/*! 829/*!
830 Returns <tt>$OPIEDIR/</tt>. 830 Returns <tt>$OPIEDIR/</tt>.
831*/ 831*/
832QString QPEApplication::qpeDir() 832QString QPEApplication::qpeDir()
833{ 833{
834 const char * base = getenv( "OPIEDIR" ); 834 const char * base = getenv( "OPIEDIR" );
835 if ( base ) 835 if ( base )
836 return QString( base ) + "/"; 836 return QString( base ) + "/";
837 837
838 return QString( "../" ); 838 return QString( "../" );
839} 839}
840 840
841/*! 841/*!
842 Returns the user's current Document directory. There is a trailing "/". 842 Returns the user's current Document directory. There is a trailing "/".
843 .. well, it does now,, and there's no trailing '/' 843 .. well, it does now,, and there's no trailing '/'
844*/ 844*/
845QString QPEApplication::documentDir() 845QString QPEApplication::documentDir()
846{ 846{
847 const char* base = getenv( "HOME"); 847 const char* base = getenv( "HOME");
848 if ( base ) 848 if ( base )
849 return QString( base ) + "/Documents"; 849 return QString( base ) + "/Documents";
850 850
851 return QString( "../Documents" ); 851 return QString( "../Documents" );
852} 852}
853 853
854static int deforient = -1; 854static int deforient = -1;
855 855
856/*! 856/*!
857 \internal 857 \internal
858*/ 858*/
859int QPEApplication::defaultRotation() 859int QPEApplication::defaultRotation()
860{ 860{
861 if ( deforient < 0 ) { 861 if ( deforient < 0 ) {
862 QString d = getenv( "QWS_DISPLAY" ); 862 QString d = getenv( "QWS_DISPLAY" );
863 if ( d.contains( "Rot90" ) ) { 863 if ( d.contains( "Rot90" ) ) {
864 deforient = 90; 864 deforient = 90;
865 } 865 }
866 else if ( d.contains( "Rot180" ) ) { 866 else if ( d.contains( "Rot180" ) ) {
867 deforient = 180; 867 deforient = 180;
868 } 868 }
869 else if ( d.contains( "Rot270" ) ) { 869 else if ( d.contains( "Rot270" ) ) {
870 deforient = 270; 870 deforient = 270;
871 } 871 }
872 else { 872 else {
873 deforient = 0; 873 deforient = 0;
874 } 874 }
875 } 875 }
876 return deforient; 876 return deforient;
877} 877}
878 878
879/*! 879/*!
880 \internal 880 \internal
881*/ 881*/
882void QPEApplication::setDefaultRotation( int r ) 882void QPEApplication::setDefaultRotation( int r )
883{ 883{
884 if ( qApp->type() == GuiServer ) { 884 if ( qApp->type() == GuiServer ) {
885 deforient = r; 885 deforient = r;
886 setenv( "QWS_DISPLAY", QString( "Transformed:Rot%1:0" ).arg( r ).latin1(), 1 ); 886 setenv( "QWS_DISPLAY", QString( "Transformed:Rot%1:0" ).arg( r ).latin1(), 1 );
887 Config config("qpe"); 887 Config config("qpe");
888 config.setGroup( "Rotation" ); 888 config.setGroup( "Rotation" );
889 config.writeEntry( "Screen", getenv("QWS_DISPLAY") ); 889 config.writeEntry( "Screen", getenv("QWS_DISPLAY") );
890 } 890 }
891 else { 891 else {
892#ifndef QT_NO_COP 892#ifndef QT_NO_COP
893 { QCopEnvelope e( "QPE/System", "setDefaultRotation(int)" ); 893 { QCopEnvelope e( "QPE/System", "setDefaultRotation(int)" );
894 e << r; 894 e << r;
895 } 895 }
896#endif 896#endif
897 897
898 } 898 }
899} 899}
900 900
901/*! 901/*!
902 \internal 902 \internal
903*/ 903*/
904void QPEApplication::applyStyle() 904void QPEApplication::applyStyle()
905{ 905{
906 Config config( "qpe" ); 906 Config config( "qpe" );
907 907
908 config.setGroup( "Appearance" ); 908 config.setGroup( "Appearance" );
909 909
910 // Widget style 910 // Widget style
911 QString style = config.readEntry( "Style", "Light" ); 911 QString style = config.readEntry( "Style", "Light" );
912 internalSetStyle( style ); 912 internalSetStyle( style );
913 913
914 // Colors 914 // Colors
915 QColor bgcolor( config.readEntry( "Background", "#E5E1D5" ) ); 915 QColor bgcolor( config.readEntry( "Background", "#E5E1D5" ) );
916 QColor btncolor( config.readEntry( "Button", "#D6CDBB" ) ); 916 QColor btncolor( config.readEntry( "Button", "#D6CDBB" ) );
917 QPalette pal( btncolor, bgcolor ); 917 QPalette pal( btncolor, bgcolor );
918 QString color = config.readEntry( "Highlight", "#800000" ); 918 QString color = config.readEntry( "Highlight", "#800000" );
919 pal.setColor( QColorGroup::Highlight, QColor( color ) ); 919 pal.setColor( QColorGroup::Highlight, QColor( color ) );
920 color = config.readEntry( "HighlightedText", "#FFFFFF" ); 920 color = config.readEntry( "HighlightedText", "#FFFFFF" );
921 pal.setColor( QColorGroup::HighlightedText, QColor( color ) ); 921 pal.setColor( QColorGroup::HighlightedText, QColor( color ) );
922 color = config.readEntry( "Text", "#000000" ); 922 color = config.readEntry( "Text", "#000000" );
923 pal.setColor( QColorGroup::Text, QColor( color ) ); 923 pal.setColor( QColorGroup::Text, QColor( color ) );
924 color = config.readEntry( "ButtonText", "#000000" ); 924 color = config.readEntry( "ButtonText", "#000000" );
925 pal.setColor( QPalette::Active, QColorGroup::ButtonText, QColor( color ) ); 925 pal.setColor( QPalette::Active, QColorGroup::ButtonText, QColor( color ) );
926 color = config.readEntry( "Base", "#FFFFFF" ); 926 color = config.readEntry( "Base", "#FFFFFF" );
927 pal.setColor( QColorGroup::Base, QColor( color ) ); 927 pal.setColor( QColorGroup::Base, QColor( color ) );
928 928
929 pal.setColor( QPalette::Disabled, QColorGroup::Text, 929 pal.setColor( QPalette::Disabled, QColorGroup::Text,
930 pal.color( QPalette::Active, QColorGroup::Background ).dark() ); 930 pal.color( QPalette::Active, QColorGroup::Background ).dark() );
931 931
932 setPalette( pal, TRUE ); 932 setPalette( pal, TRUE );
933 933
934 // Window Decoration 934 // Window Decoration
935 QString dec = config.readEntry( "Decoration", "Qtopia" ); 935 QString dec = config.readEntry( "Decoration", "Qtopia" );
936 if ( dec != d->decorationName ) { 936 if ( dec != d->decorationName ) {
937 qwsSetDecoration( new QPEDecoration( dec ) ); 937 qwsSetDecoration( new QPEDecoration( dec ) );
938 d->decorationName = dec; 938 d->decorationName = dec;
939 } 939 }
940 940
941 // Font 941 // Font
942 QString ff = config.readEntry( "FontFamily", font().family() ); 942 QString ff = config.readEntry( "FontFamily", font().family() );
943 int fs = config.readNumEntry( "FontSize", font().pointSize() ); 943 int fs = config.readNumEntry( "FontSize", font().pointSize() );
944 setFont( QFont(ff, fs) ); 944 setFont( QFont(ff, fs) );
945} 945}
946 946
947void QPEApplication::systemMessage( const QCString& msg, const QByteArray& data ) 947void QPEApplication::systemMessage( const QCString& msg, const QByteArray& data )
948{ 948{
949#ifdef Q_WS_QWS 949#ifdef Q_WS_QWS
950 QDataStream stream( data, IO_ReadOnly ); 950 QDataStream stream( data, IO_ReadOnly );
951 if ( msg == "applyStyle()" ) { 951 if ( msg == "applyStyle()" ) {
952 applyStyle(); 952 applyStyle();
953 } 953 }
954 else if ( msg == "setDefaultRotation(int)" ) { 954 else if ( msg == "setDefaultRotation(int)" ) {
955 if ( type() == GuiServer ) { 955 if ( type() == GuiServer ) {
956 int r; 956 int r;
957 stream >> r; 957 stream >> r;
958 setDefaultRotation( r ); 958 setDefaultRotation( r );
959 } 959 }
960 } 960 }
961 else if ( msg == "shutdown()" ) { 961 else if ( msg == "shutdown()" ) {
962 if ( type() == GuiServer ) 962 if ( type() == GuiServer )
963 shutdown(); 963 shutdown();
964 } 964 }
965 else if ( msg == "quit()" ) { 965 else if ( msg == "quit()" ) {
966 if ( type() != GuiServer ) 966 if ( type() != GuiServer )
967 tryQuit(); 967 tryQuit();
968 } 968 }
969 else if ( msg == "forceQuit()" ) { 969 else if ( msg == "forceQuit()" ) {
970 if ( type() != GuiServer ) 970 if ( type() != GuiServer )
971 quit(); 971 quit();
972 } 972 }
973 else if ( msg == "restart()" ) { 973 else if ( msg == "restart()" ) {
974 if ( type() == GuiServer ) 974 if ( type() == GuiServer )
975 restart(); 975 restart();
976 } 976 }
977 else if ( msg == "grabKeyboard(QString)" ) { 977 else if ( msg == "grabKeyboard(QString)" ) {
978 QString who; 978 QString who;
979 stream >> who; 979 stream >> who;
980 if ( who.isEmpty() ) 980 if ( who.isEmpty() )
981 d->kbgrabber = 0; 981 d->kbgrabber = 0;
982 else if ( who != d->appName ) 982 else if ( who != d->appName )
983 d->kbgrabber = 1; 983 d->kbgrabber = 1;
984 else 984 else
985 d->kbgrabber = 2; 985 d->kbgrabber = 2;
986 } 986 }
987 else if ( msg == "language(QString)" ) { 987 else if ( msg == "language(QString)" ) {
988 if ( type() == GuiServer ) { 988 if ( type() == GuiServer ) {
989 QString l; 989 QString l;
990 stream >> l; 990 stream >> l;
991 QString cl = getenv( "LANG" ); 991 QString cl = getenv( "LANG" );
992 if ( cl != l ) { 992 if ( cl != l ) {
993 if ( l.isNull() ) 993 if ( l.isNull() )
994 unsetenv( "LANG" ); 994 unsetenv( "LANG" );
995 else 995 else
996 setenv( "LANG", l.latin1(), 1 ); 996 setenv( "LANG", l.latin1(), 1 );
997 restart(); 997 restart();
998 } 998 }
999 } 999 }
1000 } 1000 }
1001 else if ( msg == "timeChange(QString)" ) { 1001 else if ( msg == "timeChange(QString)" ) {
1002 QString t; 1002 QString t;
1003 stream >> t; 1003 stream >> t;
1004 if ( t.isNull() ) 1004 if ( t.isNull() )
1005 unsetenv( "TZ" ); 1005 unsetenv( "TZ" );
1006 else 1006 else
1007 setenv( "TZ", t.latin1(), 1 ); 1007 setenv( "TZ", t.latin1(), 1 );
1008 // emit the signal so everyone else knows... 1008 // emit the signal so everyone else knows...
1009 emit timeChanged(); 1009 emit timeChanged();
1010 } 1010 }
1011 else if ( msg == "execute(QString)" ) { 1011 else if ( msg == "execute(QString)" ) {
1012 if ( type() == GuiServer ) { 1012 if ( type() == GuiServer ) {
1013 QString t; 1013 QString t;
1014 stream >> t; 1014 stream >> t;
1015 Global::execute( t ); 1015 Global::execute( t );
1016 } 1016 }
1017 } 1017 }
1018 else if ( msg == "execute(QString,QString)" ) { 1018 else if ( msg == "execute(QString,QString)" ) {
1019 if ( type() == GuiServer ) { 1019 if ( type() == GuiServer ) {
1020 QString t, d; 1020 QString t, d;
1021 stream >> t >> d; 1021 stream >> t >> d;
1022 Global::execute( t, d ); 1022 Global::execute( t, d );
1023 } 1023 }
1024 } 1024 }
1025 else if ( msg == "addAlarm(QDateTime,QCString,QCString,int)" ) { 1025 else if ( msg == "addAlarm(QDateTime,QCString,QCString,int)" ) {
1026 if ( type() == GuiServer ) { 1026 if ( type() == GuiServer ) {
1027 QDateTime when; 1027 QDateTime when;
1028 QCString channel, message; 1028 QCString channel, message;
1029 int data; 1029 int data;
1030 stream >> when >> channel >> message >> data; 1030 stream >> when >> channel >> message >> data;
1031 AlarmServer::addAlarm( when, channel, message, data ); 1031 AlarmServer::addAlarm( when, channel, message, data );
1032 } 1032 }
1033 } 1033 }
1034 else if ( msg == "deleteAlarm(QDateTime,QCString,QCString,int)" ) { 1034 else if ( msg == "deleteAlarm(QDateTime,QCString,QCString,int)" ) {
1035 if ( type() == GuiServer ) { 1035 if ( type() == GuiServer ) {
1036 QDateTime when; 1036 QDateTime when;
1037 QCString channel, message; 1037 QCString channel, message;
1038 int data; 1038 int data;
1039 stream >> when >> channel >> message >> data; 1039 stream >> when >> channel >> message >> data;
1040 AlarmServer::deleteAlarm( when, channel, message, data ); 1040 AlarmServer::deleteAlarm( when, channel, message, data );
1041 } 1041 }
1042 } 1042 }
1043 else if ( msg == "clockChange(bool)" ) { 1043 else if ( msg == "clockChange(bool)" ) {
1044 int tmp; 1044 int tmp;
1045 stream >> tmp; 1045 stream >> tmp;
1046 emit clockChanged( tmp ); 1046 emit clockChanged( tmp );
1047 } 1047 }
1048 else if ( msg == "weekChange(bool)" ) { 1048 else if ( msg == "weekChange(bool)" ) {
1049 int tmp; 1049 int tmp;
1050 stream >> tmp; 1050 stream >> tmp;
1051 emit weekChanged( tmp ); 1051 emit weekChanged( tmp );
1052 } 1052 }
1053 else if ( msg == "setDateFormat(DateFormat)" ) { 1053 else if ( msg == "setDateFormat(DateFormat)" ) {
1054 DateFormat tmp; 1054 DateFormat tmp;
1055 stream >> tmp; 1055 stream >> tmp;
1056 emit dateFormatChanged( tmp ); 1056 emit dateFormatChanged( tmp );
1057 } 1057 }
1058 else if ( msg == "setVolume(int,int)" ) { 1058 else if ( msg == "setVolume(int,int)" ) {
1059 int t, v; 1059 int t, v;
1060 stream >> t >> v; 1060 stream >> t >> v;
1061 setVolume( t, v ); 1061 setVolume( t, v );
1062 emit volumeChanged( muted ); 1062 emit volumeChanged( muted );
1063 } 1063 }
1064 else if ( msg == "volumeChange(bool)" ) { 1064 else if ( msg == "volumeChange(bool)" ) {
1065 stream >> muted; 1065 stream >> muted;
1066 setVolume(); 1066 setVolume();
1067 emit volumeChanged( muted ); 1067 emit volumeChanged( muted );
1068 } 1068 }
1069 else if ( msg == "setMic(int,int)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com> 1069 else if ( msg == "setMic(int,int)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com>
1070 int t, v; 1070 int t, v;
1071 stream >> t >> v; 1071 stream >> t >> v;
1072 setMic( t, v ); 1072 setMic( t, v );
1073 emit micChanged( micMuted ); 1073 emit micChanged( micMuted );
1074 } 1074 }
1075 else if ( msg == "micChange(bool)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com> 1075 else if ( msg == "micChange(bool)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com>
1076 stream >> micMuted; 1076 stream >> micMuted;
1077 setMic(); 1077 setMic();
1078 emit micChanged( micMuted ); 1078 emit micChanged( micMuted );
1079 } 1079 }
1080#endif 1080#endif
1081} 1081}
1082 1082
1083/*! 1083/*!
1084 \internal 1084 \internal
1085*/ 1085*/
1086bool QPEApplication::raiseAppropriateWindow() 1086bool QPEApplication::raiseAppropriateWindow()
1087{ 1087{
1088 bool r = FALSE; 1088 bool r = FALSE;
1089 // ########## raise()ing main window should raise and set active 1089 // ########## raise()ing main window should raise and set active
1090 // ########## it and then all childen. This belongs in Qt/Embedded 1090 // ########## it and then all childen. This belongs in Qt/Embedded
1091 QWidget *top = d->qpe_main_widget; 1091 QWidget *top = d->qpe_main_widget;
1092 if ( !top ) 1092 if ( !top )
1093 top = mainWidget(); 1093 top = mainWidget();
1094 if ( top && d->keep_running ) { 1094 if ( top && d->keep_running ) {
1095 if ( top->isVisible() ) 1095 if ( top->isVisible() )
1096 r = TRUE; 1096 r = TRUE;
1097 else if (d->preloaded) { 1097 else if (d->preloaded) {
1098 // We are preloaded and not visible.. pretend we just started.. 1098 // We are preloaded and not visible.. pretend we just started..
1099 QCopEnvelope e("QPE/System", "fastAppShowing(QString)"); 1099 QCopEnvelope e("QPE/System", "fastAppShowing(QString)");
1100 e << d->appName; 1100 e << d->appName;
1101 } 1101 }
1102 1102
1103 d->show_mx(top, d->nomaximize); 1103 d->show_mx(top, d->nomaximize);
1104 top->raise(); 1104 top->raise();
1105 top->setActiveWindow(); 1105 top->setActiveWindow();
1106 } 1106 }
1107 QWidget *topm = activeModalWidget(); 1107 QWidget *topm = activeModalWidget();
1108 if ( topm && topm != top ) { 1108 if ( topm && topm != top ) {
1109 topm->show(); 1109 topm->show();
1110 topm->raise(); 1110 topm->raise();
1111 topm->setActiveWindow(); 1111 topm->setActiveWindow();
1112 // If we haven't already handled the fastAppShowing message 1112 // If we haven't already handled the fastAppShowing message
1113 if (!top && d->preloaded) { 1113 if (!top && d->preloaded) {
1114 QCopEnvelope e("QPE/System", "fastAppShowing(QString)"); 1114 QCopEnvelope e("QPE/System", "fastAppShowing(QString)");
1115 e << d->appName; 1115 e << d->appName;
1116 } 1116 }
1117 r = FALSE; 1117 r = FALSE;
1118 } 1118 }
1119 return r; 1119 return r;
1120} 1120}
1121 1121
1122void QPEApplication::pidMessage( const QCString& msg, const QByteArray& data) 1122void QPEApplication::pidMessage( const QCString& msg, const QByteArray& data)
1123{ 1123{
1124#ifdef Q_WS_QWS 1124#ifdef Q_WS_QWS
1125 1125
1126 if ( msg == "quit()" ) { 1126 if ( msg == "quit()" ) {
1127 tryQuit(); 1127 tryQuit();
1128 } 1128 }
1129 else if ( msg == "quitIfInvisible()" ) { 1129 else if ( msg == "quitIfInvisible()" ) {
1130 if ( d->qpe_main_widget && !d->qpe_main_widget->isVisible() ) 1130 if ( d->qpe_main_widget && !d->qpe_main_widget->isVisible() )
1131 quit(); 1131 quit();
1132 } 1132 }
1133 else if ( msg == "close()" ) { 1133 else if ( msg == "close()" ) {
1134 hideOrQuit(); 1134 hideOrQuit();
1135 } 1135 }
1136 else if ( msg == "disablePreload()" ) { 1136 else if ( msg == "disablePreload()" ) {
1137 d->preloaded = FALSE; 1137 d->preloaded = FALSE;
1138 d->keep_running = TRUE; 1138 d->keep_running = TRUE;
1139 /* so that quit will quit */ 1139 /* so that quit will quit */
1140 } 1140 }
1141 else if ( msg == "enablePreload()" ) { 1141 else if ( msg == "enablePreload()" ) {
1142 if (d->qpe_main_widget) 1142 if (d->qpe_main_widget)
1143 d->preloaded = TRUE; 1143 d->preloaded = TRUE;
1144 d->keep_running = TRUE; 1144 d->keep_running = TRUE;
1145 /* so next quit won't quit */ 1145 /* so next quit won't quit */
1146 } 1146 }
1147 else if ( msg == "raise()" ) { 1147 else if ( msg == "raise()" ) {
1148 d->keep_running = TRUE; 1148 d->keep_running = TRUE;
1149 d->notbusysent = FALSE; 1149 d->notbusysent = FALSE;
1150 raiseAppropriateWindow(); 1150 raiseAppropriateWindow();
1151 // Tell the system we're still chugging along... 1151 // Tell the system we're still chugging along...
1152 QCopEnvelope e("QPE/System", "appRaised(QString)"); 1152 QCopEnvelope e("QPE/System", "appRaised(QString)");
1153 e << d->appName; 1153 e << d->appName;
1154 } 1154 }
1155 else if ( msg == "flush()" ) { 1155 else if ( msg == "flush()" ) {
1156 emit flush(); 1156 emit flush();
1157 // we need to tell the desktop 1157 // we need to tell the desktop
1158 QCopEnvelope e( "QPE/Desktop", "flushDone(QString)" ); 1158 QCopEnvelope e( "QPE/Desktop", "flushDone(QString)" );
1159 e << d->appName; 1159 e << d->appName;
1160 } 1160 }
1161 else if ( msg == "reload()" ) { 1161 else if ( msg == "reload()" ) {
1162 emit reload(); 1162 emit reload();
1163 } 1163 }
1164 else if ( msg == "setDocument(QString)" ) { 1164 else if ( msg == "setDocument(QString)" ) {
1165 d->keep_running = TRUE; 1165 d->keep_running = TRUE;
1166 QDataStream stream( data, IO_ReadOnly ); 1166 QDataStream stream( data, IO_ReadOnly );
1167 QString doc; 1167 QString doc;
1168 stream >> doc; 1168 stream >> doc;
1169 QWidget *mw = mainWidget(); 1169 QWidget *mw = mainWidget();
1170 if ( !mw ) 1170 if ( !mw )
1171 mw = d->qpe_main_widget; 1171 mw = d->qpe_main_widget;
1172 if ( mw ) 1172 if ( mw )
1173 Global::setDocument( mw, doc ); 1173 Global::setDocument( mw, doc );
1174 } 1174 }
1175 else if ( msg == "nextView()" ) { 1175 else if ( msg == "nextView()" ) {
1176 qDebug("got nextView()"); 1176 qDebug("got nextView()");
1177 /* 1177 /*
1178 if ( raiseAppropriateWindow() ) 1178 if ( raiseAppropriateWindow() )
1179 */ 1179 */
1180 emit appMessage( msg, data); 1180 emit appMessage( msg, data);
1181 } 1181 }
1182 else { 1182 else {
1183 emit appMessage( msg, data); 1183 emit appMessage( msg, data);
1184 } 1184 }
1185 1185
1186#endif 1186#endif
1187} 1187}
1188 1188
1189 1189
1190/*! 1190/*!
1191 Sets widget \a mw as the mainWidget() and shows it. For small windows, 1191 Sets widget \a mw as the mainWidget() and shows it. For small windows,
1192 consider passing TRUE for \a nomaximize rather than the default FALSE. 1192 consider passing TRUE for \a nomaximize rather than the default FALSE.
1193 1193
1194 \sa showMainDocumentWidget() 1194 \sa showMainDocumentWidget()
1195*/ 1195*/
1196void QPEApplication::showMainWidget( QWidget* mw, bool nomaximize ) 1196void QPEApplication::showMainWidget( QWidget* mw, bool nomaximize )
1197{ 1197{
1198 d->show(mw, nomaximize ); 1198 d->show(mw, nomaximize );
1199} 1199}
1200 1200
1201/*! 1201/*!
1202 Sets widget \a mw as the mainWidget() and shows it. For small windows, 1202 Sets widget \a mw as the mainWidget() and shows it. For small windows,
1203 consider passing TRUE for \a nomaximize rather than the default FALSE. 1203 consider passing TRUE for \a nomaximize rather than the default FALSE.
1204 1204
1205 This calls designates the application as 1205 This calls designates the application as
1206 a \link docwidget.html document-oriented\endlink application. 1206 a \link docwidget.html document-oriented\endlink application.
1207 1207
1208 The \a mw widget \e must have this slot: setDocument(const QString&). 1208 The \a mw widget \e must have this slot: setDocument(const QString&).
1209 1209
1210 \sa showMainWidget() 1210 \sa showMainWidget()
1211*/ 1211*/
1212void QPEApplication::showMainDocumentWidget( QWidget* mw, bool nomaximize ) 1212void QPEApplication::showMainDocumentWidget( QWidget* mw, bool nomaximize )
1213{ 1213{
1214 if ( mw && argc() == 2 ) 1214 if ( mw && argc() == 2 )
1215 Global::setDocument( mw, QString::fromUtf8(argv()[1]) ); 1215 Global::setDocument( mw, QString::fromUtf8(argv()[1]) );
1216 1216
1217 d->show(mw, nomaximize ); 1217 d->show(mw, nomaximize );
1218} 1218}
1219 1219
1220 1220
1221/*! 1221/*!
1222 If an application is started via a \link qcop.html QCop\endlink 1222 If an application is started via a \link qcop.html QCop\endlink
1223 message, the application will process the \link qcop.html 1223 message, the application will process the \link qcop.html
1224 QCop\endlink message and then quit. If the application calls this 1224 QCop\endlink message and then quit. If the application calls this
1225 function while processing a \link qcop.html QCop\endlink message, 1225 function while processing a \link qcop.html QCop\endlink message,
1226 after processing its outstanding \link qcop.html QCop\endlink 1226 after processing its outstanding \link qcop.html QCop\endlink
1227 messages the application will start 'properly' and show itself. 1227 messages the application will start 'properly' and show itself.
1228 1228
1229 \sa keepRunning() 1229 \sa keepRunning()
1230*/ 1230*/
1231void QPEApplication::setKeepRunning() 1231void QPEApplication::setKeepRunning()
1232{ 1232{
1233 if ( qApp && qApp->inherits( "QPEApplication" ) ) { 1233 if ( qApp && qApp->inherits( "QPEApplication" ) ) {
1234 QPEApplication * qpeApp = ( QPEApplication* ) qApp; 1234 QPEApplication * qpeApp = ( QPEApplication* ) qApp;
1235 qpeApp->d->keep_running = TRUE; 1235 qpeApp->d->keep_running = TRUE;
1236 } 1236 }
1237} 1237}
1238 1238
1239/*! 1239/*!
1240 Returns TRUE if the application will quit after processing the 1240 Returns TRUE if the application will quit after processing the
1241 current list of qcop messages; otherwise returns FALSE. 1241 current list of qcop messages; otherwise returns FALSE.
1242 1242
1243 \sa setKeepRunning() 1243 \sa setKeepRunning()
1244*/ 1244*/
1245bool QPEApplication::keepRunning() const 1245bool QPEApplication::keepRunning() const
1246{ 1246{
1247 return d->keep_running; 1247 return d->keep_running;
1248} 1248}
1249 1249
1250/*! 1250/*!
1251 \internal 1251 \internal
1252*/ 1252*/
1253void QPEApplication::internalSetStyle( const QString &style ) 1253void QPEApplication::internalSetStyle( const QString &style )
1254{ 1254{
1255#if QT_VERSION >= 300 1255#if QT_VERSION >= 300
1256 if ( style == "QPE" ) { 1256 if ( style == "QPE" ) {
1257 setStyle( new QPEStyle ); 1257 setStyle( new QPEStyle );
1258 } 1258 }
1259 else { 1259 else {
1260 QStyle *s = QStyleFactory::create( style ); 1260 QStyle *s = QStyleFactory::create( style );
1261 if ( s ) 1261 if ( s )
1262 setStyle( s ); 1262 setStyle( s );
1263 } 1263 }
1264#else 1264#else
1265 if ( style == "Windows" ) { 1265 if ( style == "Windows" ) {
1266 setStyle( new QWindowsStyle ); 1266 setStyle( new QWindowsStyle );
1267 } 1267 }
1268 else if ( style == "QPE" ) { 1268 else if ( style == "QPE" ) {
1269 setStyle( new QPEStyle ); 1269 setStyle( new QPEStyle );
1270 } 1270 }
1271 else if ( style == "Light" ) { 1271 else if ( style == "Light" ) {
1272 setStyle( new LightStyle ); 1272 setStyle( new LightStyle );
1273 } 1273 }
1274#ifndef QT_NO_STYLE_PLATINUM 1274#ifndef QT_NO_STYLE_PLATINUM
1275 else if ( style == "Platinum" ) { 1275 else if ( style == "Platinum" ) {
1276 setStyle( new QPlatinumStyle ); 1276 setStyle( new QPlatinumStyle );
1277 } 1277 }
1278#endif 1278#endif
1279#ifndef QT_NO_STYLE_MOTIF 1279#ifndef QT_NO_STYLE_MOTIF
1280 else if ( style == "Motif" ) { 1280 else if ( style == "Motif" ) {
1281 setStyle( new QMotifStyle ); 1281 setStyle( new QMotifStyle );
1282 } 1282 }
1283#endif 1283#endif
1284#ifndef QT_NO_STYLE_MOTIFPLUS 1284#ifndef QT_NO_STYLE_MOTIFPLUS
1285 else if ( style == "MotifPlus" ) { 1285 else if ( style == "MotifPlus" ) {
1286 setStyle( new QMotifPlusStyle ); 1286 setStyle( new QMotifPlusStyle );
1287 } 1287 }
1288#endif 1288#endif
1289 1289
1290 else { 1290 else {
1291 QStyle *sty = 0; 1291 QStyle *sty = 0;
1292 QString path = QPEApplication::qpeDir ( ) + "/plugins/styles/"; 1292 QString path = QPEApplication::qpeDir ( ) + "/plugins/styles/";
1293 1293
1294 if ( style. find ( ".so" ) > 0 ) 1294 if ( style. find ( ".so" ) > 0 )
1295 path += style; 1295 path += style;
1296 else 1296 else
1297 path = path + "lib" + style. lower ( ) + ".so"; // compatibility 1297 path = path + "lib" + style. lower ( ) + ".so"; // compatibility
1298 1298
1299 static QLibrary *lastlib = 0; 1299 static QLibrary *lastlib = 0;
1300 static StyleInterface *lastiface = 0; 1300 static StyleInterface *lastiface = 0;
1301 1301
1302 QLibrary *lib = new QLibrary ( path ); 1302 QLibrary *lib = new QLibrary ( path );
1303 StyleInterface *iface = 0; 1303 StyleInterface *iface = 0;
1304 1304
1305 if (( lib-> queryInterface ( IID_Style, ( QUnknownInterface ** ) &iface ) == QS_OK ) && iface ) 1305 if (( lib-> queryInterface ( IID_Style, ( QUnknownInterface ** ) &iface ) == QS_OK ) && iface )
1306 sty = iface-> style ( ); 1306 sty = iface-> style ( );
1307 1307
1308 if ( sty ) { 1308 if ( sty ) {
1309 setStyle ( sty ); 1309 setStyle ( sty );
1310 1310
1311 if ( lastiface ) 1311 if ( lastiface )
1312 lastiface-> release ( ); 1312 lastiface-> release ( );
1313 lastiface = iface; 1313 lastiface = iface;
1314 1314
1315 if ( lastlib ) { 1315 if ( lastlib ) {
1316 lastlib-> unload ( ); 1316 lastlib-> unload ( );
1317 delete lastlib; 1317 delete lastlib;
1318 } 1318 }
1319 lastlib = lib; 1319 lastlib = lib;
1320 } 1320 }
1321 else { 1321 else {
1322 if ( iface ) 1322 if ( iface )
1323 iface-> release ( ); 1323 iface-> release ( );
1324 delete lib; 1324 delete lib;
1325 1325
1326 setStyle ( new QPEStyle ( )); 1326 setStyle ( new QPEStyle ( ));
1327 } 1327 }
1328 } 1328 }
1329#endif 1329#endif
1330} 1330}
1331 1331
1332/*! 1332/*!
1333 \internal 1333 \internal
1334*/ 1334*/
1335void QPEApplication::prepareForTermination( bool willrestart ) 1335void QPEApplication::prepareForTermination( bool willrestart )
1336{ 1336{
1337 if ( willrestart ) { 1337 if ( willrestart ) {
1338 // Draw a big wait icon, the image can be altered in later revisions 1338 // Draw a big wait icon, the image can be altered in later revisions
1339 // QWidget *d = QApplication::desktop(); 1339 // QWidget *d = QApplication::desktop();
1340 QImage img = Resource::loadImage( "launcher/new_wait" ); 1340 QImage img = Resource::loadImage( "launcher/new_wait" );
1341 QPixmap pix; 1341 QPixmap pix;
1342 pix.convertFromImage( img.smoothScale( 1 * img.width(), 1 * img.height() ) ); 1342 pix.convertFromImage( img.smoothScale( 1 * img.width(), 1 * img.height() ) );
1343 QLabel *lblWait = new QLabel( 0, "wait hack!", QWidget::WStyle_Customize | 1343 QLabel *lblWait = new QLabel( 0, "wait hack!", QWidget::WStyle_Customize |
1344 QWidget::WStyle_NoBorder | QWidget::WStyle_Tool ); 1344 QWidget::WStyle_NoBorder | QWidget::WStyle_Tool );
1345 lblWait->setPixmap( pix ); 1345 lblWait->setPixmap( pix );
1346 lblWait->setAlignment( QWidget::AlignCenter ); 1346 lblWait->setAlignment( QWidget::AlignCenter );
1347 lblWait->show(); 1347 lblWait->show();
1348 lblWait->showMaximized(); 1348 lblWait->showMaximized();
1349 } 1349 }
1350#ifndef SINGLE_APP 1350#ifndef SINGLE_APP
1351 { QCopEnvelope envelope( "QPE/System", "forceQuit()" ); 1351 { QCopEnvelope envelope( "QPE/System", "forceQuit()" );
1352 } 1352 }
1353 processEvents(); // ensure the message goes out. 1353 processEvents(); // ensure the message goes out.
1354 sleep( 1 ); // You have 1 second to comply. 1354 sleep( 1 ); // You have 1 second to comply.
1355#endif 1355#endif
1356} 1356}
1357 1357
1358/*! 1358/*!
1359 \internal 1359 \internal
1360*/ 1360*/
1361void QPEApplication::shutdown() 1361void QPEApplication::shutdown()
1362{ 1362{
1363 // Implement in server's QPEApplication subclass 1363 // Implement in server's QPEApplication subclass
1364} 1364}
1365 1365
1366/*! 1366/*!
1367 \internal 1367 \internal
1368*/ 1368*/
1369void QPEApplication::restart() 1369void QPEApplication::restart()
1370{ 1370{
1371 // Implement in server's QPEApplication subclass 1371 // Implement in server's QPEApplication subclass
1372} 1372}
1373 1373
1374static QPtrDict<void>* stylusDict = 0; 1374static QPtrDict<void>* stylusDict = 0;
1375static void createDict() 1375static void createDict()
1376{ 1376{
1377 if ( !stylusDict ) 1377 if ( !stylusDict )
1378 stylusDict = new QPtrDict<void>; 1378 stylusDict = new QPtrDict<void>;
1379} 1379}
1380 1380
1381/*! 1381/*!
1382 Returns the current StylusMode for widget \a w. 1382 Returns the current StylusMode for widget \a w.
1383 1383
1384 \sa setStylusOperation() StylusMode 1384 \sa setStylusOperation() StylusMode
1385*/ 1385*/
1386QPEApplication::StylusMode QPEApplication::stylusOperation( QWidget* w ) 1386QPEApplication::StylusMode QPEApplication::stylusOperation( QWidget* w )
1387{ 1387{
1388 if ( stylusDict ) 1388 if ( stylusDict )
1389 return ( StylusMode ) ( int ) stylusDict->find( w ); 1389 return ( StylusMode ) ( int ) stylusDict->find( w );
1390 return LeftOnly; 1390 return LeftOnly;
1391} 1391}
1392 1392
1393/*! 1393/*!
1394 \enum QPEApplication::StylusMode 1394 \enum QPEApplication::StylusMode
1395 1395
1396 \value LeftOnly the stylus only generates LeftButton 1396 \value LeftOnly the stylus only generates LeftButton
1397 events (the default). 1397 events (the default).
1398 \value RightOnHold the stylus generates RightButton events 1398 \value RightOnHold the stylus generates RightButton events
1399 if the user uses the press-and-hold gesture. 1399 if the user uses the press-and-hold gesture.
1400 1400
1401 \sa setStylusOperation() stylusOperation() 1401 \sa setStylusOperation() stylusOperation()
1402*/ 1402*/
1403 1403
1404/*! 1404/*!
1405 Causes widget \a w to receive mouse events according to the stylus 1405 Causes widget \a w to receive mouse events according to the stylus
1406 \a mode. 1406 \a mode.
1407 1407
1408 \sa stylusOperation() StylusMode 1408 \sa stylusOperation() StylusMode
1409*/ 1409*/
1410void QPEApplication::setStylusOperation( QWidget * w, StylusMode mode ) 1410void QPEApplication::setStylusOperation( QWidget * w, StylusMode mode )
1411{ 1411{
1412 createDict(); 1412 createDict();
1413 if ( mode == LeftOnly ) { 1413 if ( mode == LeftOnly ) {
1414 stylusDict->remove 1414 stylusDict->remove
1415 ( w ); 1415 ( w );
1416 w->removeEventFilter( qApp ); 1416 w->removeEventFilter( qApp );
1417 } 1417 }
1418 else { 1418 else {
1419 stylusDict->insert( w, ( void* ) mode ); 1419 stylusDict->insert( w, ( void* ) mode );
1420 connect( w, SIGNAL( destroyed() ), qApp, SLOT( removeSenderFromStylusDict() ) ); 1420 connect( w, SIGNAL( destroyed() ), qApp, SLOT( removeSenderFromStylusDict() ) );
1421 w->installEventFilter( qApp ); 1421 w->installEventFilter( qApp );
1422 } 1422 }
1423} 1423}
1424 1424
1425 1425
1426/*! 1426/*!
1427 \reimp 1427 \reimp
1428*/ 1428*/
1429bool QPEApplication::eventFilter( QObject *o, QEvent *e ) 1429bool QPEApplication::eventFilter( QObject *o, QEvent *e )
1430{ 1430{
1431 if ( stylusDict && e->type() >= QEvent::MouseButtonPress && e->type() <= QEvent::MouseMove ) { 1431 if ( stylusDict && e->type() >= QEvent::MouseButtonPress && e->type() <= QEvent::MouseMove ) {
1432 QMouseEvent * me = ( QMouseEvent* ) e; 1432 QMouseEvent * me = ( QMouseEvent* ) e;
1433 StylusMode mode = (StylusMode)(int)stylusDict->find(o); 1433 StylusMode mode = (StylusMode)(int)stylusDict->find(o);
1434 switch (mode) { 1434 switch (mode) {
1435 case RightOnHold: 1435 case RightOnHold:
1436 switch ( me->type() ) { 1436 switch ( me->type() ) {
1437 case QEvent::MouseButtonPress: 1437 case QEvent::MouseButtonPress:
1438 if ( me->button() == LeftButton ) { 1438 if ( me->button() == LeftButton ) {
1439 d->presstimer = startTimer(500); // #### pref. 1439 d->presstimer = startTimer(500); // #### pref.
1440 d->presswidget = (QWidget*)o; 1440 d->presswidget = (QWidget*)o;
1441 d->presspos = me->pos(); 1441 d->presspos = me->pos();
1442 d->rightpressed = FALSE; 1442 d->rightpressed = FALSE;
1443 } 1443 }
1444 break; 1444 break;
1445 case QEvent::MouseMove: 1445 case QEvent::MouseMove:
1446 if (d->presstimer && (me->pos() - d->presspos).manhattanLength() > 8) { 1446 if (d->presstimer && (me->pos() - d->presspos).manhattanLength() > 8) {
1447 killTimer(d->presstimer); 1447 killTimer(d->presstimer);
1448 d->presstimer = 0; 1448 d->presstimer = 0;
1449 } 1449 }
1450 break; 1450 break;
1451 case QEvent::MouseButtonRelease: 1451 case QEvent::MouseButtonRelease:
1452 if ( me->button() == LeftButton ) { 1452 if ( me->button() == LeftButton ) {
1453 if ( d->presstimer ) { 1453 if ( d->presstimer ) {
1454 killTimer(d->presstimer); 1454 killTimer(d->presstimer);
1455 d->presstimer = 0; 1455 d->presstimer = 0;
1456 } 1456 }
1457 if ( d->rightpressed && d->presswidget ) { 1457 if ( d->rightpressed && d->presswidget ) {
1458 // Right released 1458 // Right released
1459 postEvent( d->presswidget, 1459 postEvent( d->presswidget,
1460 new QMouseEvent( QEvent::MouseButtonRelease, me->pos(), 1460 new QMouseEvent( QEvent::MouseButtonRelease, me->pos(),
1461 RightButton, LeftButton + RightButton ) ); 1461 RightButton, LeftButton + RightButton ) );
1462 // Left released, off-widget 1462 // Left released, off-widget
1463 postEvent( d->presswidget, 1463 postEvent( d->presswidget,
1464 new QMouseEvent( QEvent::MouseMove, QPoint( -1, -1), 1464 new QMouseEvent( QEvent::MouseMove, QPoint( -1, -1),
1465 LeftButton, LeftButton ) ); 1465 LeftButton, LeftButton ) );
1466 postEvent( d->presswidget, 1466 postEvent( d->presswidget,
1467 new QMouseEvent( QEvent::MouseButtonRelease, QPoint( -1, -1), 1467 new QMouseEvent( QEvent::MouseButtonRelease, QPoint( -1, -1),
1468 LeftButton, LeftButton ) ); 1468 LeftButton, LeftButton ) );
1469 d->rightpressed = FALSE; 1469 d->rightpressed = FALSE;
1470 return TRUE; // don't send the real Left release 1470 return TRUE; // don't send the real Left release
1471 } 1471 }
1472 } 1472 }
1473 break; 1473 break;
1474 default: 1474 default:
1475 break; 1475 break;
1476 } 1476 }
1477 break; 1477 break;
1478 default: 1478 default:
1479 ; 1479 ;
1480 } 1480 }
1481 } 1481 }
1482 else if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) { 1482 else if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) {
1483 QKeyEvent *ke = (QKeyEvent *)e; 1483 QKeyEvent *ke = (QKeyEvent *)e;
1484 if ( ke->key() == Key_Enter ) { 1484 if ( ke->key() == Key_Enter ) {
1485 if ( o->isA( "QRadioButton" ) || o->isA( "QCheckBox" ) ) { 1485 if ( o->isA( "QRadioButton" ) || o->isA( "QCheckBox" ) ) {
1486 postEvent( o, new QKeyEvent( e->type(), Key_Space, ' ', 1486 postEvent( o, new QKeyEvent( e->type(), Key_Space, ' ',
1487 ke->state(), " ", ke->isAutoRepeat(), ke->count() ) ); 1487 ke->state(), " ", ke->isAutoRepeat(), ke->count() ) );
1488 return TRUE; 1488 return TRUE;
1489 } 1489 }
1490 } 1490 }
1491 } 1491 }
1492 return FALSE; 1492 return FALSE;
1493} 1493}
1494 1494
1495/*! 1495/*!
1496 \reimp 1496 \reimp
1497*/ 1497*/
1498void QPEApplication::timerEvent( QTimerEvent *e ) 1498void QPEApplication::timerEvent( QTimerEvent *e )
1499{ 1499{
1500 if ( e->timerId() == d->presstimer && d->presswidget ) { 1500 if ( e->timerId() == d->presstimer && d->presswidget ) {
1501 // Right pressed 1501 // Right pressed
1502 postEvent( d->presswidget, 1502 postEvent( d->presswidget,
1503 new QMouseEvent( QEvent::MouseButtonPress, d->presspos, 1503 new QMouseEvent( QEvent::MouseButtonPress, d->presspos,
1504 RightButton, LeftButton ) ); 1504 RightButton, LeftButton ) );
1505 killTimer( d->presstimer ); 1505 killTimer( d->presstimer );
1506 d->presstimer = 0; 1506 d->presstimer = 0;
1507 d->rightpressed = TRUE; 1507 d->rightpressed = TRUE;
1508 } 1508 }
1509} 1509}
1510 1510
1511void QPEApplication::removeSenderFromStylusDict() 1511void QPEApplication::removeSenderFromStylusDict()
1512{ 1512{
1513 stylusDict->remove 1513 stylusDict->remove
1514 ( ( void* ) sender() ); 1514 ( ( void* ) sender() );
1515 if ( d->presswidget == sender() ) 1515 if ( d->presswidget == sender() )
1516 d->presswidget = 0; 1516 d->presswidget = 0;
1517} 1517}
1518 1518
1519/*! 1519/*!
1520 \internal 1520 \internal
1521*/ 1521*/
1522bool QPEApplication::keyboardGrabbed() const 1522bool QPEApplication::keyboardGrabbed() const
1523{ 1523{
1524 return d->kbgrabber; 1524 return d->kbgrabber;
1525} 1525}
1526 1526
1527 1527
1528/*! 1528/*!
1529 Reverses the effect of grabKeyboard(). This is called automatically 1529 Reverses the effect of grabKeyboard(). This is called automatically
1530 on program exit. 1530 on program exit.
1531*/ 1531*/
1532void QPEApplication::ungrabKeyboard() 1532void QPEApplication::ungrabKeyboard()
1533{ 1533{
1534 QPEApplicationData * d = ( ( QPEApplication* ) qApp ) ->d; 1534 QPEApplicationData * d = ( ( QPEApplication* ) qApp ) ->d;
1535 if ( d->kbgrabber == 2 ) { 1535 if ( d->kbgrabber == 2 ) {
1536#ifndef QT_NO_COP 1536#ifndef QT_NO_COP
1537 QCopEnvelope e( "QPE/System", "grabKeyboard(QString)" ); 1537 QCopEnvelope e( "QPE/System", "grabKeyboard(QString)" );
1538 e << QString::null; 1538 e << QString::null;
1539#endif 1539#endif
1540 1540
1541 d->kbregrab = FALSE; 1541 d->kbregrab = FALSE;
1542 d->kbgrabber = 0; 1542 d->kbgrabber = 0;
1543 } 1543 }
1544} 1544}
1545 1545
1546/*! 1546/*!
1547 Grabs the physical keyboard keys, e.g. the application's launching 1547 Grabs the physical keyboard keys, e.g. the application's launching
1548 keys. Instead of launching applications when these keys are pressed 1548 keys. Instead of launching applications when these keys are pressed
1549 the signals emitted are sent to this application instead. Some games 1549 the signals emitted are sent to this application instead. Some games
1550 programs take over the launch keys in this way to make interaction 1550 programs take over the launch keys in this way to make interaction
1551 easier. 1551 easier.
1552 1552
1553 \sa ungrabKeyboard() 1553 \sa ungrabKeyboard()
1554*/ 1554*/
1555void QPEApplication::grabKeyboard() 1555void QPEApplication::grabKeyboard()
1556{ 1556{
1557 QPEApplicationData * d = ( ( QPEApplication* ) qApp ) ->d; 1557 QPEApplicationData * d = ( ( QPEApplication* ) qApp ) ->d;
1558 if ( qApp->type() == QApplication::GuiServer ) 1558 if ( qApp->type() == QApplication::GuiServer )
1559 d->kbgrabber = 0; 1559 d->kbgrabber = 0;
1560 else { 1560 else {
1561#ifndef QT_NO_COP 1561#ifndef QT_NO_COP
1562 QCopEnvelope e( "QPE/System", "grabKeyboard(QString)" ); 1562 QCopEnvelope e( "QPE/System", "grabKeyboard(QString)" );
1563 e << d->appName; 1563 e << d->appName;
1564#endif 1564#endif
1565 1565
1566 d->kbgrabber = 2; // me 1566 d->kbgrabber = 2; // me
1567 } 1567 }
1568} 1568}
1569 1569
1570/*! 1570/*!
1571 \reimp 1571 \reimp
1572*/ 1572*/
1573int QPEApplication::exec() 1573int QPEApplication::exec()
1574{ 1574{
1575#ifndef QT_NO_COP 1575#ifndef QT_NO_COP
1576 d->sendQCopQ(); 1576 d->sendQCopQ();
1577#endif 1577#endif
1578 1578
1579 if ( d->keep_running ) 1579 if ( d->keep_running )
1580 //|| d->qpe_main_widget && d->qpe_main_widget->isVisible() ) 1580 //|| d->qpe_main_widget && d->qpe_main_widget->isVisible() )
1581 return QApplication::exec(); 1581 return QApplication::exec();
1582 1582
1583#ifndef QT_NO_COP 1583#ifndef QT_NO_COP
1584 1584
1585 { 1585 {
1586 QCopEnvelope e( "QPE/System", "closing(QString)" ); 1586 QCopEnvelope e( "QPE/System", "closing(QString)" );
1587 e << d->appName; 1587 e << d->appName;
1588 } 1588 }
1589#endif 1589#endif
1590 processEvents(); 1590 processEvents();
1591 return 0; 1591 return 0;
1592} 1592}
1593 1593
1594/*! 1594/*!
1595 \internal 1595 \internal
1596 External request for application to quit. Quits if possible without 1596 External request for application to quit. Quits if possible without
1597 loosing state. 1597 loosing state.
1598*/ 1598*/
1599void QPEApplication::tryQuit() 1599void QPEApplication::tryQuit()
1600{ 1600{
1601 if ( activeModalWidget() || strcmp( argv() [ 0 ], "embeddedkonsole" ) == 0 ) 1601 if ( activeModalWidget() || strcmp( argv() [ 0 ], "embeddedkonsole" ) == 0 )
1602 return ; // Inside modal loop or konsole. Too hard to save state. 1602 return ; // Inside modal loop or konsole. Too hard to save state.
1603#ifndef QT_NO_COP 1603#ifndef QT_NO_COP
1604 1604
1605 { 1605 {
1606 QCopEnvelope e( "QPE/System", "closing(QString)" ); 1606 QCopEnvelope e( "QPE/System", "closing(QString)" );
1607 e << d->appName; 1607 e << d->appName;
1608 } 1608 }
1609#endif 1609#endif
1610 processEvents(); 1610 processEvents();
1611 1611
1612 quit(); 1612 quit();
1613} 1613}
1614 1614
1615/*! 1615/*!
1616 \internal 1616 \internal
1617 User initiated quit. Makes the window 'Go Away'. If preloaded this means 1617 User initiated quit. Makes the window 'Go Away'. If preloaded this means
1618 hiding the window. If not it means quitting the application. 1618 hiding the window. If not it means quitting the application.
1619 As this is user initiated we don't need to check state. 1619 As this is user initiated we don't need to check state.
1620*/ 1620*/
1621void QPEApplication::hideOrQuit() 1621void QPEApplication::hideOrQuit()
1622{ 1622{
1623 processEvents(); 1623 processEvents();
1624 1624
1625 // If we are a preloaded application we don't actually quit, so emit 1625 // If we are a preloaded application we don't actually quit, so emit
1626 // a System message indicating we're quasi-closing. 1626 // a System message indicating we're quasi-closing.
1627 if ( d->preloaded && d->qpe_main_widget ) 1627 if ( d->preloaded && d->qpe_main_widget )
1628#ifndef QT_NO_COP 1628#ifndef QT_NO_COP
1629 1629
1630 { 1630 {
1631 QCopEnvelope e("QPE/System", "fastAppHiding(QString)" ); 1631 QCopEnvelope e("QPE/System", "fastAppHiding(QString)" );
1632 e << d->appName; 1632 e << d->appName;
1633 d->qpe_main_widget->hide(); 1633 d->qpe_main_widget->hide();
1634 } 1634 }
1635#endif 1635#endif
1636 else 1636 else
1637 quit(); 1637 quit();
1638} 1638}
1639 1639
1640#if defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX) 1640#if defined(QT_QWS_IPAQ) || defined(QT_QWS_SHARP)
1641 1641
1642// The libraries with the skiff package (and possibly others) have 1642// The libraries with the skiff package (and possibly others) have
1643// completely useless implementations of builtin new and delete that 1643// completely useless implementations of builtin new and delete that
1644// use about 50% of your CPU. Here we revert to the simple libc 1644// use about 50% of your CPU. Here we revert to the simple libc
1645// functions. 1645// functions.
1646 1646
1647void* operator new[]( size_t size ) 1647void* operator new[]( size_t size )
1648{ 1648{
1649 return malloc( size ); 1649 return malloc( size );
1650} 1650}
1651 1651
1652void* operator new( size_t size ) 1652void* operator new( size_t size )
1653{ 1653{
1654 return malloc( size ); 1654 return malloc( size );
1655} 1655}
1656 1656
1657void operator delete[]( void* p ) 1657void operator delete[]( void* p )
1658{ 1658{
1659 free( p ); 1659 free( p );
1660} 1660}
1661 1661
1662void operator delete[]( void* p, size_t /*size*/ ) 1662void operator delete[]( void* p, size_t /*size*/ )
1663{ 1663{
1664 free( p ); 1664 free( p );
1665} 1665}
1666 1666
1667void operator delete( void* p ) 1667void operator delete( void* p )
1668{ 1668{
1669 free( p ); 1669 free( p );
1670} 1670}
1671 1671
1672void operator delete( void* p, size_t /*size*/ ) 1672void operator delete( void* p, size_t /*size*/ )
1673{ 1673{
1674 free( p ); 1674 free( p );
1675} 1675}
1676 1676
1677#endif 1677#endif
1678 1678
1679#if ( QT_VERSION <= 230 ) && !defined(SINGLE_APP) 1679#if ( QT_VERSION <= 230 ) && !defined(SINGLE_APP)
1680#include <qwidgetlist.h> 1680#include <qwidgetlist.h>
1681#ifdef QWS 1681#ifdef QWS
1682#include <qgfx_qws.h> 1682#include <qgfx_qws.h>
1683extern QRect qt_maxWindowRect; 1683extern QRect qt_maxWindowRect;
1684void qt_setMaxWindowRect(const QRect& r ) 1684void qt_setMaxWindowRect(const QRect& r )
1685{ 1685{
1686 qt_maxWindowRect = qt_screen->mapFromDevice( r, 1686 qt_maxWindowRect = qt_screen->mapFromDevice( r,
1687 qt_screen->mapToDevice( QSize( qt_screen->width(), qt_screen->height() ) ) ); 1687 qt_screen->mapToDevice( QSize( qt_screen->width(), qt_screen->height() ) ) );
1688 // Re-resize any maximized windows 1688 // Re-resize any maximized windows
1689 QWidgetList* l = QApplication::topLevelWidgets(); 1689 QWidgetList* l = QApplication::topLevelWidgets();
1690 if ( l ) { 1690 if ( l ) {
1691 QWidget * w = l->first(); 1691 QWidget * w = l->first();
1692 while ( w ) { 1692 while ( w ) {
1693 if ( w->isVisible() && w->isMaximized() ) { 1693 if ( w->isVisible() && w->isMaximized() ) {
1694 w->showMaximized(); 1694 w->showMaximized();
1695 } 1695 }
1696 w = l->next(); 1696 w = l->next();
1697 } 1697 }
1698 delete l; 1698 delete l;
1699 } 1699 }
1700} 1700}
1701#endif 1701#endif
1702#endif 1702#endif