summaryrefslogtreecommitdiff
path: root/library/qpeapplication.cpp
Unidiff
Diffstat (limited to 'library/qpeapplication.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--library/qpeapplication.cpp40
1 files changed, 11 insertions, 29 deletions
diff --git a/library/qpeapplication.cpp b/library/qpeapplication.cpp
index 70ffec1..4dbfbd8 100644
--- a/library/qpeapplication.cpp
+++ b/library/qpeapplication.cpp
@@ -1,757 +1,739 @@
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** $Id$ 19** $Id$
20** 20**
21**********************************************************************/ 21**********************************************************************/
22#define QTOPIA_INTERNAL_LANGLIST
22#include <stdlib.h> 23#include <stdlib.h>
23#include <unistd.h> 24#include <unistd.h>
24#include <qfile.h> 25#include <qfile.h>
25#ifdef Q_WS_QWS 26#ifdef Q_WS_QWS
26#ifndef QT_NO_COP 27#ifndef QT_NO_COP
27#if QT_VERSION <= 231 28#if QT_VERSION <= 231
28#define private public 29#define private public
29#define sendLocally processEvent 30#define sendLocally processEvent
30#include "qcopenvelope_qws.h" 31#include "qcopenvelope_qws.h"
31#undef private 32#undef private
32#else 33#else
33#include "qcopenvelope_qws.h" 34#include "qcopenvelope_qws.h"
34#endif 35#endif
35#endif 36#endif
36#include <qwindowsystem_qws.h> 37#include <qwindowsystem_qws.h>
37#endif 38#endif
38#include <qtextstream.h> 39#include <qtextstream.h>
39#include <qpalette.h> 40#include <qpalette.h>
40#include <qbuffer.h> 41#include <qbuffer.h>
41#include <qptrdict.h> 42#include <qptrdict.h>
42#include <qregexp.h> 43#include <qregexp.h>
43#include <qdir.h> 44#include <qdir.h>
44#include <qlabel.h> 45#include <qlabel.h>
45#include <qdialog.h> 46#include <qdialog.h>
46#include <qdragobject.h> 47#include <qdragobject.h>
47#include <qevent.h> 48#include <qevent.h>
48#include <qtooltip.h> 49#include <qtooltip.h>
49#include <qsignal.h> 50#include <qsignal.h>
50#include "qpeapplication.h" 51#include "qpeapplication.h"
51#include "qpestyle.h" 52#include "qpestyle.h"
52#if QT_VERSION >= 300 53#if QT_VERSION >= 300
53#include <qstylefactory.h> 54#include <qstylefactory.h>
54#else 55#else
55#include <qplatinumstyle.h> 56#include <qplatinumstyle.h>
56#include <qwindowsstyle.h> 57#include <qwindowsstyle.h>
57#include <qmotifstyle.h> 58#include <qmotifstyle.h>
58#include <qmotifplusstyle.h> 59#include <qmotifplusstyle.h>
59#include "lightstyle.h" 60#include "lightstyle.h"
60#endif 61#endif
61#include "global.h" 62#include "global.h"
62#include "resource.h" 63#include "resource.h"
63#if QT_VERSION <= 230 && defined(QT_NO_CODECS) 64#if QT_VERSION <= 230 && defined(QT_NO_CODECS)
64#include "qutfcodec.h" 65#include "qutfcodec.h"
65#endif 66#endif
66#include "config.h" 67#include "config.h"
67#include "network.h" 68#include "network.h"
68#include "fontmanager.h" 69#include "fontmanager.h"
69#include "power.h" 70#include "power.h"
70#include "alarmserver.h" 71#include "alarmserver.h"
71#include "applnk.h" 72#include "applnk.h"
72#include "qpemenubar.h" 73#include "qpemenubar.h"
73 74
74#include <unistd.h> 75#include <unistd.h>
75#include <sys/file.h> 76#include <sys/file.h>
76#include <sys/ioctl.h> 77#include <sys/ioctl.h>
77#include <sys/soundcard.h> 78#include <sys/soundcard.h>
78 79
79// for setBacklight() 80// for setBacklight()
80#if defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX) 81#if defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX)
81#include <linux/fb.h> 82#include <linux/fb.h>
82#include <sys/types.h> 83#include <sys/types.h>
83#include <sys/stat.h> 84#include <sys/stat.h>
84#endif 85#endif
85#include <stdlib.h> 86#include <stdlib.h>
86 87
87 88
88class QPEApplicationData { 89class QPEApplicationData {
89public: 90public:
90 QPEApplicationData() : presstimer(0), presswidget(0), rightpressed(FALSE), 91 QPEApplicationData() : presstimer(0), presswidget(0), rightpressed(FALSE),
91 kbgrabber(0), kbregrab(FALSE), notbusysent(FALSE), preloaded(FALSE), 92 kbgrabber(0), kbregrab(FALSE), notbusysent(FALSE), preloaded(FALSE),
92 forceshow(FALSE), nomaximize(FALSE), qpe_main_widget(0), 93 forceshow(FALSE), nomaximize(FALSE), qpe_main_widget(0),
93 keep_running(TRUE) 94 keep_running(TRUE)
94 { 95 {
95 qcopq.setAutoDelete(TRUE); 96 qcopq.setAutoDelete(TRUE);
96 } 97 }
97 98
98 int presstimer; 99 int presstimer;
99 QWidget* presswidget; 100 QWidget* presswidget;
100 QPoint presspos; 101 QPoint presspos;
101 bool rightpressed; 102 bool rightpressed;
102 int kbgrabber; 103 int kbgrabber;
103 bool kbregrab; 104 bool kbregrab;
104 bool notbusysent; 105 bool notbusysent;
105 QString appName; 106 QString appName;
106 struct QCopRec { 107 struct QCopRec {
107 QCopRec(const QCString &ch, const QCString &msg, 108 QCopRec(const QCString &ch, const QCString &msg,
108 const QByteArray &d) : 109 const QByteArray &d) :
109 channel(ch), message(msg), data(d) { } 110 channel(ch), message(msg), data(d) { }
110 111
111 QCString channel; 112 QCString channel;
112 QCString message; 113 QCString message;
113 QByteArray data; 114 QByteArray data;
114 }; 115 };
115 bool preloaded; 116 bool preloaded;
116 bool forceshow; 117 bool forceshow;
117 bool nomaximize; 118 bool nomaximize;
118 QWidget* qpe_main_widget; 119 QWidget* qpe_main_widget;
119 bool keep_running; 120 bool keep_running;
120 QList<QCopRec> qcopq; 121 QList<QCopRec> qcopq;
121 122
122 void enqueueQCop(const QCString &ch, const QCString &msg, 123 void enqueueQCop(const QCString &ch, const QCString &msg,
123 const QByteArray &data) 124 const QByteArray &data)
124 { 125 {
125 qcopq.append(new QCopRec(ch,msg,data)); 126 qcopq.append(new QCopRec(ch,msg,data));
126 } 127 }
127 void sendQCopQ() 128 void sendQCopQ()
128 { 129 {
129 QCopRec* r; 130 QCopRec* r;
130 for (QListIterator<QCopRec> it(qcopq); (r=it.current()); ++it) 131 for (QListIterator<QCopRec> it(qcopq); (r=it.current()); ++it)
131 QCopChannel::sendLocally(r->channel,r->message,r->data); 132 QCopChannel::sendLocally(r->channel,r->message,r->data);
132 qcopq.clear(); 133 qcopq.clear();
133 } 134 }
134}; 135};
135 136
136class ResourceMimeFactory : public QMimeSourceFactory { 137class ResourceMimeFactory : public QMimeSourceFactory {
137public: 138public:
138 ResourceMimeFactory() 139 ResourceMimeFactory()
139 { 140 {
140 QStringList path; 141 setFilePath( Global::helpPath() );
141 QString lang = getenv("LANG");
142 if ( !lang.isEmpty() )
143 path += QPEApplication::qpeDir() + "/help/" + lang + "/html";
144 path += QPEApplication::qpeDir() + "/pics";
145 path += QPEApplication::qpeDir() + "/help/en/html";
146 path += QPEApplication::qpeDir() + "/docs";
147 QString dir = QDir::current().canonicalPath();
148 if ( dir == "/" )
149 dir += "/docs";
150 else {
151 path += dir + "/../pics";
152 dir += "/../docs";
153 path += dir;
154 }
155 setFilePath( path );
156 setExtensionType("html","text/html;charset=UTF-8"); 142 setExtensionType("html","text/html;charset=UTF-8");
157 } 143 }
158 144
159 const QMimeSource* data(const QString& abs_name) const 145 const QMimeSource* data(const QString& abs_name) const
160 { 146 {
161 const QMimeSource* r = QMimeSourceFactory::data(abs_name); 147 const QMimeSource* r = QMimeSourceFactory::data(abs_name);
162 if ( !r ) { 148 if ( !r ) {
163 int sl = abs_name.length(); 149 int sl = abs_name.length();
164 do { 150 do {
165 sl = abs_name.findRev('/',sl-1); 151 sl = abs_name.findRev('/',sl-1);
166 QString name = sl>=0 ? abs_name.mid(sl+1) : abs_name; 152 QString name = sl>=0 ? abs_name.mid(sl+1) : abs_name;
167 int dot = name.findRev('.'); 153 int dot = name.findRev('.');
168 if ( dot >= 0 ) 154 if ( dot >= 0 )
169 name = name.left(dot); 155 name = name.left(dot);
170 QImage img = Resource::loadImage(name); 156 QImage img = Resource::loadImage(name);
171 if ( !img.isNull() ) 157 if ( !img.isNull() )
172 r = new QImageDrag(img); 158 r = new QImageDrag(img);
173 } while (!r && sl>0); 159 } while (!r && sl>0);
174 } 160 }
175 return r; 161 return r;
176 } 162 }
177}; 163};
178 164
179static int muted=0; 165static int muted=0;
180 166
181static void setVolume(int t=0, int percent=-1) 167static void setVolume(int t=0, int percent=-1)
182{ 168{
183 switch (t) { 169 switch (t) {
184 case 0: { 170 case 0: {
185 Config cfg("Sound"); 171 Config cfg("Sound");
186 cfg.setGroup("System"); 172 cfg.setGroup("System");
187 if ( percent < 0 ) 173 if ( percent < 0 )
188 percent = cfg.readNumEntry("Volume",50); 174 percent = cfg.readNumEntry("Volume",50);
189 int fd = 0; 175 int fd = 0;
190 if ((fd = open("/dev/mixer", O_RDWR))>=0) { 176 if ((fd = open("/dev/mixer", O_RDWR))>=0) {
191 int vol = muted ? 0 : percent; 177 int vol = muted ? 0 : percent;
192 // set both channels to same volume 178 // set both channels to same volume
193 vol |= vol << 8; 179 vol |= vol << 8;
194 ioctl(fd, MIXER_WRITE(0), &vol); 180 ioctl(fd, MIXER_WRITE(0), &vol);
195 ::close(fd); 181 ::close(fd);
196 } 182 }
197 } break; 183 } break;
198 } 184 }
199} 185}
200 186
201int qpe_sysBrightnessSteps() 187int qpe_sysBrightnessSteps()
202{ 188{
203#if defined(QT_QWS_IPAQ) 189#if defined(QT_QWS_IPAQ)
204 return 255; 190 return 255;
205#elif defined(QT_QWS_EBX) 191#elif defined(QT_QWS_EBX)
206 return 4; 192 return 4;
207#else 193#else
208 return 255; // ? 194 return 255; // ?
209#endif 195#endif
210} 196}
211 197
212 198
213static int& hack(int& i) 199static int& hack(int& i)
214{ 200{
215#if QT_VERSION <= 230 && defined(QT_NO_CODECS) 201#if QT_VERSION <= 230 && defined(QT_NO_CODECS)
216 // These should be created, but aren't in Qt 2.3.0 202 // These should be created, but aren't in Qt 2.3.0
217 (void)new QUtf8Codec; 203 (void)new QUtf8Codec;
218 (void)new QUtf16Codec; 204 (void)new QUtf16Codec;
219#endif 205#endif
220 return i; 206 return i;
221} 207}
222 208
223static bool forced_off = FALSE; 209static bool forced_off = FALSE;
224static int curbl=-1; 210static int curbl=-1;
225 211
226static int backlight() 212static int backlight()
227{ 213{
228 if ( curbl == -1 ) { 214 if ( curbl == -1 ) {
229 // Read from config 215 // Read from config
230 Config config( "qpe" ); 216 Config config( "qpe" );
231 config.setGroup( "Screensaver" ); 217 config.setGroup( "Screensaver" );
232 curbl = config.readNumEntry("Brightness",255); 218 curbl = config.readNumEntry("Brightness",255);
233 } 219 }
234 return curbl; 220 return curbl;
235} 221}
236 222
237static void setBacklight(int bright) 223static void setBacklight(int bright)
238{ 224{
239 if ( bright == -3 ) { 225 if ( bright == -3 ) {
240 // Forced on 226 // Forced on
241 forced_off = FALSE; 227 forced_off = FALSE;
242 bright = -1; 228 bright = -1;
243 } 229 }
244 if ( forced_off && bright != -2 ) 230 if ( forced_off && bright != -2 )
245 return; 231 return;
246 if ( bright == -2 ) { 232 if ( bright == -2 ) {
247 // Toggle between off and on 233 // Toggle between off and on
248 bright = curbl ? 0 : -1; 234 bright = curbl ? 0 : -1;
249 forced_off = !bright; 235 forced_off = !bright;
250 } 236 }
251 if ( bright == -1 ) { 237 if ( bright == -1 ) {
252 // Read from config 238 // Read from config
253 Config config( "qpe" ); 239 Config config( "qpe" );
254 config.setGroup( "Screensaver" ); 240 config.setGroup( "Screensaver" );
255 bright = config.readNumEntry("Brightness",255); 241 bright = config.readNumEntry("Brightness",255);
256 } 242 }
257#if defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX) 243#if defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX)
258 if ( QFile::exists("/usr/bin/bl") ) { 244 if ( QFile::exists("/usr/bin/bl") ) {
259 QString cmd = "/usr/bin/bl 1 "; 245 QString cmd = "/usr/bin/bl 1 ";
260 cmd += bright<=0 ? "0 " : "1 "; 246 cmd += bright<=0 ? "0 " : "1 ";
261 cmd += QString::number(bright); 247 cmd += QString::number(bright);
262 system(cmd.latin1()); 248 system(cmd.latin1());
263#if defined(QT_QWS_EBX) 249#if defined(QT_QWS_EBX)
264 } else if ( QFile::exists("/dev/fl") ) { 250 } else if ( QFile::exists("/dev/fl") ) {
265#define FL_IOCTL_STEP_CONTRAST 100 251#define FL_IOCTL_STEP_CONTRAST 100
266 int fd = open("/dev/fl", O_WRONLY); 252 int fd = open("/dev/fl", O_WRONLY);
267 if (fd >= 0 ) { 253 if (fd >= 0 ) {
268 int steps = qpe_sysBrightnessSteps(); 254 int steps = qpe_sysBrightnessSteps();
269 int bl = ( bright * steps + 127 ) / 255; 255 int bl = ( bright * steps + 127 ) / 255;
270 if ( bright && !bl ) bl = 1; 256 if ( bright && !bl ) bl = 1;
271 bl = ioctl(fd, FL_IOCTL_STEP_CONTRAST, bl); 257 bl = ioctl(fd, FL_IOCTL_STEP_CONTRAST, bl);
272 close(fd); 258 close(fd);
273 } 259 }
274 } 260 }
275#elif defined(QT_QWS_IPAQ) 261#elif defined(QT_QWS_IPAQ)
276 } else if ( QFile::exists("/dev/ts") || QFile::exists("/dev/h3600_ts") ) { 262 } else if ( QFile::exists("/dev/ts") || QFile::exists("/dev/h3600_ts") ) {
277 typedef struct { 263 typedef struct {
278 unsigned char mode; 264 unsigned char mode;
279 unsigned char pwr; 265 unsigned char pwr;
280 unsigned char brightness; 266 unsigned char brightness;
281 } FLITE_IN; 267 } FLITE_IN;
282# ifndef FLITE_ON 268# ifndef FLITE_ON
283# ifndef _LINUX_IOCTL_H 269# ifndef _LINUX_IOCTL_H
284# include <linux/ioctl.h> 270# include <linux/ioctl.h>
285# endif 271# endif
286# define FLITE_ON _IOW('f', 7, FLITE_IN) 272# define FLITE_ON _IOW('f', 7, FLITE_IN)
287# endif 273# endif
288 int fd; 274 int fd;
289 if ( QFile::exists("/dev/ts") ) 275 if ( QFile::exists("/dev/ts") )
290 fd = open("/dev/ts", O_WRONLY); 276 fd = open("/dev/ts", O_WRONLY);
291 else 277 else
292 fd = open("/dev/h3600_ts", O_WRONLY); 278 fd = open("/dev/h3600_ts", O_WRONLY);
293 if (fd >= 0 ) { 279 if (fd >= 0 ) {
294 FLITE_IN bl; 280 FLITE_IN bl;
295 bl.mode = 1; 281 bl.mode = 1;
296 bl.pwr = bright ? 1 : 0; 282 bl.pwr = bright ? 1 : 0;
297 bl.brightness = bright; 283 bl.brightness = bright;
298 ioctl(fd, FLITE_ON, &bl); 284 ioctl(fd, FLITE_ON, &bl);
299 close(fd); 285 close(fd);
300 } 286 }
301 } 287 }
302#endif 288#endif
303#endif 289#endif
304 curbl = bright; 290 curbl = bright;
305} 291}
306 292
307void qpe_setBacklight(int bright) { setBacklight(bright); } 293void qpe_setBacklight(int bright) { setBacklight(bright); }
308 294
309static bool dim_on = FALSE; 295static bool dim_on = FALSE;
310static bool lightoff_on = FALSE; 296static bool lightoff_on = FALSE;
311static int disable_suspend = 100; 297static int disable_suspend = 100;
312 298
313static bool powerOnline() 299static bool powerOnline()
314{ 300{
315 return PowerStatusManager::readStatus().acStatus() == PowerStatus::Online; 301 return PowerStatusManager::readStatus().acStatus() == PowerStatus::Online;
316} 302}
317 303
318static bool networkOnline() 304static bool networkOnline()
319{ 305{
320 return Network::networkOnline(); 306 return Network::networkOnline();
321} 307}
322 308
323class QPEScreenSaver : public QWSScreenSaver 309class QPEScreenSaver : public QWSScreenSaver
324{ 310{
325 311
326public: 312public:
327 QPEScreenSaver() 313 QPEScreenSaver()
328 { 314 {
329 } 315 }
330 void restore() 316 void restore()
331 { 317 {
332 setBacklight(-1); 318 setBacklight(-1);
333 } 319 }
334 bool save(int level) 320 bool save(int level)
335 { 321 {
336 switch ( level ) { 322 switch ( level ) {
337 case 0: 323 case 0:
338 if ( disable_suspend > 0 && dim_on ) { 324 if ( disable_suspend > 0 && dim_on ) {
339 if (backlight() > 1) 325 if (backlight() > 1)
340 setBacklight(1); // lowest non-off 326 setBacklight(1); // lowest non-off
341 } 327 }
342 return TRUE; 328 return TRUE;
343 break; 329 break;
344 case 1: 330 case 1:
345 if ( disable_suspend > 1 && lightoff_on ) { 331 if ( disable_suspend > 1 && lightoff_on ) {
346 setBacklight(0); // off 332 setBacklight(0); // off
347 } 333 }
348 return TRUE; 334 return TRUE;
349 break; 335 break;
350 case 2: 336 case 2:
351 if ( disable_suspend > 2 && !powerOnline() && !networkOnline() ) { 337 if ( disable_suspend > 2 && !powerOnline() && !networkOnline() ) {
352 QWSServer::sendKeyEvent( 0xffff, Qt::Key_F34, FALSE, TRUE, FALSE ); 338 QWSServer::sendKeyEvent( 0xffff, Qt::Key_F34, FALSE, TRUE, FALSE );
353 return TRUE; 339 return TRUE;
354 } 340 }
355 break; 341 break;
356 } 342 }
357 return FALSE; 343 return FALSE;
358 } 344 }
359}; 345};
360 346
361static int ssi(int interval, Config &config, const QString &enable, const QString& value, int def) 347static int ssi(int interval, Config &config, const QString &enable, const QString& value, int def)
362{ 348{
363 if ( !enable.isEmpty() && config.readNumEntry(enable,0) == 0 ) 349 if ( !enable.isEmpty() && config.readNumEntry(enable,0) == 0 )
364 return 0; 350 return 0;
365 351
366 if ( interval < 0 ) { 352 if ( interval < 0 ) {
367 // Restore screen blanking and power saving state 353 // Restore screen blanking and power saving state
368 interval = config.readNumEntry( value, def ); 354 interval = config.readNumEntry( value, def );
369 } 355 }
370 return interval; 356 return interval;
371} 357}
372 358
373static void setScreenSaverIntervals(int i1, int i2, int i3) 359static void setScreenSaverIntervals(int i1, int i2, int i3)
374{ 360{
375 Config config( "qpe" ); 361 Config config( "qpe" );
376 config.setGroup( "Screensaver" ); 362 config.setGroup( "Screensaver" );
377 363
378 int v[4]; 364 int v[4];
379 i1 = ssi(i1, config, "Dim","Interval_Dim", 30); 365 i1 = ssi(i1, config, "Dim","Interval_Dim", 30);
380 i2 = ssi(i2, config, "LightOff","Interval_LightOff", 20); 366 i2 = ssi(i2, config, "LightOff","Interval_LightOff", 20);
381 i3 = ssi(i3, config, "","Interval", 60); 367 i3 = ssi(i3, config, "","Interval", 60);
382 368
383 //qDebug("screen saver intervals: %d %d %d", i1, i2, i3); 369 //qDebug("screen saver intervals: %d %d %d", i1, i2, i3);
384 370
385 v[0] = QMAX( 1000*i1, 100); 371 v[0] = QMAX( 1000*i1, 100);
386 v[1] = QMAX( 1000*i2, 100); 372 v[1] = QMAX( 1000*i2, 100);
387 v[2] = QMAX( 1000*i3, 100); 373 v[2] = QMAX( 1000*i3, 100);
388 v[3] = 0; 374 v[3] = 0;
389 dim_on = ( (i1 != 0) ? config.readNumEntry("Dim",1) : FALSE ); 375 dim_on = ( (i1 != 0) ? config.readNumEntry("Dim",1) : FALSE );
390 lightoff_on = ( (i2 != 0 ) ? config.readNumEntry("LightOff",1) : FALSE ); 376 lightoff_on = ( (i2 != 0 ) ? config.readNumEntry("LightOff",1) : FALSE );
391 if ( !i1 && !i2 && !i3 ) 377 if ( !i1 && !i2 && !i3 )
392 QWSServer::setScreenSaverInterval(0); 378 QWSServer::setScreenSaverInterval(0);
393 else 379 else
394 QWSServer::setScreenSaverIntervals(v); 380 QWSServer::setScreenSaverIntervals(v);
395} 381}
396 382
397static void setScreenSaverInterval(int interval) 383static void setScreenSaverInterval(int interval)
398{ 384{
399 setScreenSaverIntervals(-1,-1,interval); 385 setScreenSaverIntervals(-1,-1,interval);
400} 386}
401 387
402 388
403/*! 389/*!
404 \class QPEApplication qpeapplication.h 390 \class QPEApplication qpeapplication.h
405 \brief The QPEApplication class implements various system services 391 \brief The QPEApplication class implements various system services
406 that are available to all Qtopia applications. 392 that are available to all Qtopia applications.
407 393
408 Simply by using QPEApplication instead of QApplication, a plain Qt 394 Simply by using QPEApplication instead of QApplication, a plain Qt
409 application becomes a Qtopia application. It automatically follows 395 application becomes a Qtopia application. It automatically follows
410 style changes, quits and raises, and in the 396 style changes, quits and raises, and in the
411 case of \link docwidget.html document-oriented\endlink applications, 397 case of \link docwidget.html document-oriented\endlink applications,
412 changes the current displayed document in response to the environment. 398 changes the current displayed document in response to the environment.
413*/ 399*/
414 400
415/*! 401/*!
416 \fn void QPEApplication::clientMoused() 402 \fn void QPEApplication::clientMoused()
417 403
418 \internal 404 \internal
419*/ 405*/
420 406
421/*! 407/*!
422 \fn void QPEApplication::timeChanged(); 408 \fn void QPEApplication::timeChanged();
423 409
424 This signal is emitted when the time jumps forward or backwards 410 This signal is emitted when the time jumps forward or backwards
425 by more than the normal passage of time. 411 by more than the normal passage of time.
426*/ 412*/
427 413
428/*! 414/*!
429 \fn void QPEApplication::clockChanged( bool ampm ); 415 \fn void QPEApplication::clockChanged( bool ampm );
430 416
431 This signal is emitted when the user changes the style 417 This signal is emitted when the user changes the style
432 of clock. If \a ampm is TRUE, the user wants a 12-hour 418 of clock. If \a ampm is TRUE, the user wants a 12-hour
433 AM/PM close, otherwise, they want a 24-hour clock. 419 AM/PM close, otherwise, they want a 24-hour clock.
434*/ 420*/
435 421
436/*! 422/*!
437 \fn void QPEApplication::appMessage( const QCString& msg, const QByteArray& data ) 423 \fn void QPEApplication::appMessage( const QCString& msg, const QByteArray& data )
438 424
439 This signal is emitted when a message is received on the 425 This signal is emitted when a message is received on the
440 QPE/Application/<i>appname</i> QCop channel for this application. 426 QPE/Application/<i>appname</i> QCop channel for this application.
441 427
442 The slot to which you connect this signal uses \a msg and \a data 428 The slot to which you connect this signal uses \a msg and \a data
443 in the following way: 429 in the following way:
444 430
445\code 431\code
446 void MyWidget::receive( const QCString& msg, const QByteArray& data ) 432 void MyWidget::receive( const QCString& msg, const QByteArray& data )
447 { 433 {
448 QDataStream stream( data, IO_ReadOnly ); 434 QDataStream stream( data, IO_ReadOnly );
449 if ( msg == "someMessage(int,int,int)" ) { 435 if ( msg == "someMessage(int,int,int)" ) {
450 int a,b,c; 436 int a,b,c;
451 stream >> a >> b >> c; 437 stream >> a >> b >> c;
452 ... 438 ...
453 } else if ( msg == "otherMessage(QString)" ) { 439 } else if ( msg == "otherMessage(QString)" ) {
454 ... 440 ...
455 } 441 }
456 } 442 }
457\endcode 443\endcode
458 444
459 \sa qcop.html 445 \sa qcop.html
460*/ 446*/
461 447
462/*! 448/*!
463 Constructs a QPEApplication just as you would construct 449 Constructs a QPEApplication just as you would construct
464 a QApplication, passing \a argc, \a argv, and \a t. 450 a QApplication, passing \a argc, \a argv, and \a t.
465*/ 451*/
466QPEApplication::QPEApplication( int& argc, char **argv, Type t ) 452QPEApplication::QPEApplication( int& argc, char **argv, Type t )
467 : QApplication( hack(argc), argv, t ) 453 : QApplication( hack(argc), argv, t )
468{ 454{
469 int dw = desktop()->width(); 455 int dw = desktop()->width();
470 if ( dw < 200 ) { 456 if ( dw < 200 ) {
471 setFont( QFont( "helvetica", 8 ) ); 457 setFont( QFont( "helvetica", 8 ) );
472 AppLnk::setSmallIconSize(10); 458 AppLnk::setSmallIconSize(10);
473 AppLnk::setBigIconSize(28); 459 AppLnk::setBigIconSize(28);
474 } 460 }
475 461
476 d = new QPEApplicationData; 462 d = new QPEApplicationData;
477 QMimeSourceFactory::setDefaultFactory(new ResourceMimeFactory); 463 QMimeSourceFactory::setDefaultFactory(new ResourceMimeFactory);
478 464
479 connect(this, SIGNAL(lastWindowClosed()), this, SLOT(hideOrQuit())); 465 connect(this, SIGNAL(lastWindowClosed()), this, SLOT(hideOrQuit()));
480#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 466#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
481 467
482 QString qcopfn("/tmp/qcop-msg-"); 468 QString qcopfn("/tmp/qcop-msg-");
483 qcopfn += QString(argv[0]); // append command name 469 qcopfn += QString(argv[0]); // append command name
484 470
485 QFile f(qcopfn); 471 QFile f(qcopfn);
486 if ( f.open(IO_ReadOnly) ) { 472 if ( f.open(IO_ReadOnly) ) {
487 flock(f.handle(), LOCK_EX); 473 flock(f.handle(), LOCK_EX);
488 } 474 }
489 475
490 sysChannel = new QCopChannel( "QPE/System", this ); 476 sysChannel = new QCopChannel( "QPE/System", this );
491 connect( sysChannel, SIGNAL(received(const QCString &, const QByteArray &)), 477 connect( sysChannel, SIGNAL(received(const QCString &, const QByteArray &)),
492 this, SLOT(systemMessage( const QCString &, const QByteArray &)) ); 478 this, SLOT(systemMessage( const QCString &, const QByteArray &)) );
493 479
494 QCString channel = QCString(argv[0]); 480 QCString channel = QCString(argv[0]);
495 channel.replace(QRegExp(".*/"),""); 481 channel.replace(QRegExp(".*/"),"");
496 d->appName = channel; 482 d->appName = channel;
497 channel = "QPE/Application/" + channel; 483 channel = "QPE/Application/" + channel;
498 pidChannel = new QCopChannel( channel, this); 484 pidChannel = new QCopChannel( channel, this);
499 connect( pidChannel, SIGNAL(received(const QCString &, const QByteArray &)), 485 connect( pidChannel, SIGNAL(received(const QCString &, const QByteArray &)),
500 this, SLOT(pidMessage(const QCString &, const QByteArray &))); 486 this, SLOT(pidMessage(const QCString &, const QByteArray &)));
501 487
502 if ( f.isOpen() ) { 488 if ( f.isOpen() ) {
503 d->keep_running = FALSE; 489 d->keep_running = FALSE;
504 QDataStream ds(&f); 490 QDataStream ds(&f);
505 QCString channel, message; 491 QCString channel, message;
506 QByteArray data; 492 QByteArray data;
507 while(!ds.atEnd()) { 493 while(!ds.atEnd()) {
508 ds >> channel >> message >> data; 494 ds >> channel >> message >> data;
509 d->enqueueQCop(channel,message,data); 495 d->enqueueQCop(channel,message,data);
510 } 496 }
511 497
512 flock(f.handle(), LOCK_UN); 498 flock(f.handle(), LOCK_UN);
513 f.close(); 499 f.close();
514 f.remove(); 500 f.remove();
515 } 501 }
516 502
517 for (int a=0; a<argc; a++) { 503 for (int a=0; a<argc; a++) {
518 if ( qstrcmp(argv[a],"-preload")==0 ) { 504 if ( qstrcmp(argv[a],"-preload")==0 ) {
519 argv[a] = argv[a+1]; 505 argv[a] = argv[a+1];
520 a++; 506 a++;
521 d->preloaded = TRUE; 507 d->preloaded = TRUE;
522 argc-=1; 508 argc-=1;
523 } else if ( qstrcmp(argv[a],"-preload-show")==0 ) { 509 } else if ( qstrcmp(argv[a],"-preload-show")==0 ) {
524 argv[a] = argv[a+1]; 510 argv[a] = argv[a+1];
525 a++; 511 a++;
526 d->preloaded = TRUE; 512 d->preloaded = TRUE;
527 d->forceshow = TRUE; 513 d->forceshow = TRUE;
528 argc-=1; 514 argc-=1;
529 } 515 }
530 } 516 }
531 517
532 /* overide stored arguments */ 518 /* overide stored arguments */
533 setArgs(argc, argv); 519 setArgs(argc, argv);
534 520
535#endif 521#endif
536 522
537 qwsSetDecoration( new QPEDecoration() ); 523 qwsSetDecoration( new QPEDecoration() );
538 524
539#ifndef QT_NO_TRANSLATION 525#ifndef QT_NO_TRANSLATION
540 char *l = getenv( "LANG" ); 526 QStringList langs = Global::languageList();
541 QString lang; 527 for (QStringList::ConstIterator it = langs.begin(); it!=langs.end(); ++it) {
542 if ( l ) { 528 QString lang = *it;
543 lang = l;
544 529
545 /* 530 QTranslator * trans;
546 Config config("qpe"); 531 QString tfn;
547 config.setGroup( "Appearance" );
548 lang = config.readEntry( "Language", lang );
549 */
550 532
551 QTranslator * trans = new QTranslator(this); 533 trans = new QTranslator(this);
552 QString tfn = qpeDir()+"/i18n/"+lang+"/"+d->appName+".qm"; 534 tfn = qpeDir()+"/i18n/"+lang+"/libqpe.qm";
553 if ( trans->load( tfn )) 535 if ( trans->load( tfn ))
554 installTranslator( trans ); 536 installTranslator( trans );
555 else 537 else
556 delete trans; 538 delete trans;
557 539
558 trans = new QTranslator(this); 540 trans = new QTranslator(this);
559 tfn = qpeDir()+"/i18n/"+lang+"/libqpe.qm"; 541 tfn = qpeDir()+"/i18n/"+lang+"/"+d->appName+".qm";
560 if ( trans->load( tfn )) 542 if ( trans->load( tfn ))
561 installTranslator( trans ); 543 installTranslator( trans );
562 else 544 else
563 delete trans; 545 delete trans;
564 546
565 //###language/font hack; should look it up somewhere 547 //###language/font hack; should look it up somewhere
566 if ( lang == "ja" || lang == "zh_CN" || lang == "zh_TW" || lang == "ko" ) { 548 if ( lang == "ja" || lang == "zh_CN" || lang == "zh_TW" || lang == "ko" ) {
567 QFont fn = FontManager::unicodeFont( FontManager::Proportional ); 549 QFont fn = FontManager::unicodeFont( FontManager::Proportional );
568 setFont( fn ); 550 setFont( fn );
569 } 551 }
570 } 552 }
571#endif 553#endif
572 554
573 applyStyle(); 555 applyStyle();
574 556
575 if ( type() == GuiServer ) { 557 if ( type() == GuiServer ) {
576 setScreenSaverInterval(-1); 558 setScreenSaverInterval(-1);
577 setVolume(); 559 setVolume();
578 QWSServer::setScreenSaver(new QPEScreenSaver); 560 QWSServer::setScreenSaver(new QPEScreenSaver);
579 } 561 }
580 562
581 installEventFilter( this ); 563 installEventFilter( this );
582 564
583 QPEMenuToolFocusManager::initialize(); 565 QPEMenuToolFocusManager::initialize();
584 566
585#ifdef QT_NO_QWS_CURSOR 567#ifdef QT_NO_QWS_CURSOR
586 // if we have no cursor, probably don't want tooltips 568 // if we have no cursor, probably don't want tooltips
587 QToolTip::setEnabled( FALSE ); 569 QToolTip::setEnabled( FALSE );
588#endif 570#endif
589} 571}
590 572
591static QPtrDict<void>* inputMethodDict=0; 573static QPtrDict<void>* inputMethodDict=0;
592static void createInputMethodDict() 574static void createInputMethodDict()
593{ 575{
594 if ( !inputMethodDict ) 576 if ( !inputMethodDict )
595 inputMethodDict = new QPtrDict<void>; 577 inputMethodDict = new QPtrDict<void>;
596} 578}
597 579
598/*! 580/*!
599 Returns the currently set hint to the system as to whether 581 Returns the currently set hint to the system as to whether
600 \a w has any use for text input methods. 582 \a w has any use for text input methods.
601 583
602 \sa setInputMethodHint() 584 \sa setInputMethodHint()
603*/ 585*/
604QPEApplication::InputMethodHint QPEApplication::inputMethodHint( QWidget* w ) 586QPEApplication::InputMethodHint QPEApplication::inputMethodHint( QWidget* w )
605{ 587{
606 if ( inputMethodDict && w ) 588 if ( inputMethodDict && w )
607 return (InputMethodHint)(int)inputMethodDict->find(w); 589 return (InputMethodHint)(int)inputMethodDict->find(w);
608 return Normal; 590 return Normal;
609} 591}
610 592
611/*! 593/*!
612 \enum QPEApplication::InputMethodHint 594 \enum QPEApplication::InputMethodHint
613 595
614 \value Normal the application sometimes needs text input (the default). 596 \value Normal the application sometimes needs text input (the default).
615 \value AlwaysOff the application never needs text input. 597 \value AlwaysOff the application never needs text input.
616 \value AlwaysOn the application always needs text input. 598 \value AlwaysOn the application always needs text input.
617*/ 599*/
618 600
619/*! 601/*!
620 Hints to the system that \a w has use for text input methods 602 Hints to the system that \a w has use for text input methods
621 as specified by \a mode. 603 as specified by \a mode.
622 604
623 \sa inputMethodHint() 605 \sa inputMethodHint()
624*/ 606*/
625void QPEApplication::setInputMethodHint( QWidget* w, InputMethodHint mode ) 607void QPEApplication::setInputMethodHint( QWidget* w, InputMethodHint mode )
626{ 608{
627 createInputMethodDict(); 609 createInputMethodDict();
628 if ( mode == Normal ) { 610 if ( mode == Normal ) {
629 inputMethodDict->remove(w); 611 inputMethodDict->remove(w);
630 } else { 612 } else {
631 inputMethodDict->insert(w,(void*)mode); 613 inputMethodDict->insert(w,(void*)mode);
632 } 614 }
633} 615}
634 616
635class HackDialog : public QDialog 617class HackDialog : public QDialog
636{ 618{
637public: 619public:
638 void acceptIt() { accept(); } 620 void acceptIt() { accept(); }
639 void rejectIt() { reject(); } 621 void rejectIt() { reject(); }
640}; 622};
641 623
642 624
643void QPEApplication::mapToDefaultAction( QWSKeyEvent *ke, int key ) 625void QPEApplication::mapToDefaultAction( QWSKeyEvent *ke, int key )
644{ 626{
645 // specialised actions for certain widgets. May want to 627 // specialised actions for certain widgets. May want to
646 // add more stuff here. 628 // add more stuff here.
647 if ( activePopupWidget() && activePopupWidget()->inherits( "QListBox" ) 629 if ( activePopupWidget() && activePopupWidget()->inherits( "QListBox" )
648 && activePopupWidget()->parentWidget() 630 && activePopupWidget()->parentWidget()
649 && activePopupWidget()->parentWidget()->inherits( "QComboBox" ) ) 631 && activePopupWidget()->parentWidget()->inherits( "QComboBox" ) )
650 key = Qt::Key_Return; 632 key = Qt::Key_Return;
651 633
652 if ( activePopupWidget() && activePopupWidget()->inherits( "QPopupMenu" ) ) 634 if ( activePopupWidget() && activePopupWidget()->inherits( "QPopupMenu" ) )
653 key = Qt::Key_Return; 635 key = Qt::Key_Return;
654 636
655 ke->simpleData.keycode = key; 637 ke->simpleData.keycode = key;
656} 638}
657 639
658class HackWidget : public QWidget 640class HackWidget : public QWidget
659{ 641{
660public: 642public:
661 bool needsOk() 643 bool needsOk()
662 { return (getWState() & WState_Reserved1 ); } 644 { return (getWState() & WState_Reserved1 ); }
663}; 645};
664 646
665/*! 647/*!
666 \internal 648 \internal
667*/ 649*/
668bool QPEApplication::qwsEventFilter( QWSEvent *e ) 650bool QPEApplication::qwsEventFilter( QWSEvent *e )
669{ 651{
670 if ( !d->notbusysent && e->type == QWSEvent::Focus ) { 652 if ( !d->notbusysent && e->type == QWSEvent::Focus ) {
671 if ( qApp->type() != QApplication::GuiServer ) { 653 if ( qApp->type() != QApplication::GuiServer ) {
672 QCopEnvelope e("QPE/System", "notBusy(QString)" ); 654 QCopEnvelope e("QPE/System", "notBusy(QString)" );
673 e << d->appName; 655 e << d->appName;
674 } 656 }
675 d->notbusysent=TRUE; 657 d->notbusysent=TRUE;
676 } 658 }
677 if ( type() == GuiServer ) { 659 if ( type() == GuiServer ) {
678 switch ( e->type ) { 660 switch ( e->type ) {
679 case QWSEvent::Mouse: 661 case QWSEvent::Mouse:
680 if ( e->asMouse()->simpleData.state && !QWidget::find(e->window()) ) 662 if ( e->asMouse()->simpleData.state && !QWidget::find(e->window()) )
681 emit clientMoused(); 663 emit clientMoused();
682 } 664 }
683 } 665 }
684 if ( e->type == QWSEvent::Key ) { 666 if ( e->type == QWSEvent::Key ) {
685 if ( d->kbgrabber == 1 ) 667 if ( d->kbgrabber == 1 )
686 return TRUE; 668 return TRUE;
687 QWSKeyEvent *ke = (QWSKeyEvent *)e; 669 QWSKeyEvent *ke = (QWSKeyEvent *)e;
688 if ( ke->simpleData.keycode == Qt::Key_F33 ) { 670 if ( ke->simpleData.keycode == Qt::Key_F33 ) {
689 // Use special "OK" key to press "OK" on top level widgets 671 // Use special "OK" key to press "OK" on top level widgets
690 QWidget *active = activeWindow(); 672 QWidget *active = activeWindow();
691 QWidget *popup = 0; 673 QWidget *popup = 0;
692 if ( active && active->isPopup() ) { 674 if ( active && active->isPopup() ) {
693 popup = active; 675 popup = active;
694 active = active->parentWidget(); 676 active = active->parentWidget();
695 } 677 }
696 if ( active && (int)active->winId() == ke->simpleData.window && 678 if ( active && (int)active->winId() == ke->simpleData.window &&
697 !active->testWFlags( WStyle_Customize|WType_Popup|WType_Desktop )) { 679 !active->testWFlags( WStyle_Customize|WType_Popup|WType_Desktop )) {
698 if ( ke->simpleData.is_press ) { 680 if ( ke->simpleData.is_press ) {
699 if ( popup ) 681 if ( popup )
700 popup->close(); 682 popup->close();
701 if ( active->inherits( "QDialog" ) ) { 683 if ( active->inherits( "QDialog" ) ) {
702 HackDialog *d = (HackDialog *)active; 684 HackDialog *d = (HackDialog *)active;
703 d->acceptIt(); 685 d->acceptIt();
704 return TRUE; 686 return TRUE;
705 } else if ( ((HackWidget *)active)->needsOk() ) { 687 } else if ( ((HackWidget *)active)->needsOk() ) {
706 QSignal s; 688 QSignal s;
707 s.connect( active, SLOT( accept() ) ); 689 s.connect( active, SLOT( accept() ) );
708 s.activate(); 690 s.activate();
709 } else { 691 } else {
710 // do the same as with the select key: Map to the default action of the widget: 692 // do the same as with the select key: Map to the default action of the widget:
711 mapToDefaultAction( ke, Qt::Key_Return ); 693 mapToDefaultAction( ke, Qt::Key_Return );
712 } 694 }
713 } 695 }
714 } 696 }
715 } else if ( ke->simpleData.keycode == Qt::Key_F30 ) { 697 } else if ( ke->simpleData.keycode == Qt::Key_F30 ) {
716 // Use special "select" key to do whatever default action a widget has 698 // Use special "select" key to do whatever default action a widget has
717 mapToDefaultAction( ke, Qt::Key_Space ); 699 mapToDefaultAction( ke, Qt::Key_Space );
718 } else if ( ke->simpleData.keycode == Qt::Key_Escape && 700 } else if ( ke->simpleData.keycode == Qt::Key_Escape &&
719 ke->simpleData.is_press ) { 701 ke->simpleData.is_press ) {
720 // Escape key closes app if focus on toplevel 702 // Escape key closes app if focus on toplevel
721 QWidget *active = activeWindow(); 703 QWidget *active = activeWindow();
722 if ( active && active->testWFlags( WType_TopLevel ) && 704 if ( active && active->testWFlags( WType_TopLevel ) &&
723 (int)active->winId() == ke->simpleData.window && 705 (int)active->winId() == ke->simpleData.window &&
724 !active->testWFlags( WStyle_Dialog|WStyle_Customize|WType_Popup|WType_Desktop )) { 706 !active->testWFlags( WStyle_Dialog|WStyle_Customize|WType_Popup|WType_Desktop )) {
725 if ( active->inherits( "QDialog" ) ) { 707 if ( active->inherits( "QDialog" ) ) {
726 HackDialog *d = (HackDialog *)active; 708 HackDialog *d = (HackDialog *)active;
727 d->rejectIt(); 709 d->rejectIt();
728 return TRUE; 710 return TRUE;
729 } else if ( strcmp( argv()[0], "embeddedkonsole") != 0 ) { 711 } else if ( strcmp( argv()[0], "embeddedkonsole") != 0 ) {
730 active->close(); 712 active->close();
731 } 713 }
732 } 714 }
733 } 715 }
734 716
735#if QT_VERSION < 231 717#if QT_VERSION < 231
736 // Filter out the F4/Launcher key from apps 718 // Filter out the F4/Launcher key from apps
737 // ### The launcher key may not always be F4 on all devices 719 // ### The launcher key may not always be F4 on all devices
738 if ( ((QWSKeyEvent *)e)->simpleData.keycode == Qt::Key_F4 ) 720 if ( ((QWSKeyEvent *)e)->simpleData.keycode == Qt::Key_F4 )
739 return TRUE; 721 return TRUE;
740#endif 722#endif
741 } 723 }
742 if ( e->type == QWSEvent::Focus ) { 724 if ( e->type == QWSEvent::Focus ) {
743 QWSFocusEvent *fe = (QWSFocusEvent*)e; 725 QWSFocusEvent *fe = (QWSFocusEvent*)e;
744 QWidget* nfw = QWidget::find(e->window()); 726 QWidget* nfw = QWidget::find(e->window());
745 if ( !fe->simpleData.get_focus ) { 727 if ( !fe->simpleData.get_focus ) {
746 QWidget *active = activeWindow(); 728 QWidget *active = activeWindow();
747 while ( active && active->isPopup() ) { 729 while ( active && active->isPopup() ) {
748 active->close(); 730 active->close();
749 active = activeWindow(); 731 active = activeWindow();
750 } 732 }
751 if ( !nfw && d->kbgrabber == 2 ) { 733 if ( !nfw && d->kbgrabber == 2 ) {
752 ungrabKeyboard(); 734 ungrabKeyboard();
753 d->kbregrab = TRUE; // want kb back when we're active 735 d->kbregrab = TRUE; // want kb back when we're active
754 } 736 }
755 } else { 737 } else {
756 // make sure our modal widget is ALWAYS on top 738 // make sure our modal widget is ALWAYS on top
757 QWidget *topm = activeModalWidget(); 739 QWidget *topm = activeModalWidget();