summaryrefslogtreecommitdiff
authorsandman <sandman>2002-12-23 00:07:32 (UTC)
committer sandman <sandman>2002-12-23 00:07:32 (UTC)
commit6f82a7bad0746d37ff1545717be3fe67e2eed17c (patch) (unidiff)
treeeaf5e6b6d7e7fcc648d25ae7021d1785b80122f2
parentc513f413c7d901cc9945714c8e7eb47292f63306 (diff)
downloadopie-6f82a7bad0746d37ff1545717be3fe67e2eed17c.zip
opie-6f82a7bad0746d37ff1545717be3fe67e2eed17c.tar.gz
opie-6f82a7bad0746d37ff1545717be3fe67e2eed17c.tar.bz2
- ported the device button handling to the new ODevice based framework
- removed the key re-grabbing in runningsappbar (not necessary anymore) - added a few new QCops to make all "special" launcher functions available via qcop - added the devicebuttons to the opie-taskbar ipk
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/launcher/desktop.cpp1070
-rw-r--r--core/launcher/desktop.h149
-rw-r--r--core/launcher/launcher.cpp7
-rw-r--r--core/launcher/main.cpp5
-rw-r--r--core/launcher/opie-taskbar.control2
-rw-r--r--core/launcher/runningappbar.cpp9
-rw-r--r--core/launcher/startmenu.cpp19
-rw-r--r--core/launcher/taskbar.cpp12
8 files changed, 608 insertions, 665 deletions
diff --git a/core/launcher/desktop.cpp b/core/launcher/desktop.cpp
index 6c67056..fa9736f 100644
--- a/core/launcher/desktop.cpp
+++ b/core/launcher/desktop.cpp
@@ -1,905 +1,841 @@
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 "qcopbridge.h" 24#include "qcopbridge.h"
25#include "shutdownimpl.h" 25#include "shutdownimpl.h"
26#include "startmenu.h" 26#include "startmenu.h"
27#include "taskbar.h" 27#include "taskbar.h"
28#include "transferserver.h" 28#include "transferserver.h"
29#include "irserver.h" 29#include "irserver.h"
30#include "packageslave.h" 30#include "packageslave.h"
31#include "screensaver.h" 31#include "screensaver.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/network.h> 40#include <qpe/network.h>
41#include <qpe/global.h> 41#include <qpe/global.h>
42 42
43#if defined( QT_QWS_SHARP ) || defined( QT_QWS_IPAQ ) 43#if defined( QT_QWS_SHARP ) || defined( QT_QWS_IPAQ )
44#include <qpe/custom.h> 44#include <qpe/custom.h>
45#endif 45#endif
46 46
47#include <opie/odevice.h> 47#include <opie/odevice.h>
48 48
49#include <qgfx_qws.h> 49#include <qgfx_qws.h>
50#include <qmainwindow.h> 50#include <qmainwindow.h>
51#include <qmessagebox.h> 51#include <qmessagebox.h>
52#include <qtimer.h> 52#include <qtimer.h>
53#include <qwindowsystem_qws.h> 53#include <qwindowsystem_qws.h>
54 54
55#include <qvaluelist.h> 55#include <qvaluelist.h>
56 56
57#include <stdlib.h> 57#include <stdlib.h>
58#include <unistd.h> 58#include <unistd.h>
59#include <fcntl.h> 59#include <fcntl.h>
60 60
61
61using namespace Opie; 62using namespace Opie;
62 63
63class QCopKeyRegister 64class QCopKeyRegister
64{ 65{
65public: 66public:
66 QCopKeyRegister() : keyCode( 0 ) 67 QCopKeyRegister() : keyCode( 0 )
67 { } 68 { }
68 QCopKeyRegister( int k, const QString &c, const QString &m ) 69 QCopKeyRegister( int k, const QCString &c, const QCString &m )
69 : keyCode( k ), channel( c ), message( m ) 70 : keyCode( k ), channel( c ), message( m )
70 { } 71 { }
71 72
72 int getKeyCode() const 73 int getKeyCode() const
73 { 74 {
74 return keyCode; 75 return keyCode;
75 } 76 }
76 QString getChannel() const 77 QCString getChannel() const
77 { 78 {
78 return channel; 79 return channel;
79 } 80 }
80 QString getMessage() const 81 QCString getMessage() const
81 { 82 {
82 return message; 83 return message;
83 } 84 }
84 85
85private: 86private:
86 int keyCode; 87 int keyCode;
87 QString channel, message; 88 QCString channel, message;
88}; 89};
89 90
90typedef QValueList<QCopKeyRegister> KeyRegisterList; 91typedef QValueList<QCopKeyRegister> KeyRegisterList;
91KeyRegisterList keyRegisterList; 92KeyRegisterList keyRegisterList;
92 93
93static Desktop* qpedesktop = 0; 94static Desktop* qpedesktop = 0;
94static int loggedin = 0; 95static int loggedin = 0;
95static void login( bool at_poweron ) 96static void login( bool at_poweron )
96{ 97{
97 if ( !loggedin ) { 98 if ( !loggedin ) {
98 Global::terminateBuiltin( "calibrate" ); 99 Global::terminateBuiltin( "calibrate" );
99 Password::authenticate( at_poweron ); 100 Password::authenticate( at_poweron );
100 loggedin = 1; 101 loggedin = 1;
101 QCopEnvelope e( "QPE/Desktop", "unlocked()" ); 102 QCopEnvelope e( "QPE/Desktop", "unlocked()" );
102 } 103 }
103} 104}
104 105
105bool Desktop::screenLocked() 106bool Desktop::screenLocked()
106{ 107{
107 return loggedin == 0; 108 return loggedin == 0;
108} 109}
109 110
110/* 111/*
111 Priority is number of alerts that are needed to pop up 112 Priority is number of alerts that are needed to pop up
112 alert. 113 alert.
113 */ 114 */
114class DesktopPowerAlerter : public QMessageBox 115class DesktopPowerAlerter : public QMessageBox
115{ 116{
116public: 117public:
117 DesktopPowerAlerter( QWidget *parent, const char *name = 0 ) 118 DesktopPowerAlerter( QWidget *parent, const char *name = 0 )
118 : QMessageBox( tr( "Battery Status" ), "Low Battery", 119 : QMessageBox( tr( "Battery Status" ), "Low Battery",
119 QMessageBox::Critical, 120 QMessageBox::Critical,
120 QMessageBox::Ok | QMessageBox::Default, 121 QMessageBox::Ok | QMessageBox::Default,
121 QMessageBox::NoButton, QMessageBox::NoButton, 122 QMessageBox::NoButton, QMessageBox::NoButton,
122 parent, name, FALSE ) 123 parent, name, FALSE )
123 { 124 {
124 currentPriority = INT_MAX; 125 currentPriority = INT_MAX;
125 alertCount = 0; 126 alertCount = 0;
126 } 127 }
127 128
128 void alert( const QString &text, int priority ); 129 void alert( const QString &text, int priority );
129 void hideEvent( QHideEvent * ); 130 void hideEvent( QHideEvent * );
130private: 131private:
131 int currentPriority; 132 int currentPriority;
132 int alertCount; 133 int alertCount;
133}; 134};
134 135
135void DesktopPowerAlerter::alert( const QString &text, int priority ) 136void DesktopPowerAlerter::alert( const QString &text, int priority )
136{ 137{
137 alertCount++; 138 alertCount++;
138 if ( alertCount < priority ) 139 if ( alertCount < priority )
139 return ; 140 return ;
140 if ( priority > currentPriority ) 141 if ( priority > currentPriority )
141 return ; 142 return ;
142 currentPriority = priority; 143 currentPriority = priority;
143 setText( text ); 144 setText( text );
144 show(); 145 show();
145} 146}
146 147
147 148
148void DesktopPowerAlerter::hideEvent( QHideEvent *e ) 149void DesktopPowerAlerter::hideEvent( QHideEvent *e )
149{ 150{
150 QMessageBox::hideEvent( e ); 151 QMessageBox::hideEvent( e );
151 alertCount = 0; 152 alertCount = 0;
152 currentPriority = INT_MAX; 153 currentPriority = INT_MAX;
153} 154}
154 155
155 156
156void DesktopApplication::switchLCD ( bool on ) 157void DesktopApplication::switchLCD ( bool on )
157{ 158{
158 if ( qApp ) { 159 if ( qApp ) {
159 DesktopApplication *dapp = (DesktopApplication *) qApp; 160 DesktopApplication *dapp = (DesktopApplication *) qApp;
160 161
161 if ( dapp-> m_screensaver ) { 162 if ( dapp-> m_screensaver ) {
162 if ( on ) { 163 if ( on ) {
163 dapp-> m_screensaver-> setDisplayState ( true ); 164 dapp-> m_screensaver-> setDisplayState ( true );
164 dapp-> m_screensaver-> setBacklight ( -3 ); 165 dapp-> m_screensaver-> setBacklight ( -3 );
165 } 166 }
166 else { 167 else {
167 dapp-> m_screensaver-> setDisplayState ( false ); 168 dapp-> m_screensaver-> setDisplayState ( false );
168 } 169 }
169 } 170 }
170 } 171 }
171} 172}
172 173
173 174
174DesktopApplication::DesktopApplication( int& argc, char **argv, Type appType ) 175DesktopApplication::DesktopApplication( int& argc, char **argv, Type appType )
175 : QPEApplication( argc, argv, appType ) 176 : QPEApplication( argc, argv, appType )
176{ 177{
177 178
178 Config cfg( "apm" ); 179 Config cfg( "apm" );
179 cfg.setGroup( "Warnings" ); 180 cfg.setGroup( "Warnings" );
180 //cfg.readNumEntry( "checkinterval", 10000 ) 181 //cfg.readNumEntry( "checkinterval", 10000 )
181 m_powerVeryLow = cfg.readNumEntry( "powerverylow", 10 ); 182 m_powerVeryLow = cfg.readNumEntry( "powerverylow", 10 );
182 m_powerCritical = cfg.readNumEntry( "powercritical", 5 ); 183 m_powerCritical = cfg.readNumEntry( "powercritical", 5 );
183 184
184 m_ps = new PowerStatus; 185 m_ps = new PowerStatus;
185 m_ps_last = new PowerStatus; 186 m_ps_last = new PowerStatus;
186 pa = new DesktopPowerAlerter( 0 ); 187 pa = new DesktopPowerAlerter( 0 );
187 188
188 m_timer = new QTimer( this ); 189 m_timer = new QTimer( this );
189 connect( m_timer, SIGNAL( timeout() ), this, SLOT( apmTimeout() ) ); 190 connect( m_timer, SIGNAL( timeout() ), this, SLOT( apmTimeout() ) );
190 m_timer->start( 5000 ); 191 m_timer->start( 5000 );
191
192 channel = new QCopChannel( "QPE/Desktop", this );
193 connect( channel, SIGNAL( received( const QCString&, const QByteArray& ) ),
194 this, SLOT( desktopMessage( const QCString&, const QByteArray& ) ) );
195 192
193 m_last_button = 0;
194 m_button_timer = new QTimer ( );
195 connect ( m_button_timer, SIGNAL( timeout ( )), this, SLOT( sendHeldAction ( )));
196
196 channel = new QCopChannel( "QPE/System", this ); 197 channel = new QCopChannel( "QPE/System", this );
197 connect( channel, SIGNAL( received( const QCString&, const QByteArray& ) ), 198 connect( channel, SIGNAL( received( const QCString&, const QByteArray& ) ),
198 this, SLOT( systemMessage( const QCString&, const QByteArray& ) ) ); 199 this, SLOT( systemMessage( const QCString&, const QByteArray& ) ) );
199 200
201 channel = new QCopChannel( "QPE/Launcher", this );
202 connect( channel, SIGNAL( received( const QCString&, const QByteArray& ) ),
203 this, SLOT( launcherMessage( const QCString&, const QByteArray& ) ) );
204
200 m_screensaver = new OpieScreenSaver ( ); 205 m_screensaver = new OpieScreenSaver ( );
201 m_screensaver-> setInterval ( -1 ); 206 m_screensaver-> setInterval ( -1 );
202 QWSServer::setScreenSaver( m_screensaver ); 207 QWSServer::setScreenSaver( m_screensaver );
208
209 rereadVolumes();
210 connect( qApp, SIGNAL( volumeChanged( bool ) ), this, SLOT( rereadVolumes() ) );
203 211
204 apmTimeout ( ); 212 apmTimeout ( );
213
214 grabKeyboard ( );
205} 215}
206 216
207 217
208DesktopApplication::~DesktopApplication() 218DesktopApplication::~DesktopApplication()
209{ 219{
220 ungrabKeyboard ( );
221
210 delete m_ps; 222 delete m_ps;
211 delete m_ps_last; 223 delete m_ps_last;
212 delete pa; 224 delete pa;
213} 225}
214 226
215void DesktopApplication::apmTimeout() 227void DesktopApplication::apmTimeout()
216{ 228{
217 qpedesktop->checkMemory(); // in case no events are being generated 229 qpedesktop->checkMemory(); // in case no events are being generated
218 230
219 *m_ps_last = *m_ps; 231 *m_ps_last = *m_ps;
220 *m_ps = PowerStatusManager::readStatus(); 232 *m_ps = PowerStatusManager::readStatus();
221 233
222 if ( m_ps-> acStatus ( ) != m_ps_last-> acStatus ( )) 234 if ( m_ps-> acStatus ( ) != m_ps_last-> acStatus ( ))
223 m_screensaver-> powerStatusChanged ( *m_ps ); 235 m_screensaver-> powerStatusChanged ( *m_ps );
224 236
225 if ( m_ps-> acStatus ( ) != PowerStatus::Online ) { 237 if ( m_ps-> acStatus ( ) != PowerStatus::Online ) {
226 int bat = m_ps-> batteryPercentRemaining ( ); 238 int bat = m_ps-> batteryPercentRemaining ( );
227 239
228 if ( bat < m_ps_last-> batteryPercentRemaining ( )) { 240 if ( bat < m_ps_last-> batteryPercentRemaining ( )) {
229 if ( bat <= m_powerCritical ) 241 if ( bat <= m_powerCritical )
230 pa->alert( tr( "Battery level is critical!\nKeep power off until power restored!" ), 1 ); 242 pa->alert( tr( "Battery level is critical!\nKeep power off until power restored!" ), 1 );
231 else if ( bat <= m_powerVeryLow ) 243 else if ( bat <= m_powerVeryLow )
232 pa->alert( tr( "Battery is running very low." ), 2 ); 244 pa->alert( tr( "Battery is running very low." ), 2 );
233 } 245 }
234 if ( m_ps-> backupBatteryStatus ( ) == PowerStatus::VeryLow ) 246 if ( m_ps-> backupBatteryStatus ( ) == PowerStatus::VeryLow )
235 pa->alert( tr( "The Back-up battery is very low.\nPlease charge the back-up battery." ), 2 ); 247 pa->alert( tr( "The Back-up battery is very low.\nPlease charge the back-up battery." ), 2 );
236 } 248 }
237} 249}
238 250
239void DesktopApplication::desktopMessage( const QCString &msg, const QByteArray &data ) 251
252void DesktopApplication::systemMessage( const QCString & msg, const QByteArray & data )
240{ 253{
241 QDataStream stream( data, IO_ReadOnly ); 254 QDataStream stream ( data, IO_ReadOnly );
242 if ( msg == "keyRegister(int key, QString channel, QString message)" ) {
243 int k;
244 QString c, m;
245 stream >> k;
246 stream >> c;
247 stream >> m;
248 255
249 qWarning( "KeyRegisterReceived: %i, %s, %s", k, ( const char* ) c, ( const char * ) m ); 256 if ( msg == "setScreenSaverInterval(int)" ) {
250 keyRegisterList.append( QCopKeyRegister( k, c, m ) ); 257 int time;
251 } 258 stream >> time;
259 m_screensaver-> setInterval( time );
260 }
261 else if ( msg == "setScreenSaverIntervals(int,int,int)" ) {
262 int t1, t2, t3;
263 stream >> t1 >> t2 >> t3;
264 m_screensaver-> setIntervals( t1, t2, t3 );
265 }
266 else if ( msg == "setBacklight(int)" ) {
267 int bright;
268 stream >> bright;
269 m_screensaver-> setBacklight( bright );
270 }
271 else if ( msg == "setScreenSaverMode(int)" ) {
272 int mode;
273 stream >> mode;
274 m_screensaver-> setMode ( mode );
275 }
276 else if ( msg == "reloadPowerWarnSettings()" ) {
277 reloadPowerWarnSettings();
278 }
279 else if ( msg == "setDisplayState(int)" ) {
280 int state;
281 stream >> state;
282 m_screensaver-> setDisplayState ( state != 0 );
283 }
284 else if ( msg == "suspend()" ) {
285 emit power();
286 }
287 else if ( msg == "sendBusinessCard()" ) {
288 QString card = ::getenv ( "HOME" );
289 card += "/Applications/addressbook/businesscard.vcf";
290
291 if ( QFile::exists( card ) ) {
292 QCopEnvelope e ( "QPE/Obex", "send(QString,QString,QString)" );
293 QString mimetype = "text/x-vCard";
294 e << tr( "business card" ) << card << mimetype;
295 }
296 }
252} 297}
253 298
254 299void DesktopApplication::reloadPowerWarnSettings()
255void DesktopApplication::systemMessage( const QCString & msg, const QByteArray & data )
256{ 300{
257 QDataStream stream ( data, IO_ReadOnly ); 301 Config cfg( "apm" );
258 302 cfg.setGroup( "Warnings" );
259 if ( msg == "setScreenSaverInterval(int)" ) { 303
260 int time; 304 // m_timer->changeInterval( cfg.readNumEntry( "checkinterval", 10000 ) );
261 stream >> time; 305 m_powerVeryLow = cfg.readNumEntry( "powerverylow", 10 );
262 m_screensaver-> setInterval( time ); 306 m_powerCritical = cfg.readNumEntry( "powervcritical", 5 );
263 }
264 else if ( msg == "setScreenSaverIntervals(int,int,int)" ) {
265 int t1, t2, t3;
266 stream >> t1 >> t2 >> t3;
267 m_screensaver-> setIntervals( t1, t2, t3 );
268 }
269 else if ( msg == "setBacklight(int)" ) {
270 int bright;
271 stream >> bright;
272 m_screensaver-> setBacklight( bright );
273 }
274 else if ( msg == "setScreenSaverMode(int)" ) {
275 int mode;
276 stream >> mode;
277 m_screensaver-> setMode ( mode );
278 }
279 else if ( msg == "reloadPowerWarnSettings()" ) {
280 reloadPowerWarnSettings();
281 }
282 else if ( msg == "setDisplayState(int)" ) {
283 int state;
284 stream >> state;
285 m_screensaver-> setDisplayState ( state != 0 );
286 }
287 else if ( msg == "suspend()" ) {
288 emit power();
289 }
290}
291
292void DesktopApplication::reloadPowerWarnSettings() {
293 Config cfg( "apm" );
294 cfg.setGroup( "Warnings" );
295
296 // m_timer->changeInterval( cfg.readNumEntry( "checkinterval", 10000 ) );
297 m_powerVeryLow = cfg.readNumEntry( "powerverylow", 10 );
298 m_powerCritical = cfg.readNumEntry( "powervcritical", 5 );
299} 307}
300 308
301 309
302enum MemState { Unknown, VeryLow, Low, Normal } memstate = Unknown; 310enum MemState { Unknown, VeryLow, Low, Normal } memstate = Unknown;
303 311
304#ifdef Q_WS_QWS 312
305bool DesktopApplication::qwsEventFilter( QWSEvent *e ) 313void DesktopApplication::launcherMessage( const QCString & msg, const QByteArray & data )
314{
315 QDataStream stream ( data, IO_ReadOnly );
316
317 if ( msg == "deviceButton(int,int,int)" ) {
318 int keycode, press, autoRepeat;
319 stream >> keycode >> press >> autoRepeat;
320
321 const ODeviceButton *db = ODevice::inst ( )-> buttonForKeycode ( keycode );
322
323 if ( db )
324 checkButtonAction ( db, keycode, press, autoRepeat );
325 }
326 else if ( msg == "keyRegister(int,QCString,QCString)" ) {
327 int k;
328 QCString c, m;
329 stream >> k >> c >> m;
330
331 keyRegisterList.append ( QCopKeyRegister ( k, c, m ));
332 }
333}
334
335void DesktopApplication::sendHeldAction ( )
306{ 336{
307 qpedesktop->checkMemory(); 337 if ( m_last_button ) {
308 338 m_last_button-> heldAction ( ). send ( );
309 if ( e->type == QWSEvent::Key ) { 339 m_last_button = 0;
310 QWSKeyEvent * ke = ( QWSKeyEvent * ) e; 340 }
311 if ( !loggedin && ke->simpleData.keycode != Key_F34 )
312 return TRUE;
313 bool press = ke->simpleData.is_press;
314 bool autoRepeat = ke->simpleData.is_auto_repeat;
315
316 /*
317 app that registers key/message to be sent back to the app, when it doesn't have focus,
318 when user presses key, unless keyboard has been requested from app.
319 will not send multiple repeats if user holds key
320 i.e. one shot
321 */
322 if ( !keyRegisterList.isEmpty() && ke->simpleData.keycode !=0 && press) {
323// qDebug("<<<<<<<<<<<<<keycode %d", ke->simpleData.keycode);
324 KeyRegisterList::Iterator it;
325 for ( it = keyRegisterList.begin(); it != keyRegisterList.end(); ++it ) {
326 if ( ( *it ).getKeyCode() == ke->simpleData.keycode && !autoRepeat && !keyboardGrabbed() ) {
327 if ( press )
328 qDebug( "press" );
329 else
330 qDebug( "release" );
331 QCopEnvelope( ( *it ).getChannel().utf8(), ( *it ).getMessage().utf8() );
332 }
333 }
334 }
335
336 if ( !keyboardGrabbed() ) {
337 if ( ke->simpleData.keycode == Key_F9 ) {
338 if ( press )
339 emit datebook();
340 return TRUE;
341 }
342 if ( ke->simpleData.keycode == Key_F10 ) {
343 if ( !press && cardSendTimer ) {
344 emit contacts();
345 delete cardSendTimer;
346 }
347 else if ( press ) {
348 cardSendTimer = new QTimer();
349 cardSendTimer->start( 2000, TRUE );
350 connect( cardSendTimer, SIGNAL( timeout() ), this, SLOT( sendCard() ) );
351 }
352 return TRUE;
353 }
354
355 if ( ke->simpleData.keycode == Key_F11 ) {
356 if ( press ) emit menu();
357 return TRUE;
358 }
359
360 if ( ke->simpleData.keycode == Key_F12 ) {
361 while ( activePopupWidget() )
362 activePopupWidget() ->close();
363 if ( press )
364 emit launch();
365 return TRUE;
366 }
367 if ( ke->simpleData.keycode == Key_F13 ) {
368 if ( press )
369 emit email();
370 return TRUE;
371 }
372 }
373
374 if ( ke->simpleData.keycode == Key_F34 ) {
375 if ( press )
376 emit power();
377 return TRUE;
378 }
379 // This was used for the iPAQ PowerButton
380 // See main.cpp for new KeyboardFilter
381 //
382 // if ( ke->simpleData.keycode == Key_SysReq ) {
383 // if ( press ) emit power();
384 // return TRUE;
385 // }
386 if ( ke->simpleData.keycode == Key_F35 ) {
387 if ( press )
388 emit backlight();
389 return TRUE;
390 }
391 if ( ke->simpleData.keycode == Key_F32 ) {
392 if ( press )
393 QCopEnvelope e( "QPE/Desktop", "startSync()" );
394 return TRUE;
395 }
396 if ( ke->simpleData.keycode == Key_F31 && !ke->simpleData.modifiers ) {
397 if ( press )
398 emit symbol();
399 return TRUE;
400 }
401 if ( ke->simpleData.keycode == Key_NumLock ) {
402 if ( press )
403 emit numLockStateToggle();
404 }
405 if ( ke->simpleData.keycode == Key_CapsLock ) {
406 if ( press )
407 emit capsLockStateToggle();
408 }
409 if ( ( press && !autoRepeat ) || ( !press && autoRepeat ) )
410 qpedesktop->keyClick();
411 }
412 else {
413 if ( e->type == QWSEvent::Mouse ) {
414 QWSMouseEvent * me = ( QWSMouseEvent * ) e;
415 static bool up = TRUE;
416 if ( me->simpleData.state & LeftButton ) {
417 if ( up ) {
418 up = FALSE;
419 qpedesktop->screenClick();
420 }
421 }
422 else {
423 up = TRUE;
424 }
425 }
426 }
427
428 return QPEApplication::qwsEventFilter( e );
429} 341}
430#endif
431 342
432 343
433void DesktopApplication::sendCard() 344
345void DesktopApplication::checkButtonAction ( const ODeviceButton *db, int keycode, bool press, bool autoRepeat )
346 {
347 if ( db ) {
348 if ( !press && !autoRepeat && m_button_timer-> isActive ( )) {
349 m_button_timer-> stop ( );
350 if ( !db-> pressedAction ( ). channel ( ). isEmpty ( )) {
351 db-> pressedAction ( ). send ( );
352 }
353 }
354 else if ( press && !autoRepeat ) {
355 m_button_timer-> stop ( );
356
357 if ( !db-> heldAction ( ). channel ( ). isEmpty ( )) {
358 m_last_button = db;
359 m_button_timer-> start ( ODevice::inst ( )-> buttonHoldTime ( ), true );
360 }
361 }
362 }
363}
364
365bool DesktopApplication::eventFilter ( QObject *o, QEvent *e )
434{ 366{
435 delete cardSendTimer; 367 if ( e-> type ( ) == QEvent::KeyPress || e-> type ( ) == QEvent::KeyRelease ) {
436 cardSendTimer = 0; 368 QKeyEvent *ke = (QKeyEvent *) e;
437 QString card = getenv( "HOME" ); 369
438 card += "/Applications/addressbook/businesscard.vcf"; 370 const ODeviceButton *db = ODevice::inst ( )-> buttonForKeycode ( ke-> key ( ));
371
372 if ( db ) {
373 checkButtonAction ( db, ke-> key ( ), e-> type ( ) == QEvent::KeyPress, ke-> isAutoRepeat ( ));
374 return true;
375 }
376 }
377 return QPEApplication::eventFilter ( o, e );
378}
379
380#ifdef Q_WS_QWS
381
382bool DesktopApplication::qwsEventFilter( QWSEvent *e )
383{
384 qpedesktop->checkMemory();
385
386 if ( e->type == QWSEvent::Key ) {
387 QWSKeyEvent * ke = (QWSKeyEvent *) e;
388 ushort keycode = ke-> simpleData. keycode;
389
390 if ( !loggedin && keycode != Key_F34 )
391 return true;
392
393 bool press = ke-> simpleData. is_press;
394 bool autoRepeat = ke-> simpleData. is_auto_repeat;
395
396 if ( !keyboardGrabbed ( )) {
397 // app that registers key/message to be sent back to the app, when it doesn't have focus,
398 // when user presses key, unless keyboard has been requested from app.
399 // will not send multiple repeats if user holds key
400 // i.e. one shot
401
402 if ( keycode != 0 && press && !autoRepeat ) {
403 for ( KeyRegisterList::Iterator it = keyRegisterList.begin(); it != keyRegisterList.end(); ++it ) {
404 if (( *it ). getKeyCode ( ) == keycode ) {
405 QCopEnvelope (( *it ). getChannel ( ), ( *it ). getMessage ( ));
406 return true;
407 }
408 }
409 }
410 }
411
412 if ( keycode == HardKey_Suspend ) {
413 if ( press )
414 emit power ( );
415 return true;
416 }
417 else if ( keycode == HardKey_Backlight ) {
418 if ( press )
419 emit backlight ( );
420 return true;
421 }
422 else if ( keycode == Key_F32 ) {
423 if ( press )
424 QCopEnvelope e( "QPE/Desktop", "startSync()" );
425 return true;
426 }
427 else if ( keycode == Key_F31 && !ke-> simpleData. modifiers ) { // Symbol Key -> show Unicode IM
428 if ( press )
429 emit symbol ( );
430 return true;
431 }
432 else if ( keycode == Key_NumLock ) {
433 if ( press )
434 emit numLockStateToggle ( );
435 }
436 else if ( keycode == Key_CapsLock ) {
437 if ( press )
438 emit capsLockStateToggle();
439 }
440 if (( press && !autoRepeat ) || ( !press && autoRepeat )) {
441 if ( m_keyclick_sound )
442 ODevice::inst ( )-> keySound ( );
443 }
444 }
445 else if ( e-> type == QWSEvent::Mouse ) {
446 QWSMouseEvent * me = ( QWSMouseEvent * ) e;
447 static bool up = true;
448
449 if ( me-> simpleData. state & LeftButton ) {
450 if ( up ) {
451 up = false;
452 if ( m_screentap_sound )
453 ODevice::inst ( ) -> touchSound ( );
454 }
455 }
456 else {
457 up = true;
458 }
459 }
439 460
440 if ( QFile::exists( card ) ) { 461 return QPEApplication::qwsEventFilter ( e );
441 QCopEnvelope e( "QPE/Obex", "send(QString,QString,QString)" );
442 QString mimetype = "text/x-vCard";
443 e << tr( "business card" ) << card << mimetype;
444 }
445} 462}
463#endif
464
465
446 466
447#if defined(QPE_HAVE_MEMALERTER) 467#if defined(QPE_HAVE_MEMALERTER)
448QPE_MEMALERTER_IMPL 468QPE_MEMALERTER_IMPL
449#endif 469#endif
450 470
451//=========================================================================== 471//===========================================================================
452 472
453Desktop::Desktop() : 473Desktop::Desktop() :
454 QWidget( 0, 0, WStyle_Tool | WStyle_Customize ), 474 QWidget( 0, 0, WStyle_Tool | WStyle_Customize ),
455 qcopBridge( 0 ), 475 qcopBridge( 0 ),
456 transferServer( 0 ), 476 transferServer( 0 ),
457 packageSlave( 0 ) 477 packageSlave( 0 )
458{ 478{
459 qpedesktop = this; 479 qpedesktop = this;
460 480
461 // bg = new Info( this ); 481 // bg = new Info( this );
462 tb = new TaskBar; 482 tb = new TaskBar;
463 483
464 launcher = new Launcher( 0, 0, WStyle_Customize | QWidget::WGroupLeader ); 484 launcher = new Launcher( 0, 0, WStyle_Customize | QWidget::WGroupLeader );
465 485
466 connect( launcher, SIGNAL( busy() ), tb, SLOT( startWait() ) ); 486 connect( launcher, SIGNAL( busy() ), tb, SLOT( startWait() ) );
467 connect( launcher, SIGNAL( notBusy( const QString& ) ), tb, SLOT( stopWait( const QString& ) ) ); 487 connect( launcher, SIGNAL( notBusy( const QString& ) ), tb, SLOT( stopWait( const QString& ) ) );
468 488
469 int displayw = qApp->desktop() ->width(); 489 int displayw = qApp->desktop() ->width();
470 int displayh = qApp->desktop() ->height(); 490 int displayh = qApp->desktop() ->height();
471 491
472 492
473 QSize sz = tb->sizeHint(); 493 QSize sz = tb->sizeHint();
474 494
475 setGeometry( 0, displayh - sz.height(), displayw, sz.height() ); 495 setGeometry( 0, displayh - sz.height(), displayw, sz.height() );
476 tb->setGeometry( 0, displayh - sz.height(), displayw, sz.height() ); 496 tb->setGeometry( 0, displayh - sz.height(), displayw, sz.height() );
477 497
478 tb->show(); 498 tb->show();
479 launcher->showMaximized(); 499 launcher->showMaximized();
480 launcher->show(); 500 launcher->show();
481 launcher->raise(); 501 launcher->raise();
482#if defined(QPE_HAVE_MEMALERTER) 502#if defined(QPE_HAVE_MEMALERTER)
483 503
484 initMemalerter(); 504 initMemalerter();
485#endif 505#endif
486 // start services 506 // start services
487 startTransferServer(); 507 startTransferServer();
488 ( void ) new IrServer( this ); 508 ( void ) new IrServer( this );
489 rereadVolumes();
490 509
491 packageSlave = new PackageSlave( this ); 510 packageSlave = new PackageSlave( this );
492 connect( qApp, SIGNAL( volumeChanged( bool ) ), this, SLOT( rereadVolumes() ) );
493 511
494 qApp->installEventFilter( this ); 512 qApp->installEventFilter( this );
495 513
496 qApp-> setMainWidget ( launcher ); 514 qApp-> setMainWidget ( launcher );
497} 515}
498 516
499void Desktop::show() 517void Desktop::show()
500{ 518{
501 login( TRUE ); 519 login( TRUE );
502 QWidget::show(); 520 QWidget::show();
503} 521}
504 522
505Desktop::~Desktop() 523Desktop::~Desktop()
506{ 524{
507 delete launcher; 525 delete launcher;
508 delete tb; 526 delete tb;
509 delete qcopBridge; 527 delete qcopBridge;
510 delete transferServer; 528 delete transferServer;
511} 529}
512 530
513bool Desktop::recoverMemory() 531bool Desktop::recoverMemory()
514{ 532{
515 return tb->recoverMemory(); 533 return tb->recoverMemory();
516} 534}
517 535
518void Desktop::checkMemory() 536void Desktop::checkMemory()
519{ 537{
520#if defined(QPE_HAVE_MEMALERTER) 538#if defined(QPE_HAVE_MEMALERTER)
521 static bool ignoreNormal = FALSE; 539 static bool ignoreNormal = FALSE;
522 static bool existingMessage = FALSE; 540 static bool existingMessage = FALSE;
523 541
524 if ( existingMessage ) 542 if ( existingMessage )
525 return ; // don't show a second message while still on first 543 return ; // don't show a second message while still on first
526 544
527 existingMessage = TRUE; 545 existingMessage = TRUE;
528 switch ( memstate ) { 546 switch ( memstate ) {
529 case Unknown: 547 case Unknown:
530 break; 548 break;
531 case Low: 549 case Low:
532 memstate = Unknown; 550 memstate = Unknown;
533 if ( recoverMemory() ) 551 if ( recoverMemory() )
534 ignoreNormal = TRUE; 552 ignoreNormal = TRUE;
535 else 553 else
536 QMessageBox::warning( 0 , "Memory Status", 554 QMessageBox::warning( 0 , "Memory Status",
537 "The memory smacks of shortage. \n" 555 "The memory smacks of shortage. \n"
538 "Please save data. " ); 556 "Please save data. " );
539 break; 557 break;
540 case Normal: 558 case Normal:
541 memstate = Unknown; 559 memstate = Unknown;
542 if ( ignoreNormal ) 560 if ( ignoreNormal )
543 ignoreNormal = FALSE; 561 ignoreNormal = FALSE;
544// else 562 // else
545// QMessageBox::information ( 0 , "Memory Status", 563 // QMessageBox::information ( 0 , "Memory Status",
546// "There is enough memory again." ); 564 // "There is enough memory again." );
547 break; 565 break;
548 case VeryLow: 566 case VeryLow:
549 memstate = Unknown; 567 memstate = Unknown;
550 QMessageBox::critical( 0 , "Memory Status", 568 QMessageBox::critical( 0 , "Memory Status",
551 "The memory is very low. \n" 569 "The memory is very low. \n"
552 "Please end this application \n" 570 "Please end this application \n"
553 "immediately." ); 571 "immediately." );
554 recoverMemory(); 572 recoverMemory();
555 } 573 }
556 existingMessage = FALSE; 574 existingMessage = FALSE;
557#endif 575#endif
558} 576}
559 577
560static bool isVisibleWindow( int wid ) 578static bool isVisibleWindow( int wid )
561{ 579{
562#ifdef QWS 580#ifdef QWS
563 const QList<QWSWindow> &list = qwsServer->clientWindows(); 581 const QList<QWSWindow> &list = qwsServer->clientWindows();
564 QWSWindow* w; 582 QWSWindow* w;
565 for ( QListIterator<QWSWindow> it( list ); ( w = it.current() ); ++it ) { 583 for ( QListIterator<QWSWindow> it( list ); ( w = it.current() ); ++it ) {
566 if ( w->winId() == wid ) 584 if ( w->winId() == wid )
567 return !w->isFullyObscured(); 585 return !w->isFullyObscured();
568 } 586 }
569#endif 587#endif
570 return FALSE; 588 return FALSE;
571} 589}
572 590
573static bool hasVisibleWindow( const QString& clientname ) 591static bool hasVisibleWindow( const QString& clientname )
574{ 592{
575#ifdef QWS 593#ifdef QWS
576 const QList<QWSWindow> &list = qwsServer->clientWindows(); 594 const QList<QWSWindow> &list = qwsServer->clientWindows();
577 QWSWindow* w; 595 QWSWindow* w;
578 for ( QListIterator<QWSWindow> it( list ); ( w = it.current() ); ++it ) { 596 for ( QListIterator<QWSWindow> it( list ); ( w = it.current() ); ++it ) {
579 if ( w->client() ->identity() == clientname && !w->isFullyObscured() ) 597 if ( w->client() ->identity() == clientname && !w->isFullyObscured() )
580 return TRUE; 598 return TRUE;
581 } 599 }
582#endif 600#endif
583 return FALSE; 601 return FALSE;
584} 602}
585 603
586void Desktop::raiseLauncher()
587{
588 Config cfg( "qpe" ); //F12 'Home'
589 cfg.setGroup( "AppsKey" );
590 QString tempItem;
591 tempItem = cfg.readEntry( "Middle", "Home" );
592 if ( tempItem == "Home" || tempItem.isEmpty() ) {
593 home ( );
594 }
595 else {
596 QCopEnvelope e( "QPE/System", "execute(QString)" );
597 e << tempItem;
598 }
599}
600
601void Desktop::home ( )
602{
603 if ( isVisibleWindow( launcher->winId() ) )
604 launcher->nextView();
605 else
606 launcher->raise();
607}
608 604
609void Desktop::executeOrModify( const QString& appLnkFile ) 605void Desktop::executeOrModify( const QString& appLnkFile )
610{ 606{
611 AppLnk lnk( MimeType::appsFolderName() + "/" + appLnkFile ); 607 AppLnk lnk( MimeType::appsFolderName() + "/" + appLnkFile );
612 if ( lnk.isValid() ) { 608 if ( lnk.isValid() ) {
613 QCString app = lnk.exec().utf8(); 609 QCString app = lnk.exec().utf8();
614 Global::terminateBuiltin( "calibrate" ); 610 Global::terminateBuiltin( "calibrate" );
615 if ( QCopChannel::isRegistered( "QPE/Application/" + app ) ) { 611 if ( QCopChannel::isRegistered( "QPE/Application/" + app ) ) {
616 // MRUList::addTask( &lnk ); 612 // MRUList::addTask( &lnk );
617 if ( hasVisibleWindow( app ) ) 613 if ( hasVisibleWindow( app ) )
618 QCopChannel::send( "QPE/Application/" + app, "nextView()" ); 614 QCopChannel::send( "QPE/Application/" + app, "nextView()" );
619 else 615 else
620 QCopChannel::send( "QPE/Application/" + app, "raise()" ); 616 QCopChannel::send( "QPE/Application/" + app, "raise()" );
621 } 617 }
622 else { 618 else {
623 lnk.execute(); 619 lnk.execute();
624 } 620 }
625 } 621 }
626}
627
628void Desktop::raiseDatebook()
629{
630 Config cfg( "qpe" ); //F9 'Activity'
631 cfg.setGroup( "AppsKey" );
632 QString tempItem;
633 tempItem = cfg.readEntry( "LeftEnd" , "Calendar" );
634 if ( tempItem == "Calendar" || tempItem.isEmpty() ) {
635 tempItem = "datebook";
636 }
637 QCopEnvelope e( "QPE/System", "execute(QString)" );
638 e << tempItem;
639}
640
641void Desktop::raiseContacts()
642{
643 Config cfg( "qpe" ); //F10, 'Contacts'
644 cfg.setGroup( "AppsKey" );
645 QString tempItem;
646 tempItem = cfg.readEntry( "Left2nd", "Address Book" );
647 if ( tempItem == "Address Book" || tempItem.isEmpty() ) {
648 tempItem = "addressbook";
649 }
650 QCopEnvelope e( "QPE/System", "execute(QString)" );
651 e << tempItem;
652}
653
654void Desktop::raiseMenu()
655{
656 Config cfg( "qpe" ); //F11, 'Menu
657 cfg.setGroup( "AppsKey" );
658 QString tempItem;
659 tempItem = cfg.readEntry( "Right2nd" , "Popup Menu" );
660 if ( tempItem == "Popup Menu" || tempItem.isEmpty() ) {
661 Global::terminateBuiltin( "calibrate" );
662 tb->startMenu() ->launch();
663 }
664 else {
665 QCopEnvelope e( "QPE/System", "execute(QString)" );
666 e << tempItem;
667 }
668}
669
670void Desktop::raiseEmail()
671{
672 Config cfg( "qpe" ); //F13, 'Mail' // only in zaurus, on ipaq mail key is F11
673 cfg.setGroup( "AppsKey" );
674 QString tempItem;
675 tempItem = cfg.readEntry( "RightEnd", "Mail" );
676 if ( tempItem == "Mail" || tempItem == "qtmail" || tempItem.isEmpty() ) {
677 tempItem = "mail";
678 }
679 QCopEnvelope e( "QPE/System", "execute(QString)" );
680 e << tempItem;
681} 622}
682 623
683// autoStarts apps on resume and start 624// autoStarts apps on resume and start
684void Desktop::execAutoStart() 625void Desktop::execAutoStart()
685{ 626{
686 QString appName; 627 QString appName;
687 int delay; 628 int delay;
688 QDateTime now = QDateTime::currentDateTime(); 629 QDateTime now = QDateTime::currentDateTime();
689 Config cfg( "autostart" ); 630 Config cfg( "autostart" );
690 cfg.setGroup( "AutoStart" ); 631 cfg.setGroup( "AutoStart" );
691 appName = cfg.readEntry( "Apps", "" ); 632 appName = cfg.readEntry( "Apps", "" );
692 delay = ( cfg.readEntry( "Delay", "0" ) ).toInt(); 633 delay = ( cfg.readEntry( "Delay", "0" ) ).toInt();
693 // If the time between suspend and resume was longer then the 634 // If the time between suspend and resume was longer then the
694 // value saved as delay, start the app 635 // value saved as delay, start the app
695 if ( suspendTime.secsTo( now ) >= ( delay * 60 ) && !appName.isEmpty() ) { 636 if ( suspendTime.secsTo( now ) >= ( delay * 60 ) && !appName.isEmpty() ) {
696 QCopEnvelope e( "QPE/System", "execute(QString)" ); 637 QCopEnvelope e( "QPE/System", "execute(QString)" );
697 e << QString( appName ); 638 e << QString( appName );
698 } 639 }
699} 640}
700 641
701#if defined(QPE_HAVE_TOGGLELIGHT) 642#if defined(QPE_HAVE_TOGGLELIGHT)
702#include <qpe/config.h> 643#include <qpe/config.h>
703 644
704#include <sys/ioctl.h> 645#include <sys/ioctl.h>
705#include <sys/types.h> 646#include <sys/types.h>
706#include <fcntl.h> 647#include <fcntl.h>
707#include <unistd.h> 648#include <unistd.h>
708#include <errno.h> 649#include <errno.h>
709#include <linux/ioctl.h> 650#include <linux/ioctl.h>
710#include <time.h> 651#include <time.h>
711#endif 652#endif
712 653
713 654
714void Desktop::togglePower() 655void Desktop::togglePower()
715{ 656{
716 static bool excllock = false; 657 static bool excllock = false;
717 658
718 qDebug ( "togglePower (locked == %d)", excllock ? 1 : 0 ); 659 qDebug ( "togglePower (locked == %d)", excllock ? 1 : 0 );
719 660
720 if ( excllock ) 661 if ( excllock )
721 return; 662 return ;
722 663
723 excllock = true; 664 excllock = true;
724 665
725 bool wasloggedin = loggedin; 666 bool wasloggedin = loggedin;
726 loggedin = 0; 667 loggedin = 0;
727 suspendTime = QDateTime::currentDateTime(); 668 suspendTime = QDateTime::currentDateTime();
728 669
729#ifdef QWS 670#ifdef QWS
730 if ( Password::needToAuthenticate ( true ) && qt_screen ) { 671
731 // Should use a big black window instead. 672 if ( Password::needToAuthenticate ( true ) && qt_screen ) {
732 // But this would not show up fast enough 673 // Should use a big black window instead.
733 QGfx *g = qt_screen-> screenGfx ( ); 674 // But this would not show up fast enough
734 g-> fillRect ( 0, 0, qt_screen-> width ( ), qt_screen-> height ( )); 675 QGfx *g = qt_screen-> screenGfx ( );
735 delete g; 676 g-> fillRect ( 0, 0, qt_screen-> width ( ), qt_screen-> height ( ));
736 } 677 delete g;
678 }
737#endif 679#endif
738 680
739 ODevice::inst ( )-> suspend ( ); 681 ODevice::inst ( )-> suspend ( );
740 682
741 DesktopApplication::switchLCD ( true ); // force LCD on without slow qcop call 683 DesktopApplication::switchLCD ( true ); // force LCD on without slow qcop call
742 QWSServer::screenSaverActivate ( false ); 684 QWSServer::screenSaverActivate ( false );
743 685
744 { 686 {
745 QCopEnvelope( "QPE/Card", "mtabChanged()" ); // might have changed while asleep 687 QCopEnvelope( "QPE/Card", "mtabChanged()" ); // might have changed while asleep
746 } 688 }
747 689
748 if ( wasloggedin ) 690 if ( wasloggedin )
749 login ( true ); 691 login ( true );
750 692
751 execAutoStart(); 693 execAutoStart();
752 //qcopBridge->closeOpenConnections(); 694 //qcopBridge->closeOpenConnections();
753 695
754 excllock = false; 696 excllock = false;
755} 697}
756 698
757void Desktop::toggleLight() 699void Desktop::toggleLight()
758{ 700{
759 QCopEnvelope e( "QPE/System", "setBacklight(int)" ); 701 QCopEnvelope e( "QPE/System", "setBacklight(int)" );
760 e << -2; // toggle 702 e << -2; // toggle
761} 703}
762 704
763void Desktop::toggleSymbolInput() 705void Desktop::toggleSymbolInput()
764{ 706{
765 tb->toggleSymbolInput(); 707 tb->toggleSymbolInput();
766} 708}
767 709
768void Desktop::toggleNumLockState() 710void Desktop::toggleNumLockState()
769{ 711{
770 tb->toggleNumLockState(); 712 tb->toggleNumLockState();
771} 713}
772 714
773void Desktop::toggleCapsLockState() 715void Desktop::toggleCapsLockState()
774{ 716{
775 tb->toggleCapsLockState(); 717 tb->toggleCapsLockState();
776} 718}
777 719
778void Desktop::styleChange( QStyle &s ) 720void Desktop::styleChange( QStyle &s )
779{ 721{
780 QWidget::styleChange( s ); 722 QWidget::styleChange( s );
781 int displayw = qApp->desktop() ->width(); 723 int displayw = qApp->desktop() ->width();
782 int displayh = qApp->desktop() ->height(); 724 int displayh = qApp->desktop() ->height();
783 725
784 QSize sz = tb->sizeHint(); 726 QSize sz = tb->sizeHint();
785 727
786 tb->setGeometry( 0, displayh - sz.height(), displayw, sz.height() ); 728 tb->setGeometry( 0, displayh - sz.height(), displayw, sz.height() );
787} 729}
788 730
789void DesktopApplication::shutdown() 731void DesktopApplication::shutdown()
790{ 732{
791 if ( type() != GuiServer ) 733 if ( type() != GuiServer )
792 return ; 734 return ;
793 ShutdownImpl *sd = new ShutdownImpl( 0, 0, WDestructiveClose ); 735 ShutdownImpl *sd = new ShutdownImpl( 0, 0, WDestructiveClose );
794 connect( sd, SIGNAL( shutdown( ShutdownImpl::Type ) ), 736 connect( sd, SIGNAL( shutdown( ShutdownImpl::Type ) ),
795 this, SLOT( shutdown( ShutdownImpl::Type ) ) ); 737 this, SLOT( shutdown( ShutdownImpl::Type ) ) );
796 sd->showMaximized(); 738 sd->showMaximized();
797} 739}
798 740
799void DesktopApplication::shutdown( ShutdownImpl::Type t ) 741void DesktopApplication::shutdown( ShutdownImpl::Type t )
800{ 742{
801 switch ( t ) { 743 switch ( t ) {
802 case ShutdownImpl::ShutdownSystem: 744 case ShutdownImpl::ShutdownSystem:
803 execlp( "shutdown", "shutdown", "-h", "now", ( void* ) 0 ); 745 execlp( "shutdown", "shutdown", "-h", "now", ( void* ) 0 );
804 break; 746 break;
805 case ShutdownImpl::RebootSystem: 747 case ShutdownImpl::RebootSystem:
806 execlp( "shutdown", "shutdown", "-r", "now", ( void* ) 0 ); 748 execlp( "shutdown", "shutdown", "-r", "now", ( void* ) 0 );
807 break; 749 break;
808 case ShutdownImpl::RestartDesktop: 750 case ShutdownImpl::RestartDesktop:
809 restart(); 751 restart();
810 break; 752 break;
811 case ShutdownImpl::TerminateDesktop: 753 case ShutdownImpl::TerminateDesktop:
812 prepareForTermination( FALSE ); 754 prepareForTermination( FALSE );
813 755
814 // This is a workaround for a Qt bug 756 // This is a workaround for a Qt bug
815 // clipboard applet has to stop its poll timer, or Qt/E 757 // clipboard applet has to stop its poll timer, or Qt/E
816 // will hang on quit() right before it emits aboutToQuit() 758 // will hang on quit() right before it emits aboutToQuit()
817 emit aboutToQuit ( ); 759 emit aboutToQuit ( );
818 760
819 quit(); 761 quit();
820 break; 762 break;
821 } 763 }
822} 764}
823 765
824void DesktopApplication::restart() 766void DesktopApplication::restart()
825{ 767{
826 prepareForTermination( TRUE ); 768 prepareForTermination( TRUE );
827 769
828#ifdef Q_WS_QWS 770#ifdef Q_WS_QWS
829 771
830 for ( int fd = 3; fd < 100; fd++ ) 772 for ( int fd = 3; fd < 100; fd++ )
831 close( fd ); 773 close( fd );
832#if defined(QT_DEMO_SINGLE_FLOPPY) 774#if defined(QT_DEMO_SINGLE_FLOPPY)
833 775
834 execl( "/sbin/init", "qpe", 0 ); 776 execl( "/sbin/init", "qpe", 0 );
835#elif defined(QT_QWS_CASSIOPEIA) 777#elif defined(QT_QWS_CASSIOPEIA)
836 778
837 execl( "/bin/sh", "sh", 0 ); 779 execl( "/bin/sh", "sh", 0 );
838#else 780#else
839 781
840 execl( ( qpeDir() + "/bin/qpe" ).latin1(), "qpe", 0 ); 782 execl( ( qpeDir() + "/bin/qpe" ).latin1(), "qpe", 0 );
841#endif 783#endif
842 784
843 exit( 1 ); 785 exit( 1 );
844#endif 786#endif
845} 787}
846 788
847void Desktop::startTransferServer() 789void Desktop::startTransferServer()
848{ 790{
849 // start qcop bridge server 791 // start qcop bridge server
850 qcopBridge = new QCopBridge( 4243 ); 792 qcopBridge = new QCopBridge( 4243 );
851 if ( !qcopBridge->ok() ) { 793 if ( !qcopBridge->ok() ) {
852 delete qcopBridge; 794 delete qcopBridge;
853 qcopBridge = 0; 795 qcopBridge = 0;
854 } 796 }
855 // start transfer server 797 // start transfer server
856 transferServer = new TransferServer( 4242 ); 798 transferServer = new TransferServer( 4242 );
857 if ( !transferServer->ok() ) { 799 if ( !transferServer->ok() ) {
858 delete transferServer; 800 delete transferServer;
859 transferServer = 0; 801 transferServer = 0;
860 } 802 }
861 if ( !transferServer || !qcopBridge ) 803 if ( !transferServer || !qcopBridge )
862 startTimer( 2000 ); 804 startTimer( 2000 );
863} 805}
864 806
865void Desktop::timerEvent( QTimerEvent *e ) 807void Desktop::timerEvent( QTimerEvent *e )
866{ 808{
867 killTimer( e->timerId() ); 809 killTimer( e->timerId() );
868 startTransferServer(); 810 startTransferServer();
869} 811}
870 812
871void Desktop::terminateServers() 813void Desktop::terminateServers()
872{ 814{
873 delete transferServer; 815 delete transferServer;
874 delete qcopBridge; 816 delete qcopBridge;
875 transferServer = 0; 817 transferServer = 0;
876 qcopBridge = 0; 818 qcopBridge = 0;
877} 819}
878 820
879void Desktop::rereadVolumes() 821void DesktopApplication::rereadVolumes()
880{ 822{
881 Config cfg( "qpe" ); 823 Config cfg( "qpe" );
882 cfg.setGroup( "Volume" ); 824 cfg. setGroup ( "Volume" );
883 touchclick = cfg.readBoolEntry( "TouchSound" ); 825
884 keyclick = cfg.readBoolEntry( "KeySound" ); 826 m_screentap_sound = cfg. readBoolEntry ( "TouchSound" );
885 alarmsound = cfg.readBoolEntry( "AlarmSound" ); 827 m_keyclick_sound = cfg. readBoolEntry ( "KeySound" );
886} 828 m_alarm_sound = cfg. readBoolEntry ( "AlarmSound" );
887
888void Desktop::keyClick()
889{
890 if ( keyclick )
891 ODevice::inst ( ) -> keySound ( );
892} 829}
893 830
894void Desktop::screenClick() 831void DesktopApplication::soundAlarm()
895{ 832{
896 if ( touchclick ) 833 if ( me ( )-> m_alarm_sound )
897 ODevice::inst ( ) -> touchSound ( ); 834 ODevice::inst ( )-> alarmSound ( );
898} 835}
899 836
900void Desktop::soundAlarm() 837DesktopApplication *DesktopApplication::me ( )
901{ 838{
902 if ( qpedesktop-> alarmsound ) 839 return (DesktopApplication *) qApp;
903 ODevice::inst ( ) -> alarmSound ( );
904} 840}
905 841
diff --git a/core/launcher/desktop.h b/core/launcher/desktop.h
index 1f8daa0..6cb7ab2 100644
--- a/core/launcher/desktop.h
+++ b/core/launcher/desktop.h
@@ -1,152 +1,155 @@
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#ifndef __DESKTOP_H__ 21#ifndef __DESKTOP_H__
22#define __DESKTOP_H__ 22#define __DESKTOP_H__
23 23
24 24
25#include "shutdownimpl.h" 25#include "shutdownimpl.h"
26 26
27#include <qpe/qpeapplication.h> 27#include <qpe/qpeapplication.h>
28#include <opie/odevicebutton.h>
28 29
29#include <qwidget.h> 30#include <qwidget.h>
30#include <qdatetime.h> 31#include <qdatetime.h>
31 32
32class Background; 33class Background;
33class Launcher; 34class Launcher;
34class TaskBar; 35class TaskBar;
35class PowerStatus; 36class PowerStatus;
36class QCopBridge; 37class QCopBridge;
37class TransferServer; 38class TransferServer;
38class DesktopPowerAlerter; 39class DesktopPowerAlerter;
39class PackageSlave; 40class PackageSlave;
40class OpieScreenSaver; 41class OpieScreenSaver;
41 42
42class DesktopApplication : public QPEApplication 43class DesktopApplication : public QPEApplication
43{ 44{
44 Q_OBJECT 45 Q_OBJECT
45public: 46public:
46 DesktopApplication( int& argc, char **argv, Type t ); 47 DesktopApplication( int& argc, char **argv, Type t );
47 ~DesktopApplication(); 48 ~DesktopApplication();
49
50 static void switchLCD ( bool on ); // only for togglePower in Desktop
48 51
49 static void switchLCD ( bool on ); // only for togglePower in Desktop 52 static void soundAlarm(); // only because QCop soundAlarm() is defined in QPE/TaskBar
50 53
51signals: 54signals:
52 void menu(); 55 void menu();
53 void home(); 56 void home();
54 void datebook(); 57 void launch();
55 void contacts(); 58 void backlight();
56 void launch(); 59 void power();
57 void email(); 60 void symbol();
58 void backlight(); 61 void numLockStateToggle();
59 void power(); 62 void capsLockStateToggle();
60 void symbol(); 63 void prepareForRestart();
61 void numLockStateToggle();
62 void capsLockStateToggle();
63 void prepareForRestart();
64 64
65protected: 65protected:
66#ifdef Q_WS_QWS 66#ifdef Q_WS_QWS
67 67
68 bool qwsEventFilter( QWSEvent * ); 68 bool qwsEventFilter( QWSEvent * );
69#endif 69#endif
70 70
71 void shutdown(); 71 void shutdown();
72 void restart(); 72 void restart();
73 73
74public slots: 74public slots:
75 virtual void desktopMessage ( const QCString &msg, const QByteArray &data ); 75 virtual void systemMessage ( const QCString &msg, const QByteArray &data );
76 virtual void systemMessage ( const QCString &msg, const QByteArray &data ); 76 virtual void launcherMessage ( const QCString &msg, const QByteArray &data );
77 void rereadVolumes();
77 78
78protected slots: 79protected slots:
79 void shutdown( ShutdownImpl::Type ); 80 void shutdown ( ShutdownImpl::Type );
80 void apmTimeout(); 81 void apmTimeout ( );
81 void sendCard(); 82 void sendHeldAction ( );
83
84protected:
85 virtual bool eventFilter ( QObject *o, QEvent *e );
86 void checkButtonAction ( const Opie::ODeviceButton *db, int keycode, bool press, bool autoRepeat );
87
88private:
89 static DesktopApplication *me ( );
90
82private: 91private:
83 void reloadPowerWarnSettings(); 92 void reloadPowerWarnSettings();
84 DesktopPowerAlerter *pa; 93 DesktopPowerAlerter *pa;
85 PowerStatus *m_ps, *m_ps_last; 94 PowerStatus *m_ps, *m_ps_last;
86 QTimer *cardSendTimer; 95 QTimer *cardSendTimer;
87 QCopChannel *channel; 96 QCopChannel *channel;
88 OpieScreenSaver *m_screensaver; 97 OpieScreenSaver *m_screensaver;
89 QTimer * m_timer; 98 QTimer * m_timer;
90 int m_powerVeryLow; 99 int m_powerVeryLow;
91 int m_powerCritical; 100 int m_powerCritical;
92 int m_currentPowerLevel; 101 int m_currentPowerLevel;
102
103 const Opie::ODeviceButton *m_last_button;
104 QTimer *m_button_timer;
105
106 bool m_keyclick_sound : 1;
107 bool m_screentap_sound : 1;
108 bool m_alarm_sound : 1;
93}; 109};
94 110
95 111
96class Desktop : public QWidget 112class Desktop : public QWidget
97{ 113{
98 Q_OBJECT 114 Q_OBJECT
99public: 115public:
100 Desktop(); 116 Desktop();
101 ~Desktop(); 117 ~Desktop();
102
103 static bool screenLocked();
104 118
105 void show(); 119 static bool screenLocked();
106 void checkMemory();
107 120
108 void keyClick(); 121 void show();
109 void screenClick(); 122 void checkMemory();
110 static void soundAlarm();
111 123
112public slots: 124public slots:
113 void raiseDatebook(); 125 void execAutoStart();
114 void raiseContacts(); 126 void togglePower();
115 void raiseMenu(); 127 void toggleLight();
116 void raiseLauncher(); 128 void toggleNumLockState();
117 void raiseEmail(); 129 void toggleCapsLockState();
118 void execAutoStart(); 130 void toggleSymbolInput();
119 void togglePower(); 131 void terminateServers();
120 void toggleLight();
121 void toggleNumLockState();
122 void toggleCapsLockState();
123 void toggleSymbolInput();
124 void terminateServers();
125 void rereadVolumes();
126
127 void home ( );
128 132
129protected: 133protected:
130 void executeOrModify( const QString& appLnkFile ); 134 void executeOrModify( const QString& appLnkFile );
131 void styleChange( QStyle & ); 135 void styleChange( QStyle & );
132 void timerEvent( QTimerEvent *e ); 136 void timerEvent( QTimerEvent *e );
133 137
134 QWidget *bg; 138 QWidget *bg;
135 Launcher *launcher; 139 Launcher *launcher;
136 TaskBar *tb; 140 TaskBar *tb;
137 141
138private: 142private:
139 void startTransferServer(); 143 void startTransferServer();
140 bool recoverMemory(); 144 bool recoverMemory();
141 145
142 QCopBridge *qcopBridge; 146 QCopBridge *qcopBridge;
143 TransferServer *transferServer; 147 TransferServer *transferServer;
144 PackageSlave *packageSlave; 148 PackageSlave *packageSlave;
145 149
146 QDateTime suspendTime; 150 QDateTime suspendTime;
147 bool keyclick, touchclick, alarmsound;
148}; 151};
149 152
150 153
151#endif // __DESKTOP_H__ 154#endif // __DESKTOP_H__
152 155
diff --git a/core/launcher/launcher.cpp b/core/launcher/launcher.cpp
index 767efb2..6764338 100644
--- a/core/launcher/launcher.cpp
+++ b/core/launcher/launcher.cpp
@@ -1121,128 +1121,135 @@ void Launcher::systemMessage( const QCString &msg, const QByteArray &data)
1121 QString kb; 1121 QString kb;
1122 stream >> kb; 1122 stream >> kb;
1123 setenv("QWS_KEYBOARD",kb.latin1(),1); 1123 setenv("QWS_KEYBOARD",kb.latin1(),1);
1124 qwsServer->openKeyboard(); 1124 qwsServer->openKeyboard();
1125#endif 1125#endif
1126 } 1126 }
1127} 1127}
1128 1128
1129void Launcher::cancelSync() 1129void Launcher::cancelSync()
1130{ 1130{
1131#ifndef QT_NO_COP 1131#ifndef QT_NO_COP
1132 QCopEnvelope e( "QPE/Desktop", "cancelSync()" ); 1132 QCopEnvelope e( "QPE/Desktop", "cancelSync()" );
1133#endif 1133#endif
1134} 1134}
1135 1135
1136void Launcher::launcherMessage( const QCString &msg, const QByteArray &data) 1136void Launcher::launcherMessage( const QCString &msg, const QByteArray &data)
1137{ 1137{
1138 QDataStream stream( data, IO_ReadOnly ); 1138 QDataStream stream( data, IO_ReadOnly );
1139 if ( msg == "setTabView(QString,int)" ) { 1139 if ( msg == "setTabView(QString,int)" ) {
1140 QString id; 1140 QString id;
1141 stream >> id; 1141 stream >> id;
1142 int mode; 1142 int mode;
1143 stream >> mode; 1143 stream >> mode;
1144 if ( tabs->view(id) ) 1144 if ( tabs->view(id) )
1145 tabs->view(id)->setViewMode( (LauncherView::ViewMode)mode ); 1145 tabs->view(id)->setViewMode( (LauncherView::ViewMode)mode );
1146 } else if ( msg == "setTabBackground(QString,int,QString)" ) { 1146 } else if ( msg == "setTabBackground(QString,int,QString)" ) {
1147 QString id; 1147 QString id;
1148 stream >> id; 1148 stream >> id;
1149 int mode; 1149 int mode;
1150 stream >> mode; 1150 stream >> mode;
1151 QString pixmapOrColor; 1151 QString pixmapOrColor;
1152 stream >> pixmapOrColor; 1152 stream >> pixmapOrColor;
1153 if ( tabs->view(id) ) 1153 if ( tabs->view(id) )
1154 tabs->view(id)->setBackgroundType( (LauncherView::BackgroundType)mode, pixmapOrColor ); 1154 tabs->view(id)->setBackgroundType( (LauncherView::BackgroundType)mode, pixmapOrColor );
1155 } else if ( msg == "setTextColor(QString,QString)" ) { 1155 } else if ( msg == "setTextColor(QString,QString)" ) {
1156 QString id; 1156 QString id;
1157 stream >> id; 1157 stream >> id;
1158 QString color; 1158 QString color;
1159 stream >> color; 1159 stream >> color;
1160 if ( tabs->view(id) ) 1160 if ( tabs->view(id) )
1161 tabs->view(id)->setTextColor( QColor(color) ); 1161 tabs->view(id)->setTextColor( QColor(color) );
1162 } else if ( msg == "setFont(QString,QString,int,int,int)" ) { 1162 } else if ( msg == "setFont(QString,QString,int,int,int)" ) {
1163 QString id; 1163 QString id;
1164 stream >> id; 1164 stream >> id;
1165 QString fam; 1165 QString fam;
1166 stream >> fam; 1166 stream >> fam;
1167 int size; 1167 int size;
1168 stream >> size; 1168 stream >> size;
1169 int weight; 1169 int weight;
1170 stream >> weight; 1170 stream >> weight;
1171 int italic; 1171 int italic;
1172 stream >> italic; 1172 stream >> italic;
1173 if ( tabs->view(id) ) 1173 if ( tabs->view(id) )
1174 if ( !fam. isEmpty ( )) 1174 if ( !fam. isEmpty ( ))
1175 tabs->view(id)->setViewFont( QFont(fam, size, weight, italic!=0) ); 1175 tabs->view(id)->setViewFont( QFont(fam, size, weight, italic!=0) );
1176 else 1176 else
1177 tabs->view(id)->unsetViewFont(); 1177 tabs->view(id)->unsetViewFont();
1178 qDebug( "setFont: %s, %d, %d, %d", fam.latin1(), size, weight, italic ); 1178 qDebug( "setFont: %s, %d, %d, %d", fam.latin1(), size, weight, italic );
1179 } 1179 }
1180 else if ( msg == "setBusyIndicatorType(QString)" ) { 1180 else if ( msg == "setBusyIndicatorType(QString)" ) {
1181 QString type; 1181 QString type;
1182 stream >> type; 1182 stream >> type;
1183 tabs->setBusyIndicatorType(type); 1183 tabs->setBusyIndicatorType(type);
1184 } 1184 }
1185 else if ( msg == "home()" ) {
1186 if ( isVisibleWindow( winId ( )))
1187 nextView ( );
1188 else
1189 raise ( );
1190
1191 }
1185} 1192}
1186 1193
1187void Launcher::storageChanged() 1194void Launcher::storageChanged()
1188{ 1195{
1189 if ( in_lnk_props ) { 1196 if ( in_lnk_props ) {
1190 got_lnk_change = TRUE; 1197 got_lnk_change = TRUE;
1191 lnk_change = QString::null; 1198 lnk_change = QString::null;
1192 } else { 1199 } else {
1193 updateLink( QString::null ); 1200 updateLink( QString::null );
1194 } 1201 }
1195} 1202}
1196 1203
1197 1204
1198bool Launcher::mkdir(const QString &localPath) 1205bool Launcher::mkdir(const QString &localPath)
1199{ 1206{
1200 QDir fullDir(localPath); 1207 QDir fullDir(localPath);
1201 if (fullDir.exists()) 1208 if (fullDir.exists())
1202 return true; 1209 return true;
1203 1210
1204 // at this point the directory doesn't exist 1211 // at this point the directory doesn't exist
1205 // go through the directory tree and start creating the direcotories 1212 // go through the directory tree and start creating the direcotories
1206 // that don't exist; if we can't create the directories, return false 1213 // that don't exist; if we can't create the directories, return false
1207 1214
1208 QString dirSeps = "/"; 1215 QString dirSeps = "/";
1209 int dirIndex = localPath.find(dirSeps); 1216 int dirIndex = localPath.find(dirSeps);
1210 QString checkedPath; 1217 QString checkedPath;
1211 1218
1212 // didn't find any seps; weird, use the cur dir instead 1219 // didn't find any seps; weird, use the cur dir instead
1213 if (dirIndex == -1) { 1220 if (dirIndex == -1) {
1214 //qDebug("No seperators found in path %s", localPath.latin1()); 1221 //qDebug("No seperators found in path %s", localPath.latin1());
1215 checkedPath = QDir::currentDirPath(); 1222 checkedPath = QDir::currentDirPath();
1216 } 1223 }
1217 1224
1218 while (checkedPath != localPath) { 1225 while (checkedPath != localPath) {
1219 // no more seperators found, use the local path 1226 // no more seperators found, use the local path
1220 if (dirIndex == -1) 1227 if (dirIndex == -1)
1221 checkedPath = localPath; 1228 checkedPath = localPath;
1222 else { 1229 else {
1223 // the next directory to check 1230 // the next directory to check
1224 checkedPath = localPath.left(dirIndex) + "/"; 1231 checkedPath = localPath.left(dirIndex) + "/";
1225 // advance the iterator; the next dir seperator 1232 // advance the iterator; the next dir seperator
1226 dirIndex = localPath.find(dirSeps, dirIndex+1); 1233 dirIndex = localPath.find(dirSeps, dirIndex+1);
1227 } 1234 }
1228 1235
1229 QDir checkDir(checkedPath); 1236 QDir checkDir(checkedPath);
1230 if (!checkDir.exists()) { 1237 if (!checkDir.exists()) {
1231 //qDebug("mkdir making dir %s", checkedPath.latin1()); 1238 //qDebug("mkdir making dir %s", checkedPath.latin1());
1232 1239
1233 if (!checkDir.mkdir(checkedPath)) { 1240 if (!checkDir.mkdir(checkedPath)) {
1234 qDebug("Unable to make directory %s", checkedPath.latin1()); 1241 qDebug("Unable to make directory %s", checkedPath.latin1());
1235 return FALSE; 1242 return FALSE;
1236 } 1243 }
1237 } 1244 }
1238 1245
1239 } 1246 }
1240 return TRUE; 1247 return TRUE;
1241} 1248}
1242 1249
1243void Launcher::preloadApps() 1250void Launcher::preloadApps()
1244{ 1251{
1245 Config cfg("Launcher"); 1252 Config cfg("Launcher");
1246 cfg.setGroup("Preload"); 1253 cfg.setGroup("Preload");
1247 QStringList apps = cfg.readListEntry("Apps",','); 1254 QStringList apps = cfg.readListEntry("Apps",',');
1248 for (QStringList::ConstIterator it=apps.begin(); it!=apps.end(); ++it) { 1255 for (QStringList::ConstIterator it=apps.begin(); it!=apps.end(); ++it) {
diff --git a/core/launcher/main.cpp b/core/launcher/main.cpp
index 8b91f5d..49b41d6 100644
--- a/core/launcher/main.cpp
+++ b/core/launcher/main.cpp
@@ -31,133 +31,128 @@
31 31
32#include <opie/odevice.h> 32#include <opie/odevice.h>
33 33
34#include <qmessagebox.h> 34#include <qmessagebox.h>
35#include <qfile.h> 35#include <qfile.h>
36#include <qimage.h> 36#include <qimage.h>
37#include <qwindowsystem_qws.h> 37#include <qwindowsystem_qws.h>
38#include <qpe/qcopenvelope_qws.h> 38#include <qpe/qcopenvelope_qws.h>
39#include <qpe/alarmserver.h> 39#include <qpe/alarmserver.h>
40 40
41#include <stdlib.h> 41#include <stdlib.h>
42#include <stdio.h> 42#include <stdio.h>
43#include <signal.h> 43#include <signal.h>
44#include <unistd.h> 44#include <unistd.h>
45 45
46#if defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX) 46#if defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX)
47#include "../calibrate/calibrate.h" 47#include "../calibrate/calibrate.h"
48#endif 48#endif
49 49
50using namespace Opie; 50using namespace Opie;
51 51
52void initEnvironment() 52void initEnvironment()
53{ 53{
54 Config config("locale"); 54 Config config("locale");
55 config.setGroup( "Location" ); 55 config.setGroup( "Location" );
56 QString tz = config.readEntry( "Timezone", getenv("TZ") ); 56 QString tz = config.readEntry( "Timezone", getenv("TZ") );
57 57
58 // if not timezone set, pick New York 58 // if not timezone set, pick New York
59 if (tz.isNull()) 59 if (tz.isNull())
60 tz = "America/New_York"; 60 tz = "America/New_York";
61 61
62 setenv( "TZ", tz, 1 ); 62 setenv( "TZ", tz, 1 );
63 config.writeEntry( "Timezone", tz); 63 config.writeEntry( "Timezone", tz);
64 64
65 config.setGroup( "Language" ); 65 config.setGroup( "Language" );
66 QString lang = config.readEntry( "Language", getenv("LANG") ); 66 QString lang = config.readEntry( "Language", getenv("LANG") );
67 if ( !lang.isNull() ) 67 if ( !lang.isNull() )
68 setenv( "LANG", lang, 1 ); 68 setenv( "LANG", lang, 1 );
69} 69}
70 70
71 71
72int initApplication( int argc, char ** argv ) 72int initApplication( int argc, char ** argv )
73{ 73{
74 initEnvironment(); 74 initEnvironment();
75 75
76#if !defined(QT_QWS_CASSIOPEIA) && !defined(QT_QWS_IPAQ) && !defined(QT_QWS_EBX) 76#if !defined(QT_QWS_CASSIOPEIA) && !defined(QT_QWS_IPAQ) && !defined(QT_QWS_EBX)
77 setenv( "QWS_SIZE", "240x320", 0 ); 77 setenv( "QWS_SIZE", "240x320", 0 );
78#endif 78#endif
79 79
80 //Don't flicker at startup: 80 //Don't flicker at startup:
81 QWSServer::setDesktopBackground( QImage() ); 81 QWSServer::setDesktopBackground( QImage() );
82 DesktopApplication a( argc, argv, QApplication::GuiServer ); 82 DesktopApplication a( argc, argv, QApplication::GuiServer );
83 83
84 ODevice::inst ( )-> setSoftSuspend ( true ); 84 ODevice::inst ( )-> setSoftSuspend ( true );
85 85
86 { // init backlight 86 { // init backlight
87 QCopEnvelope e("QPE/System", "setBacklight(int)" ); 87 QCopEnvelope e("QPE/System", "setBacklight(int)" );
88 e << -3; // Forced on 88 e << -3; // Forced on
89 } 89 }
90 90
91 AlarmServer::initialize(); 91 AlarmServer::initialize();
92 92
93 Desktop *d = new Desktop(); 93 Desktop *d = new Desktop();
94 94
95 QObject::connect( &a, SIGNAL(menu()), d, SLOT(raiseMenu()) );
96 QObject::connect( &a, SIGNAL(datebook()), d, SLOT(raiseDatebook()) );
97 QObject::connect( &a, SIGNAL(contacts()), d, SLOT(raiseContacts()) );
98 QObject::connect( &a, SIGNAL(launch()), d, SLOT(raiseLauncher()) );
99 QObject::connect( &a, SIGNAL(email()), d, SLOT(raiseEmail()) );
100 QObject::connect( &a, SIGNAL(power()), d, SLOT(togglePower()) ); 95 QObject::connect( &a, SIGNAL(power()), d, SLOT(togglePower()) );
101 QObject::connect( &a, SIGNAL(backlight()), d, SLOT(toggleLight()) ); 96 QObject::connect( &a, SIGNAL(backlight()), d, SLOT(toggleLight()) );
102 QObject::connect( &a, SIGNAL(symbol()), d, SLOT(toggleSymbolInput()) ); 97 QObject::connect( &a, SIGNAL(symbol()), d, SLOT(toggleSymbolInput()) );
103 QObject::connect( &a, SIGNAL(numLockStateToggle()), d, SLOT(toggleNumLockState()) ); 98 QObject::connect( &a, SIGNAL(numLockStateToggle()), d, SLOT(toggleNumLockState()) );
104 QObject::connect( &a, SIGNAL(capsLockStateToggle()), d, SLOT(toggleCapsLockState()) ); 99 QObject::connect( &a, SIGNAL(capsLockStateToggle()), d, SLOT(toggleCapsLockState()) );
105 QObject::connect( &a, SIGNAL(prepareForRestart()), d, SLOT(terminateServers()) ); 100 QObject::connect( &a, SIGNAL(prepareForRestart()), d, SLOT(terminateServers()) );
106 101
107 (void)new SysFileMonitor(d); 102 (void)new SysFileMonitor(d);
108 Network::createServer(d); 103 Network::createServer(d);
109 104
110#if defined(QT_QWS_CASSIOPEIA) || defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX) 105#if defined(QT_QWS_CASSIOPEIA) || defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX)
111 if ( !QFile::exists( "/etc/pointercal" ) ) { 106 if ( !QFile::exists( "/etc/pointercal" ) ) {
112 // Make sure calibration widget starts on top. 107 // Make sure calibration widget starts on top.
113 Calibrate *cal = new Calibrate; 108 Calibrate *cal = new Calibrate;
114 cal->exec(); 109 cal->exec();
115 delete cal; 110 delete cal;
116 } 111 }
117#endif 112#endif
118 113
119 d->show(); 114 d->show();
120 115
121 if ( QDate::currentDate ( ). year ( ) < 2000 ) { 116 if ( QDate::currentDate ( ). year ( ) < 2000 ) {
122 if ( QMessageBox::information ( 0, DesktopApplication::tr( "Information" ), DesktopApplication::tr( "<p>The system date doesn't seem to be valid.\n(%1)</p><p>Do you want to correct the clock ?</p>" ). arg( TimeString::dateString ( QDate::currentDate ( ))), QMessageBox::Yes, QMessageBox::No ) == QMessageBox::Yes ) { 117 if ( QMessageBox::information ( 0, DesktopApplication::tr( "Information" ), DesktopApplication::tr( "<p>The system date doesn't seem to be valid.\n(%1)</p><p>Do you want to correct the clock ?</p>" ). arg( TimeString::dateString ( QDate::currentDate ( ))), QMessageBox::Yes, QMessageBox::No ) == QMessageBox::Yes ) {
123 QCopEnvelope e ( "QPE/Application/systemtime", "setDocument(QString)" ); 118 QCopEnvelope e ( "QPE/Application/systemtime", "setDocument(QString)" );
124 e << QString ( ); 119 e << QString ( );
125 } 120 }
126 } 121 }
127 122
128 int rv = a.exec(); 123 int rv = a.exec();
129 124
130 delete d; 125 delete d;
131 126
132 ODevice::inst ( )-> setSoftSuspend ( false ); 127 ODevice::inst ( )-> setSoftSuspend ( false );
133 128
134 return rv; 129 return rv;
135} 130}
136 131
137static const char *pidfile_path = "/var/run/opie.pid"; 132static const char *pidfile_path = "/var/run/opie.pid";
138 133
139void create_pidfile ( ) 134void create_pidfile ( )
140{ 135{
141 FILE *f; 136 FILE *f;
142 137
143 if (( f = ::fopen ( pidfile_path, "w" ))) { 138 if (( f = ::fopen ( pidfile_path, "w" ))) {
144 ::fprintf ( f, "%d", getpid ( )); 139 ::fprintf ( f, "%d", getpid ( ));
145 ::fclose ( f ); 140 ::fclose ( f );
146 } 141 }
147} 142}
148 143
149void remove_pidfile ( ) 144void remove_pidfile ( )
150{ 145{
151 ::unlink ( pidfile_path ); 146 ::unlink ( pidfile_path );
152} 147}
153 148
154void handle_sigterm ( int /* sig */ ) 149void handle_sigterm ( int /* sig */ )
155{ 150{
156 if ( qApp ) 151 if ( qApp )
157 qApp-> quit ( ); 152 qApp-> quit ( );
158} 153}
159 154
160int main( int argc, char ** argv ) 155int main( int argc, char ** argv )
161{ 156{
162 ::signal ( SIGCHLD, SIG_IGN ); 157 ::signal ( SIGCHLD, SIG_IGN );
163 158
diff --git a/core/launcher/opie-taskbar.control b/core/launcher/opie-taskbar.control
index 13e5715..8bf2113 100644
--- a/core/launcher/opie-taskbar.control
+++ b/core/launcher/opie-taskbar.control
@@ -1,9 +1,9 @@
1Files: bin/qpe apps/Settings/Calibrate.desktop pics/launcher plugins/applets/libsuspendapplet.so* plugins/applets/libhomeapplet.so* plugins/applets/liblogoutapplet.so* 1Files: bin/qpe apps/Settings/Calibrate.desktop pics/launcher pics/devicebuttons/*.png plugins/applets/libsuspendapplet.so* plugins/applets/libhomeapplet.so* plugins/applets/liblogoutapplet.so*
2Priority: required 2Priority: required
3Section: opie/system 3Section: opie/system
4Maintainer: Project Opie <opie@handhelds.org> 4Maintainer: Project Opie <opie@handhelds.org>
5Architecture: arm 5Architecture: arm
6Version: $QPE_VERSION-$SUB_VERSION.1 6Version: $QPE_VERSION-$SUB_VERSION.1
7Depends: qt-embedded (>=$QTE_VERSION) 7Depends: qt-embedded (>=$QTE_VERSION)
8Description: Launcher for Opie 8Description: Launcher for Opie
9 The "finder" or "explorer", or whatever you want to call it. 9 The "finder" or "explorer", or whatever you want to call it.
diff --git a/core/launcher/runningappbar.cpp b/core/launcher/runningappbar.cpp
index 3ac66f2..356200b 100644
--- a/core/launcher/runningappbar.cpp
+++ b/core/launcher/runningappbar.cpp
@@ -63,137 +63,128 @@ RunningAppBar::RunningAppBar(QWidget* parent)
63RunningAppBar::~RunningAppBar() 63RunningAppBar::~RunningAppBar()
64{} 64{}
65 65
66void RunningAppBar::newQcopChannel(const QString& channelName) 66void RunningAppBar::newQcopChannel(const QString& channelName)
67{ 67{
68 QString prefix("QPE/Application/"); 68 QString prefix("QPE/Application/");
69 if (channelName.startsWith(prefix)) { 69 if (channelName.startsWith(prefix)) {
70 QString appName = channelName.mid(prefix.length()); 70 QString appName = channelName.mid(prefix.length());
71 // qDebug("App %s just connected!", appName.latin1()); 71 // qDebug("App %s just connected!", appName.latin1());
72 const AppLnk* newGuy = m_AppLnkSet->findExec(appName); 72 const AppLnk* newGuy = m_AppLnkSet->findExec(appName);
73 if (newGuy && !newGuy->isPreloaded()) { 73 if (newGuy && !newGuy->isPreloaded()) {
74 addTask(*newGuy); 74 addTask(*newGuy);
75 } 75 }
76 } 76 }
77} 77}
78 78
79void RunningAppBar::removedQcopChannel(const QString& channelName) 79void RunningAppBar::removedQcopChannel(const QString& channelName)
80{ 80{
81 QString prefix("QPE/Application/"); 81 QString prefix("QPE/Application/");
82 if (channelName.startsWith(prefix)) { 82 if (channelName.startsWith(prefix)) {
83 QString appName = channelName.mid(prefix.length()); 83 QString appName = channelName.mid(prefix.length());
84 qDebug("App %s just disconnected!", appName.latin1()); 84 qDebug("App %s just disconnected!", appName.latin1());
85 const AppLnk* newGuy = m_AppLnkSet->findExec(appName); 85 const AppLnk* newGuy = m_AppLnkSet->findExec(appName);
86 if (newGuy) { 86 if (newGuy) {
87 removeTask(*newGuy); 87 removeTask(*newGuy);
88 } 88 }
89 } 89 }
90} 90}
91 91
92void RunningAppBar::received(const QCString& msg, const QByteArray& data) 92void RunningAppBar::received(const QCString& msg, const QByteArray& data)
93{ 93{
94 // Since fast apps appear and disappear without disconnecting from their 94 // Since fast apps appear and disappear without disconnecting from their
95 // channel we need to watch for the showing/hiding events and update according. 95 // channel we need to watch for the showing/hiding events and update according.
96 QDataStream stream( data, IO_ReadOnly ); 96 QDataStream stream( data, IO_ReadOnly );
97 if ( msg == "fastAppShowing(QString)") { 97 if ( msg == "fastAppShowing(QString)") {
98 QString appName; 98 QString appName;
99 stream >> appName; 99 stream >> appName;
100 addTask(*m_AppLnkSet->findExec(appName)); 100 addTask(*m_AppLnkSet->findExec(appName));
101 } 101 }
102 else if ( msg == "fastAppHiding(QString)") { 102 else if ( msg == "fastAppHiding(QString)") {
103 QString appName; 103 QString appName;
104 stream >> appName; 104 stream >> appName;
105 removeTask(*m_AppLnkSet->findExec(appName)); 105 removeTask(*m_AppLnkSet->findExec(appName));
106 } 106 }
107} 107}
108 108
109void RunningAppBar::addTask(const AppLnk& appLnk) 109void RunningAppBar::addTask(const AppLnk& appLnk)
110{ 110{
111 // qDebug("Added %s to app list.", appLnk.name().latin1()); 111 // qDebug("Added %s to app list.", appLnk.name().latin1());
112 AppLnk* newApp = new AppLnk(appLnk); 112 AppLnk* newApp = new AppLnk(appLnk);
113 newApp->setExec(appLnk.exec()); 113 newApp->setExec(appLnk.exec());
114 m_AppList.prepend(newApp); 114 m_AppList.prepend(newApp);
115 update(); 115 update();
116} 116}
117 117
118void RunningAppBar::removeTask(const AppLnk& appLnk) 118void RunningAppBar::removeTask(const AppLnk& appLnk)
119{ 119{
120 unsigned int i = 0; 120 unsigned int i = 0;
121 for (; i < m_AppList.count() ; i++) { 121 for (; i < m_AppList.count() ; i++) {
122 AppLnk* target = m_AppList.at(i); 122 AppLnk* target = m_AppList.at(i);
123 if (target->exec() == appLnk.exec()) { 123 if (target->exec() == appLnk.exec()) {
124 qDebug("Removing %s from app list.", appLnk.name().latin1()); 124 qDebug("Removing %s from app list.", appLnk.name().latin1());
125 m_AppList.remove(); 125 m_AppList.remove();
126 126
127 // grab the keyboard back, in case the app crashed/forgot
128
129 QPEApplication *qpeapp = (QPEApplication *) qApp;
130
131 if ( appLnk.exec() == qpeapp-> keyboardGrabbedBy ( )) {
132 qDebug ( "grabbing keyboard back from %s", appLnk.name().latin1());
133 qpeapp-> grabKeyboard ( );
134 }
135
136 delete target; 127 delete target;
137 } 128 }
138 } 129 }
139 update(); 130 update();
140} 131}
141 132
142void RunningAppBar::mousePressEvent(QMouseEvent *e) 133void RunningAppBar::mousePressEvent(QMouseEvent *e)
143{ 134{
144 // Find out if the user is clicking on an app icon... 135 // Find out if the user is clicking on an app icon...
145 // If so, snag the index so when we repaint we show it 136 // If so, snag the index so when we repaint we show it
146 // as highlighed. 137 // as highlighed.
147 m_SelectedAppIndex = 0; 138 m_SelectedAppIndex = 0;
148 int x = 0; 139 int x = 0;
149 QListIterator<AppLnk> it( m_AppList ); 140 QListIterator<AppLnk> it( m_AppList );
150 for ( ; it.current(); ++it, ++m_SelectedAppIndex, x += spacing ) { 141 for ( ; it.current(); ++it, ++m_SelectedAppIndex, x += spacing ) {
151 if ( x + spacing <= width() ) { 142 if ( x + spacing <= width() ) {
152 if ( e->x() >= x && e->x() < x + spacing ) { 143 if ( e->x() >= x && e->x() < x + spacing ) {
153 if ( m_SelectedAppIndex < (int)m_AppList.count() ) { 144 if ( m_SelectedAppIndex < (int)m_AppList.count() ) {
154 repaint(FALSE); 145 repaint(FALSE);
155 return ; 146 return ;
156 } 147 }
157 } 148 }
158 } 149 }
159 else { 150 else {
160 break; 151 break;
161 } 152 }
162 } 153 }
163 m_SelectedAppIndex = -1; 154 m_SelectedAppIndex = -1;
164 repaint( FALSE ); 155 repaint( FALSE );
165} 156}
166 157
167void RunningAppBar::mouseReleaseEvent(QMouseEvent *e) 158void RunningAppBar::mouseReleaseEvent(QMouseEvent *e)
168{ 159{
169 if (e->button() == QMouseEvent::RightButton) { 160 if (e->button() == QMouseEvent::RightButton) {
170 return ; 161 return ;
171 } 162 }
172 if ( m_SelectedAppIndex >= 0 ) { 163 if ( m_SelectedAppIndex >= 0 ) {
173 QString channel = QString("QPE/Application/") + m_AppList.at(m_SelectedAppIndex)->exec(); 164 QString channel = QString("QPE/Application/") + m_AppList.at(m_SelectedAppIndex)->exec();
174 if (QCopChannel::isRegistered(channel.latin1())) { 165 if (QCopChannel::isRegistered(channel.latin1())) {
175 // qDebug("%s is running!", m_AppList.at(m_SelectedAppIndex)->exec().latin1()); 166 // qDebug("%s is running!", m_AppList.at(m_SelectedAppIndex)->exec().latin1());
176 QCopEnvelope e(channel.latin1(), "raise()"); 167 QCopEnvelope e(channel.latin1(), "raise()");
177 // This class will delete itself after hearing from the app or the timer expiring 168 // This class will delete itself after hearing from the app or the timer expiring
178 (void)new AppMonitor(*m_AppList.at(m_SelectedAppIndex), *this); 169 (void)new AppMonitor(*m_AppList.at(m_SelectedAppIndex), *this);
179 } 170 }
180 else { 171 else {
181 removeTask(*m_AppList.at(m_SelectedAppIndex)); 172 removeTask(*m_AppList.at(m_SelectedAppIndex));
182 } 173 }
183 174
184 m_SelectedAppIndex = -1; 175 m_SelectedAppIndex = -1;
185 update(); 176 update();
186 } 177 }
187} 178}
188 179
189void RunningAppBar::paintEvent( QPaintEvent * ) 180void RunningAppBar::paintEvent( QPaintEvent * )
190{ 181{
191 QPainter p( this ); 182 QPainter p( this );
192 AppLnk *curApp; 183 AppLnk *curApp;
193 int x = 0; 184 int x = 0;
194 int y = (height() - AppLnk::smallIconSize()) / 2; 185 int y = (height() - AppLnk::smallIconSize()) / 2;
195 int i = 0; 186 int i = 0;
196 187
197 //p.fillRect( 0, 0, width(), height(), colorGroup().background() ); 188 //p.fillRect( 0, 0, width(), height(), colorGroup().background() );
198 189
199 QListIterator<AppLnk> it(m_AppList); 190 QListIterator<AppLnk> it(m_AppList);
diff --git a/core/launcher/startmenu.cpp b/core/launcher/startmenu.cpp
index 88c6219..39e07c8 100644
--- a/core/launcher/startmenu.cpp
+++ b/core/launcher/startmenu.cpp
@@ -180,140 +180,141 @@ bool StartMenu::loadMenu( AppLnkSet *folder, QPopupMenu *menu )
180 menu-> removeItem ( sepId ); 180 menu-> removeItem ( sepId );
181 sepId = ( menu-> count ( )) ? menu-> insertSeparator ( 0 ) : 0; 181 sepId = ( menu-> count ( )) ? menu-> insertSeparator ( 0 ) : 0;
182 182
183 if ( ltabs || lot ) { 183 if ( ltabs || lot ) {
184 QDict<QPopupMenu> typpop; 184 QDict<QPopupMenu> typpop;
185 QStringList typs = folder->types(); 185 QStringList typs = folder->types();
186 for (QStringList::Iterator tit=typs.fromLast(); ; --tit) { 186 for (QStringList::Iterator tit=typs.fromLast(); ; --tit) {
187 if ( !(*tit).isEmpty() ) { 187 if ( !(*tit).isEmpty() ) {
188 QPopupMenu *new_menu; 188 QPopupMenu *new_menu;
189 if ( ltabs ) { 189 if ( ltabs ) {
190 new_menu = new StartPopupMenu( menu ); 190 new_menu = new StartPopupMenu( menu );
191 connect( new_menu, SIGNAL(activated(int)), SLOT(itemSelected(int)) ); 191 connect( new_menu, SIGNAL(activated(int)), SLOT(itemSelected(int)) );
192 int id = menu->insertItem( folder->typePixmap(*tit), folder->typeName(*tit), new_menu, -1, 0 ); 192 int id = menu->insertItem( folder->typePixmap(*tit), folder->typeName(*tit), new_menu, -1, 0 );
193 tabdict. insert ( id, new_menu ); 193 tabdict. insert ( id, new_menu );
194 } else { 194 } else {
195 new_menu = (QPopupMenu*)1; 195 new_menu = (QPopupMenu*)1;
196 } 196 }
197 typpop.insert(*tit, new_menu); 197 typpop.insert(*tit, new_menu);
198 } 198 }
199 if ( tit == typs. begin ( )) 199 if ( tit == typs. begin ( ))
200 break; 200 break;
201 } 201 }
202 QListIterator<AppLnk> it( folder->children() ); 202 QListIterator<AppLnk> it( folder->children() );
203 bool f=TRUE; 203 bool f=TRUE;
204 for ( ; it.current(); ++it ) { 204 for ( ; it.current(); ++it ) {
205 AppLnk *app = it.current(); 205 AppLnk *app = it.current();
206 if ( app->type() == "Separator" ) { // No tr 206 if ( app->type() == "Separator" ) { // No tr
207 if ( lot ) { 207 if ( lot ) {
208 menu->insertSeparator(); 208 menu->insertSeparator();
209 } 209 }
210 } else { 210 } else {
211 f = FALSE; 211 f = FALSE;
212 QString t = app->type(); 212 QString t = app->type();
213 QPopupMenu* pmenu = typpop.find(t); 213 QPopupMenu* pmenu = typpop.find(t);
214 if ( ltabs ) { 214 if ( ltabs ) {
215 if ( !pmenu && lot ) 215 if ( !pmenu && lot )
216 pmenu = menu; 216 pmenu = menu;
217 } else { 217 } else {
218 if ( !pmenu ) 218 if ( !pmenu )
219 pmenu = menu; 219 pmenu = menu;
220 else 220 else
221 pmenu = 0; 221 pmenu = 0;
222 } 222 }
223 if ( pmenu ) { 223 if ( pmenu ) {
224 QString t = app->name(); 224 QString t = app->name();
225 t.replace(QRegExp("&"),"&&"); // escape shortcut character 225 t.replace(QRegExp("&"),"&&"); // escape shortcut character
226 pmenu->insertItem( app->pixmap(), t, app->id() ); 226 pmenu->insertItem( app->pixmap(), t, app->id() );
227 } 227 }
228 result=TRUE; 228 result=TRUE;
229 } 229 }
230 } 230 }
231 } 231 }
232 232
233 if ( sepId && ( menu-> idAt ( 0 ) == sepId )) { // no tabs entries 233 if ( sepId && ( menu-> idAt ( 0 ) == sepId )) { // no tabs entries
234 menu-> removeItem ( sepId ); 234 menu-> removeItem ( sepId );
235 sepId = 0; 235 sepId = 0;
236 } 236 }
237 if ( !menu-> count ( )) // if we don't do this QPopupMenu will insert a dummy Separator, which won't go away later 237 if ( !menu-> count ( )) // if we don't do this QPopupMenu will insert a dummy Separator, which won't go away later
238 sepId = menu-> insertSeparator ( ); 238 sepId = menu-> insertSeparator ( );
239 239
240 return result; 240 return result;
241} 241}
242 242
243 243
244void StartMenu::launch() 244void StartMenu::launch ( )
245{ 245{
246 int y = mapToGlobal( QPoint() ).y() - launchMenu->sizeHint().height(); 246 int y = mapToGlobal ( QPoint ( )). y ( ) - launchMenu-> sizeHint ( ). height ( );
247 247
248 if ( launchMenu->isVisible() ) 248 if ( launchMenu-> isVisible ( )) {
249 launchMenu->hide(); 249 launchMenu-> hide ( );
250 }
250 else { 251 else {
251 QWidget *active = qApp->activeWindow(); 252 QWidget *active = qApp-> activeWindow ( );
252 if ( active && active->isPopup() ) 253 if ( active && active-> isPopup ( ))
253 active->close(); 254 active-> close ( );
254 255
255 launchMenu->popup( QPoint( 1, y ) ); 256 launchMenu-> popup ( QPoint ( 1, y ));
256 } 257 }
257} 258}
258 259
259const AppLnk* StartMenu::execToLink(const QString& appname) 260const AppLnk* StartMenu::execToLink(const QString& appname)
260{ 261{
261 const AppLnk* a = apps->findExec( appname ); 262 const AppLnk* a = apps->findExec( appname );
262 return a; 263 return a;
263} 264}
264 265
265void StartPopupMenu::keyPressEvent( QKeyEvent *e ) 266void StartPopupMenu::keyPressEvent( QKeyEvent *e )
266{ 267{
267 if ( e->key() == Key_F33 || e->key() == Key_Space ) { 268 if ( e->key() == Key_F33 || e->key() == Key_Space ) {
268 // "OK" button, little hacky 269 // "OK" button, little hacky
269 QKeyEvent ke(QEvent::KeyPress, Key_Enter, 13, 0); 270 QKeyEvent ke(QEvent::KeyPress, Key_Enter, 13, 0);
270 QPopupMenu::keyPressEvent( &ke ); 271 QPopupMenu::keyPressEvent( &ke );
271 } else { 272 } else {
272 QPopupMenu::keyPressEvent( e ); 273 QPopupMenu::keyPressEvent( e );
273 } 274 }
274} 275}
275 276
276static int compareAppletPositions(const void *a, const void *b) 277static int compareAppletPositions(const void *a, const void *b)
277{ 278{
278 const MenuApplet* aa = *(const MenuApplet**)a; 279 const MenuApplet* aa = *(const MenuApplet**)a;
279 const MenuApplet* ab = *(const MenuApplet**)b; 280 const MenuApplet* ab = *(const MenuApplet**)b;
280 int d = aa->iface->position() - ab->iface->position(); 281 int d = aa->iface->position() - ab->iface->position();
281 if ( d ) return d; 282 if ( d ) return d;
282 return QString::compare(aa->library->library(),ab->library->library()); 283 return QString::compare(aa->library->library(),ab->library->library());
283} 284}
284 285
285void StartMenu::clearApplets() 286void StartMenu::clearApplets()
286{ 287{
287 launchMenu-> hide(); 288 launchMenu-> hide();
288 289
289 for ( QIntDictIterator<MenuApplet> it ( applets ); it. current ( ); ++it ) { 290 for ( QIntDictIterator<MenuApplet> it ( applets ); it. current ( ); ++it ) {
290 MenuApplet *applet = it. current ( ); 291 MenuApplet *applet = it. current ( );
291 if ( launchMenu ) { 292 if ( launchMenu ) {
292 launchMenu-> removeItem ( applet-> id ); 293 launchMenu-> removeItem ( applet-> id );
293 delete applet-> popup; 294 delete applet-> popup;
294 } 295 }
295 296
296 applet-> iface-> release(); 297 applet-> iface-> release();
297 applet-> library-> unload(); 298 applet-> library-> unload();
298 delete applet-> library; 299 delete applet-> library;
299 } 300 }
300 applets.clear(); 301 applets.clear();
301} 302}
302 303
303 304
304 305
305void StartMenu::loadApplets() 306void StartMenu::loadApplets()
306{ 307{
307 Config cfg( "StartMenu" ); 308 Config cfg( "StartMenu" );
308 cfg.setGroup( "Applets" ); 309 cfg.setGroup( "Applets" );
309 310
310 // SafeMode causes too much problems, so we disable it for now -- 311 // SafeMode causes too much problems, so we disable it for now --
311 // maybe we should reenable it for OPIE 1.0 - sandman 26.09.02 312 // maybe we should reenable it for OPIE 1.0 - sandman 26.09.02
312 313
313 bool safe = false; //cfg.readBoolEntry("SafeMode",FALSE); 314 bool safe = false; //cfg.readBoolEntry("SafeMode",FALSE);
314 if ( safe && !safety_tid ) 315 if ( safe && !safety_tid )
315 return; 316 return;
316 cfg.writeEntry("SafeMode",TRUE); 317 cfg.writeEntry("SafeMode",TRUE);
317 cfg.write(); 318 cfg.write();
318 QStringList exclude = cfg.readListEntry( "ExcludeApplets", ',' ); 319 QStringList exclude = cfg.readListEntry( "ExcludeApplets", ',' );
319 320
diff --git a/core/launcher/taskbar.cpp b/core/launcher/taskbar.cpp
index b4b7df6..77035a3 100644
--- a/core/launcher/taskbar.cpp
+++ b/core/launcher/taskbar.cpp
@@ -219,116 +219,126 @@ void TaskBar::stopWait(const QString& /*app*/)
219 waitIcon->setWaiting( false ); 219 waitIcon->setWaiting( false );
220} 220}
221 221
222void TaskBar::stopWait() 222void TaskBar::stopWait()
223{ 223{
224 waitTimer->stop(); 224 waitTimer->stop();
225 225
226 waitIcon->setWaiting( false ); 226 waitIcon->setWaiting( false );
227} 227}
228 228
229void TaskBar::resizeEvent( QResizeEvent *e ) 229void TaskBar::resizeEvent( QResizeEvent *e )
230{ 230{
231 QHBox::resizeEvent( e ); 231 QHBox::resizeEvent( e );
232 calcMaxWindowRect(); 232 calcMaxWindowRect();
233} 233}
234 234
235void TaskBar::styleChange( QStyle &s ) 235void TaskBar::styleChange( QStyle &s )
236{ 236{
237 QHBox::styleChange( s ); 237 QHBox::styleChange( s );
238 calcMaxWindowRect(); 238 calcMaxWindowRect();
239} 239}
240 240
241void TaskBar::calcMaxWindowRect() 241void TaskBar::calcMaxWindowRect()
242{ 242{
243#ifdef Q_WS_QWS 243#ifdef Q_WS_QWS
244 QRect wr; 244 QRect wr;
245 int displayWidth = qApp->desktop()->width(); 245 int displayWidth = qApp->desktop()->width();
246 QRect ir = inputMethods->inputRect(); 246 QRect ir = inputMethods->inputRect();
247 if ( ir.isValid() ) { 247 if ( ir.isValid() ) {
248 wr.setCoords( 0, 0, displayWidth-1, ir.top()-1 ); 248 wr.setCoords( 0, 0, displayWidth-1, ir.top()-1 );
249 } else { 249 } else {
250 wr.setCoords( 0, 0, displayWidth-1, y()-1 ); 250 wr.setCoords( 0, 0, displayWidth-1, y()-1 );
251 } 251 }
252 252
253#if QT_VERSION < 300 253#if QT_VERSION < 300
254 QWSServer::setMaxWindowRect( qt_screen->mapToDevice(wr, 254 QWSServer::setMaxWindowRect( qt_screen->mapToDevice(wr,
255 QSize(qt_screen->width(),qt_screen->height())) 255 QSize(qt_screen->width(),qt_screen->height()))
256 ); 256 );
257#else 257#else
258 QWSServer::setMaxWindowRect( wr ); 258 QWSServer::setMaxWindowRect( wr );
259#endif 259#endif
260#endif 260#endif
261} 261}
262 262
263void TaskBar::receive( const QCString &msg, const QByteArray &data ) 263void TaskBar::receive( const QCString &msg, const QByteArray &data )
264{ 264{
265 QDataStream stream( data, IO_ReadOnly ); 265 QDataStream stream( data, IO_ReadOnly );
266 if ( msg == "message(QString)" ) { 266 if ( msg == "message(QString)" ) {
267 QString text; 267 QString text;
268 stream >> text; 268 stream >> text;
269 setStatusMessage( text ); 269 setStatusMessage( text );
270 } else if ( msg == "hideInputMethod()" ) { 270 } else if ( msg == "hideInputMethod()" ) {
271 inputMethods->hideInputMethod(); 271 inputMethods->hideInputMethod();
272 } else if ( msg == "showInputMethod()" ) { 272 } else if ( msg == "showInputMethod()" ) {
273 inputMethods->showInputMethod(); 273 inputMethods->showInputMethod();
274 } else if ( msg == "reloadInputMethods()" ) { 274 } else if ( msg == "reloadInputMethods()" ) {
275 inputMethods->loadInputMethods(); 275 inputMethods->loadInputMethods();
276 } else if ( msg == "reloadApps()" ) { 276 } else if ( msg == "reloadApps()" ) {
277 sm->reloadApps(); 277 sm->reloadApps();
278 } else if ( msg == "reloadApplets()" ) { 278 } else if ( msg == "reloadApplets()" ) {
279 sysTray->clearApplets(); 279 sysTray->clearApplets();
280 sysTray->addApplets(); 280 sysTray->addApplets();
281 sm->reloadApplets(); 281 sm->reloadApplets();
282 } else if ( msg == "soundAlarm()" ) { 282 } else if ( msg == "soundAlarm()" ) {
283 Desktop::soundAlarm(); 283 DesktopApplication::soundAlarm ( );
284 } 284 }
285 else if ( msg == "setLed(int,bool)" ) { 285 else if ( msg == "setLed(int,bool)" ) {
286 int led, status; 286 int led, status;
287 stream >> led >> status; 287 stream >> led >> status;
288 288
289 QValueList <OLed> ll = ODevice::inst ( )-> ledList ( ); 289 QValueList <OLed> ll = ODevice::inst ( )-> ledList ( );
290 if ( ll. count ( )){ 290 if ( ll. count ( )){
291 OLed l = ll. contains ( Led_Mail ) ? Led_Mail : ll [0]; 291 OLed l = ll. contains ( Led_Mail ) ? Led_Mail : ll [0];
292 bool canblink = ODevice::inst ( )-> ledStateList ( l ). contains ( Led_BlinkSlow ); 292 bool canblink = ODevice::inst ( )-> ledStateList ( l ). contains ( Led_BlinkSlow );
293 293
294 ODevice::inst ( )-> setLedState ( l, status ? ( canblink ? Led_BlinkSlow : Led_On ) : Led_Off ); 294 ODevice::inst ( )-> setLedState ( l, status ? ( canblink ? Led_BlinkSlow : Led_On ) : Led_Off );
295 } 295 }
296 } 296 }
297 else if ( msg == "toggleMenu()" ) {
298 if ( sm-> launchMenu-> isVisible ( ))
299 sm-> launch ( );
300 else {
301 QCopEnvelope e ( "QPE/System", "toggleApplicationMenu()" );
302 }
303 }
304 else if ( msg == "toggleStartMenu()" ) {
305 sm-> launch ( );
306 }
297} 307}
298 308
299QWidget *TaskBar::calibrate(bool) 309QWidget *TaskBar::calibrate(bool)
300{ 310{
301#ifdef Q_WS_QWS 311#ifdef Q_WS_QWS
302 Calibrate *c = new Calibrate; 312 Calibrate *c = new Calibrate;
303 c->show(); 313 c->show();
304 return c; 314 return c;
305#else 315#else
306 return 0; 316 return 0;
307#endif 317#endif
308} 318}
309 319
310void TaskBar::toggleNumLockState() 320void TaskBar::toggleNumLockState()
311{ 321{
312 if ( lockState ) lockState->toggleNumLockState(); 322 if ( lockState ) lockState->toggleNumLockState();
313} 323}
314 324
315void TaskBar::toggleCapsLockState() 325void TaskBar::toggleCapsLockState()
316{ 326{
317 if ( lockState ) lockState->toggleCapsLockState(); 327 if ( lockState ) lockState->toggleCapsLockState();
318} 328}
319 329
320void TaskBar::toggleSymbolInput() 330void TaskBar::toggleSymbolInput()
321{ 331{
322 if ( inputMethods->currentShown() == "Unicode" ) { 332 if ( inputMethods->currentShown() == "Unicode" ) {
323 inputMethods->hideInputMethod(); 333 inputMethods->hideInputMethod();
324 } else { 334 } else {
325 inputMethods->showInputMethod("Unicode"); 335 inputMethods->showInputMethod("Unicode");
326 } 336 }
327} 337}
328 338
329bool TaskBar::recoverMemory() 339bool TaskBar::recoverMemory()
330{ 340{
331 //eturn mru->quitOldApps(); 341 //eturn mru->quitOldApps();
332 return true; 342 return true;
333} 343}
334 344