summaryrefslogtreecommitdiff
path: root/x11/libqpe-x11/qpe/qpeapplication.cpp
Unidiff
Diffstat (limited to 'x11/libqpe-x11/qpe/qpeapplication.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--x11/libqpe-x11/qpe/qpeapplication.cpp90
1 files changed, 90 insertions, 0 deletions
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,126 +1,142 @@
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";
@@ -174,96 +190,122 @@ namespace {
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() ) {
@@ -485,96 +527,116 @@ namespace {
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:
@@ -612,87 +674,115 @@ void QPEApplication::tryQuit() {
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