summaryrefslogtreecommitdiff
authorzecke <zecke>2002-10-18 01:34:23 (UTC)
committer zecke <zecke>2002-10-18 01:34:23 (UTC)
commit0457c48c165abef8afa2ac73c8f66d20e289681a (patch) (unidiff)
tree2c6baf363487d474df6ceeaf2ea17a351b38aa05
parente7e36afd3685c7fab146ebd0078d7f1a60f8c5e6 (diff)
downloadopie-0457c48c165abef8afa2ac73c8f66d20e289681a.zip
opie-0457c48c165abef8afa2ac73c8f66d20e289681a.tar.gz
opie-0457c48c165abef8afa2ac73c8f66d20e289681a.tar.bz2
Fix OCOPServer bugs... when removing clients
Implement the Opie side for the OK button now the awesome matchbox needs to get an update I was too excited about X11 so i did not do any PIM work yet
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--x11/ipc/server/ocopserver.cpp59
-rw-r--r--x11/libqpe-x11/qpe/qpeapplication.cpp90
-rw-r--r--x11/libqpe-x11/qpe/qpeapplication.h2
3 files changed, 127 insertions, 24 deletions
diff --git a/x11/ipc/server/ocopserver.cpp b/x11/ipc/server/ocopserver.cpp
index 4940cb8..0f818b7 100644
--- a/x11/ipc/server/ocopserver.cpp
+++ b/x11/ipc/server/ocopserver.cpp
@@ -103,297 +103,308 @@ void OCopServer::initSocket() {
103} 103}
104/** 104/**
105 * we got the possibility to read 105 * we got the possibility to read
106 * on the server 106 * on the server
107 * this is mostly due a connect 107 * this is mostly due a connect
108 * on a client side 108 * on a client side
109 * we will accept it 109 * we will accept it
110 * add it to our list 110 * add it to our list
111 */ 111 */
112void OCopServer::newOnServer() { 112void OCopServer::newOnServer() {
113 int fd = accept(); 113 int fd = accept();
114 if ( fd < 0 ) 114 if ( fd < 0 )
115 return; 115 return;
116 116
117 /* 117 /*
118 * we got a successfull new connection 118 * we got a successfull new connection
119 * be happy 119 * be happy
120 * set SocketNotifier 120 * set SocketNotifier
121 * connect it 121 * connect it
122 * and a OCOPClient 122 * and a OCOPClient
123 */ 123 */
124 qWarning("Heureka new connection %d", fd ); 124 qWarning("Heureka new connection %d", fd );
125 125
126 126
127 registerClient( fd ); 127 registerClient( fd );
128} 128}
129int OCopServer::accept() { 129int OCopServer::accept() {
130 /* 130 /*
131 * accept it 131 * accept it
132 * the socket is currently blocking IIRC 132 * the socket is currently blocking IIRC
133 */ 133 */
134 return ::accept( m_serverfd, (struct sockaddr*)&m_address, &m_adrlaenge ); 134 return ::accept( m_serverfd, (struct sockaddr*)&m_address, &m_adrlaenge );
135} 135}
136void OCopServer::newOnClient( int fd ) { 136void OCopServer::newOnClient( int fd ) {
137 errno = 0; 137 errno = 0;
138 OCOPHead head; 138 OCOPHead head;
139 memset(&head, 0, sizeof(head) ); 139 memset(&head, 0, sizeof(head) );
140 int rea = ::read(fd, &head, sizeof(head) ); 140 int rea = ::read(fd, &head, sizeof(head) );
141 //qWarning("read %d %d", rea, errno); 141 //qWarning("read %d %d", rea, errno);
142 /* 142 /*
143 * I should get EPIPE but nothing like this happens 143 * I should get EPIPE but nothing like this happens
144 * so if rea == 0 and we were signaled by the notifier 144 * so if rea == 0 and we were signaled by the notifier
145 * we close it and drop the clients... 145 * we close it and drop the clients...
146 */ 146 */
147 if ( rea <= 0 ) { 147 if ( rea <= 0 ) {
148 deregisterClient( fd ); 148 deregisterClient( fd );
149 return; 149 return;
150 } 150 }
151 /* 151 /*
152 * OCOPHead 152 * OCOPHead
153 */ 153 */
154 //qWarning("data %s %d", &bug, rea ); 154 //qWarning("data %s %d", &bug, rea );
155 155
156 /* 156 /*
157 * Check the magic 157 * Check the magic
158 * if chcked read till EOF if magic does not match 158 * if chcked read till EOF if magic does not match
159 * otherwise do read 159 * otherwise do read
160 * channel 160 * channel
161 * func 161 * func
162 * data into mem 162 * data into mem
163 * and then send the OCOPPacket 163 * and then send the OCOPPacket
164 * 164 *
165 */ 165 */
166 if (head.magic == 47 ) { 166 if (head.magic == 47 ) {
167 qWarning("magic match"); 167// qWarning("magic match");
168 QCString channel( head.chlen+1 ); 168 QCString channel( head.chlen+1 );
169 QCString func( head.funclen+1 ); 169 QCString func( head.funclen+1 );
170 QByteArray data ( head.datalen ); 170 QByteArray data ( head.datalen );
171 171
172 /* 172 /*
173 * we do not check for errors 173 * we do not check for errors
174 */ 174 */
175 qWarning("read "); 175// qWarning("read ");
176 int s = read(fd, channel.data(), head.chlen ); 176 int s = read(fd, channel.data(), head.chlen );
177 s = read(fd, func.data(), head.funclen ); 177 s = read(fd, func.data(), head.funclen );
178 s = read(fd, data.data(), head.datalen ); 178 s = read(fd, data.data(), head.datalen );
179 qWarning("read"); 179// qWarning("read");
180 180
181 /* debug output */ 181 /* debug output */
182 qWarning("channel %s %d", channel.data(), head.chlen ); 182// qWarning("channel %s %d", channel.data(), head.chlen );
183 qWarning("func %s %d", func.data(), head.funclen ); 183// qWarning("func %s %d", func.data(), head.funclen );
184 /* debug end */ 184 /* debug end */
185 185
186 /* 186 /*
187 * now that we got the complete body 187 * now that we got the complete body
188 * we need to make a package 188 * we need to make a package
189 * and then we need to send it to clients 189 * and then we need to send it to clients
190 * making a package is done here 190 * making a package is done here
191 * dispatching it not 191 * dispatching it not
192 */ 192 */
193 OCOPPacket packet( head.type, channel, func, data ); 193 OCOPPacket packet( head.type, channel, func, data );
194 dispatch( packet, fd ); 194 dispatch( packet, fd );
195 195
196 }else{ 196 }else{
197 qWarning("magic does not match"); 197 qWarning("magic does not match");
198 qWarning("magic %d", head.magic ); 198 qWarning("magic %d", head.magic );
199 } 199 }
200} 200}
201void OCopServer::registerClient( int fd ) { 201void OCopServer::registerClient( int fd ) {
202 if (m_clients.contains(fd) ) 202 if (m_clients.contains(fd) )
203 return; 203 return;
204 204
205 QSocketNotifier* notify = new QSocketNotifier(fd, QSocketNotifier::Read, this ); 205 QSocketNotifier* notify = new QSocketNotifier(fd, QSocketNotifier::Read, this );
206 connect(notify, SIGNAL(activated(int) ), 206 connect(notify, SIGNAL(activated(int) ),
207 this, SLOT(newOnClient(int) ) ); 207 this, SLOT(newOnClient(int) ) );
208 OCOPClient client; 208 OCOPClient client;
209 client.fd = fd; 209 client.fd = fd;
210 client.notify = notify; 210 client.notify = notify;
211 m_clients.insert( client.fd, client ); 211 m_clients.insert( client.fd, client );
212 qWarning("clients are up to %d", m_clients.count() ); 212 qWarning("clients are up to %d", m_clients.count() );
213}; 213};
214void OCopServer::deregisterClient(int fd ) { 214void OCopServer::deregisterClient(int fd ) {
215 QMap<int, OCOPClient>::Iterator it = m_clients.find( fd ); 215 QMap<int, OCOPClient>::Iterator it = m_clients.find( fd );
216 if (it != m_clients.end() ) { 216 if (it != m_clients.end() ) {
217 OCOPClient client = it.data();
218 delete client.notify;
219 m_clients.remove(fd );
220 close(fd );
221 /* 217 /*
222 * TIME_ME 218 * TIME_ME
223 * 219 *
224 * now delete from all channels 220 * now delete from all channels
225 * go through all channels 221 * go through all channels
226 * remove the fd from the list 222 * remove the fd from the list
227 * if count becomes 0 remove the channel 223 * if count becomes 0 remove the channel
228 * otherwise replace QArray<int> 224 * otherwise replace QArray<int>
229 */ 225 */
230 QMap<QCString, QValueList<int> >::Iterator it2; 226 QMap<QCString, QValueList<int> >::Iterator it2;
231 repeatIt: 227 repeatIt:
232 for ( it2 = m_channels.begin(); it2 != m_channels.end(); ++it2 ) { 228 for ( it2 = m_channels.begin(); it2 != m_channels.end(); ++it2 ) {
233 /* 229 /*
234 * The channel contains this fd 230 * The channel contains this fd
235 */ 231 */
236 qWarning("Channel %s", it2.key().data() ); 232 qWarning("Channel %s %d", it2.key().data(), it2.data().count() );
237 if ( it2.data().contains( fd ) ) { 233 if ( it2.data().contains( fd ) ) {
238 qWarning("contains"); 234 qWarning("contains");
239 QValueList<int> array = it2.data(); 235 QValueList<int> array = it2.data();
240 236
241 /* 237 /*
242 * remove channel or just replace 238 * remove channel or just replace
243 */ 239 */
244 if ( array.count() == 1 ) { 240 if ( array.count() == 1 || array.count() == 0) {
245 qWarning("Invalidate!"); 241 qWarning("Invalidate!");
246 /* is the list now invalidatet? */ 242 /* is the list now invalidatet? */
247 m_channels.remove( it2 ); 243 m_channels.remove( it2 );
248 /* That is the first go to of my life 244 /* That is the first go to of my life
249 * but Iterator remove( Iterator ) 245 * but Iterator remove( Iterator )
250 * does not exist 246 * does not exist
251 * it2 = --it2; 247 * it2 = --it2;
252 * does not work reliable too 248 * does not work reliable too
253 * so the only way is to reiterate :( 249 * so the only way is to reiterate :(
254 */ 250 */
255 goto repeatIt; 251 goto repeatIt;
256 }else{ 252 }else{
257 qWarning("removing"); 253 qWarning("removing count %d %d",fd, array.count() );
258 array.remove( fd ); 254 QValueList<int>::Iterator it3 = array.find( fd );
259 it2 = m_channels.replace( it2.key(), array ); 255 it3 = array.remove( it3 );
256 QCString key = it2.key().copy();
257 it2 = m_channels.replace( key, array );
260 } 258 }
261 } 259 }
262 } // off all channels 260 } // off all channels
261 OCOPClient client = it.data();
262 delete client.notify;
263 m_clients.remove(fd );
264 close(fd );
263 } 265 }
264 qWarning("clients are now at %d", m_clients.count() ); 266 qWarning("clients are now at %d", m_clients.count() );
265}; 267};
266/** 268/**
267 * this function will evaluate 269 * this function will evaluate
268 * the package and then do the appropriate thins 270 * the package and then do the appropriate thins
269 */ 271 */
270void OCopServer::dispatch( const OCOPPacket& packet, int sourceFD ) { 272void OCopServer::dispatch( const OCOPPacket& packet, int sourceFD ) {
271 qWarning("packet.type() == %d", packet.type() ); 273 qWarning("packet.type() == %d", packet.type() );
272 switch( packet.type() ) { 274 switch( packet.type() ) {
273 case OCOPPacket::Register: 275 case OCOPPacket::Register:
274 registerClient(sourceFD ); 276 registerClient(sourceFD );
275 break; 277 break;
276 case OCOPPacket::Unregister: 278 case OCOPPacket::Unregister:
277 deregisterClient(sourceFD ); 279 deregisterClient(sourceFD );
278 break; 280 break;
279 case OCOPPacket::Call: 281 case OCOPPacket::Call:
280 call( packet, sourceFD ); 282 call( packet, sourceFD );
281 break; 283 break;
282 /* not implemented */ 284 /* not implemented */
283 case OCOPPacket::Method: 285 case OCOPPacket::Method:
284 break; 286 break;
285 /* nit implemented */ 287 /* nit implemented */
286 case OCOPPacket::Reply: 288 case OCOPPacket::Reply:
287 break; 289 break;
288 case OCOPPacket::RegisterChannel: 290 case OCOPPacket::RegisterChannel:
289 addChannel( packet.channel() , sourceFD ); 291 addChannel( packet.channel() , sourceFD );
290 break; 292 break;
291 case OCOPPacket::UnregisterChannel: 293 case OCOPPacket::UnregisterChannel:
292 delChannel( packet.channel(), sourceFD ); 294 delChannel( packet.channel(), sourceFD );
293 break; 295 break;
294 /* not implemented */ 296 /* not implemented */
295 case OCOPPacket::Return: 297 case OCOPPacket::Return:
296 break; 298 break;
297 /* not implemented :( */ 299 /* not implemented :( */
298 case OCOPPacket::Signal: 300 case OCOPPacket::Signal:
299 break; 301 break;
300 case OCOPPacket::IsRegistered: 302 case OCOPPacket::IsRegistered:
301 qWarning("IsRegistered"); 303 qWarning("IsRegistered");
302 isRegistered( packet.channel(), sourceFD ); 304 isRegistered( packet.channel(), sourceFD );
303 break; 305 break;
304 }; 306 };
305} 307}
306void OCopServer::errorOnServer() { 308void OCopServer::errorOnServer() {
307 /* 309 /*
308 * something is wrong on the server socket? 310 * something is wrong on the server socket?
309 * what should we do? 311 * what should we do?
310 * FIXME 312 * FIXME
311 */ 313 */
312} 314}
313QStringList OCopServer::channels() { 315QStringList OCopServer::channels() {
314 QStringList list; 316 QStringList list;
315 { 317 {
316 QMap<QCString, QValueList<int> >::Iterator it; 318 QMap<QCString, QValueList<int> >::Iterator it;
317 for (it = m_channels.begin(); it != m_channels.end(); ++it ) { 319 for (it = m_channels.begin(); it != m_channels.end(); ++it ) {
318 list << it.key(); 320 list << it.key();
319 }; 321 };
320 } 322 }
321 return list; 323 return list;
322} 324}
323bool OCopServer::isChannelRegistered( const QCString& chan ) const{ 325bool OCopServer::isChannelRegistered( const QCString& chan ) const{
324 return m_channels.contains( chan ); 326 return m_channels.contains( chan );
325} 327}
326void OCopServer::addChannel( const QCString& channel, 328void OCopServer::addChannel( const QCString& channel,
327 int fd ) { 329 int fd ) {
328 QMap<QCString, QValueList<int> >::Iterator it; 330 QMap<QCString, QValueList<int> >::Iterator it;
329 it = m_channels.find( channel ); 331 it = m_channels.find( channel );
330 332 if ( it != m_channels.end() ) {
331 /* could be empty */ 333 /* could be empty */
332 QValueList<int> list = it.data(); 334 QValueList<int> list = it.data();
333 list.append( fd ); 335 list.append( fd );
334 it = m_channels.replace( channel, list ); 336 qWarning("count is now in addChannel %d %s", list.count(), channel.data() );
337 it = m_channels.replace( channel, list );
338 }else {
339 QValueList<int> ints;
340 ints.append( fd );
341 m_channels.insert( channel, ints );
342 }
335}; 343};
336void OCopServer::delChannel( const QCString& channel, 344void OCopServer::delChannel( const QCString& channel,
337 int fd ) { 345 int fd ) {
346 qWarning("remove %s, %d", channel.data(), fd );
338 if (!m_channels.contains( channel ) ) 347 if (!m_channels.contains( channel ) )
339 return; 348 return;
340 349
341 QMap<QCString, QValueList<int> >::Iterator it; 350 QMap<QCString, QValueList<int> >::Iterator it;
342 it = m_channels.find( channel ); 351 it = m_channels.find( channel );
343 352
344 if ( it.data().contains(fd) ) { 353 if ( it.data().contains(fd) ) {
345
346 QValueList<int> ints = it.data(); 354 QValueList<int> ints = it.data();
347 if ( ints.count() == 1 ) 355 if ( ints.count() == 1 )
348 m_channels.remove( it ); 356 m_channels.remove( channel );
349 else{ 357 else{
350 QValueList<int> ints = it.data(); 358 QValueList<int> ints = it.data();
351 ints.remove( fd ); 359 QValueList<int>::Iterator rem = ints.find( fd );
352 m_channels.replace( it.key(), ints ); 360 rem = ints.remove( rem );
361 QCString str = it.key().copy();
362 m_channels.replace( str, ints );
353 } 363 }
364 qWarning(" channel count is now %d", ints.count() );
354 } 365 }
355} 366}
356void OCopServer::isRegistered( const QCString& channel, int fd) { 367void OCopServer::isRegistered( const QCString& channel, int fd) {
357 qWarning("isRegistered"); 368// qWarning("isRegistered");
358 OCOPHead head; 369 OCOPHead head;
359 QCString func(2); 370 QCString func(2);
360 371
361 memset(&head, 0, sizeof(head ) ); 372 memset(&head, 0, sizeof(head ) );
362 head.magic = 47; 373 head.magic = 47;
363 head.type = OCOPPacket::IsRegistered; 374 head.type = OCOPPacket::IsRegistered;
364 head.chlen = channel.size(); 375 head.chlen = channel.size();
365 head.funclen = func.size(); 376 head.funclen = func.size();
366 head.datalen = 0; 377 head.datalen = 0;
367 378
368 if ( isChannelRegistered( channel ) ) { 379 if ( isChannelRegistered( channel ) ) {
369 //is registered 380 //is registered
370 func[0] = 1; 381 func[0] = 1;
371 }else{ 382 }else{
372 func[0] = 0; 383 func[0] = 0;
373 } 384 }
374 385
375 /** 386 /**
376 * write the head 387 * write the head
377 * and then channel 388 * and then channel
378 * success/failure inside func 389 * success/failure inside func
379 */ 390 */
380 write(fd, &head, sizeof(head) ); 391 write(fd, &head, sizeof(head) );
381 write(fd, channel.data(), channel.size() ); 392 write(fd, channel.data(), channel.size() );
382 write(fd, func.data(), func.size() ); 393 write(fd, func.data(), func.size() );
383} 394}
384QValueList<int> OCopServer::clients( const QCString& channel ) { 395QValueList<int> OCopServer::clients( const QCString& channel ) {
385 return m_channels[channel]; 396 return m_channels[channel];
386} 397}
387void OCopServer::call( const OCOPPacket& p, int ) { 398void OCopServer::call( const OCOPPacket& p, int ) {
388 QValueList<int> cli = clients( p.channel() ); 399 QValueList<int> cli = clients( p.channel() );
389 QValueList<int>::Iterator it; 400 QValueList<int>::Iterator it;
390 401
391 OCOPHead head = p.head(); 402 OCOPHead head = p.head();
392 for (it = cli.begin(); it != cli.end(); ++it ) { 403 for (it = cli.begin(); it != cli.end(); ++it ) {
393 write( (*it), &head, sizeof(head ) ); 404 write( (*it), &head, sizeof(head ) );
394 /* expl. shared! */ 405 /* expl. shared! */
395 write( (*it), p.channel().data(), p.channel().size() ); 406 write( (*it), p.channel().data(), p.channel().size() );
396 write( (*it), p.header().data(), p.header().size() ); 407 write( (*it), p.header().data(), p.header().size() );
397 write( (*it), p.content().data(), p.content().size() ); 408 write( (*it), p.content().data(), p.content().size() );
398 }; 409 };
399} 410}
diff --git a/x11/libqpe-x11/qpe/qpeapplication.cpp b/x11/libqpe-x11/qpe/qpeapplication.cpp
index 8785c74..75a8189 100644
--- a/x11/libqpe-x11/qpe/qpeapplication.cpp
+++ b/x11/libqpe-x11/qpe/qpeapplication.cpp
@@ -1,142 +1,158 @@
1#define QTOPIA_INTERNAL_LANGLIST 1#define QTOPIA_INTERNAL_LANGLIST
2 2
3#include <stdio.h> 3#include <stdio.h>
4#include <stdlib.h> 4#include <stdlib.h>
5#include <unistd.h> 5#include <unistd.h>
6#include <sys/file.h> 6#include <sys/file.h>
7 7
8
8#include <qdir.h> 9#include <qdir.h>
9#include <qdialog.h> 10#include <qdialog.h>
10#include <qdragobject.h> 11#include <qdragobject.h>
11#include <qevent.h> 12#include <qevent.h>
12#include <qlabel.h> 13#include <qlabel.h>
13#include <qlist.h> 14#include <qlist.h>
14#include <qtextstream.h> 15#include <qtextstream.h>
15#include <qtextcodec.h> 16#include <qtextcodec.h>
16#include <qpalette.h> 17#include <qpalette.h>
17#include <qptrdict.h> 18#include <qptrdict.h>
18#include <qregexp.h> 19#include <qregexp.h>
20#include <qtimer.h>
19 21
20#include <qpe/alarmserver.h> 22#include <qpe/alarmserver.h>
21#include <qpe/applnk.h> 23#include <qpe/applnk.h>
22#include <qpe/qpemenubar.h> 24#include <qpe/qpemenubar.h>
23#include <qpe/textcodecinterface.h> 25#include <qpe/textcodecinterface.h>
24#include <qpe/imagecodecinterface.h> 26#include <qpe/imagecodecinterface.h>
25#include <qpe/qlibrary.h> 27#include <qpe/qlibrary.h>
26#include <qpe/qpestyle.h> 28#include <qpe/qpestyle.h>
27#include <qpe/styleinterface.h> 29#include <qpe/styleinterface.h>
28#include <qpe/global.h> 30#include <qpe/global.h>
29#include <qpe/resource.h> 31#include <qpe/resource.h>
30#include <qpe/config.h> 32#include <qpe/config.h>
31#include <qpe/network.h> 33#include <qpe/network.h>
32 34
33#include <qpe/qpeapplication.h> 35#include <qpe/qpeapplication.h>
34#include <qpe/timestring.h> 36#include <qpe/timestring.h>
35#include <qpe/qcopenvelope_qws.h> 37#include <qpe/qcopenvelope_qws.h>
36 38
39
40#include <X11/Xlib.h>
41#include <X11/Xutil.h>
42
43const int XKeyPress = KeyPress;
44const int XKeyRelease = KeyRelease;
45#undef KeyPress
46#undef KeyRelease
47
37namespace { 48namespace {
38 struct QCopRec{ 49 struct QCopRec{
39 QCopRec( const QCString& ch, const QCString& msg, const QByteArray& ar ) 50 QCopRec( const QCString& ch, const QCString& msg, const QByteArray& ar )
40 : channel(ch), message(msg), data(ar) { 51 : channel(ch), message(msg), data(ar) {
41 52
42 } 53 }
43 QCString channel; 54 QCString channel;
44 QCString message; 55 QCString message;
45 QByteArray data; 56 QByteArray data;
46 }; 57 };
47}; 58};
48 59
49 60
50class QPEApplication::Private { 61class QPEApplication::Private {
51public: 62public:
52 Private(); 63 Private();
53 ~Private(); 64 ~Private();
54 void enqueueQCop( const QCString& ch, const QCString& msg, 65 void enqueueQCop( const QCString& ch, const QCString& msg,
55 const QByteArray& ); 66 const QByteArray& );
56 void sendQCopQ(); 67 void sendQCopQ();
57 static void show_mx(QWidget* mw, bool nomaximize ); 68 static void show_mx(QWidget* mw, bool nomaximize );
58 void show( QWidget* mw, bool nomax ); 69 void show( QWidget* mw, bool nomax );
59 void loadTextCodecs(); 70 void loadTextCodecs();
60 void loadImageCodecs(); 71 void loadImageCodecs();
61 72
62 int kbgrabber; 73 int kbgrabber;
63 int presstimer; 74 int presstimer;
64 75
65 bool rightpressed : 1; 76 bool rightpressed : 1;
66 bool kbregrab : 1; 77 bool kbregrab : 1;
67 bool notbusysent : 1; 78 bool notbusysent : 1;
68 bool preloaded : 1; 79 bool preloaded : 1;
69 bool forceshow : 1; 80 bool forceshow : 1;
70 bool nomaximize : 1; 81 bool nomaximize : 1;
71 bool keep_running : 1; 82 bool keep_running : 1;
72 83
73 QWidget* presswidget; 84 QWidget* presswidget;
74 QPoint presspos; 85 QPoint presspos;
75 QWidget* qpe_main_widget; 86 QWidget* qpe_main_widget;
76 QString appName; 87 QString appName;
77 QString styleName; 88 QString styleName;
78 QString decorationName; 89 QString decorationName;
90 Atom wm_delete_window;
91 Atom wm_take_focus;
92 Atom wm_context_help;
93 Atom wm_context_accept;
94 Atom wm_protocols;
79 95
80private: 96private:
81 QList<QCopRec> qcopq; 97 QList<QCopRec> qcopq;
82}; 98};
83QPEApplication::Private::~Private() { 99QPEApplication::Private::~Private() {
84} 100}
85QPEApplication::Private::Private() 101QPEApplication::Private::Private()
86 : kbgrabber(0 ), presstimer(0 ), rightpressed( FALSE ), kbregrab( FALSE ), notbusysent( FALSE ), 102 : kbgrabber(0 ), presstimer(0 ), rightpressed( FALSE ), kbregrab( FALSE ), notbusysent( FALSE ),
87 preloaded( FALSE ), forceshow( FALSE ), nomaximize( FALSE ), keep_running( TRUE ), 103 preloaded( FALSE ), forceshow( FALSE ), nomaximize( FALSE ), keep_running( TRUE ),
88 presswidget( 0 ), qpe_main_widget(0 ) { 104 presswidget( 0 ), qpe_main_widget(0 ) {
89 105
90 qcopq.setAutoDelete( TRUE ); 106 qcopq.setAutoDelete( TRUE );
91} 107}
92void QPEApplication::Private::enqueueQCop( const QCString& chan, const QCString& msg, 108void QPEApplication::Private::enqueueQCop( const QCString& chan, const QCString& msg,
93 const QByteArray& ar ) { 109 const QByteArray& ar ) {
94 qcopq.append( new QCopRec(chan, msg, ar ) ); 110 qcopq.append( new QCopRec(chan, msg, ar ) );
95} 111}
96void QPEApplication::Private::sendQCopQ() { 112void QPEApplication::Private::sendQCopQ() {
97 QCopRec* r; 113 QCopRec* r;
98 for ( r = qcopq.first(); r; r = qcopq.next() ) { 114 for ( r = qcopq.first(); r; r = qcopq.next() ) {
99 QCopChannel::sendLocally( r->channel, r->message, r->data ); 115 QCopChannel::sendLocally( r->channel, r->message, r->data );
100 } 116 }
101 qcopq.clear(); 117 qcopq.clear();
102} 118}
103void QPEApplication::Private::show_mx(QWidget* mw, bool nomaximize ) { 119void QPEApplication::Private::show_mx(QWidget* mw, bool nomaximize ) {
104 if (mw->layout() && mw->inherits("QDialog") ) { 120 if (mw->layout() && mw->inherits("QDialog") ) {
105 QPEApplication::showDialog( (QDialog*)mw, nomaximize ); 121 QPEApplication::showDialog( (QDialog*)mw, nomaximize );
106 }else { 122 }else {
107 if (!nomaximize ) 123 if (!nomaximize )
108 mw->showMaximized(); 124 mw->showMaximized();
109 else 125 else
110 mw->show(); 126 mw->show();
111 } 127 }
112} 128}
113void QPEApplication::Private::show( QWidget* mw, bool nomax ) { 129void QPEApplication::Private::show( QWidget* mw, bool nomax ) {
114 nomaximize = nomax; 130 nomaximize = nomax;
115 qpe_main_widget = mw; 131 qpe_main_widget = mw;
116 132
117 sendQCopQ(); 133 sendQCopQ();
118 134
119 if ( preloaded ) { 135 if ( preloaded ) {
120 if (forceshow ) 136 if (forceshow )
121 show_mx(mw, nomax ); 137 show_mx(mw, nomax );
122 }else if ( keep_running ) 138 }else if ( keep_running )
123 show_mx( mw, nomax ); 139 show_mx( mw, nomax );
124} 140}
125void QPEApplication::Private::loadTextCodecs() { 141void QPEApplication::Private::loadTextCodecs() {
126 QString path = QPEApplication::qpeDir() + "/plugins/textcodecs"; 142 QString path = QPEApplication::qpeDir() + "/plugins/textcodecs";
127 QDir dir( path, "lib*.so" ); 143 QDir dir( path, "lib*.so" );
128 QStringList list = dir.entryList(); 144 QStringList list = dir.entryList();
129 QStringList::Iterator it; 145 QStringList::Iterator it;
130 for ( it = list.begin(); it != list.end(); ++it ) { 146 for ( it = list.begin(); it != list.end(); ++it ) {
131 TextCodecInterface *iface = 0; 147 TextCodecInterface *iface = 0;
132 QLibrary *lib = new QLibrary( path + "/" + *it ); 148 QLibrary *lib = new QLibrary( path + "/" + *it );
133 if ( lib->queryInterface( IID_QtopiaTextCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) { 149 if ( lib->queryInterface( IID_QtopiaTextCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) {
134 QValueList<int> mibs = iface->mibEnums(); 150 QValueList<int> mibs = iface->mibEnums();
135 for (QValueList<int>::ConstIterator i = mibs.begin(); i != mibs.end(); ++i) { 151 for (QValueList<int>::ConstIterator i = mibs.begin(); i != mibs.end(); ++i) {
136 (void)iface->createForMib(*i); 152 (void)iface->createForMib(*i);
137 // ### it exists now; need to remember if we can delete it 153 // ### it exists now; need to remember if we can delete it
138 } 154 }
139 } 155 }
140 else { 156 else {
141 lib->unload(); 157 lib->unload();
142 delete lib; 158 delete lib;
@@ -158,128 +174,154 @@ void QPEApplication::Private::loadImageCodecs() {
158 // ### it exists now; need to remember if we can delete it 174 // ### it exists now; need to remember if we can delete it
159 } 175 }
160 } 176 }
161 else { 177 else {
162 lib->unload(); 178 lib->unload();
163 delete lib; 179 delete lib;
164 } 180 }
165 } 181 }
166} 182}
167 183
168// The Help System hook 184// The Help System hook
169namespace { 185namespace {
170 class ResourceMimeFactory : public QMimeSourceFactory 186 class ResourceMimeFactory : public QMimeSourceFactory
171 { 187 {
172 public: 188 public:
173 ResourceMimeFactory(); 189 ResourceMimeFactory();
174 ~ResourceMimeFactory(); 190 ~ResourceMimeFactory();
175 const QMimeSource* data( const QString& abs_name )const; 191 const QMimeSource* data( const QString& abs_name )const;
176 }; 192 };
177 ResourceMimeFactory::ResourceMimeFactory() 193 ResourceMimeFactory::ResourceMimeFactory()
178 { 194 {
179 setFilePath( Global::helpPath() ); 195 setFilePath( Global::helpPath() );
180 setExtensionType( "html", "text/html;charset=UTF-8" ); 196 setExtensionType( "html", "text/html;charset=UTF-8" );
181 } 197 }
182 ResourceMimeFactory::~ResourceMimeFactory() { 198 ResourceMimeFactory::~ResourceMimeFactory() {
183 } 199 }
184 200
185 const QMimeSource* ResourceMimeFactory::data( const QString& abs_name ) const 201 const QMimeSource* ResourceMimeFactory::data( const QString& abs_name ) const
186 { 202 {
187 const QMimeSource * r = QMimeSourceFactory::data( abs_name ); 203 const QMimeSource * r = QMimeSourceFactory::data( abs_name );
188 if ( !r ) { 204 if ( !r ) {
189 int sl = abs_name.length(); 205 int sl = abs_name.length();
190 do { 206 do {
191 sl = abs_name.findRev( '/', sl - 1 ); 207 sl = abs_name.findRev( '/', sl - 1 );
192 QString name = sl >= 0 ? abs_name.mid( sl + 1 ) : abs_name; 208 QString name = sl >= 0 ? abs_name.mid( sl + 1 ) : abs_name;
193 int dot = name.findRev( '.' ); 209 int dot = name.findRev( '.' );
194 if ( dot >= 0 ) 210 if ( dot >= 0 )
195 name = name.left( dot ); 211 name = name.left( dot );
196 QImage img = Resource::loadImage( name ); 212 QImage img = Resource::loadImage( name );
197 if ( !img.isNull() ) 213 if ( !img.isNull() )
198 r = new QImageDrag( img ); 214 r = new QImageDrag( img );
199 } 215 }
200 while ( !r && sl > 0 ); 216 while ( !r && sl > 0 );
201 } 217 }
202 return r; 218 return r;
203 }; 219 };
204}; 220};
205// QPEApplication 221// QPEApplication
206QPEApplication::~QPEApplication() { 222QPEApplication::~QPEApplication() {
207 qWarning("~QPEApplication"); 223 qWarning("~QPEApplication");
208 ungrabKeyboard(); 224 ungrabKeyboard();
209 qWarning("UngrabKeyboard"); 225 qWarning("UngrabKeyboard");
210 226
211// delete m_sys; 227// delete m_sys;
212// delete m_pid; 228// delete m_pid;
213 229
214 delete d; 230 delete d;
215} 231}
216QPEApplication::QPEApplication(int &arg, char** argv, Type t) 232QPEApplication::QPEApplication(int &arg, char** argv, Type t)
217 : QApplication( arg, argv, t ) { 233 : QApplication( arg, argv, t ) {
218 d = new Private; 234 d = new Private;
219 d->loadTextCodecs(); 235 d->loadTextCodecs();
220 d->loadImageCodecs(); 236 d->loadImageCodecs();
221 237
238 // Init X-Atom
239 Atom *atoms[5];
240 Atom atoms_re[5];
241 char* names[5];
242 int n = 0;
243 atoms[n] = &d->wm_delete_window;
244 names[n++] = "WM_DELETE_WINDOW";
245
246 atoms[n] = &d->wm_take_focus;
247 names[n++] = "WM_TAKE_FOCUS";
248
249 atoms[n] = &d->wm_context_help;
250 names[n++] = "_NET_WM_CONTEXT_HELP";
251
252 atoms[n] = &d->wm_context_accept;
253 names[n++] = "_NET_WM_CONTEXT_ACCEPT";
254
255 atoms[n] = &d->wm_protocols;
256 names[n++] = "WM_PROTOCOLS";
257
258 XInternAtoms( qt_xdisplay(), names, n, FALSE, atoms_re);
259 // now copy the values over to the properties
260 for (int i = 0; i < n; i++ )
261 *atoms[i] = atoms_re[i];
262 // done with X11 Stuff
263
222 int dw = desktop()->width(); 264 int dw = desktop()->width();
223 if ( dw < 200 ) { 265 if ( dw < 200 ) {
224 setFont( QFont( "helvetica", 8 ) ); 266 setFont( QFont( "helvetica", 8 ) );
225 AppLnk::setSmallIconSize( 10 ); 267 AppLnk::setSmallIconSize( 10 );
226 AppLnk::setBigIconSize( 28 ); 268 AppLnk::setBigIconSize( 28 );
227 }else if ( dw > 600 ) { 269 }else if ( dw > 600 ) {
228 setFont( QFont( "helvetica", 12 ) ); 270 setFont( QFont( "helvetica", 12 ) );
229 AppLnk::setSmallIconSize( 24 ); 271 AppLnk::setSmallIconSize( 24 );
230 AppLnk::setBigIconSize( 48 ); 272 AppLnk::setBigIconSize( 48 );
231 }else if ( dw > 200 ) { 273 }else if ( dw > 200 ) {
232 setFont( QFont( "helvetica", 10 ) ); 274 setFont( QFont( "helvetica", 10 ) );
233 AppLnk::setSmallIconSize( 16 ); 275 AppLnk::setSmallIconSize( 16 );
234 AppLnk::setBigIconSize( 32 ); 276 AppLnk::setBigIconSize( 32 );
235 } 277 }
236 QMimeSourceFactory::setDefaultFactory( new ResourceMimeFactory ); 278 QMimeSourceFactory::setDefaultFactory( new ResourceMimeFactory );
237 279
238 connect( this, SIGNAL( lastWindowClosed() ), this, SLOT(hideOrQuit() ) ); 280 connect( this, SIGNAL( lastWindowClosed() ), this, SLOT(hideOrQuit() ) );
239 281
240 QString qcopfn( "/tmp/qcop-msg-" ); 282 QString qcopfn( "/tmp/qcop-msg-" );
241 qcopfn += QString( argv[0] ); // append command name to the QCOP name 283 qcopfn += QString( argv[0] ); // append command name to the QCOP name
242 QFile file( qcopfn ); 284 QFile file( qcopfn );
243 if (file.open(IO_ReadOnly ) ) { 285 if (file.open(IO_ReadOnly ) ) {
244 flock( file.handle(), LOCK_EX ); 286 flock( file.handle(), LOCK_EX );
245 } 287 }
246 288
247 /* Hmmm damn we need to make the parent 0l otherwise it get's deleted 289 /* Hmmm damn we need to make the parent 0l otherwise it get's deleted
248 * past the QApplication 290 * past the QApplication
249 */ 291 */
250 m_sys = new QCopChannel( "QPE/System", 0l); 292 m_sys = new QCopChannel( "QPE/System", 0l);
251 connect(m_sys, SIGNAL( received( const QCString&, const QByteArray& ) ), 293 connect(m_sys, SIGNAL( received( const QCString&, const QByteArray& ) ),
252 this, SLOT(systemMessage( const QCString&, const QByteArray& ) ) ); 294 this, SLOT(systemMessage( const QCString&, const QByteArray& ) ) );
253 295
254 // private channel QPE/Application/appname 296 // private channel QPE/Application/appname
255 QCString channel = QCString( argv[0] ); 297 QCString channel = QCString( argv[0] );
256 channel.replace( QRegExp( ".*/"), "" ); 298 channel.replace( QRegExp( ".*/"), "" );
257 d->appName = channel; 299 d->appName = channel;
258 channel = "QPE/Application/"+ channel; 300 channel = "QPE/Application/"+ channel;
259 m_pid = new QCopChannel( channel, 0l ); 301 m_pid = new QCopChannel( channel, 0l );
260 connect(m_pid, SIGNAL( received( const QCString&, const QByteArray& ) ), 302 connect(m_pid, SIGNAL( received( const QCString&, const QByteArray& ) ),
261 this, SLOT( pidMessage( const QCString&, const QByteArray& ) ) ); 303 this, SLOT( pidMessage( const QCString&, const QByteArray& ) ) );
262 304
263 // read the Pre QCOP Stuff from the file 305 // read the Pre QCOP Stuff from the file
264 if ( file.isOpen() ) { 306 if ( file.isOpen() ) {
265 d->keep_running = FALSE; 307 d->keep_running = FALSE;
266 QDataStream ds( &file ); 308 QDataStream ds( &file );
267 QCString chanel, message; 309 QCString chanel, message;
268 QByteArray data; 310 QByteArray data;
269 while (!ds.atEnd() ) { 311 while (!ds.atEnd() ) {
270 ds >> chanel >> message >> data; 312 ds >> chanel >> message >> data;
271 d->enqueueQCop( chanel, message, data ); 313 d->enqueueQCop( chanel, message, data );
272 } 314 }
273 flock( file.handle(), LOCK_UN ); 315 flock( file.handle(), LOCK_UN );
274 file.close(); 316 file.close();
275 file.remove(); 317 file.remove();
276 } 318 }
277 319
278 // read in some stuff from the command line 320 // read in some stuff from the command line
279 // we do not have setArgs so we need to take 321 // we do not have setArgs so we need to take
280 // care of that 322 // care of that
281 for ( int a = 0; a < arg; a++ ) { 323 for ( int a = 0; a < arg; a++ ) {
282 if ( qstrcmp( argv[a], "-preload" ) == 0 ) { 324 if ( qstrcmp( argv[a], "-preload" ) == 0 ) {
283 d->preloaded = TRUE; 325 d->preloaded = TRUE;
284 }else if ( qstrcmp( argv[a ] , "-preload-show" ) == 0 ) { 326 }else if ( qstrcmp( argv[a ] , "-preload-show" ) == 0 ) {
285 d->preloaded = TRUE; 327 d->preloaded = TRUE;
@@ -469,230 +511,278 @@ void QPEApplication::timerEvent( QTimerEvent* e ) {
469 postEvent( d->presswidget, 511 postEvent( d->presswidget,
470 new QMouseEvent( QEvent::MouseButtonPress, d->presspos, 512 new QMouseEvent( QEvent::MouseButtonPress, d->presspos,
471 RightButton, LeftButton ) ); 513 RightButton, LeftButton ) );
472 killTimer( d->presstimer ); 514 killTimer( d->presstimer );
473 d->presstimer = 0; 515 d->presstimer = 0;
474 } 516 }
475} 517}
476 518
477// InputMethods Hints 519// InputMethods Hints
478namespace { 520namespace {
479 static QPtrDict<void>* inputMethodDict = 0; 521 static QPtrDict<void>* inputMethodDict = 0;
480 static void createInputMethodDict(){ 522 static void createInputMethodDict(){
481 if ( !inputMethodDict ) 523 if ( !inputMethodDict )
482 inputMethodDict = new QPtrDict<void>; 524 inputMethodDict = new QPtrDict<void>;
483 } 525 }
484 526
485 static QPtrDict<void>* stylusDict = 0; 527 static QPtrDict<void>* stylusDict = 0;
486 static void createDict() { 528 static void createDict() {
487 if ( !stylusDict ) 529 if ( !stylusDict )
488 stylusDict = new QPtrDict<void>; 530 stylusDict = new QPtrDict<void>;
489 } 531 }
490}; 532};
491 533
492void QPEApplication::setInputMethodHint( QWidget* w, InputMethodHint mode ) { 534void QPEApplication::setInputMethodHint( QWidget* w, InputMethodHint mode ) {
493 createInputMethodDict(); 535 createInputMethodDict();
494 if ( mode == Normal ) { 536 if ( mode == Normal ) {
495 inputMethodDict->remove 537 inputMethodDict->remove
496 ( w ); 538 ( w );
497 }else { 539 }else {
498 inputMethodDict->insert( w, ( void* ) mode ); 540 inputMethodDict->insert( w, ( void* ) mode );
499 } 541 }
500} 542}
501QPEApplication::InputMethodHint QPEApplication::inputMethodHint( QWidget* w) { 543QPEApplication::InputMethodHint QPEApplication::inputMethodHint( QWidget* w) {
502 if ( inputMethodDict && w ) 544 if ( inputMethodDict && w )
503 return ( InputMethodHint ) ( int ) inputMethodDict->find( w ); 545 return ( InputMethodHint ) ( int ) inputMethodDict->find( w );
504 return Normal; 546 return Normal;
505} 547}
506 548
507 549
508void QPEApplication::removeSenderFromStylusDict() { 550void QPEApplication::removeSenderFromStylusDict() {
509 stylusDict->remove( ( void* ) sender() ); 551 stylusDict->remove( ( void* ) sender() );
510 if ( d->presswidget == sender() ) 552 if ( d->presswidget == sender() )
511 d->presswidget = 0; 553 d->presswidget = 0;
512} 554}
513void QPEApplication::setStylusOperation( QWidget* w, StylusMode mode) { 555void QPEApplication::setStylusOperation( QWidget* w, StylusMode mode) {
514 createDict(); 556 createDict();
515 if ( mode == LeftOnly ) { 557 if ( mode == LeftOnly ) {
516 stylusDict->remove 558 stylusDict->remove
517 ( w ); 559 ( w );
518 w->removeEventFilter( qApp ); 560 w->removeEventFilter( qApp );
519 }else { 561 }else {
520 stylusDict->insert( w, ( void* ) mode ); 562 stylusDict->insert( w, ( void* ) mode );
521 connect( w, SIGNAL( destroyed() ), qApp, SLOT( removeSenderFromStylusDict() ) ); 563 connect( w, SIGNAL( destroyed() ), qApp, SLOT( removeSenderFromStylusDict() ) );
522 w->installEventFilter( qApp ); 564 w->installEventFilter( qApp );
523 } 565 }
524} 566}
525QPEApplication::StylusMode QPEApplication::stylusOperation( QWidget* w) { 567QPEApplication::StylusMode QPEApplication::stylusOperation( QWidget* w) {
526 if ( stylusDict ) 568 if ( stylusDict )
527 return ( StylusMode ) ( int ) stylusDict->find( w ); 569 return ( StylusMode ) ( int ) stylusDict->find( w );
528 return LeftOnly; 570 return LeftOnly;
529} 571}
530 572
531// eventFilter...... 573// eventFilter......
532bool QPEApplication::eventFilter( QObject* o, QEvent* e ) { 574bool QPEApplication::eventFilter( QObject* o, QEvent* e ) {
575 /*
576 * We want our WM to show Ok and a X button
577 * on dialogs
578 * our part is to set the _NET_WM_CONTEXT_ACCEPT
579 * propery
580 * and then wait for a client message -zecke
581 * on show we will add the prop
582 */
583 if (o->inherits("QDialog") && e->type() == QEvent::Show ) {
584 QDialog* dialog = (QDialog*)o;
585 Atom wm_prot[45];
586 int n = 0;
587 wm_prot[n++] = d->wm_delete_window;
588 wm_prot[n++] = d->wm_take_focus;
589 wm_prot[n++] = d->wm_context_accept;
590 if ( dialog->testWFlags( WStyle_ContextHelp ) )
591 wm_prot[n++] = d->wm_context_help;
592 XSetWMProtocols( qt_xdisplay(), dialog->winId(), wm_prot, n );
593 return TRUE; // should be save
594 }
533 if ( stylusDict && e->type() >= QEvent::MouseButtonPress && e->type() <= QEvent::MouseMove ) { 595 if ( stylusDict && e->type() >= QEvent::MouseButtonPress && e->type() <= QEvent::MouseMove ) {
534 QMouseEvent * me = ( QMouseEvent* ) e; 596 QMouseEvent * me = ( QMouseEvent* ) e;
535 StylusMode mode = (StylusMode)(int)stylusDict->find(o); 597 StylusMode mode = (StylusMode)(int)stylusDict->find(o);
536 switch (mode) { 598 switch (mode) {
537 case RightOnHold: 599 case RightOnHold:
538 switch ( me->type() ) { 600 switch ( me->type() ) {
539 case QEvent::MouseButtonPress: 601 case QEvent::MouseButtonPress:
540 if ( me->button() == LeftButton ) { 602 if ( me->button() == LeftButton ) {
541 d->presstimer = startTimer(500); // #### pref. 603 d->presstimer = startTimer(500); // #### pref.
542 d->presswidget = (QWidget*)o; 604 d->presswidget = (QWidget*)o;
543 d->presspos = me->pos(); 605 d->presspos = me->pos();
544 d->rightpressed = FALSE; 606 d->rightpressed = FALSE;
545 } 607 }
546 break; 608 break;
547 case QEvent::MouseMove: 609 case QEvent::MouseMove:
548 if (d->presstimer && (me->pos() - d->presspos).manhattanLength() > 8) { 610 if (d->presstimer && (me->pos() - d->presspos).manhattanLength() > 8) {
549 killTimer(d->presstimer); 611 killTimer(d->presstimer);
550 d->presstimer = 0; 612 d->presstimer = 0;
551 } 613 }
552 break; 614 break;
553 case QEvent::MouseButtonRelease: 615 case QEvent::MouseButtonRelease:
554 if ( me->button() == LeftButton ) { 616 if ( me->button() == LeftButton ) {
555 if ( d->presstimer ) { 617 if ( d->presstimer ) {
556 killTimer(d->presstimer); 618 killTimer(d->presstimer);
557 d->presstimer = 0; 619 d->presstimer = 0;
558 } 620 }
559 if ( d->rightpressed && d->presswidget ) { 621 if ( d->rightpressed && d->presswidget ) {
560 // Right released 622 // Right released
561 postEvent( d->presswidget, 623 postEvent( d->presswidget,
562 new QMouseEvent( QEvent::MouseButtonRelease, me->pos(), 624 new QMouseEvent( QEvent::MouseButtonRelease, me->pos(),
563 RightButton, LeftButton + RightButton ) ); 625 RightButton, LeftButton + RightButton ) );
564 // Left released, off-widget 626 // Left released, off-widget
565 postEvent( d->presswidget, 627 postEvent( d->presswidget,
566 new QMouseEvent( QEvent::MouseMove, QPoint( -1, -1), 628 new QMouseEvent( QEvent::MouseMove, QPoint( -1, -1),
567 LeftButton, LeftButton ) ); 629 LeftButton, LeftButton ) );
568 postEvent( d->presswidget, 630 postEvent( d->presswidget,
569 new QMouseEvent( QEvent::MouseButtonRelease, QPoint( -1, -1), 631 new QMouseEvent( QEvent::MouseButtonRelease, QPoint( -1, -1),
570 LeftButton, LeftButton ) ); 632 LeftButton, LeftButton ) );
571 d->rightpressed = FALSE; 633 d->rightpressed = FALSE;
572 return TRUE; // don't send the real Left release 634 return TRUE; // don't send the real Left release
573 } 635 }
574 } 636 }
575 break; 637 break;
576 default: 638 default:
577 break; 639 break;
578 } 640 }
579 break; 641 break;
580 default: 642 default:
581 ; 643 ;
582 } 644 }
583 } 645 }
584 else if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) { 646 else if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) {
585 QKeyEvent *ke = (QKeyEvent *)e; 647 QKeyEvent *ke = (QKeyEvent *)e;
586 if ( ke->key() == Key_Enter ) { 648 if ( ke->key() == Key_Enter ) {
587 if ( o->isA( "QRadioButton" ) || o->isA( "QCheckBox" ) ) { 649 if ( o->isA( "QRadioButton" ) || o->isA( "QCheckBox" ) ) {
588 postEvent( o, new QKeyEvent( e->type(), Key_Space, ' ', 650 postEvent( o, new QKeyEvent( e->type(), Key_Space, ' ',
589 ke->state(), " ", ke->isAutoRepeat(), ke->count() ) ); 651 ke->state(), " ", ke->isAutoRepeat(), ke->count() ) );
590 return TRUE; 652 return TRUE;
591 } 653 }
592 } 654 }
593 } 655 }
594 return FALSE; 656 return FALSE;
595} 657}
596 658
597// Quit stuff 659// Quit stuff
598void QPEApplication::restart() { 660void QPEApplication::restart() {
599 661
600} 662}
601void QPEApplication::shutdown() { 663void QPEApplication::shutdown() {
602 664
603} 665}
604void QPEApplication::tryQuit() { 666void QPEApplication::tryQuit() {
605 qWarning("TryQuit!!"); 667 qWarning("TryQuit!!");
606 if ( activeModalWidget() || strcmp( argv() [ 0 ], "embeddedkonsole" ) == 0 ) 668 if ( activeModalWidget() || strcmp( argv() [ 0 ], "embeddedkonsole" ) == 0 )
607 return ; // Inside modal loop or konsole. Too hard to save state. 669 return ; // Inside modal loop or konsole. Too hard to save state.
608 { 670 {
609 QCopEnvelope e( "QPE/System", "closing(QString)" ); 671 QCopEnvelope e( "QPE/System", "closing(QString)" );
610 e << d->appName; 672 e << d->appName;
611 } 673 }
612 processEvents(); 674 processEvents();
613 675
614 quit(); 676 quit();
615} 677}
616void QPEApplication::hideOrQuit() { 678void QPEApplication::hideOrQuit() {
617 qWarning("hide or close"); 679 qWarning("hide or close");
618 processEvents(); 680 processEvents();
619 qWarning("past processing"); 681 qWarning("past processing");
620 682
621 // If we are a preloaded application we don't actually quit, so emit 683 // If we are a preloaded application we don't actually quit, so emit
622 // a System message indicating we're quasi-closing. 684 // a System message indicating we're quasi-closing.
623 if ( d->preloaded && d->qpe_main_widget ) 685 if ( d->preloaded && d->qpe_main_widget )
624 686
625 { 687 {
626 qWarning("hiding"); 688 qWarning("hiding");
627 QCopEnvelope e("QPE/System", "fastAppHiding(QString)" ); 689 QCopEnvelope e("QPE/System", "fastAppHiding(QString)" );
628 e << d->appName; 690 e << d->appName;
629 d->qpe_main_widget->hide(); 691 d->qpe_main_widget->hide();
630 } 692 }
631 else 693 else
632 quit(); 694 quit();
633} 695}
634 696
635/*! 697/*!
636 \internal 698 \internal
637*/ 699*/
638void QPEApplication::prepareForTermination( bool willrestart ) 700void QPEApplication::prepareForTermination( bool willrestart )
639{ 701{
640 if ( willrestart ) { 702 if ( willrestart ) {
641 // Draw a big wait icon, the image can be altered in later revisions 703 // Draw a big wait icon, the image can be altered in later revisions
642 // QWidget *d = QApplication::desktop(); 704 // QWidget *d = QApplication::desktop();
643 QImage img = Resource::loadImage( "launcher/new_wait" ); 705 QImage img = Resource::loadImage( "launcher/new_wait" );
644 QPixmap pix; 706 QPixmap pix;
645 pix.convertFromImage( img.smoothScale( 1 * img.width(), 1 * img.height() ) ); 707 pix.convertFromImage( img.smoothScale( 1 * img.width(), 1 * img.height() ) );
646 QLabel *lblWait = new QLabel( 0, "wait hack!", QWidget::WStyle_Customize | 708 QLabel *lblWait = new QLabel( 0, "wait hack!", QWidget::WStyle_Customize |
647 QWidget::WStyle_NoBorder | QWidget::WStyle_Tool ); 709 QWidget::WStyle_NoBorder | QWidget::WStyle_Tool );
648 lblWait->setPixmap( pix ); 710 lblWait->setPixmap( pix );
649 lblWait->setAlignment( QWidget::AlignCenter ); 711 lblWait->setAlignment( QWidget::AlignCenter );
650 lblWait->show(); 712 lblWait->show();
651 lblWait->showMaximized(); 713 lblWait->showMaximized();
652 } 714 }
653#ifndef SINGLE_APP 715#ifndef SINGLE_APP
654 { QCopEnvelope envelope( "QPE/System", "forceQuit()" ); 716 { QCopEnvelope envelope( "QPE/System", "forceQuit()" );
655 } 717 }
656 processEvents(); // ensure the message goes out. 718 processEvents(); // ensure the message goes out.
657 sleep( 1 ); // You have 1 second to comply. 719 sleep( 1 ); // You have 1 second to comply.
658#endif 720#endif
659} 721}
722int QPEApplication::x11ClientMessage(QWidget* w, XEvent* event, bool b ) {
723 qWarning("X11 ClientMessage %d %d", event->type, ClientMessage);
724 if ( event->type == ClientMessage ) {
725 if ( (event->xclient.message_type == d->wm_protocols) &&
726 (event->xclient.data.l[0] == d->wm_context_accept ) ) {
727 qWarning("accepted!!!");
728 /*
729 * I'm not sure if we should use activeWidget
730 * or activeModalWidget
731 * a QDialog could be not modal too
732 */
733 if ( w->inherits("QDialog" ) ) {
734 qWarning("inherits QDialog!!!");
735 QDialog* dia = (QDialog*)w;
736 /*
737 * call it directly or via QTimer::singleShot?
738 */
739 QTimer::singleShot(0, dia, SLOT(reject() ) );
740 return 0;
741 }
742
743 }
744 }
745 return QApplication::x11ClientMessage(w, event, b );
746}
747
748#define KeyPress XKeyPress
749#define KeyRelease XKeyRelease
660 750
661#if defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX) 751#if defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX)
662 752
663// The libraries with the skiff package (and possibly others) have 753// The libraries with the skiff package (and possibly others) have
664// completely useless implementations of builtin new and delete that 754// completely useless implementations of builtin new and delete that
665// use about 50% of your CPU. Here we revert to the simple libc 755// use about 50% of your CPU. Here we revert to the simple libc
666// functions. 756// functions.
667 757
668void* operator new[]( size_t size ) 758void* operator new[]( size_t size )
669{ 759{
670 return malloc( size ); 760 return malloc( size );
671} 761}
672 762
673void* operator new( size_t size ) 763void* operator new( size_t size )
674{ 764{
675 return malloc( size ); 765 return malloc( size );
676} 766}
677 767
678void operator delete[]( void* p ) 768void operator delete[]( void* p )
679{ 769{
680 free( p ); 770 free( p );
681} 771}
682 772
683void operator delete[]( void* p, size_t /*size*/ ) 773void operator delete[]( void* p, size_t /*size*/ )
684{ 774{
685 free( p ); 775 free( p );
686} 776}
687 777
688void operator delete( void* p ) 778void operator delete( void* p )
689{ 779{
690 free( p ); 780 free( p );
691} 781}
692 782
693void operator delete( void* p, size_t /*size*/ ) 783void operator delete( void* p, size_t /*size*/ )
694{ 784{
695 free( p ); 785 free( p );
696} 786}
697 787
698#endif 788#endif
diff --git a/x11/libqpe-x11/qpe/qpeapplication.h b/x11/libqpe-x11/qpe/qpeapplication.h
index 333f331..254fbfa 100644
--- a/x11/libqpe-x11/qpe/qpeapplication.h
+++ b/x11/libqpe-x11/qpe/qpeapplication.h
@@ -1,102 +1,104 @@
1#ifndef OPIE_QPE_APPLICATION_H 1#ifndef OPIE_QPE_APPLICATION_H
2#define OPIE_QPE_APPLICATION_H 2#define OPIE_QPE_APPLICATION_H
3 3
4/** 4/**
5 * LGPLed 5 * LGPLed
6 */ 6 */
7 7
8#include <qapplication.h> 8#include <qapplication.h>
9#include <qevent.h> 9#include <qevent.h>
10 10
11#include <qpe/timestring.h> 11#include <qpe/timestring.h>
12 12
13class QCopChannel; 13class QCopChannel;
14class QPEApplication : public QApplication { 14class QPEApplication : public QApplication {
15 Q_OBJECT 15 Q_OBJECT
16public: 16public:
17 QPEApplication(int& argc, char** argv, Type=GuiClient ); 17 QPEApplication(int& argc, char** argv, Type=GuiClient );
18 ~QPEApplication(); 18 ~QPEApplication();
19 19
20 20
21 static QString qpeDir(); 21 static QString qpeDir();
22 static QString documentDir(); 22 static QString documentDir();
23 void applyStyle(); 23 void applyStyle();
24 24
25 static int defaultRotation(); 25 static int defaultRotation();
26 static void setDefaultRotation( int r ); 26 static void setDefaultRotation( int r );
27 static void grabKeyboard(); 27 static void grabKeyboard();
28 static void ungrabKeyboard(); 28 static void ungrabKeyboard();
29 29
30 enum StylusMode { 30 enum StylusMode {
31 LeftOnly, 31 LeftOnly,
32 RightOnHold 32 RightOnHold
33 }; 33 };
34 static void setStylusOperation( QWidget*, StylusMode ); 34 static void setStylusOperation( QWidget*, StylusMode );
35 static StylusMode stylusOperation( QWidget* ); 35 static StylusMode stylusOperation( QWidget* );
36 36
37 enum InputMethodHint { 37 enum InputMethodHint {
38 Normal, 38 Normal,
39 AlwaysOff, 39 AlwaysOff,
40 AlwaysOn 40 AlwaysOn
41 }; 41 };
42 static void setInputMethodHint( QWidget*, InputMethodHint ); 42 static void setInputMethodHint( QWidget*, InputMethodHint );
43 static InputMethodHint inputMethodHint( QWidget* ); 43 static InputMethodHint inputMethodHint( QWidget* );
44 44
45 void showMainWidget( QWidget*, bool nomax = FALSE ); 45 void showMainWidget( QWidget*, bool nomax = FALSE );
46 void showMainDocumentWidget( QWidget*, bool nomax = FALSE ); 46 void showMainDocumentWidget( QWidget*, bool nomax = FALSE );
47 47
48 static void showDialog( QDialog*, bool nomax = FALSE ); 48 static void showDialog( QDialog*, bool nomax = FALSE );
49 static int execDialog( QDialog*, bool nomax = FALSE ); 49 static int execDialog( QDialog*, bool nomax = FALSE );
50 50
51 static void setKeepRunning(); 51 static void setKeepRunning();
52 bool keepRunning()const; 52 bool keepRunning()const;
53 53
54 bool keyboardGrabbed()const; 54 bool keyboardGrabbed()const;
55 int exec(); 55 int exec();
56 56
57// QWS bits 57// QWS bits
58 enum screenSaverHint { 58 enum screenSaverHint {
59 Disable = 0, 59 Disable = 0,
60 DisableLightOff = 1, 60 DisableLightOff = 1,
61 DisableSuspend = 2, 61 DisableSuspend = 2,
62 Enable = 100 62 Enable = 100
63 }; 63 };
64 /* reimplemented for internal purposes */
65 int x11ClientMessage( QWidget*, XEvent*, bool );
64 66
65signals: 67signals:
66 void clientMoused(); 68 void clientMoused();
67 void timeChanged(); 69 void timeChanged();
68 void clockChanged( bool pm ); 70 void clockChanged( bool pm );
69 void micChanged( bool muted ); 71 void micChanged( bool muted );
70 void volumeChanged( bool muted ); 72 void volumeChanged( bool muted );
71 void appMessage( const QCString& msg, const QByteArray& data); 73 void appMessage( const QCString& msg, const QByteArray& data);
72 void weekChanged( bool startOnMonday ); 74 void weekChanged( bool startOnMonday );
73 void dateFormatChanged( DateFormat ); 75 void dateFormatChanged( DateFormat );
74 void flush(); 76 void flush();
75 void reload(); 77 void reload();
76 78
77private: 79private:
78 void initTranslations(); 80 void initTranslations();
79 void internalSetStyle(const QString&); 81 void internalSetStyle(const QString&);
80 82
81private slots: 83private slots:
82 void hideOrQuit(); 84 void hideOrQuit();
83 void systemMessage( const QCString&, const QByteArray& ); 85 void systemMessage( const QCString&, const QByteArray& );
84 void pidMessage( const QCString&, const QByteArray& ); 86 void pidMessage( const QCString&, const QByteArray& );
85 void removeSenderFromStylusDict(); 87 void removeSenderFromStylusDict();
86protected: 88protected:
87 virtual void restart(); 89 virtual void restart();
88 virtual void shutdown(); 90 virtual void shutdown();
89 void prepareForTermination(bool willrestart); 91 void prepareForTermination(bool willrestart);
90 bool eventFilter( QObject*, QEvent* ); 92 bool eventFilter( QObject*, QEvent* );
91 void timerEvent( QTimerEvent* ); 93 void timerEvent( QTimerEvent* );
92 void raiseAppropriateWindow(); 94 void raiseAppropriateWindow();
93 virtual void tryQuit(); 95 virtual void tryQuit();
94 96
95private: 97private:
96 class Private; 98 class Private;
97 Private* d; 99 Private* d;
98 QCopChannel *m_sys; 100 QCopChannel *m_sys;
99 QCopChannel *m_pid; 101 QCopChannel *m_pid;
100}; 102};
101 103
102#endif 104#endif