summaryrefslogtreecommitdiff
authorllornkcor <llornkcor>2005-08-09 07:50:02 (UTC)
committer llornkcor <llornkcor>2005-08-09 07:50:02 (UTC)
commit65fefea850384673d282e19ebecd7840cb697354 (patch) (unidiff)
tree9c4bd98abe5d5f61a1c5d002f0189eaadf93903e
parent3ba74fc183b06760b60f1ad45ca4bfa0e47b3ecc (diff)
downloadopie-65fefea850384673d282e19ebecd7840cb697354.zip
opie-65fefea850384673d282e19ebecd7840cb697354.tar.gz
opie-65fefea850384673d282e19ebecd7840cb697354.tar.bz2
default should be maximized
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--library/qpeapplication.cpp10
1 files changed, 5 insertions, 5 deletions
diff --git a/library/qpeapplication.cpp b/library/qpeapplication.cpp
index 19e99f2..286c6ef 100644
--- a/library/qpeapplication.cpp
+++ b/library/qpeapplication.cpp
@@ -1,740 +1,740 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. 2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of the Qtopia Environment. 4** This file is part of the Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19*/ 19*/
20#define QTOPIA_INTERNAL_LANGLIST 20#define QTOPIA_INTERNAL_LANGLIST
21#include <stdlib.h> 21#include <stdlib.h>
22#include <unistd.h> 22#include <unistd.h>
23#ifndef Q_OS_MACX 23#ifndef Q_OS_MACX
24#include <linux/limits.h> // needed for some toolchains (PATH_MAX) 24#include <linux/limits.h> // needed for some toolchains (PATH_MAX)
25#endif 25#endif
26#include <qfile.h> 26#include <qfile.h>
27#include <qqueue.h> 27#include <qqueue.h>
28#ifdef Q_WS_QWS 28#ifdef Q_WS_QWS
29#ifndef QT_NO_COP 29#ifndef QT_NO_COP
30#if QT_VERSION <= 231 30#if QT_VERSION <= 231
31#define private public 31#define private public
32#define sendLocally processEvent 32#define sendLocally processEvent
33#include "qcopenvelope_qws.h" 33#include "qcopenvelope_qws.h"
34#undef private 34#undef private
35#else 35#else
36#include "qcopenvelope_qws.h" 36#include "qcopenvelope_qws.h"
37#endif 37#endif
38#endif 38#endif
39#include <qwindowsystem_qws.h> 39#include <qwindowsystem_qws.h>
40#endif 40#endif
41#include <qtextstream.h> 41#include <qtextstream.h>
42#include <qpalette.h> 42#include <qpalette.h>
43#include <qbuffer.h> 43#include <qbuffer.h>
44#include <qptrdict.h> 44#include <qptrdict.h>
45#include <qregexp.h> 45#include <qregexp.h>
46#include <qdir.h> 46#include <qdir.h>
47#include <qlabel.h> 47#include <qlabel.h>
48#include <qdialog.h> 48#include <qdialog.h>
49#include <qdragobject.h> 49#include <qdragobject.h>
50#include <qtextcodec.h> 50#include <qtextcodec.h>
51#include <qevent.h> 51#include <qevent.h>
52#include <qtooltip.h> 52#include <qtooltip.h>
53#include <qsignal.h> 53#include <qsignal.h>
54#include <qmainwindow.h> 54#include <qmainwindow.h>
55#include <qwidgetlist.h> 55#include <qwidgetlist.h>
56#include <qpixmapcache.h> 56#include <qpixmapcache.h>
57 57
58#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 58#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
59#define QTOPIA_INTERNAL_INITAPP 59#define QTOPIA_INTERNAL_INITAPP
60#include "qpeapplication.h" 60#include "qpeapplication.h"
61#include "qpestyle.h" 61#include "qpestyle.h"
62#include "styleinterface.h" 62#include "styleinterface.h"
63#if QT_VERSION >= 0x030000 63#if QT_VERSION >= 0x030000
64#include <qstylefactory.h> 64#include <qstylefactory.h>
65#else 65#else
66#include <qplatinumstyle.h> 66#include <qplatinumstyle.h>
67#include <qwindowsstyle.h> 67#include <qwindowsstyle.h>
68#include <qmotifstyle.h> 68#include <qmotifstyle.h>
69#include <qmotifplusstyle.h> 69#include <qmotifplusstyle.h>
70#include "lightstyle.h" 70#include "lightstyle.h"
71 71
72#include <qpe/qlibrary.h> 72#include <qpe/qlibrary.h>
73#endif 73#endif
74#include "global.h" 74#include "global.h"
75#include "resource.h" 75#include "resource.h"
76#if QT_VERSION <= 230 && defined(QT_NO_CODECS) 76#if QT_VERSION <= 230 && defined(QT_NO_CODECS)
77#include "qutfcodec.h" 77#include "qutfcodec.h"
78#endif 78#endif
79#include "config.h" 79#include "config.h"
80#include "network.h" 80#include "network.h"
81#ifdef QWS 81#ifdef QWS
82#include "fontmanager.h" 82#include "fontmanager.h"
83#include "fontdatabase.h" 83#include "fontdatabase.h"
84#endif 84#endif
85 85
86#include "alarmserver.h" 86#include "alarmserver.h"
87#include "applnk.h" 87#include "applnk.h"
88#include "qpemenubar.h" 88#include "qpemenubar.h"
89#include "textcodecinterface.h" 89#include "textcodecinterface.h"
90#include "imagecodecinterface.h" 90#include "imagecodecinterface.h"
91#include <qtopia/qpeglobal.h> 91#include <qtopia/qpeglobal.h>
92 92
93#include <unistd.h> 93#include <unistd.h>
94#include <sys/file.h> 94#include <sys/file.h>
95#include <sys/ioctl.h> 95#include <sys/ioctl.h>
96#ifndef QT_NO_SOUND 96#ifndef QT_NO_SOUND
97#include <sys/soundcard.h> 97#include <sys/soundcard.h>
98#endif 98#endif
99 99
100#include <backend/rohfeedback.h> 100#include <backend/rohfeedback.h>
101 101
102 102
103static bool useBigPixmaps = 0; 103static bool useBigPixmaps = 0;
104 104
105class HackWidget : public QWidget 105class HackWidget : public QWidget
106{ 106{
107public: 107public:
108 bool needsOk() 108 bool needsOk()
109 { return (getWState() & WState_Reserved1 ); } 109 { return (getWState() & WState_Reserved1 ); }
110 110
111 QRect normalGeometry() 111 QRect normalGeometry()
112 { return topData()->normalGeometry; }; 112 { return topData()->normalGeometry; };
113}; 113};
114 114
115class QPEApplicationData 115class QPEApplicationData
116{ 116{
117public: 117public:
118 QPEApplicationData ( ) : 118 QPEApplicationData ( ) :
119 presstimer( 0 ), presswidget( 0 ), rightpressed( false ), kbgrabbed( false ), 119 presstimer( 0 ), presswidget( 0 ), rightpressed( false ), kbgrabbed( false ),
120 notbusysent( false ), preloaded( false ), forceshow( false ), nomaximize( false ), 120 notbusysent( false ), preloaded( false ), forceshow( false ), nomaximize( false ),
121 keep_running( true ), qcopQok( false ), 121 keep_running( true ), qcopQok( false ),
122 fontFamily( "Vera" ), fontSize( 10 ), smallIconSize( 14 ), 122 fontFamily( "Vera" ), fontSize( 10 ), smallIconSize( 14 ),
123 bigIconSize( 32 ), qpe_main_widget( 0 ) 123 bigIconSize( 32 ), qpe_main_widget( 0 )
124 { 124 {
125 Config cfg( "qpe" ); 125 Config cfg( "qpe" );
126 cfg.setGroup( "Appearance" ); 126 cfg.setGroup( "Appearance" );
127 useBigPixmaps = cfg.readBoolEntry( "useBigPixmaps", false ); 127 useBigPixmaps = cfg.readBoolEntry( "useBigPixmaps", false );
128 fontFamily = cfg.readEntry( "FontFamily", "Vera" ); 128 fontFamily = cfg.readEntry( "FontFamily", "Vera" );
129 fontSize = cfg.readNumEntry( "FontSize", 10 ); 129 fontSize = cfg.readNumEntry( "FontSize", 10 );
130 smallIconSize = cfg.readNumEntry( "SmallIconSize", 14 ); 130 smallIconSize = cfg.readNumEntry( "SmallIconSize", 14 );
131 bigIconSize = cfg.readNumEntry( "BigIconSize", 32 ); 131 bigIconSize = cfg.readNumEntry( "BigIconSize", 32 );
132#ifdef OPIE_WITHROHFEEDBACK 132#ifdef OPIE_WITHROHFEEDBACK
133 RoH = 0; 133 RoH = 0;
134#endif 134#endif
135 } 135 }
136 136
137 int presstimer; 137 int presstimer;
138 QWidget* presswidget; 138 QWidget* presswidget;
139 QPoint presspos; 139 QPoint presspos;
140#ifdef OPIE_WITHROHFEEDBACK 140#ifdef OPIE_WITHROHFEEDBACK
141 Opie::Internal::RoHFeedback *RoH; 141 Opie::Internal::RoHFeedback *RoH;
142#endif 142#endif
143 143
144 bool rightpressed : 1; 144 bool rightpressed : 1;
145 bool kbgrabbed : 1; 145 bool kbgrabbed : 1;
146 bool notbusysent : 1; 146 bool notbusysent : 1;
147 bool preloaded : 1; 147 bool preloaded : 1;
148 bool forceshow : 1; 148 bool forceshow : 1;
149 bool nomaximize : 1; 149 bool nomaximize : 1;
150 bool keep_running : 1; 150 bool keep_running : 1;
151 bool qcopQok : 1; 151 bool qcopQok : 1;
152 152
153 QCString fontFamily; 153 QCString fontFamily;
154 int fontSize; 154 int fontSize;
155 int smallIconSize; 155 int smallIconSize;
156 int bigIconSize; 156 int bigIconSize;
157 157
158 QString appName; 158 QString appName;
159 struct QCopRec 159 struct QCopRec
160 { 160 {
161 QCopRec( const QCString &ch, const QCString &msg, 161 QCopRec( const QCString &ch, const QCString &msg,
162 const QByteArray &d ) : 162 const QByteArray &d ) :
163 channel( ch ), message( msg ), data( d ) 163 channel( ch ), message( msg ), data( d )
164 { } 164 { }
165 165
166 QCString channel; 166 QCString channel;
167 QCString message; 167 QCString message;
168 QByteArray data; 168 QByteArray data;
169 }; 169 };
170 QGuardedPtr<QWidget> qpe_main_widget; 170 QGuardedPtr<QWidget> qpe_main_widget;
171 QGuardedPtr<QWidget> lastraised; 171 QGuardedPtr<QWidget> lastraised;
172 QQueue<QCopRec> qcopq; 172 QQueue<QCopRec> qcopq;
173 QString styleName; 173 QString styleName;
174 QString decorationName; 174 QString decorationName;
175 175
176 void enqueueQCop( const QCString &ch, const QCString &msg, 176 void enqueueQCop( const QCString &ch, const QCString &msg,
177 const QByteArray &data ) 177 const QByteArray &data )
178 { 178 {
179 qcopq.enqueue( new QCopRec( ch, msg, data ) ); 179 qcopq.enqueue( new QCopRec( ch, msg, data ) );
180 } 180 }
181 void sendQCopQ() 181 void sendQCopQ()
182 { 182 {
183 if (!qcopQok ) 183 if (!qcopQok )
184 return; 184 return;
185 185
186 QCopRec * r; 186 QCopRec * r;
187 187
188 while((r=qcopq.dequeue())) { 188 while((r=qcopq.dequeue())) {
189 // remove from queue before sending... 189 // remove from queue before sending...
190 // event loop can come around again before getting 190 // event loop can come around again before getting
191 // back from sendLocally 191 // back from sendLocally
192#ifndef QT_NO_COP 192#ifndef QT_NO_COP
193 QCopChannel::sendLocally( r->channel, r->message, r->data ); 193 QCopChannel::sendLocally( r->channel, r->message, r->data );
194#endif 194#endif
195 195
196 delete r; 196 delete r;
197 } 197 }
198 } 198 }
199 199
200 static void show_mx(QWidget* mw, bool nomaximize, QString &strName) { 200 static void show_mx(QWidget* mw, bool nomaximize, QString &strName) {
201 if ( mw->inherits("QMainWindow") || mw->isA("QMainWindow") ) 201 if ( mw->inherits("QMainWindow") || mw->isA("QMainWindow") )
202 { 202 {
203 ( ( QMainWindow* ) mw )->setUsesBigPixmaps( useBigPixmaps ); 203 ( ( QMainWindow* ) mw )->setUsesBigPixmaps( useBigPixmaps );
204 } 204 }
205 QPoint p; 205 QPoint p;
206 QSize s; 206 QSize s;
207 bool max; 207 bool max;
208 208
209 if ( mw->isVisible() ) { 209 if ( mw->isVisible() ) {
210 if ( read_widget_rect(strName, max, p, s) && validate_widget_size(mw, p, s) ) { 210 if ( read_widget_rect(strName, max, p, s) && validate_widget_size(mw, p, s) ) {
211 mw->resize(s); 211 mw->resize(s);
212 mw->move(p); 212 mw->move(p);
213 } 213 }
214 mw->raise(); 214 mw->raise();
215 } else { 215 } else {
216 216
217 if ( mw->layout() && mw->inherits("QDialog") ) { 217 if ( mw->layout() && mw->inherits("QDialog") ) {
218 if ( read_widget_rect(strName, max, p, s) && validate_widget_size(mw, p, s) ) { 218 if ( read_widget_rect(strName, max, p, s) && validate_widget_size(mw, p, s) ) {
219 mw->resize(s); 219 mw->resize(s);
220 mw->move(p); 220 mw->move(p);
221 221
222 if ( max && !nomaximize ) { 222 if ( max && !nomaximize ) {
223 mw->showMaximized(); 223 mw->showMaximized();
224 } else { 224 } else {
225 mw->show(); 225 mw->show();
226 } 226 }
227 } else { 227 } else {
228 QPEApplication::showDialog((QDialog*)mw,nomaximize); 228 QPEApplication::showDialog((QDialog*)mw, !nomaximize);
229 } 229 }
230 } else { 230 } else {
231 if ( read_widget_rect(strName, max, p, s) && validate_widget_size(mw, p, s) ) { 231 if ( read_widget_rect(strName, max, p, s) && validate_widget_size(mw, p, s) ) {
232 mw->resize(s); 232 mw->resize(s);
233 mw->move(p); 233 mw->move(p);
234 } else { //no stored rectangle, make an estimation 234 } else { //no stored rectangle, make an estimation
235 int x = (qApp->desktop()->width()-mw->frameGeometry().width())/2; 235 int x = (qApp->desktop()->width()-mw->frameGeometry().width())/2;
236 int y = (qApp->desktop()->height()-mw->frameGeometry().height())/2; 236 int y = (qApp->desktop()->height()-mw->frameGeometry().height())/2;
237 mw->move( QMAX(x,0), QMAX(y,0) ); 237 mw->move( QMAX(x,0), QMAX(y,0) );
238#ifdef Q_WS_QWS 238#ifdef Q_WS_QWS
239 if ( !nomaximize ) 239 if ( !nomaximize )
240 mw->showMaximized(); 240 mw->showMaximized();
241#endif 241#endif
242 } 242 }
243 if ( max && !nomaximize ) 243 if ( max && !nomaximize )
244 mw->showMaximized(); 244 mw->showMaximized();
245 else 245 else
246 mw->show(); 246 mw->show();
247 } 247 }
248 } 248 }
249 } 249 }
250 250
251 static bool read_widget_rect(const QString &app, bool &maximized, QPoint &p, QSize &s) 251 static bool read_widget_rect(const QString &app, bool &maximized, QPoint &p, QSize &s)
252 { 252 {
253#ifndef OPIE_NO_WINDOWED 253#ifndef OPIE_NO_WINDOWED
254 maximized = TRUE; 254 maximized = TRUE;
255 // 350 is the trigger in qwsdefaultdecoration for providing a resize button 255 // 350 is the trigger in qwsdefaultdecoration for providing a resize button
256 if ( qApp->desktop()->width() <= 350 ) 256 if ( qApp->desktop()->width() <= 350 )
257 return FALSE; 257 return FALSE;
258 258
259 Config cfg( "qpe" ); 259 Config cfg( "qpe" );
260 cfg.setGroup("ApplicationPositions"); 260 cfg.setGroup("ApplicationPositions");
261 QString str = cfg.readEntry( app, QString::null ); 261 QString str = cfg.readEntry( app, QString::null );
262 QStringList l = QStringList::split(",", str); 262 QStringList l = QStringList::split(",", str);
263 263
264 if ( l.count() == 5) { 264 if ( l.count() == 5) {
265 p.setX( l[0].toInt() ); 265 p.setX( l[0].toInt() );
266 p.setY( l[1].toInt() ); 266 p.setY( l[1].toInt() );
267 267
268 s.setWidth( l[2].toInt() ); 268 s.setWidth( l[2].toInt() );
269 s.setHeight( l[3].toInt() ); 269 s.setHeight( l[3].toInt() );
270 270
271 maximized = l[4].toInt(); 271 maximized = l[4].toInt();
272 272
273 return TRUE; 273 return TRUE;
274 } 274 }
275#endif 275#endif
276 return FALSE; 276 return FALSE;
277 } 277 }
278 278
279 279
280 static bool validate_widget_size(const QWidget *w, QPoint &p, QSize &s) 280 static bool validate_widget_size(const QWidget *w, QPoint &p, QSize &s)
281 { 281 {
282#ifndef Q_WS_QWS 282#ifndef Q_WS_QWS
283 QRect qt_maxWindowRect = qApp->desktop()->geometry(); 283 QRect qt_maxWindowRect = qApp->desktop()->geometry();
284#endif 284#endif
285 int maxX = qt_maxWindowRect.width(); 285 int maxX = qt_maxWindowRect.width();
286 int maxY = qt_maxWindowRect.height(); 286 int maxY = qt_maxWindowRect.height();
287 int wWidth = s.width() + ( w->frameGeometry().width() - w->geometry().width() ); 287 int wWidth = s.width() + ( w->frameGeometry().width() - w->geometry().width() );
288 int wHeight = s.height() + ( w->frameGeometry().height() - w->geometry().height() ); 288 int wHeight = s.height() + ( w->frameGeometry().height() - w->geometry().height() );
289 289
290 // total window size is not allowed to be larger than desktop window size 290 // total window size is not allowed to be larger than desktop window size
291 if ( ( wWidth >= maxX ) && ( wHeight >= maxY ) ) 291 if ( ( wWidth >= maxX ) && ( wHeight >= maxY ) )
292 return FALSE; 292 return FALSE;
293 293
294 if ( wWidth > maxX ) { 294 if ( wWidth > maxX ) {
295 s.setWidth( maxX - (w->frameGeometry().width() - w->geometry().width() ) ); 295 s.setWidth( maxX - (w->frameGeometry().width() - w->geometry().width() ) );
296 wWidth = maxX; 296 wWidth = maxX;
297 } 297 }
298 298
299 if ( wHeight > maxY ) { 299 if ( wHeight > maxY ) {
300 s.setHeight( maxY - (w->frameGeometry().height() - w->geometry().height() ) ); 300 s.setHeight( maxY - (w->frameGeometry().height() - w->geometry().height() ) );
301 wHeight = maxY; 301 wHeight = maxY;
302 } 302 }
303 303
304 // any smaller than this and the maximize/close/help buttons will be overlapping 304 // any smaller than this and the maximize/close/help buttons will be overlapping
305 if ( wWidth < 80 || wHeight < 60 ) 305 if ( wWidth < 80 || wHeight < 60 )
306 return FALSE; 306 return FALSE;
307 307
308 if ( p.x() < 0 ) 308 if ( p.x() < 0 )
309 p.setX(0); 309 p.setX(0);
310 if ( p.y() < 0 ) 310 if ( p.y() < 0 )
311 p.setY(0); 311 p.setY(0);
312 312
313 if ( p.x() + wWidth > maxX ) 313 if ( p.x() + wWidth > maxX )
314 p.setX( maxX - wWidth ); 314 p.setX( maxX - wWidth );
315 if ( p.y() + wHeight > maxY ) 315 if ( p.y() + wHeight > maxY )
316 p.setY( maxY - wHeight ); 316 p.setY( maxY - wHeight );
317 317
318 return TRUE; 318 return TRUE;
319 } 319 }
320 320
321 static void store_widget_rect(QWidget *w, QString &app) 321 static void store_widget_rect(QWidget *w, QString &app)
322 { 322 {
323 if( !w ) 323 if( !w )
324 return; 324 return;
325#ifndef OPIE_NO_WINDOWED 325#ifndef OPIE_NO_WINDOWED
326 // 350 is the trigger in qwsdefaultdecoration for providing a resize button 326 // 350 is the trigger in qwsdefaultdecoration for providing a resize button
327 if ( qApp->desktop()->width() <= 350 ) 327 if ( qApp->desktop()->width() <= 350 )
328 return; 328 return;
329 // we use these to map the offset of geometry and pos. ( we can only use normalGeometry to 329 // we use these to map the offset of geometry and pos. ( we can only use normalGeometry to
330 // get the non-maximized version, so we have to do it the hard way ) 330 // get the non-maximized version, so we have to do it the hard way )
331 int offsetX = w->x() - w->geometry().left(); 331 int offsetX = w->x() - w->geometry().left();
332 int offsetY = w->y() - w->geometry().top(); 332 int offsetY = w->y() - w->geometry().top();
333 333
334 QRect r; 334 QRect r;
335 if ( w->isMaximized() ) 335 if ( w->isMaximized() )
336 r = ( (HackWidget *) w)->normalGeometry(); 336 r = ( (HackWidget *) w)->normalGeometry();
337 else 337 else
338 r = w->geometry(); 338 r = w->geometry();
339 339
340 // Stores the window placement as pos(), size() (due to the offset mapping) 340 // Stores the window placement as pos(), size() (due to the offset mapping)
341 Config cfg( "qpe" ); 341 Config cfg( "qpe" );
342 cfg.setGroup("ApplicationPositions"); 342 cfg.setGroup("ApplicationPositions");
343 QString s; 343 QString s;
344 s.sprintf("%d,%d,%d,%d,%d", r.left() + offsetX, r.top() + offsetY, r.width(), r.height(), w->isMaximized() ); 344 s.sprintf("%d,%d,%d,%d,%d", r.left() + offsetX, r.top() + offsetY, r.width(), r.height(), w->isMaximized() );
345 cfg.writeEntry( app, s ); 345 cfg.writeEntry( app, s );
346#endif 346#endif
347 } 347 }
348 348
349 static bool setWidgetCaptionFromAppName( QWidget* /*mw*/, const QString& /*appName*/, const QString& /*appsPath*/ ) 349 static bool setWidgetCaptionFromAppName( QWidget* /*mw*/, const QString& /*appName*/, const QString& /*appsPath*/ )
350 { 350 {
351 /* 351 /*
352 // This works but disable it for now until it is safe to apply 352 // This works but disable it for now until it is safe to apply
353 // What is does is scan the .desktop files of all the apps for 353 // What is does is scan the .desktop files of all the apps for
354 // the applnk that has the corresponding argv[0] as this program 354 // the applnk that has the corresponding argv[0] as this program
355 // then it uses the name stored in the .desktop file as the caption 355 // then it uses the name stored in the .desktop file as the caption
356 // for the main widget. This saves duplicating translations for 356 // for the main widget. This saves duplicating translations for
357 // the app name in the program and in the .desktop files. 357 // the app name in the program and in the .desktop files.
358 358
359 AppLnkSet apps( appsPath ); 359 AppLnkSet apps( appsPath );
360 360
361 QList<AppLnk> appsList = apps.children(); 361 QList<AppLnk> appsList = apps.children();
362 for ( QListIterator<AppLnk> it(appsList); it.current(); ++it ) { 362 for ( QListIterator<AppLnk> it(appsList); it.current(); ++it ) {
363 if ( (*it)->exec() == appName ) { 363 if ( (*it)->exec() == appName ) {
364 mw->setCaption( (*it)->name() ); 364 mw->setCaption( (*it)->name() );
365 return TRUE; 365 return TRUE;
366 } 366 }
367 } 367 }
368 */ 368 */
369 return FALSE; 369 return FALSE;
370 } 370 }
371 371
372 372
373 void show(QWidget* mw, bool nomax) 373 void show(QWidget* mw, bool nomax)
374 { 374 {
375 setWidgetCaptionFromAppName( mw, appName, QPEApplication::qpeDir() + "apps" ); 375 setWidgetCaptionFromAppName( mw, appName, QPEApplication::qpeDir() + "apps" );
376 nomaximize = nomax; 376 nomaximize = nomax;
377 qpe_main_widget = mw; 377 qpe_main_widget = mw;
378 qcopQok = TRUE; 378 qcopQok = TRUE;
379#ifndef QT_NO_COP 379#ifndef QT_NO_COP
380 380
381 sendQCopQ(); 381 sendQCopQ();
382#endif 382#endif
383 383
384 if ( preloaded ) { 384 if ( preloaded ) {
385 if (forceshow) 385 if (forceshow)
386 show_mx(mw, nomax, appName); 386 show_mx(mw, nomax, appName);
387 } 387 }
388 else if ( keep_running ) { 388 else if ( keep_running ) {
389 show_mx(mw, nomax, appName); 389 show_mx(mw, nomax, appName);
390 } 390 }
391 } 391 }
392 392
393 void loadTextCodecs() 393 void loadTextCodecs()
394 { 394 {
395 QString path = QPEApplication::qpeDir() + "plugins/textcodecs"; 395 QString path = QPEApplication::qpeDir() + "plugins/textcodecs";
396#ifdef Q_OS_MACX 396#ifdef Q_OS_MACX
397 QDir dir( path, "lib*.dylib" ); 397 QDir dir( path, "lib*.dylib" );
398#else 398#else
399 QDir dir( path, "lib*.so" ); 399 QDir dir( path, "lib*.so" );
400#endif 400#endif
401 QStringList list; 401 QStringList list;
402 if ( dir. exists ( )) 402 if ( dir. exists ( ))
403 list = dir.entryList(); 403 list = dir.entryList();
404 QStringList::Iterator it; 404 QStringList::Iterator it;
405 for ( it = list.begin(); it != list.end(); ++it ) { 405 for ( it = list.begin(); it != list.end(); ++it ) {
406 TextCodecInterface *iface = 0; 406 TextCodecInterface *iface = 0;
407 QLibrary *lib = new QLibrary( path + "/" + *it ); 407 QLibrary *lib = new QLibrary( path + "/" + *it );
408 if ( lib->queryInterface( IID_QtopiaTextCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) { 408 if ( lib->queryInterface( IID_QtopiaTextCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) {
409 QValueList<int> mibs = iface->mibEnums(); 409 QValueList<int> mibs = iface->mibEnums();
410 for (QValueList<int>::ConstIterator i = mibs.begin(); i != mibs.end(); ++i) { 410 for (QValueList<int>::ConstIterator i = mibs.begin(); i != mibs.end(); ++i) {
411 (void)iface->createForMib(*i); 411 (void)iface->createForMib(*i);
412 // ### it exists now; need to remember if we can delete it 412 // ### it exists now; need to remember if we can delete it
413 } 413 }
414 } 414 }
415 else { 415 else {
416 lib->unload(); 416 lib->unload();
417 delete lib; 417 delete lib;
418 } 418 }
419 } 419 }
420 } 420 }
421 421
422 void loadImageCodecs() 422 void loadImageCodecs()
423 { 423 {
424 QString path = QPEApplication::qpeDir() + "plugins/imagecodecs"; 424 QString path = QPEApplication::qpeDir() + "plugins/imagecodecs";
425#ifdef Q_OS_MACX 425#ifdef Q_OS_MACX
426 QDir dir( path, "lib*.dylib" ); 426 QDir dir( path, "lib*.dylib" );
427#else 427#else
428 QDir dir( path, "lib*.so" ); 428 QDir dir( path, "lib*.so" );
429#endif 429#endif
430 QStringList list; 430 QStringList list;
431 if ( dir. exists ( )) 431 if ( dir. exists ( ))
432 list = dir.entryList(); 432 list = dir.entryList();
433 QStringList::Iterator it; 433 QStringList::Iterator it;
434 for ( it = list.begin(); it != list.end(); ++it ) { 434 for ( it = list.begin(); it != list.end(); ++it ) {
435 ImageCodecInterface *iface = 0; 435 ImageCodecInterface *iface = 0;
436 QLibrary *lib = new QLibrary( path + "/" + *it ); 436 QLibrary *lib = new QLibrary( path + "/" + *it );
437 if ( lib->queryInterface( IID_QtopiaImageCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) { 437 if ( lib->queryInterface( IID_QtopiaImageCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) {
438 QStringList formats = iface->keys(); 438 QStringList formats = iface->keys();
439 for (QStringList::ConstIterator i = formats.begin(); i != formats.end(); ++i) { 439 for (QStringList::ConstIterator i = formats.begin(); i != formats.end(); ++i) {
440 (void)iface->installIOHandler(*i); 440 (void)iface->installIOHandler(*i);
441 // ### it exists now; need to remember if we can delete it 441 // ### it exists now; need to remember if we can delete it
442 } 442 }
443 } 443 }
444 else { 444 else {
445 lib->unload(); 445 lib->unload();
446 delete lib; 446 delete lib;
447 } 447 }
448 } 448 }
449 } 449 }
450 450
451}; 451};
452 452
453class ResourceMimeFactory : public QMimeSourceFactory 453class ResourceMimeFactory : public QMimeSourceFactory
454{ 454{
455public: 455public:
456 ResourceMimeFactory() : resImage( 0 ) 456 ResourceMimeFactory() : resImage( 0 )
457 { 457 {
458 setFilePath( Global::helpPath() ); 458 setFilePath( Global::helpPath() );
459 setExtensionType( "html", "text/html;charset=UTF-8" ); 459 setExtensionType( "html", "text/html;charset=UTF-8" );
460 } 460 }
461 ~ResourceMimeFactory() { 461 ~ResourceMimeFactory() {
462 delete resImage; 462 delete resImage;
463 } 463 }
464 464
465 const QMimeSource* data( const QString& abs_name ) const 465 const QMimeSource* data( const QString& abs_name ) const
466 { 466 {
467 const QMimeSource * r = QMimeSourceFactory::data( abs_name ); 467 const QMimeSource * r = QMimeSourceFactory::data( abs_name );
468 if ( !r ) { 468 if ( !r ) {
469 int sl = abs_name.length(); 469 int sl = abs_name.length();
470 do { 470 do {
471 sl = abs_name.findRev( '/', sl - 1 ); 471 sl = abs_name.findRev( '/', sl - 1 );
472 QString name = sl >= 0 ? abs_name.mid( sl + 1 ) : abs_name; 472 QString name = sl >= 0 ? abs_name.mid( sl + 1 ) : abs_name;
473 int dot = name.findRev( '.' ); 473 int dot = name.findRev( '.' );
474 if ( dot >= 0 ) 474 if ( dot >= 0 )
475 name = name.left( dot ); 475 name = name.left( dot );
476 QImage img = Resource::loadImage( name ); 476 QImage img = Resource::loadImage( name );
477 if ( !img.isNull() ) { 477 if ( !img.isNull() ) {
478 delete resImage; 478 delete resImage;
479 resImage = new QImageDrag( img ); 479 resImage = new QImageDrag( img );
480 r = resImage; 480 r = resImage;
481 } 481 }
482 } 482 }
483 while ( !r && sl > 0 ); 483 while ( !r && sl > 0 );
484 } 484 }
485 return r; 485 return r;
486 } 486 }
487private: 487private:
488 mutable QImageDrag *resImage; 488 mutable QImageDrag *resImage;
489}; 489};
490 490
491static int& hack(int& i) 491static int& hack(int& i)
492{ 492{
493#if QT_VERSION <= 230 && defined(QT_NO_CODECS) 493#if QT_VERSION <= 230 && defined(QT_NO_CODECS)
494 // These should be created, but aren't in Qt 2.3.0 494 // These should be created, but aren't in Qt 2.3.0
495 (void)new QUtf8Codec; 495 (void)new QUtf8Codec;
496 (void)new QUtf16Codec; 496 (void)new QUtf16Codec;
497#endif 497#endif
498 return i; 498 return i;
499} 499}
500 500
501static int muted = 0; 501static int muted = 0;
502static int micMuted = 0; 502static int micMuted = 0;
503 503
504static void setVolume( int t = 0, int percent = -1 ) 504static void setVolume( int t = 0, int percent = -1 )
505{ 505{
506 switch ( t ) { 506 switch ( t ) {
507 case 0: { 507 case 0: {
508 Config cfg( "qpe" ); 508 Config cfg( "qpe" );
509 cfg.setGroup( "Volume" ); 509 cfg.setGroup( "Volume" );
510 if ( percent < 0 ) 510 if ( percent < 0 )
511 percent = cfg.readNumEntry( "VolumePercent", 50 ); 511 percent = cfg.readNumEntry( "VolumePercent", 50 );
512#ifndef QT_NO_SOUND 512#ifndef QT_NO_SOUND
513 int fd = 0; 513 int fd = 0;
514#ifdef QT_QWS_DEVFS 514#ifdef QT_QWS_DEVFS
515 if ( ( fd = open( "/dev/sound/mixer", O_RDWR ) ) >= 0 ) { 515 if ( ( fd = open( "/dev/sound/mixer", O_RDWR ) ) >= 0 ) {
516#else 516#else
517 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) { 517 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) {
518#endif 518#endif
519 int vol = muted ? 0 : percent; 519 int vol = muted ? 0 : percent;
520 // set both channels to same volume 520 // set both channels to same volume
521 vol |= vol << 8; 521 vol |= vol << 8;
522 ioctl( fd, MIXER_WRITE( SOUND_MIXER_VOLUME ), &vol ); 522 ioctl( fd, MIXER_WRITE( SOUND_MIXER_VOLUME ), &vol );
523 ::close( fd ); 523 ::close( fd );
524 } 524 }
525#endif 525#endif
526 } 526 }
527 break; 527 break;
528 } 528 }
529} 529}
530 530
531static void setMic( int t = 0, int percent = -1 ) 531static void setMic( int t = 0, int percent = -1 )
532{ 532{
533 switch ( t ) { 533 switch ( t ) {
534 case 0: { 534 case 0: {
535 Config cfg( "qpe" ); 535 Config cfg( "qpe" );
536 cfg.setGroup( "Volume" ); 536 cfg.setGroup( "Volume" );
537 if ( percent < 0 ) 537 if ( percent < 0 )
538 percent = cfg.readNumEntry( "Mic", 50 ); 538 percent = cfg.readNumEntry( "Mic", 50 );
539 539
540#ifndef QT_NO_SOUND 540#ifndef QT_NO_SOUND
541 int fd = 0; 541 int fd = 0;
542 int mic = micMuted ? 0 : percent; 542 int mic = micMuted ? 0 : percent;
543#ifdef QT_QWS_DEVFS 543#ifdef QT_QWS_DEVFS
544 if ( ( fd = open( "/dev/sound/mixer", O_RDWR ) ) >= 0 ) { 544 if ( ( fd = open( "/dev/sound/mixer", O_RDWR ) ) >= 0 ) {
545#else 545#else
546 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) { 546 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) {
547#endif 547#endif
548 ioctl( fd, MIXER_WRITE( SOUND_MIXER_MIC ), &mic ); 548 ioctl( fd, MIXER_WRITE( SOUND_MIXER_MIC ), &mic );
549 ::close( fd ); 549 ::close( fd );
550 } 550 }
551#endif 551#endif
552 } 552 }
553 break; 553 break;
554 } 554 }
555} 555}
556 556
557 557
558static void setBass( int t = 0, int percent = -1 ) 558static void setBass( int t = 0, int percent = -1 )
559{ 559{
560 switch ( t ) { 560 switch ( t ) {
561 case 0: { 561 case 0: {
562 Config cfg( "qpe" ); 562 Config cfg( "qpe" );
563 cfg.setGroup( "Volume" ); 563 cfg.setGroup( "Volume" );
564 if ( percent < 0 ) 564 if ( percent < 0 )
565 percent = cfg.readNumEntry( "BassPercent", 50 ); 565 percent = cfg.readNumEntry( "BassPercent", 50 );
566 566
567#ifndef QT_NO_SOUND 567#ifndef QT_NO_SOUND
568 int fd = 0; 568 int fd = 0;
569 int bass = percent; 569 int bass = percent;
570#ifdef QT_QWS_DEVFS 570#ifdef QT_QWS_DEVFS
571 if ( ( fd = open( "/dev/sound/mixer", O_RDWR ) ) >= 0 ) { 571 if ( ( fd = open( "/dev/sound/mixer", O_RDWR ) ) >= 0 ) {
572#else 572#else
573 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) { 573 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) {
574#endif 574#endif
575 ioctl( fd, MIXER_WRITE( SOUND_MIXER_BASS ), &bass ); 575 ioctl( fd, MIXER_WRITE( SOUND_MIXER_BASS ), &bass );
576 ::close( fd ); 576 ::close( fd );
577 } 577 }
578#endif 578#endif
579 } 579 }
580 break; 580 break;
581 } 581 }
582} 582}
583 583
584 584
585static void setTreble( int t = 0, int percent = -1 ) 585static void setTreble( int t = 0, int percent = -1 )
586{ 586{
587 switch ( t ) { 587 switch ( t ) {
588 case 0: { 588 case 0: {
589 Config cfg( "qpe" ); 589 Config cfg( "qpe" );
590 cfg.setGroup( "Volume" ); 590 cfg.setGroup( "Volume" );
591 if ( percent < 0 ) 591 if ( percent < 0 )
592 percent = cfg.readNumEntry( "TreblePercent", 50 ); 592 percent = cfg.readNumEntry( "TreblePercent", 50 );
593 593
594#ifndef QT_NO_SOUND 594#ifndef QT_NO_SOUND
595 int fd = 0; 595 int fd = 0;
596 int treble = percent; 596 int treble = percent;
597#ifdef QT_QWS_DEVFS 597#ifdef QT_QWS_DEVFS
598 if ( ( fd = open( "/dev/sound/mixer", O_RDWR ) ) >= 0 ) { 598 if ( ( fd = open( "/dev/sound/mixer", O_RDWR ) ) >= 0 ) {
599#else 599#else
600 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) { 600 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) {
601#endif 601#endif
602 ioctl( fd, MIXER_WRITE( SOUND_MIXER_TREBLE ), &treble ); 602 ioctl( fd, MIXER_WRITE( SOUND_MIXER_TREBLE ), &treble );
603 ::close( fd ); 603 ::close( fd );
604 } 604 }
605#endif 605#endif
606 } 606 }
607 break; 607 break;
608 } 608 }
609} 609}
610 610
611 611
612/** 612/**
613 \class QPEApplication 613 \class QPEApplication
614 \brief The QPEApplication class implements various system services 614 \brief The QPEApplication class implements various system services
615 that are available to all Qtopia applications. 615 that are available to all Qtopia applications.
616 616
617 Simply by using QPEApplication instead of QApplication, a standard Qt 617 Simply by using QPEApplication instead of QApplication, a standard Qt
618 application becomes a Qtopia application. It automatically follows 618 application becomes a Qtopia application. It automatically follows
619 style changes, quits and raises, and in the 619 style changes, quits and raises, and in the
620 case of \link docwidget.html document-oriented\endlink applications, 620 case of \link docwidget.html document-oriented\endlink applications,
621 changes the currently displayed document in response to the environment. 621 changes the currently displayed document in response to the environment.
622 622
623 To create a \link docwidget.html document-oriented\endlink 623 To create a \link docwidget.html document-oriented\endlink
624 application use showMainDocumentWidget(); to create a 624 application use showMainDocumentWidget(); to create a
625 non-document-oriented application use showMainWidget(). The 625 non-document-oriented application use showMainWidget(). The
626 keepRunning() function indicates whether the application will 626 keepRunning() function indicates whether the application will
627 continue running after it's processed the last \link qcop.html 627 continue running after it's processed the last \link qcop.html
628 QCop\endlink message. This can be changed using setKeepRunning(). 628 QCop\endlink message. This can be changed using setKeepRunning().
629 629
630 A variety of signals are emitted when certain events occur, for 630 A variety of signals are emitted when certain events occur, for
631 example, timeChanged(), clockChanged(), weekChanged(), 631 example, timeChanged(), clockChanged(), weekChanged(),
632 dateFormatChanged() and volumeChanged(). If the application receives 632 dateFormatChanged() and volumeChanged(). If the application receives
633 a \link qcop.html QCop\endlink message on the application's 633 a \link qcop.html QCop\endlink message on the application's
634 QPE/Application/\e{appname} channel, the appMessage() signal is 634 QPE/Application/\e{appname} channel, the appMessage() signal is
635 emitted. There are also flush() and reload() signals, which 635 emitted. There are also flush() and reload() signals, which
636 are emitted when synching begins and ends respectively - upon these 636 are emitted when synching begins and ends respectively - upon these
637 signals, the application should save and reload any data 637 signals, the application should save and reload any data
638 files that are involved in synching. Most of these signals will initially 638 files that are involved in synching. Most of these signals will initially
639 be received and unfiltered through the appMessage() signal. 639 be received and unfiltered through the appMessage() signal.
640 640
641 This class also provides a set of useful static functions. The 641 This class also provides a set of useful static functions. The
642 qpeDir() and documentDir() functions return the respective paths. 642 qpeDir() and documentDir() functions return the respective paths.
643 The grabKeyboard() and ungrabKeyboard() functions are used to 643 The grabKeyboard() and ungrabKeyboard() functions are used to
644 control whether the application takes control of the device's 644 control whether the application takes control of the device's
645 physical buttons (e.g. application launch keys). The stylus' mode of 645 physical buttons (e.g. application launch keys). The stylus' mode of
646 operation is set with setStylusOperation() and retrieved with 646 operation is set with setStylusOperation() and retrieved with
647 stylusOperation(). There are also setInputMethodHint() and 647 stylusOperation(). There are also setInputMethodHint() and
648 inputMethodHint() functions. 648 inputMethodHint() functions.
649 649
650 \ingroup qtopiaemb 650 \ingroup qtopiaemb
651*/ 651*/
652 652
653/*! 653/*!
654 \fn void QPEApplication::clientMoused() 654 \fn void QPEApplication::clientMoused()
655 655
656 \internal 656 \internal
657*/ 657*/
658 658
659/*! 659/*!
660 \fn void QPEApplication::timeChanged(); 660 \fn void QPEApplication::timeChanged();
661 This signal is emitted when the time changes outside the normal 661 This signal is emitted when the time changes outside the normal
662 passage of time, i.e. if the time is set backwards or forwards. 662 passage of time, i.e. if the time is set backwards or forwards.
663*/ 663*/
664 664
665/*! 665/*!
666 \fn void QPEApplication::clockChanged( bool ampm ); 666 \fn void QPEApplication::clockChanged( bool ampm );
667 667
668 This signal is emitted when the user changes the clock's style. If 668 This signal is emitted when the user changes the clock's style. If
669 \a ampm is TRUE, the user wants a 12-hour AM/PM clock, otherwise, 669 \a ampm is TRUE, the user wants a 12-hour AM/PM clock, otherwise,
670 they want a 24-hour clock. 670 they want a 24-hour clock.
671*/ 671*/
672 672
673/*! 673/*!
674 \fn void QPEApplication::volumeChanged( bool muted ) 674 \fn void QPEApplication::volumeChanged( bool muted )
675 675
676 This signal is emitted whenever the mute state is changed. If \a 676 This signal is emitted whenever the mute state is changed. If \a
677 muted is TRUE, then sound output has been muted. 677 muted is TRUE, then sound output has been muted.
678*/ 678*/
679 679
680/*! 680/*!
681 \fn void QPEApplication::weekChanged( bool startOnMonday ) 681 \fn void QPEApplication::weekChanged( bool startOnMonday )
682 682
683 This signal is emitted if the week start day is changed. If \a 683 This signal is emitted if the week start day is changed. If \a
684 startOnMonday is TRUE then the first day of the week is Monday; if 684 startOnMonday is TRUE then the first day of the week is Monday; if
685 \a startOnMonday is FALSE then the first day of the week is 685 \a startOnMonday is FALSE then the first day of the week is
686 Sunday. 686 Sunday.
687*/ 687*/
688 688
689/*! 689/*!
690 \fn void QPEApplication::dateFormatChanged(DateFormat) 690 \fn void QPEApplication::dateFormatChanged(DateFormat)
691 691
692 This signal is emitted whenever the date format is changed. 692 This signal is emitted whenever the date format is changed.
693*/ 693*/
694 694
695/*! 695/*!
696 \fn void QPEApplication::flush() 696 \fn void QPEApplication::flush()
697 697
698 ### 698 ###
699*/ 699*/
700 700
701/*! 701/*!
702 \fn void QPEApplication::reload() 702 \fn void QPEApplication::reload()
703 703
704*/ 704*/
705 705
706 706
707 707
708void QPEApplication::processQCopFile() 708void QPEApplication::processQCopFile()
709{ 709{
710 QString qcopfn("/tmp/qcop-msg-"); 710 QString qcopfn("/tmp/qcop-msg-");
711 qcopfn += d->appName; // append command name 711 qcopfn += d->appName; // append command name
712 712
713 QFile f(qcopfn); 713 QFile f(qcopfn);
714 if ( f.open(IO_ReadWrite) ) { 714 if ( f.open(IO_ReadWrite) ) {
715#ifndef Q_OS_WIN32 715#ifndef Q_OS_WIN32
716 flock(f.handle(), LOCK_EX); 716 flock(f.handle(), LOCK_EX);
717#endif 717#endif
718 QDataStream ds(&f); 718 QDataStream ds(&f);
719 QCString channel, message; 719 QCString channel, message;
720 QByteArray data; 720 QByteArray data;
721 while(!ds.atEnd()) { 721 while(!ds.atEnd()) {
722 ds >> channel >> message >> data; 722 ds >> channel >> message >> data;
723 d->enqueueQCop(channel,message,data); 723 d->enqueueQCop(channel,message,data);
724 } 724 }
725 ::ftruncate(f.handle(), 0); 725 ::ftruncate(f.handle(), 0);
726#ifndef Q_OS_WIN32 726#ifndef Q_OS_WIN32
727 f.flush(); 727 f.flush();
728 flock(f.handle(), LOCK_UN); 728 flock(f.handle(), LOCK_UN);
729#endif 729#endif
730 } 730 }
731#endif 731#endif
732} 732}
733 733
734 734
735/*! 735/*!
736 \fn void QPEApplication::appMessage( const QCString& msg, const QByteArray& data ) 736 \fn void QPEApplication::appMessage( const QCString& msg, const QByteArray& data )
737 737
738 This signal is emitted when a message is received on this 738 This signal is emitted when a message is received on this
739 application's QPE/Application/<i>appname</i> \link qcop.html 739 application's QPE/Application/<i>appname</i> \link qcop.html
740 QCop\endlink channel. 740 QCop\endlink channel.