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
@@ -159,33 +159,33 @@ void OCopServer::newOnClient( int fd ) {
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
@@ -209,62 +209,64 @@ void OCopServer::registerClient( int fd ) {
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 ) {
@@ -322,44 +324,53 @@ QStringList OCopServer::channels() {
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();
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,26 +1,28 @@
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>
@@ -29,16 +31,25 @@
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;
@@ -71,16 +82,21 @@ public:
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 ),
@@ -214,16 +230,42 @@ QPEApplication::~QPEApplication() {
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 );
@@ -525,16 +567,36 @@ void QPEApplication::setStylusOperation( QWidget* w, StylusMode mode) {
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 ) {
@@ -652,16 +714,44 @@ void QPEApplication::prepareForTermination( bool willrestart )
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
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
@@ -56,16 +56,18 @@ public:
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);