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
@@ -1384,319 +1384,319 @@ static void createDict()
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