summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/launcher/desktop.cpp5
-rw-r--r--core/launcher/main.cpp3
2 files changed, 3 insertions, 5 deletions
diff --git a/core/launcher/desktop.cpp b/core/launcher/desktop.cpp
index fb10602..1ec477c 100644
--- a/core/launcher/desktop.cpp
+++ b/core/launcher/desktop.cpp
@@ -1,809 +1,806 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved. 2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of Qtopia Environment. 4** This file is part of 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 "desktop.h" 21#include "desktop.h"
22#include "info.h" 22#include "info.h"
23#include "launcher.h" 23#include "launcher.h"
24#include "mrulist.h" 24#include "mrulist.h"
25#include "qcopbridge.h" 25#include "qcopbridge.h"
26#include "shutdownimpl.h" 26#include "shutdownimpl.h"
27#include "startmenu.h" 27#include "startmenu.h"
28#include "taskbar.h" 28#include "taskbar.h"
29#include "transferserver.h" 29#include "transferserver.h"
30#include "irserver.h" 30#include "irserver.h"
31#include "packageslave.h" 31#include "packageslave.h"
32 32
33#include <qpe/applnk.h> 33#include <qpe/applnk.h>
34#include <qpe/mimetype.h> 34#include <qpe/mimetype.h>
35#include <qpe/password.h> 35#include <qpe/password.h>
36#include <qpe/config.h> 36#include <qpe/config.h>
37#include <qpe/power.h> 37#include <qpe/power.h>
38#include <qpe/timeconversion.h> 38#include <qpe/timeconversion.h>
39#include <qpe/qcopenvelope_qws.h> 39#include <qpe/qcopenvelope_qws.h>
40#include <qpe/global.h> 40#include <qpe/global.h>
41 41
42#if defined( QT_QWS_CUSTOM ) || defined( QT_QWS_IPAQ ) 42#if defined( QT_QWS_CUSTOM ) || defined( QT_QWS_IPAQ )
43#include <qpe/custom.h> 43#include <qpe/custom.h>
44#endif 44#endif
45 45
46#include <opie/odevice.h> 46#include <opie/odevice.h>
47 47
48#include <qgfx_qws.h> 48#include <qgfx_qws.h>
49#include <qmainwindow.h> 49#include <qmainwindow.h>
50#include <qmessagebox.h> 50#include <qmessagebox.h>
51#include <qtimer.h> 51#include <qtimer.h>
52#include <qwindowsystem_qws.h> 52#include <qwindowsystem_qws.h>
53 53
54#include <qvaluelist.h> 54#include <qvaluelist.h>
55 55
56#include <stdlib.h> 56#include <stdlib.h>
57#include <unistd.h> 57#include <unistd.h>
58 58
59class QCopKeyRegister 59class QCopKeyRegister
60{ 60{
61public: 61public:
62 QCopKeyRegister() : keyCode(0) { } 62 QCopKeyRegister() : keyCode(0) { }
63 QCopKeyRegister(int k, const QString &c, const QString &m) 63 QCopKeyRegister(int k, const QString &c, const QString &m)
64 : keyCode(k), channel(c), message(m) { } 64 : keyCode(k), channel(c), message(m) { }
65 65
66 int getKeyCode() const { return keyCode; } 66 int getKeyCode() const { return keyCode; }
67 QString getChannel() const { return channel; } 67 QString getChannel() const { return channel; }
68 QString getMessage() const { return message; } 68 QString getMessage() const { return message; }
69 69
70private: 70private:
71 int keyCode; 71 int keyCode;
72 QString channel, message; 72 QString channel, message;
73}; 73};
74 74
75typedef QValueList<QCopKeyRegister> KeyRegisterList; 75typedef QValueList<QCopKeyRegister> KeyRegisterList;
76KeyRegisterList keyRegisterList; 76KeyRegisterList keyRegisterList;
77 77
78static Desktop* qpedesktop = 0; 78static Desktop* qpedesktop = 0;
79static int loggedin=0; 79static int loggedin=0;
80static void login(bool at_poweron) 80static void login(bool at_poweron)
81{ 81{
82 if ( !loggedin ) { 82 if ( !loggedin ) {
83 Global::terminateBuiltin("calibrate"); 83 Global::terminateBuiltin("calibrate");
84 Password::authenticate(at_poweron); 84 Password::authenticate(at_poweron);
85 loggedin=1; 85 loggedin=1;
86 QCopEnvelope e( "QPE/Desktop", "unlocked()" ); 86 QCopEnvelope e( "QPE/Desktop", "unlocked()" );
87 } 87 }
88} 88}
89 89
90bool Desktop::screenLocked() 90bool Desktop::screenLocked()
91{ 91{
92 return loggedin == 0; 92 return loggedin == 0;
93} 93}
94 94
95/* 95/*
96 Priority is number of alerts that are needed to pop up 96 Priority is number of alerts that are needed to pop up
97 alert. 97 alert.
98 */ 98 */
99class DesktopPowerAlerter : public QMessageBox 99class DesktopPowerAlerter : public QMessageBox
100{ 100{
101public: 101public:
102 DesktopPowerAlerter( QWidget *parent, const char *name = 0 ) 102 DesktopPowerAlerter( QWidget *parent, const char *name = 0 )
103 : QMessageBox( tr("Battery Status"), "Low Battery", 103 : QMessageBox( tr("Battery Status"), "Low Battery",
104 QMessageBox::Critical, 104 QMessageBox::Critical,
105 QMessageBox::Ok | QMessageBox::Default, 105 QMessageBox::Ok | QMessageBox::Default,
106 QMessageBox::NoButton, QMessageBox::NoButton, 106 QMessageBox::NoButton, QMessageBox::NoButton,
107 parent, name, FALSE ) 107 parent, name, FALSE )
108 { 108 {
109 currentPriority = INT_MAX; 109 currentPriority = INT_MAX;
110 alertCount = 0; 110 alertCount = 0;
111 } 111 }
112 112
113 void alert( const QString &text, int priority ); 113 void alert( const QString &text, int priority );
114 void hideEvent( QHideEvent * ); 114 void hideEvent( QHideEvent * );
115private: 115private:
116 int currentPriority; 116 int currentPriority;
117 int alertCount; 117 int alertCount;
118}; 118};
119 119
120void DesktopPowerAlerter::alert( const QString &text, int priority ) 120void DesktopPowerAlerter::alert( const QString &text, int priority )
121{ 121{
122 alertCount++; 122 alertCount++;
123 if ( alertCount < priority ) 123 if ( alertCount < priority )
124 return; 124 return;
125 if ( priority > currentPriority ) 125 if ( priority > currentPriority )
126 return; 126 return;
127 currentPriority = priority; 127 currentPriority = priority;
128 setText( text ); 128 setText( text );
129 show(); 129 show();
130} 130}
131 131
132 132
133void DesktopPowerAlerter::hideEvent( QHideEvent *e ) 133void DesktopPowerAlerter::hideEvent( QHideEvent *e )
134{ 134{
135 QMessageBox::hideEvent( e ); 135 QMessageBox::hideEvent( e );
136 alertCount = 0; 136 alertCount = 0;
137 currentPriority = INT_MAX; 137 currentPriority = INT_MAX;
138} 138}
139 139
140 140
141 141
142DesktopApplication::DesktopApplication( int& argc, char **argv, Type appType ) 142DesktopApplication::DesktopApplication( int& argc, char **argv, Type appType )
143 : QPEApplication( argc, argv, appType ) 143 : QPEApplication( argc, argv, appType )
144{ 144{
145 145
146 QTimer *t = new QTimer( this ); 146 QTimer *t = new QTimer( this );
147 connect( t, SIGNAL(timeout()), this, SLOT(psTimeout()) ); 147 connect( t, SIGNAL(timeout()), this, SLOT(psTimeout()) );
148 t->start( 10000 ); 148 t->start( 10000 );
149 ps = new PowerStatus; 149 ps = new PowerStatus;
150 pa = new DesktopPowerAlerter( 0 ); 150 pa = new DesktopPowerAlerter( 0 );
151 151
152 channel = new QCopChannel( "QPE/Desktop", this ); 152 channel = new QCopChannel( "QPE/Desktop", this );
153 connect( channel, SIGNAL(received(const QCString&, const QByteArray&)), 153 connect( channel, SIGNAL(received(const QCString&, const QByteArray&)),
154 this, SLOT(receive(const QCString&, const QByteArray&)) ); 154 this, SLOT(receive(const QCString&, const QByteArray&)) );
155} 155}
156 156
157 157
158DesktopApplication::~DesktopApplication() 158DesktopApplication::~DesktopApplication()
159{ 159{
160 delete ps; 160 delete ps;
161 delete pa; 161 delete pa;
162} 162}
163 163
164void DesktopApplication::receive( const QCString &msg, const QByteArray &data ) 164void DesktopApplication::receive( const QCString &msg, const QByteArray &data )
165{ 165{
166 QDataStream stream( data, IO_ReadOnly ); 166 QDataStream stream( data, IO_ReadOnly );
167 if (msg == "keyRegister(int key, QString channel, QString message)") 167 if (msg == "keyRegister(int key, QString channel, QString message)")
168 { 168 {
169 int k; 169 int k;
170 QString c, m; 170 QString c, m;
171 stream >> k; 171 stream >> k;
172 stream >> c; 172 stream >> c;
173 stream >> m; 173 stream >> m;
174 174
175 qWarning("KeyRegisterReceived: %i, %s, %s", k, (const char*)c, (const char *)m ); 175 qWarning("KeyRegisterReceived: %i, %s, %s", k, (const char*)c, (const char *)m );
176 keyRegisterList.append(QCopKeyRegister(k,c,m)); 176 keyRegisterList.append(QCopKeyRegister(k,c,m));
177 } 177 }
178 else if (msg == "suspend()"){ 178 else if (msg == "suspend()"){
179 emit power(); 179 emit power();
180 } 180 }
181 181
182} 182}
183 183
184enum MemState { Unknown, VeryLow, Low, Normal } memstate=Unknown; 184enum MemState { Unknown, VeryLow, Low, Normal } memstate=Unknown;
185 185
186#ifdef Q_WS_QWS 186#ifdef Q_WS_QWS
187bool DesktopApplication::qwsEventFilter( QWSEvent *e ) 187bool DesktopApplication::qwsEventFilter( QWSEvent *e )
188{ 188{
189 qpedesktop->checkMemory(); 189 qpedesktop->checkMemory();
190 190
191 if ( e->type == QWSEvent::Key ) { 191 if ( e->type == QWSEvent::Key ) {
192 QWSKeyEvent *ke = (QWSKeyEvent *)e; 192 QWSKeyEvent *ke = (QWSKeyEvent *)e;
193 if ( !loggedin && ke->simpleData.keycode != Key_F34 ) 193 if ( !loggedin && ke->simpleData.keycode != Key_F34 )
194 return TRUE; 194 return TRUE;
195 bool press = ke->simpleData.is_press; 195 bool press = ke->simpleData.is_press;
196 bool autoRepeat= ke->simpleData.is_auto_repeat; 196 bool autoRepeat= ke->simpleData.is_auto_repeat;
197 197
198 /* 198 /*
199 app that registers key/message to be sent back to the app, when it doesn't have focus, 199 app that registers key/message to be sent back to the app, when it doesn't have focus,
200 when user presses key, unless keyboard has been requested from app. 200 when user presses key, unless keyboard has been requested from app.
201 will not send multiple repeats if user holds key 201 will not send multiple repeats if user holds key
202 i.e. one shot 202 i.e. one shot
203 203
204 */ 204 */
205 if (!keyRegisterList.isEmpty()) { 205 if (!keyRegisterList.isEmpty()) {
206 KeyRegisterList::Iterator it; 206 KeyRegisterList::Iterator it;
207 for( it = keyRegisterList.begin(); it != keyRegisterList.end(); ++it ) { 207 for( it = keyRegisterList.begin(); it != keyRegisterList.end(); ++it ) {
208 if ((*it).getKeyCode() == ke->simpleData.keycode && !autoRepeat && !keyboardGrabbed() && press) { 208 if ((*it).getKeyCode() == ke->simpleData.keycode && !autoRepeat && !keyboardGrabbed() && press) {
209 if(press) qDebug("press"); else qDebug("release"); 209 if(press) qDebug("press"); else qDebug("release");
210 QCopEnvelope((*it).getChannel().utf8(), (*it).getMessage().utf8()); 210 QCopEnvelope((*it).getChannel().utf8(), (*it).getMessage().utf8());
211 } 211 }
212 } 212 }
213 } 213 }
214 214
215 if ( !keyboardGrabbed() ) { 215 if ( !keyboardGrabbed() ) {
216 if ( ke->simpleData.keycode == Key_F9 ) { 216 if ( ke->simpleData.keycode == Key_F9 ) {
217 if ( press ) emit datebook(); 217 if ( press ) emit datebook();
218 return TRUE; 218 return TRUE;
219 } 219 }
220 if ( ke->simpleData.keycode == Key_F10 ) { 220 if ( ke->simpleData.keycode == Key_F10 ) {
221 if ( !press && cardSendTimer ) { 221 if ( !press && cardSendTimer ) {
222 emit contacts(); 222 emit contacts();
223 delete cardSendTimer; 223 delete cardSendTimer;
224 } else if ( press ) { 224 } else if ( press ) {
225 cardSendTimer = new QTimer(); 225 cardSendTimer = new QTimer();
226 cardSendTimer->start( 2000, TRUE ); 226 cardSendTimer->start( 2000, TRUE );
227 connect( cardSendTimer, SIGNAL( timeout() ), this, SLOT( sendCard() ) ); 227 connect( cardSendTimer, SIGNAL( timeout() ), this, SLOT( sendCard() ) );
228 } 228 }
229 return TRUE; 229 return TRUE;
230 } 230 }
231 /* menu key now opens application menu/toolbar 231 /* menu key now opens application menu/toolbar
232 if ( ke->simpleData.keycode == Key_F11 ) { 232 if ( ke->simpleData.keycode == Key_F11 ) {
233 if ( press ) emit menu(); 233 if ( press ) emit menu();
234 return TRUE; 234 return TRUE;
235 } 235 }
236 */ 236 */
237 if ( ke->simpleData.keycode == Key_F12 ) { 237 if ( ke->simpleData.keycode == Key_F12 ) {
238 while( activePopupWidget() ) 238 while( activePopupWidget() )
239 activePopupWidget()->close(); 239 activePopupWidget()->close();
240 if ( press ) emit launch(); 240 if ( press ) emit launch();
241 return TRUE; 241 return TRUE;
242 } 242 }
243 if ( ke->simpleData.keycode == Key_F13 ) { 243 if ( ke->simpleData.keycode == Key_F13 ) {
244 if ( press ) emit email(); 244 if ( press ) emit email();
245 return TRUE; 245 return TRUE;
246 } 246 }
247 } 247 }
248 248
249 if ( ke->simpleData.keycode == Key_F34 ) { 249 if ( ke->simpleData.keycode == Key_F34 ) {
250 if ( press ) emit power(); 250 if ( press ) emit power();
251 return TRUE; 251 return TRUE;
252 } 252 }
253// This was used for the iPAQ PowerButton 253// This was used for the iPAQ PowerButton
254// See main.cpp for new KeyboardFilter 254// See main.cpp for new KeyboardFilter
255// 255//
256// if ( ke->simpleData.keycode == Key_SysReq ) { 256// if ( ke->simpleData.keycode == Key_SysReq ) {
257// if ( press ) emit power(); 257// if ( press ) emit power();
258// return TRUE; 258// return TRUE;
259// } 259// }
260 if ( ke->simpleData.keycode == Key_F35 ) { 260 if ( ke->simpleData.keycode == Key_F35 ) {
261 if ( press ) emit backlight(); 261 if ( press ) emit backlight();
262 return TRUE; 262 return TRUE;
263 } 263 }
264 if ( ke->simpleData.keycode == Key_F32 ) { 264 if ( ke->simpleData.keycode == Key_F32 ) {
265 if ( press ) QCopEnvelope e( "QPE/Desktop", "startSync()" ); 265 if ( press ) QCopEnvelope e( "QPE/Desktop", "startSync()" );
266 return TRUE; 266 return TRUE;
267 } 267 }
268 if ( ke->simpleData.keycode == Key_F31 && !ke->simpleData.modifiers ) { 268 if ( ke->simpleData.keycode == Key_F31 && !ke->simpleData.modifiers ) {
269 if ( press ) emit symbol(); 269 if ( press ) emit symbol();
270 return TRUE; 270 return TRUE;
271 } 271 }
272 if ( ke->simpleData.keycode == Key_NumLock ) { 272 if ( ke->simpleData.keycode == Key_NumLock ) {
273 if ( press ) emit numLockStateToggle(); 273 if ( press ) emit numLockStateToggle();
274 } 274 }
275 if ( ke->simpleData.keycode == Key_CapsLock ) { 275 if ( ke->simpleData.keycode == Key_CapsLock ) {
276 if ( press ) emit capsLockStateToggle(); 276 if ( press ) emit capsLockStateToggle();
277 } 277 }
278 if (( press && !autoRepeat ) || ( !press && autoRepeat )) 278 if (( press && !autoRepeat ) || ( !press && autoRepeat ))
279 qpedesktop->keyClick(); 279 qpedesktop->keyClick();
280 } else { 280 } else {
281 if ( e->type == QWSEvent::Mouse ) { 281 if ( e->type == QWSEvent::Mouse ) {
282 QWSMouseEvent *me = (QWSMouseEvent *)e; 282 QWSMouseEvent *me = (QWSMouseEvent *)e;
283 static bool up = TRUE; 283 static bool up = TRUE;
284 if ( me->simpleData.state&LeftButton ) { 284 if ( me->simpleData.state&LeftButton ) {
285 if ( up ) { 285 if ( up ) {
286 up = FALSE; 286 up = FALSE;
287 qpedesktop->screenClick(); 287 qpedesktop->screenClick();
288 } 288 }
289 } else { 289 } else {
290 up = TRUE; 290 up = TRUE;
291 } 291 }
292 } 292 }
293 } 293 }
294 294
295 return QPEApplication::qwsEventFilter( e ); 295 return QPEApplication::qwsEventFilter( e );
296} 296}
297#endif 297#endif
298 298
299void DesktopApplication::psTimeout() 299void DesktopApplication::psTimeout()
300{ 300{
301 qpedesktop->checkMemory(); // in case no events are being generated 301 qpedesktop->checkMemory(); // in case no events are being generated
302 302
303 *ps = PowerStatusManager::readStatus(); 303 *ps = PowerStatusManager::readStatus();
304 304
305 if ( (ps->batteryStatus() == PowerStatus::VeryLow ) ) { 305 if ( (ps->batteryStatus() == PowerStatus::VeryLow ) ) {
306 pa->alert( tr( "Battery is running very low." ), 6 ); 306 pa->alert( tr( "Battery is running very low." ), 6 );
307 } 307 }
308 308
309 if ( ps->batteryStatus() == PowerStatus::Critical ) { 309 if ( ps->batteryStatus() == PowerStatus::Critical ) {
310 pa->alert( tr( "Battery level is critical!\n" 310 pa->alert( tr( "Battery level is critical!\n"
311 "Keep power off until power restored!" ), 1 ); 311 "Keep power off until power restored!" ), 1 );
312 } 312 }
313 313
314 if ( ps->backupBatteryStatus() == PowerStatus::VeryLow ) { 314 if ( ps->backupBatteryStatus() == PowerStatus::VeryLow ) {
315 pa->alert( tr( "The Back-up battery is very low.\nPlease charge the back-up battery." ), 3 ); 315 pa->alert( tr( "The Back-up battery is very low.\nPlease charge the back-up battery." ), 3 );
316 } 316 }
317} 317}
318 318
319 319
320void DesktopApplication::sendCard() 320void DesktopApplication::sendCard()
321{ 321{
322 delete cardSendTimer; 322 delete cardSendTimer;
323 cardSendTimer = 0; 323 cardSendTimer = 0;
324 QString card = getenv("HOME"); 324 QString card = getenv("HOME");
325 card += "/Applications/addressbook/businesscard.vcf"; 325 card += "/Applications/addressbook/businesscard.vcf";
326 326
327 if ( QFile::exists( card ) ) { 327 if ( QFile::exists( card ) ) {
328 QCopEnvelope e("QPE/Obex", "send(QString,QString,QString)"); 328 QCopEnvelope e("QPE/Obex", "send(QString,QString,QString)");
329 QString mimetype = "text/x-vCard"; 329 QString mimetype = "text/x-vCard";
330 e << tr("business card") << card << mimetype; 330 e << tr("business card") << card << mimetype;
331 } 331 }
332} 332}
333 333
334#if defined(QPE_HAVE_MEMALERTER) 334#if defined(QPE_HAVE_MEMALERTER)
335QPE_MEMALERTER_IMPL 335QPE_MEMALERTER_IMPL
336#endif 336#endif
337 337
338//=========================================================================== 338//===========================================================================
339 339
340Desktop::Desktop() : 340Desktop::Desktop() :
341 QWidget( 0, 0, WStyle_Tool | WStyle_Customize ), 341 QWidget( 0, 0, WStyle_Tool | WStyle_Customize ),
342 qcopBridge( 0 ), 342 qcopBridge( 0 ),
343 transferServer( 0 ), 343 transferServer( 0 ),
344 packageSlave( 0 ) 344 packageSlave( 0 )
345{ 345{
346 qpedesktop = this; 346 qpedesktop = this;
347 347
348// bg = new Info( this ); 348// bg = new Info( this );
349 tb = new TaskBar; 349 tb = new TaskBar;
350 350
351 launcher = new Launcher( 0, 0, WStyle_Customize | QWidget::WGroupLeader ); 351 launcher = new Launcher( 0, 0, WStyle_Customize | QWidget::WGroupLeader );
352 352
353 connect(launcher, SIGNAL(busy()), tb, SLOT(startWait())); 353 connect(launcher, SIGNAL(busy()), tb, SLOT(startWait()));
354 connect(launcher, SIGNAL(notBusy(const QString&)), tb, SLOT(stopWait(const QString&))); 354 connect(launcher, SIGNAL(notBusy(const QString&)), tb, SLOT(stopWait(const QString&)));
355 355
356 int displayw = qApp->desktop()->width(); 356 int displayw = qApp->desktop()->width();
357 int displayh = qApp->desktop()->height(); 357 int displayh = qApp->desktop()->height();
358 358
359 359
360 QSize sz = tb->sizeHint(); 360 QSize sz = tb->sizeHint();
361 361
362 setGeometry( 0, displayh-sz.height(), displayw, sz.height() ); 362 setGeometry( 0, displayh-sz.height(), displayw, sz.height() );
363 tb->setGeometry( 0, displayh-sz.height(), displayw, sz.height() ); 363 tb->setGeometry( 0, displayh-sz.height(), displayw, sz.height() );
364 364
365 tb->show(); 365 tb->show();
366 launcher->showMaximized(); 366 launcher->showMaximized();
367 launcher->show(); 367 launcher->show();
368 launcher->raise(); 368 launcher->raise();
369#if defined(QPE_HAVE_MEMALERTER) 369#if defined(QPE_HAVE_MEMALERTER)
370 initMemalerter(); 370 initMemalerter();
371#endif 371#endif
372 // start services 372 // start services
373 startTransferServer(); 373 startTransferServer();
374 (void) new IrServer( this ); 374 (void) new IrServer( this );
375 rereadVolumes(); 375 rereadVolumes();
376 376
377 packageSlave = new PackageSlave( this ); 377 packageSlave = new PackageSlave( this );
378 connect(qApp, SIGNAL(volumeChanged(bool)), this, SLOT(rereadVolumes())); 378 connect(qApp, SIGNAL(volumeChanged(bool)), this, SLOT(rereadVolumes()));
379 379
380 qApp->installEventFilter( this ); 380 qApp->installEventFilter( this );
381} 381}
382 382
383void Desktop::show() 383void Desktop::show()
384{ 384{
385 login(TRUE); 385 login(TRUE);
386 QWidget::show(); 386 QWidget::show();
387} 387}
388 388
389Desktop::~Desktop() 389Desktop::~Desktop()
390{ 390{
391 delete launcher; 391 delete launcher;
392 delete tb; 392 delete tb;
393 delete qcopBridge; 393 delete qcopBridge;
394 delete transferServer; 394 delete transferServer;
395} 395}
396 396
397bool Desktop::recoverMemory() 397bool Desktop::recoverMemory()
398{ 398{
399 return tb->recoverMemory(); 399 return tb->recoverMemory();
400} 400}
401 401
402void Desktop::checkMemory() 402void Desktop::checkMemory()
403{ 403{
404#if defined(QPE_HAVE_MEMALERTER) 404#if defined(QPE_HAVE_MEMALERTER)
405 static bool ignoreNormal=FALSE; 405 static bool ignoreNormal=FALSE;
406 static bool existingMessage=FALSE; 406 static bool existingMessage=FALSE;
407 407
408 if(existingMessage) 408 if(existingMessage)
409 return; // don't show a second message while still on first 409 return; // don't show a second message while still on first
410 410
411 existingMessage = TRUE; 411 existingMessage = TRUE;
412 switch ( memstate ) { 412 switch ( memstate ) {
413 case Unknown: 413 case Unknown:
414 break; 414 break;
415 case Low: 415 case Low:
416 memstate = Unknown; 416 memstate = Unknown;
417 if ( recoverMemory() ) 417 if ( recoverMemory() )
418 ignoreNormal = TRUE; 418 ignoreNormal = TRUE;
419 else 419 else
420 QMessageBox::warning( 0 , "Memory Status", 420 QMessageBox::warning( 0 , "Memory Status",
421 "The memory smacks of shortage. \n" 421 "The memory smacks of shortage. \n"
422 "Please save data. " ); 422 "Please save data. " );
423 break; 423 break;
424 case Normal: 424 case Normal:
425 memstate = Unknown; 425 memstate = Unknown;
426 if ( ignoreNormal ) 426 if ( ignoreNormal )
427 ignoreNormal = FALSE; 427 ignoreNormal = FALSE;
428 else 428 else
429 QMessageBox::information ( 0 , "Memory Status", 429 QMessageBox::information ( 0 , "Memory Status",
430 "There is enough memory again." ); 430 "There is enough memory again." );
431 break; 431 break;
432 case VeryLow: 432 case VeryLow:
433 memstate = Unknown; 433 memstate = Unknown;
434 QMessageBox::critical( 0 , "Memory Status", 434 QMessageBox::critical( 0 , "Memory Status",
435 "The memory is very low. \n" 435 "The memory is very low. \n"
436 "Please end this application \n" 436 "Please end this application \n"
437 "immediately." ); 437 "immediately." );
438 recoverMemory(); 438 recoverMemory();
439 } 439 }
440 existingMessage = FALSE; 440 existingMessage = FALSE;
441#endif 441#endif
442} 442}
443 443
444static bool isVisibleWindow(int wid) 444static bool isVisibleWindow(int wid)
445{ 445{
446 const QList<QWSWindow> &list = qwsServer->clientWindows(); 446 const QList<QWSWindow> &list = qwsServer->clientWindows();
447 QWSWindow* w; 447 QWSWindow* w;
448 for (QListIterator<QWSWindow> it(list); (w=it.current()); ++it) { 448 for (QListIterator<QWSWindow> it(list); (w=it.current()); ++it) {
449 if ( w->winId() == wid ) 449 if ( w->winId() == wid )
450 return !w->isFullyObscured(); 450 return !w->isFullyObscured();
451 } 451 }
452 return FALSE; 452 return FALSE;
453} 453}
454 454
455static bool hasVisibleWindow(const QString& clientname) 455static bool hasVisibleWindow(const QString& clientname)
456{ 456{
457 const QList<QWSWindow> &list = qwsServer->clientWindows(); 457 const QList<QWSWindow> &list = qwsServer->clientWindows();
458 QWSWindow* w; 458 QWSWindow* w;
459 for (QListIterator<QWSWindow> it(list); (w=it.current()); ++it) { 459 for (QListIterator<QWSWindow> it(list); (w=it.current()); ++it) {
460 if ( w->client()->identity() == clientname && !w->isFullyObscured() ) 460 if ( w->client()->identity() == clientname && !w->isFullyObscured() )
461 return TRUE; 461 return TRUE;
462 } 462 }
463 return FALSE; 463 return FALSE;
464} 464}
465 465
466void Desktop::raiseLauncher() 466void Desktop::raiseLauncher()
467{ 467{
468 Config cfg("qpe"); //F12 'Home' 468 Config cfg("qpe"); //F12 'Home'
469 cfg.setGroup("AppsKey"); 469 cfg.setGroup("AppsKey");
470 QString tempItem; 470 QString tempItem;
471 tempItem = cfg.readEntry("Middle","Home"); 471 tempItem = cfg.readEntry("Middle","Home");
472 if(tempItem == "Home" || tempItem.isEmpty()) { 472 if(tempItem == "Home" || tempItem.isEmpty()) {
473 if ( isVisibleWindow(launcher->winId()) ) 473 if ( isVisibleWindow(launcher->winId()) )
474 launcher->nextView(); 474 launcher->nextView();
475 else 475 else
476 launcher->raise(); 476 launcher->raise();
477 } else { 477 } else {
478 QCopEnvelope e("QPE/System","execute(QString)"); 478 QCopEnvelope e("QPE/System","execute(QString)");
479 e << tempItem; 479 e << tempItem;
480 } 480 }
481} 481}
482 482
483void Desktop::executeOrModify(const QString& appLnkFile) 483void Desktop::executeOrModify(const QString& appLnkFile)
484{ 484{
485 AppLnk lnk(MimeType::appsFolderName() + "/" + appLnkFile); 485 AppLnk lnk(MimeType::appsFolderName() + "/" + appLnkFile);
486 if ( lnk.isValid() ) { 486 if ( lnk.isValid() ) {
487 QCString app = lnk.exec().utf8(); 487 QCString app = lnk.exec().utf8();
488 Global::terminateBuiltin("calibrate"); 488 Global::terminateBuiltin("calibrate");
489 if ( QCopChannel::isRegistered("QPE/Application/" + app) ) { 489 if ( QCopChannel::isRegistered("QPE/Application/" + app) ) {
490 MRUList::addTask(&lnk); 490 MRUList::addTask(&lnk);
491 if ( hasVisibleWindow(app) ) 491 if ( hasVisibleWindow(app) )
492 QCopChannel::send("QPE/Application/" + app, "nextView()"); 492 QCopChannel::send("QPE/Application/" + app, "nextView()");
493 else 493 else
494 QCopChannel::send("QPE/Application/" + app, "raise()"); 494 QCopChannel::send("QPE/Application/" + app, "raise()");
495 } else { 495 } else {
496 lnk.execute(); 496 lnk.execute();
497 } 497 }
498 } 498 }
499} 499}
500 500
501void Desktop::raiseDatebook() 501void Desktop::raiseDatebook()
502{ 502{
503 Config cfg("qpe"); //F9 'Activity' 503 Config cfg("qpe"); //F9 'Activity'
504 cfg.setGroup("AppsKey"); 504 cfg.setGroup("AppsKey");
505 QString tempItem; 505 QString tempItem;
506 tempItem = cfg.readEntry("LeftEnd","Calender"); 506 tempItem = cfg.readEntry("LeftEnd","Calender");
507 if(tempItem == "Calender" || tempItem.isEmpty()) executeOrModify("Applications/datebook.desktop"); 507 if(tempItem == "Calender" || tempItem.isEmpty()) executeOrModify("Applications/datebook.desktop");
508 else { 508 else {
509 QCopEnvelope e("QPE/System","execute(QString)"); 509 QCopEnvelope e("QPE/System","execute(QString)");
510 e << tempItem; 510 e << tempItem;
511 } 511 }
512} 512}
513 513
514void Desktop::raiseContacts() 514void Desktop::raiseContacts()
515{ 515{
516 Config cfg("qpe"); //F10, 'Contacts' 516 Config cfg("qpe"); //F10, 'Contacts'
517 cfg.setGroup("AppsKey"); 517 cfg.setGroup("AppsKey");
518 QString tempItem; 518 QString tempItem;
519 tempItem = cfg.readEntry("Left2nd","Address Book"); 519 tempItem = cfg.readEntry("Left2nd","Address Book");
520 if(tempItem == "Address Book" || tempItem.isEmpty()) executeOrModify("Applications/addressbook.desktop"); 520 if(tempItem == "Address Book" || tempItem.isEmpty()) executeOrModify("Applications/addressbook.desktop");
521 else { 521 else {
522 QCopEnvelope e("QPE/System","execute(QString)"); 522 QCopEnvelope e("QPE/System","execute(QString)");
523 e << tempItem; 523 e << tempItem;
524 } 524 }
525} 525}
526 526
527void Desktop::raiseMenu() 527void Desktop::raiseMenu()
528{ 528{
529 Config cfg("qpe"); //F11, 'Menu' 529 Config cfg("qpe"); //F11, 'Menu'
530 cfg.setGroup("AppsKey"); 530 cfg.setGroup("AppsKey");
531 QString tempItem; 531 QString tempItem;
532 tempItem = cfg.readEntry("Right2nd","Popup Menu"); 532 tempItem = cfg.readEntry("Right2nd","Popup Menu");
533 if(tempItem == "Popup Menu" || tempItem.isEmpty()) { 533 if(tempItem == "Popup Menu" || tempItem.isEmpty()) {
534 Global::terminateBuiltin("calibrate"); 534 Global::terminateBuiltin("calibrate");
535 tb->startMenu()->launch(); 535 tb->startMenu()->launch();
536 } else { 536 } else {
537 QCopEnvelope e("QPE/System","execute(QString)"); 537 QCopEnvelope e("QPE/System","execute(QString)");
538 e << tempItem; 538 e << tempItem;
539 } 539 }
540} 540}
541 541
542void Desktop::raiseEmail() 542void Desktop::raiseEmail()
543{ 543{
544 Config cfg("qpe"); //F13, 'Mail' 544 Config cfg("qpe"); //F13, 'Mail'
545 cfg.setGroup("AppsKey"); 545 cfg.setGroup("AppsKey");
546 QString tempItem; 546 QString tempItem;
547 tempItem = cfg.readEntry("RightEnd","Mail"); 547 tempItem = cfg.readEntry("RightEnd","Mail");
548 if(tempItem == "Mail" || tempItem == "qtmail" || tempItem.isEmpty()) executeOrModify("Applications/qtmail.desktop"); 548 if(tempItem == "Mail" || tempItem == "qtmail" || tempItem.isEmpty()) executeOrModify("Applications/qtmail.desktop");
549 else { 549 else {
550 QCopEnvelope e("QPE/System","execute(QString)"); 550 QCopEnvelope e("QPE/System","execute(QString)");
551 e << tempItem; 551 e << tempItem;
552 } 552 }
553} 553}
554 554
555// autoStarts apps on resume and start 555// autoStarts apps on resume and start
556void Desktop::execAutoStart() { 556void Desktop::execAutoStart() {
557 QString appName; 557 QString appName;
558 int delay; 558 int delay;
559 QDateTime now = QDateTime::currentDateTime(); 559 QDateTime now = QDateTime::currentDateTime();
560 Config cfg( "autostart" ); 560 Config cfg( "autostart" );
561 cfg.setGroup( "AutoStart" ); 561 cfg.setGroup( "AutoStart" );
562 appName = cfg.readEntry( "Apps", "" ); 562 appName = cfg.readEntry( "Apps", "" );
563 delay = ( cfg.readEntry( "Delay", "0" ) ).toInt(); 563 delay = ( cfg.readEntry( "Delay", "0" ) ).toInt();
564 // If the time between suspend and resume was longer then the 564 // If the time between suspend and resume was longer then the
565 // value saved as delay, start the app 565 // value saved as delay, start the app
566 if ( suspendTime.secsTo( now ) >= ( delay * 60 ) && !appName.isEmpty() ) { 566 if ( suspendTime.secsTo( now ) >= ( delay * 60 ) && !appName.isEmpty() ) {
567 QCopEnvelope e( "QPE/System", "execute(QString)" ); 567 QCopEnvelope e( "QPE/System", "execute(QString)" );
568 e << QString( appName ); 568 e << QString( appName );
569 } 569 }
570} 570}
571 571
572#if defined(QPE_HAVE_TOGGLELIGHT) 572#if defined(QPE_HAVE_TOGGLELIGHT)
573#include <qpe/config.h> 573#include <qpe/config.h>
574 574
575#include <sys/ioctl.h> 575#include <sys/ioctl.h>
576#include <sys/types.h> 576#include <sys/types.h>
577#include <fcntl.h> 577#include <fcntl.h>
578#include <unistd.h> 578#include <unistd.h>
579#include <errno.h> 579#include <errno.h>
580#include <linux/ioctl.h> 580#include <linux/ioctl.h>
581#include <time.h> 581#include <time.h>
582#endif 582#endif
583 583
584static bool blanked=FALSE; 584static bool blanked=FALSE;
585 585
586static void blankScreen() 586static void blankScreen()
587{ 587{
588 if ( !qt_screen ) return; 588 if ( !qt_screen ) return;
589 /* Should use a big black window instead. 589 /* Should use a big black window instead.
590 QGfx* g = qt_screen->screenGfx(); 590 QGfx* g = qt_screen->screenGfx();
591 g->fillRect(0,0,qt_screen->width(),qt_screen->height()); 591 g->fillRect(0,0,qt_screen->width(),qt_screen->height());
592 delete g; 592 delete g;
593 */ 593 */
594 blanked = TRUE; 594 blanked = TRUE;
595} 595}
596 596
597static void darkScreen() 597static void darkScreen()
598{ 598{
599 extern void qpe_setBacklight(int); 599 extern void qpe_setBacklight(int);
600 qpe_setBacklight(0); // force off 600 qpe_setBacklight(0); // force off
601} 601}
602 602
603 603
604void Desktop::togglePower() 604void Desktop::togglePower()
605{ 605{
606 extern void qpe_setBacklight ( int ); // We need to toggle the LCD fast - no time to send a QCop 606 extern void qpe_setBacklight ( int ); // We need to toggle the LCD fast - no time to send a QCop
607 607
608 static bool excllock = false; 608 static bool excllock = false;
609 609
610 if ( excllock ) 610 if ( excllock )
611 return; 611 return;
612 612
613 excllock = true; 613 excllock = true;
614 614
615 bool wasloggedin = loggedin; 615 bool wasloggedin = loggedin;
616 loggedin=0; 616 loggedin=0;
617 suspendTime = QDateTime::currentDateTime(); 617 suspendTime = QDateTime::currentDateTime();
618 618
619 qpe_setBacklight ( 0 ); // force LCD off 619 //qpe_setBacklight ( 0 ); // force LCD off (sandman: why ????)
620 620
621 if ( wasloggedin ) 621 if ( wasloggedin )
622 blankScreen(); 622 blankScreen();
623 623
624 ODevice::inst ( )-> suspend ( ); 624 ODevice::inst ( )-> suspend ( );
625 625
626 QWSServer::screenSaverActivate ( false ); 626 QWSServer::screenSaverActivate ( false );
627 627
628 qpe_setBacklight ( -3 ); // force LCD on 628 qpe_setBacklight ( -3 ); // force LCD on
629 629
630 { 630 {
631 QCopEnvelope("QPE/Card", "mtabChanged()" ); // might have changed while asleep 631 QCopEnvelope("QPE/Card", "mtabChanged()" ); // might have changed while asleep
632 } 632 }
633 633
634 if ( wasloggedin ) 634 if ( wasloggedin )
635 login(TRUE); 635 login(TRUE);
636 636
637 execAutoStart(); 637 execAutoStart();
638 //qcopBridge->closeOpenConnections(); 638 //qcopBridge->closeOpenConnections();
639 //qDebug("called togglePower()!!!!!!");
640
641 qApp-> processEvents ( );
642 639
643 excllock = false; 640 excllock = false;
644} 641}
645 642
646void Desktop::toggleLight() 643void Desktop::toggleLight()
647{ 644{
648 QCopEnvelope e("QPE/System", "setBacklight(int)"); 645 QCopEnvelope e("QPE/System", "setBacklight(int)");
649 e << -2; // toggle 646 e << -2; // toggle
650} 647}
651 648
652void Desktop::toggleSymbolInput() 649void Desktop::toggleSymbolInput()
653{ 650{
654 tb->toggleSymbolInput(); 651 tb->toggleSymbolInput();
655} 652}
656 653
657void Desktop::toggleNumLockState() 654void Desktop::toggleNumLockState()
658{ 655{
659 tb->toggleNumLockState(); 656 tb->toggleNumLockState();
660} 657}
661 658
662void Desktop::toggleCapsLockState() 659void Desktop::toggleCapsLockState()
663{ 660{
664 tb->toggleCapsLockState(); 661 tb->toggleCapsLockState();
665} 662}
666 663
667void Desktop::styleChange( QStyle &s ) 664void Desktop::styleChange( QStyle &s )
668{ 665{
669 QWidget::styleChange( s ); 666 QWidget::styleChange( s );
670 int displayw = qApp->desktop()->width(); 667 int displayw = qApp->desktop()->width();
671 int displayh = qApp->desktop()->height(); 668 int displayh = qApp->desktop()->height();
672 669
673 QSize sz = tb->sizeHint(); 670 QSize sz = tb->sizeHint();
674 671
675 tb->setGeometry( 0, displayh-sz.height(), displayw, sz.height() ); 672 tb->setGeometry( 0, displayh-sz.height(), displayw, sz.height() );
676} 673}
677 674
678void DesktopApplication::shutdown() 675void DesktopApplication::shutdown()
679{ 676{
680 if ( type() != GuiServer ) 677 if ( type() != GuiServer )
681 return; 678 return;
682 ShutdownImpl *sd = new ShutdownImpl( 0, 0, WDestructiveClose ); 679 ShutdownImpl *sd = new ShutdownImpl( 0, 0, WDestructiveClose );
683 connect( sd, SIGNAL(shutdown(ShutdownImpl::Type)), 680 connect( sd, SIGNAL(shutdown(ShutdownImpl::Type)),
684 this, SLOT(shutdown(ShutdownImpl::Type)) ); 681 this, SLOT(shutdown(ShutdownImpl::Type)) );
685 sd->showMaximized(); 682 sd->showMaximized();
686} 683}
687 684
688void DesktopApplication::shutdown( ShutdownImpl::Type t ) 685void DesktopApplication::shutdown( ShutdownImpl::Type t )
689{ 686{
690 switch ( t ) { 687 switch ( t ) {
691 case ShutdownImpl::ShutdownSystem: 688 case ShutdownImpl::ShutdownSystem:
692 execlp("shutdown", "shutdown", "-h", "now", (void*)0); 689 execlp("shutdown", "shutdown", "-h", "now", (void*)0);
693 break; 690 break;
694 case ShutdownImpl::RebootSystem: 691 case ShutdownImpl::RebootSystem:
695 execlp("shutdown", "shutdown", "-r", "now", (void*)0); 692 execlp("shutdown", "shutdown", "-r", "now", (void*)0);
696 break; 693 break;
697 case ShutdownImpl::RestartDesktop: 694 case ShutdownImpl::RestartDesktop:
698 restart(); 695 restart();
699 break; 696 break;
700 case ShutdownImpl::TerminateDesktop: 697 case ShutdownImpl::TerminateDesktop:
701 prepareForTermination(FALSE); 698 prepareForTermination(FALSE);
702 699
703 // This is a workaround for a Qt bug 700 // This is a workaround for a Qt bug
704 // clipboard applet has to stop its poll timer, or Qt/E 701 // clipboard applet has to stop its poll timer, or Qt/E
705 // will hang on quit() right before it emits aboutToQuit() 702 // will hang on quit() right before it emits aboutToQuit()
706 emit aboutToQuit ( ); 703 emit aboutToQuit ( );
707 704
708 quit(); 705 quit();
709 break; 706 break;
710 } 707 }
711} 708}
712 709
713void DesktopApplication::restart() 710void DesktopApplication::restart()
714{ 711{
715 prepareForTermination(TRUE); 712 prepareForTermination(TRUE);
716 713
717#ifdef Q_WS_QWS 714#ifdef Q_WS_QWS
718 for ( int fd = 3; fd < 100; fd++ ) 715 for ( int fd = 3; fd < 100; fd++ )
719 close( fd ); 716 close( fd );
720#if defined(QT_DEMO_SINGLE_FLOPPY) 717#if defined(QT_DEMO_SINGLE_FLOPPY)
721 execl( "/sbin/init", "qpe", 0 ); 718 execl( "/sbin/init", "qpe", 0 );
722#elif defined(QT_QWS_CASSIOPEIA) 719#elif defined(QT_QWS_CASSIOPEIA)
723 execl( "/bin/sh", "sh", 0 ); 720 execl( "/bin/sh", "sh", 0 );
724#else 721#else
725 execl( (qpeDir()+"/bin/qpe").latin1(), "qpe", 0 ); 722 execl( (qpeDir()+"/bin/qpe").latin1(), "qpe", 0 );
726#endif 723#endif
727 exit(1); 724 exit(1);
728#endif 725#endif
729} 726}
730 727
731void Desktop::startTransferServer() 728void Desktop::startTransferServer()
732{ 729{
733 // start qcop bridge server 730 // start qcop bridge server
734 qcopBridge = new QCopBridge( 4243 ); 731 qcopBridge = new QCopBridge( 4243 );
735 if ( !qcopBridge->ok() ) { 732 if ( !qcopBridge->ok() ) {
736 delete qcopBridge; 733 delete qcopBridge;
737 qcopBridge = 0; 734 qcopBridge = 0;
738 } 735 }
739 // start transfer server 736 // start transfer server
740 transferServer = new TransferServer( 4242 ); 737 transferServer = new TransferServer( 4242 );
741 if ( !transferServer->ok() ) { 738 if ( !transferServer->ok() ) {
742 delete transferServer; 739 delete transferServer;
743 transferServer = 0; 740 transferServer = 0;
744 } 741 }
745 if ( !transferServer || !qcopBridge ) 742 if ( !transferServer || !qcopBridge )
746 startTimer( 2000 ); 743 startTimer( 2000 );
747} 744}
748 745
749void Desktop::timerEvent( QTimerEvent *e ) 746void Desktop::timerEvent( QTimerEvent *e )
750{ 747{
751 killTimer( e->timerId() ); 748 killTimer( e->timerId() );
752 startTransferServer(); 749 startTransferServer();
753} 750}
754 751
755void Desktop::terminateServers() 752void Desktop::terminateServers()
756{ 753{
757 delete transferServer; 754 delete transferServer;
758 delete qcopBridge; 755 delete qcopBridge;
759 transferServer = 0; 756 transferServer = 0;
760 qcopBridge = 0; 757 qcopBridge = 0;
761} 758}
762 759
763void Desktop::rereadVolumes() 760void Desktop::rereadVolumes()
764{ 761{
765 Config cfg("qpe"); 762 Config cfg("qpe");
766 cfg.setGroup("Volume"); 763 cfg.setGroup("Volume");
767 touchclick = cfg.readBoolEntry("TouchSound"); 764 touchclick = cfg.readBoolEntry("TouchSound");
768 keyclick = cfg.readBoolEntry("KeySound"); 765 keyclick = cfg.readBoolEntry("KeySound");
769 alarmsound = cfg.readBoolEntry("AlarmSound"); 766 alarmsound = cfg.readBoolEntry("AlarmSound");
770// Config cfg("Sound"); 767// Config cfg("Sound");
771// cfg.setGroup("System"); 768// cfg.setGroup("System");
772// touchclick = cfg.readBoolEntry("Touch"); 769// touchclick = cfg.readBoolEntry("Touch");
773// keyclick = cfg.readBoolEntry("Key"); 770// keyclick = cfg.readBoolEntry("Key");
774} 771}
775 772
776void Desktop::keyClick() 773void Desktop::keyClick()
777{ 774{
778 if ( keyclick ) 775 if ( keyclick )
779 ODevice::inst ( )-> keySound ( ); 776 ODevice::inst ( )-> keySound ( );
780} 777}
781 778
782void Desktop::screenClick() 779void Desktop::screenClick()
783{ 780{
784 if ( touchclick ) 781 if ( touchclick )
785 ODevice::inst ( )-> touchSound ( ); 782 ODevice::inst ( )-> touchSound ( );
786} 783}
787 784
788void Desktop::soundAlarm() 785void Desktop::soundAlarm()
789{ 786{
790 if ( qpedesktop-> alarmsound ) 787 if ( qpedesktop-> alarmsound )
791 ODevice::inst ( )-> alarmSound ( ); 788 ODevice::inst ( )-> alarmSound ( );
792} 789}
793 790
794bool Desktop::eventFilter( QObject *, QEvent *ev ) 791bool Desktop::eventFilter( QObject *, QEvent *ev )
795{ 792{
796 if ( ev-> type ( ) == QEvent::KeyPress ) { 793 if ( ev-> type ( ) == QEvent::KeyPress ) {
797 QKeyEvent *ke = (QKeyEvent *) ev; 794 QKeyEvent *ke = (QKeyEvent *) ev;
798 if ( ke-> key ( ) == Qt::Key_F11 ) { // menu key 795 if ( ke-> key ( ) == Qt::Key_F11 ) { // menu key
799 QWidget *active = qApp-> activeWindow ( ); 796 QWidget *active = qApp-> activeWindow ( );
800 797
801 if ( active && active-> isPopup ( )) 798 if ( active && active-> isPopup ( ))
802 active->close(); 799 active->close();
803 800
804 raiseMenu ( ); 801 raiseMenu ( );
805 return true; 802 return true;
806 } 803 }
807 } 804 }
808 return false; 805 return false;
809} 806}
diff --git a/core/launcher/main.cpp b/core/launcher/main.cpp
index 3ee5e26..5cf624b 100644
--- a/core/launcher/main.cpp
+++ b/core/launcher/main.cpp
@@ -1,386 +1,387 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved. 2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of Qtopia Environment. 4** This file is part of 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 "desktop.h" 21#include "desktop.h"
22#include "taskbar.h" 22#include "taskbar.h"
23#include "stabmon.h" 23#include "stabmon.h"
24 24
25#include <qpe/qpeapplication.h> 25#include <qpe/qpeapplication.h>
26#include <qpe/network.h> 26#include <qpe/network.h>
27#include <qpe/config.h> 27#include <qpe/config.h>
28#if defined( QT_QWS_CUSTOM ) || defined( QT_QWS_IPAQ ) 28#if defined( QT_QWS_CUSTOM ) || defined( QT_QWS_IPAQ )
29#include <qpe/custom.h> 29#include <qpe/custom.h>
30#endif 30#endif
31 31
32#include <opie/odevice.h> 32#include <opie/odevice.h>
33 33
34#include <qfile.h> 34#include <qfile.h>
35#include <qwindowsystem_qws.h> 35#include <qwindowsystem_qws.h>
36#include <qpe/qcopenvelope_qws.h> 36#include <qpe/qcopenvelope_qws.h>
37#include <qpe/alarmserver.h> 37#include <qpe/alarmserver.h>
38 38
39#include <stdlib.h> 39#include <stdlib.h>
40#include <stdio.h> 40#include <stdio.h>
41#include <signal.h> 41#include <signal.h>
42#include <unistd.h> 42#include <unistd.h>
43 43
44#if defined(QT_QWS_CASSIOPEIA) || defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX) 44#if defined(QT_QWS_CASSIOPEIA) || defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX)
45#include "../calibrate/calibrate.h" 45#include "../calibrate/calibrate.h"
46#endif 46#endif
47 47
48#ifdef QT_QWS_CASSIOPEIA 48#ifdef QT_QWS_CASSIOPEIA
49static void ignoreMessage( QtMsgType, const char * ) 49static void ignoreMessage( QtMsgType, const char * )
50{ 50{
51} 51}
52#include <sys/mount.h> 52#include <sys/mount.h>
53#include <sys/types.h> 53#include <sys/types.h>
54#include <sys/stat.h> 54#include <sys/stat.h>
55#include <sys/time.h> 55#include <sys/time.h>
56#include <fcntl.h> 56#include <fcntl.h>
57#include <qdatetime.h> 57#include <qdatetime.h>
58 58
59void initCassiopeia() 59void initCassiopeia()
60{ 60{
61 // MIPSEL-specific init - make sure /proc exists for shm 61 // MIPSEL-specific init - make sure /proc exists for shm
62/* 62/*
63 if ( mount("/dev/ram0", "/", "ext2", MS_REMOUNT | MS_MGC_VAL, 0 ) ) { 63 if ( mount("/dev/ram0", "/", "ext2", MS_REMOUNT | MS_MGC_VAL, 0 ) ) {
64 perror("Remounting - / read/write"); 64 perror("Remounting - / read/write");
65 } 65 }
66*/ 66*/
67 if ( mount("none", "/tmp", "ramfs", 0, 0 ) ) { 67 if ( mount("none", "/tmp", "ramfs", 0, 0 ) ) {
68 perror("mounting ramfs /tmp"); 68 perror("mounting ramfs /tmp");
69 } else { 69 } else {
70 fprintf( stderr, "mounted /tmp\n" ); 70 fprintf( stderr, "mounted /tmp\n" );
71 } 71 }
72 if ( mount("none", "/home", "ramfs", 0, 0 ) ) { 72 if ( mount("none", "/home", "ramfs", 0, 0 ) ) {
73 perror("mounting ramfs /home"); 73 perror("mounting ramfs /home");
74 } else { 74 } else {
75 fprintf( stderr, "mounted /home\n" ); 75 fprintf( stderr, "mounted /home\n" );
76 } 76 }
77 if ( mount("none","/proc","proc",0,0) ) { 77 if ( mount("none","/proc","proc",0,0) ) {
78 perror("Mounting - /proc"); 78 perror("Mounting - /proc");
79 } else { 79 } else {
80 fprintf( stderr, "mounted /proc\n" ); 80 fprintf( stderr, "mounted /proc\n" );
81 } 81 }
82 if ( mount("none","/mnt","shm",0,0) ) { 82 if ( mount("none","/mnt","shm",0,0) ) {
83 perror("Mounting - shm"); 83 perror("Mounting - shm");
84 } 84 }
85 setenv( "QTDIR", "/", 1 ); 85 setenv( "QTDIR", "/", 1 );
86 setenv( "OPIEDIR", "/", 1 ); 86 setenv( "OPIEDIR", "/", 1 );
87 setenv( "HOME", "/home", 1 ); 87 setenv( "HOME", "/home", 1 );
88 mkdir( "/home/Documents", 0755 ); 88 mkdir( "/home/Documents", 0755 );
89 89
90 // set a reasonable starting date 90 // set a reasonable starting date
91 QDateTime dt( QDate( 2001, 3, 15 ) ); 91 QDateTime dt( QDate( 2001, 3, 15 ) );
92 QDateTime now = QDateTime::currentDateTime(); 92 QDateTime now = QDateTime::currentDateTime();
93 int change = now.secsTo( dt ); 93 int change = now.secsTo( dt );
94 94
95 time_t t = ::time(0); 95 time_t t = ::time(0);
96 t += change; 96 t += change;
97 stime(&t); 97 stime(&t);
98 98
99 qInstallMsgHandler(ignoreMessage); 99 qInstallMsgHandler(ignoreMessage);
100} 100}
101#endif 101#endif
102 102
103#ifdef QPE_OWNAPM 103#ifdef QPE_OWNAPM
104#include <sys/ioctl.h> 104#include <sys/ioctl.h>
105#include <sys/types.h> 105#include <sys/types.h>
106#include <fcntl.h> 106#include <fcntl.h>
107#include <unistd.h> 107#include <unistd.h>
108#include <errno.h> 108#include <errno.h>
109#include <linux/ioctl.h> 109#include <linux/ioctl.h>
110#include <qpe/global.h> 110#include <qpe/global.h>
111 111
112static void disableAPM() 112static void disableAPM()
113{ 113{
114 114
115 int fd, cur_val, ret; 115 int fd, cur_val, ret;
116 char *device = "/dev/apm_bios"; 116 char *device = "/dev/apm_bios";
117 117
118 fd = open (device, O_WRONLY); 118 fd = open (device, O_WRONLY);
119 119
120 if (fd == -1) { 120 if (fd == -1) {
121 perror(device); 121 perror(device);
122 return; 122 return;
123 } 123 }
124 124
125 cur_val = ioctl(fd, APM_IOCGEVTSRC, 0); 125 cur_val = ioctl(fd, APM_IOCGEVTSRC, 0);
126 if (cur_val == -1) { 126 if (cur_val == -1) {
127 perror("ioctl"); 127 perror("ioctl");
128 exit(errno); 128 exit(errno);
129 } 129 }
130 130
131 ret = ioctl(fd, APM_IOCSEVTSRC, cur_val & ~APM_EVT_POWER_BUTTON); 131 ret = ioctl(fd, APM_IOCSEVTSRC, cur_val & ~APM_EVT_POWER_BUTTON);
132 if (ret == -1) { 132 if (ret == -1) {
133 perror("ioctl"); 133 perror("ioctl");
134 return; 134 return;
135 } 135 }
136 close(fd); 136 close(fd);
137} 137}
138 138
139static void initAPM() 139static void initAPM()
140{ 140{
141 // So that we have to do it ourself, but better. 141 // So that we have to do it ourself, but better.
142 disableAPM(); 142 disableAPM();
143} 143}
144#endif 144#endif
145 145
146#ifdef QT_DEMO_SINGLE_FLOPPY 146#ifdef QT_DEMO_SINGLE_FLOPPY
147#include <sys/mount.h> 147#include <sys/mount.h>
148 148
149void initFloppy() 149void initFloppy()
150{ 150{
151 mount("none","/proc","proc",0,0); 151 mount("none","/proc","proc",0,0);
152 setenv( "QTDIR", "/", 0 ); 152 setenv( "QTDIR", "/", 0 );
153 setenv( "HOME", "/root", 0 ); 153 setenv( "HOME", "/root", 0 );
154 setenv( "QWS_SIZE", "240x320", 0 ); 154 setenv( "QWS_SIZE", "240x320", 0 );
155} 155}
156#endif 156#endif
157 157
158 158
159void initEnvironment() 159void initEnvironment()
160{ 160{
161 Config config("locale"); 161 Config config("locale");
162 config.setGroup( "Location" ); 162 config.setGroup( "Location" );
163 QString tz = config.readEntry( "Timezone", getenv("TZ") ); 163 QString tz = config.readEntry( "Timezone", getenv("TZ") );
164 164
165 // if not timezone set, pick New York 165 // if not timezone set, pick New York
166 if (tz.isNull()) 166 if (tz.isNull())
167 tz = "America/New_York"; 167 tz = "America/New_York";
168 168
169 setenv( "TZ", tz, 1 ); 169 setenv( "TZ", tz, 1 );
170 config.writeEntry( "Timezone", tz); 170 config.writeEntry( "Timezone", tz);
171 171
172 config.setGroup( "Language" ); 172 config.setGroup( "Language" );
173 QString lang = config.readEntry( "Language", getenv("LANG") ); 173 QString lang = config.readEntry( "Language", getenv("LANG") );
174 if ( !lang.isNull() ) 174 if ( !lang.isNull() )
175 setenv( "LANG", lang, 1 ); 175 setenv( "LANG", lang, 1 );
176} 176}
177 177
178static void initBacklight() 178static void initBacklight()
179{ 179{
180 QCopEnvelope e("QPE/System", "setBacklight(int)" ); 180 QCopEnvelope e("QPE/System", "setBacklight(int)" );
181 e << -3; // Forced on 181 e << -3; // Forced on
182} 182}
183 183
184 184
185class ModelKeyFilter : public QObject, public QWSServer::KeyboardFilter 185class ModelKeyFilter : public QObject, public QWSServer::KeyboardFilter
186{ 186{
187public: 187public:
188 ModelKeyFilter ( ) : QObject ( 0, "MODEL_KEY_FILTER" ) 188 ModelKeyFilter ( ) : QObject ( 0, "MODEL_KEY_FILTER" )
189 { 189 {
190 bool doinst = false; 190 bool doinst = false;
191 191
192 m_model = ODevice::inst ( )-> model ( ); 192 m_model = ODevice::inst ( )-> model ( );
193 m_power_timer = 0; 193 m_power_timer = 0;
194 194
195 switch ( m_model ) { 195 switch ( m_model ) {
196 case OMODEL_iPAQ_H31xx: 196 case OMODEL_iPAQ_H31xx:
197 case OMODEL_iPAQ_H36xx: 197 case OMODEL_iPAQ_H36xx:
198 case OMODEL_iPAQ_H37xx: 198 case OMODEL_iPAQ_H37xx:
199 case OMODEL_iPAQ_H38xx: doinst = true; 199 case OMODEL_iPAQ_H38xx: doinst = true;
200 break; 200 break;
201 default : break; 201 default : break;
202 } 202 }
203 if ( doinst ) 203 if ( doinst )
204 QWSServer::setKeyboardFilter ( this ); 204 QWSServer::setKeyboardFilter ( this );
205 } 205 }
206 206
207 virtual bool filter ( int /*unicode*/, int keycode, int modifiers, bool isPress, bool autoRepeat ) 207 virtual bool filter ( int /*unicode*/, int keycode, int modifiers, bool isPress, bool autoRepeat )
208 { 208 {
209 bool kill = false; 209 bool kill = false;
210 210
211 // Rotate cursor keys 180° 211 // Rotate cursor keys 180°
212 switch ( m_model ) { 212 switch ( m_model ) {
213 case OMODEL_iPAQ_H31xx: 213 case OMODEL_iPAQ_H31xx:
214 case OMODEL_iPAQ_H38xx: { 214 case OMODEL_iPAQ_H38xx: {
215 int newkeycode = keycode; 215 int newkeycode = keycode;
216 216
217 switch ( keycode ) { 217 switch ( keycode ) {
218 case Key_Left : newkeycode = Key_Right; break; 218 case Key_Left : newkeycode = Key_Right; break;
219 case Key_Right: newkeycode = Key_Left; break; 219 case Key_Right: newkeycode = Key_Left; break;
220 case Key_Up : newkeycode = Key_Down; break; 220 case Key_Up : newkeycode = Key_Down; break;
221 case Key_Down : newkeycode = Key_Up; break; 221 case Key_Down : newkeycode = Key_Up; break;
222 } 222 }
223 if ( newkeycode != keycode ) { 223 if ( newkeycode != keycode ) {
224 QWSServer::sendKeyEvent ( -1, newkeycode, modifiers, isPress, autoRepeat ); 224 QWSServer::sendKeyEvent ( -1, newkeycode, modifiers, isPress, autoRepeat );
225 kill = true; 225 kill = true;
226 } 226 }
227 break; 227 break;
228 } 228 }
229 default: break; 229 default: break;
230 } 230 }
231 231
232 // map Power Button short/long press to F34/F35 232 // map Power Button short/long press to F34/F35
233 switch ( m_model ) { 233 switch ( m_model ) {
234 case OMODEL_iPAQ_H31xx: 234 case OMODEL_iPAQ_H31xx:
235 case OMODEL_iPAQ_H36xx: 235 case OMODEL_iPAQ_H36xx:
236 case OMODEL_iPAQ_H37xx: 236 case OMODEL_iPAQ_H37xx:
237 case OMODEL_iPAQ_H38xx: { 237 case OMODEL_iPAQ_H38xx: {
238 if ( keycode == Key_SysReq ) { 238 if ( keycode == Key_SysReq ) {
239 if ( isPress ) { 239 if ( isPress ) {
240 if ( m_power_timer ) 240 if ( m_power_timer )
241 killTimer ( m_power_timer ); 241 killTimer ( m_power_timer );
242 m_power_timer = startTimer ( 500 ); 242 m_power_timer = startTimer ( 500 );
243 } 243 }
244 else if ( m_power_timer ) { 244 else if ( m_power_timer ) {
245 killTimer ( m_power_timer ); 245 killTimer ( m_power_timer );
246 m_power_timer = 0; 246 m_power_timer = 0;
247 QWSServer::sendKeyEvent ( -1, Key_F34, 0, true, false ); 247 QWSServer::sendKeyEvent ( -1, Key_F34, 0, true, false );
248 QWSServer::sendKeyEvent ( -1, Key_F34, 0, false, false ); 248 QWSServer::sendKeyEvent ( -1, Key_F34, 0, false, false );
249 } 249 }
250 kill = true; 250 kill = true;
251 } 251 }
252 break; 252 break;
253 } 253 }
254 default: break; 254 default: break;
255 } 255 }
256 return kill; 256 return kill;
257 } 257 }
258 258
259 virtual void timerEvent ( QTimerEvent * ) 259 virtual void timerEvent ( QTimerEvent * )
260 { 260 {
261 killTimer ( m_power_timer ); 261 killTimer ( m_power_timer );
262 m_power_timer = 0; 262 m_power_timer = 0;
263 QWSServer::sendKeyEvent ( -1, Key_F35, 0, true, false ); 263 QWSServer::sendKeyEvent ( -1, Key_F35, 0, true, false );
264 QWSServer::sendKeyEvent ( -1, Key_F35, 0, false, false ); 264 QWSServer::sendKeyEvent ( -1, Key_F35, 0, false, false );
265 } 265 }
266 266
267private: 267private:
268 OModel m_model; 268 OModel m_model;
269 int m_power_timer; 269 int m_power_timer;
270}; 270};
271 271
272 272
273 273
274int initApplication( int argc, char ** argv ) 274int initApplication( int argc, char ** argv )
275{ 275{
276#ifdef QT_QWS_CASSIOPEIA 276#ifdef QT_QWS_CASSIOPEIA
277 initCassiopeia(); 277 initCassiopeia();
278#endif 278#endif
279 279
280#ifdef QPE_OWNAPM 280#ifdef QPE_OWNAPM
281 initAPM(); 281 initAPM();
282#endif 282#endif
283 283
284#ifdef QT_DEMO_SINGLE_FLOPPY 284#ifdef QT_DEMO_SINGLE_FLOPPY
285 initFloppy(); 285 initFloppy();
286#endif 286#endif
287 287
288 initEnvironment(); 288 initEnvironment();
289 289
290#if !defined(QT_QWS_CASSIOPEIA) && !defined(QT_QWS_IPAQ) && !defined(QT_QWS_EBX) 290#if !defined(QT_QWS_CASSIOPEIA) && !defined(QT_QWS_IPAQ) && !defined(QT_QWS_EBX)
291 setenv( "QWS_SIZE", "240x320", 0 ); 291 setenv( "QWS_SIZE", "240x320", 0 );
292#endif 292#endif
293 293
294 //Don't flicker at startup: 294 //Don't flicker at startup:
295 QWSServer::setDesktopBackground( QImage() ); 295 QWSServer::setDesktopBackground( QImage() );
296 DesktopApplication a( argc, argv, QApplication::GuiServer ); 296 DesktopApplication a( argc, argv, QApplication::GuiServer );
297 297
298 (void) new ModelKeyFilter ( ); 298 (void) new ModelKeyFilter ( );
299 299
300 initBacklight(); 300 initBacklight();
301 301
302 AlarmServer::initialize(); 302 AlarmServer::initialize();
303 303
304 Desktop *d = new Desktop(); 304 Desktop *d = new Desktop();
305 305
306 QObject::connect( &a, SIGNAL(datebook()), d, SLOT(raiseDatebook()) ); 306 QObject::connect( &a, SIGNAL(datebook()), d, SLOT(raiseDatebook()) );
307 QObject::connect( &a, SIGNAL(contacts()), d, SLOT(raiseContacts()) ); 307 QObject::connect( &a, SIGNAL(contacts()), d, SLOT(raiseContacts()) );
308 QObject::connect( &a, SIGNAL(launch()), d, SLOT(raiseLauncher()) ); 308 QObject::connect( &a, SIGNAL(launch()), d, SLOT(raiseLauncher()) );
309 QObject::connect( &a, SIGNAL(email()), d, SLOT(raiseEmail()) ); 309 QObject::connect( &a, SIGNAL(email()), d, SLOT(raiseEmail()) );
310 QObject::connect( &a, SIGNAL(power()), d, SLOT(togglePower()) ); 310 QObject::connect( &a, SIGNAL(power()), d, SLOT(togglePower()) );
311 QObject::connect( &a, SIGNAL(backlight()), d, SLOT(toggleLight()) ); 311 QObject::connect( &a, SIGNAL(backlight()), d, SLOT(toggleLight()) );
312 QObject::connect( &a, SIGNAL(symbol()), d, SLOT(toggleSymbolInput()) ); 312 QObject::connect( &a, SIGNAL(symbol()), d, SLOT(toggleSymbolInput()) );
313 QObject::connect( &a, SIGNAL(numLockStateToggle()), d, SLOT(toggleNumLockState()) ); 313 QObject::connect( &a, SIGNAL(numLockStateToggle()), d, SLOT(toggleNumLockState()) );
314 QObject::connect( &a, SIGNAL(capsLockStateToggle()), d, SLOT(toggleCapsLockState()) ); 314 QObject::connect( &a, SIGNAL(capsLockStateToggle()), d, SLOT(toggleCapsLockState()) );
315 QObject::connect( &a, SIGNAL(prepareForRestart()), d, SLOT(terminateServers()) ); 315 QObject::connect( &a, SIGNAL(prepareForRestart()), d, SLOT(terminateServers()) );
316 316
317 (void)new SysFileMonitor(d); 317 (void)new SysFileMonitor(d);
318 Network::createServer(d); 318 Network::createServer(d);
319 319
320#if defined(QT_QWS_CASSIOPEIA) || defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX) 320#if defined(QT_QWS_CASSIOPEIA) || defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX)
321 if ( !QFile::exists( "/etc/pointercal" ) ) { 321 if ( !QFile::exists( "/etc/pointercal" ) ) {
322 // Make sure calibration widget starts on top. 322 // Make sure calibration widget starts on top.
323 Calibrate *cal = new Calibrate; 323 Calibrate *cal = new Calibrate;
324 cal->exec(); 324 cal->exec();
325 delete cal; 325 delete cal;
326 } 326 }
327#endif 327#endif
328 328
329 d->show(); 329 d->show();
330 330
331 int rv = a.exec(); 331 int rv = a.exec();
332 332
333 delete d; 333 delete d;
334 334
335 return rv; 335 return rv;
336} 336}
337 337
338static const char *pidfile_path = "/var/run/opie.pid"; 338static const char *pidfile_path = "/var/run/opie.pid";
339 339
340void create_pidfile ( ) 340void create_pidfile ( )
341{ 341{
342 FILE *f; 342 FILE *f;
343 343
344 if (( f = ::fopen ( pidfile_path, "w" ))) { 344 if (( f = ::fopen ( pidfile_path, "w" ))) {
345 ::fprintf ( f, "%d", getpid ( )); 345 ::fprintf ( f, "%d", getpid ( ));
346 ::fclose ( f ); 346 ::fclose ( f );
347 } 347 }
348} 348}
349 349
350void remove_pidfile ( ) 350void remove_pidfile ( )
351{ 351{
352 ::unlink ( pidfile_path ); 352 ::unlink ( pidfile_path );
353} 353}
354 354
355void handle_sigterm ( int sig ) 355void handle_sigterm ( int /* sig */ )
356{ 356{
357 if ( qApp ) 357 if ( qApp )
358 qApp-> quit ( ); 358 qApp-> quit ( );
359} 359}
360 360
361int main( int argc, char ** argv ) 361int main( int argc, char ** argv )
362{ 362{
363#ifndef SINGLE_APP 363#ifndef SINGLE_APP
364 ::signal( SIGCHLD, SIG_IGN ); 364 ::signal( SIGCHLD, SIG_IGN );
365 365
366 ::signal ( SIGTERM, handle_sigterm ); 366 ::signal ( SIGTERM, handle_sigterm );
367 ::signal ( SIGINT, handle_sigterm );
367 368
368 ::setsid ( ); 369 ::setsid ( );
369 ::setpgid ( 0, 0 ); 370 ::setpgid ( 0, 0 );
370 371
371 ::atexit ( remove_pidfile ); 372 ::atexit ( remove_pidfile );
372 create_pidfile ( ); 373 create_pidfile ( );
373#endif 374#endif
374 375
375 int retVal = initApplication ( argc, argv ); 376 int retVal = initApplication ( argc, argv );
376 377
377#ifndef SINGLE_APP 378#ifndef SINGLE_APP
378 // Kill them. Kill them all. 379 // Kill them. Kill them all.
379 ::kill ( 0, SIGTERM ); 380 ::kill ( 0, SIGTERM );
380 ::sleep( 1 ); 381 ::sleep( 1 );
381 ::kill ( 0, SIGKILL ); 382 ::kill ( 0, SIGKILL );
382#endif 383#endif
383 384
384 return retVal; 385 return retVal;
385} 386}
386 387