author | sandman <sandman> | 2002-07-28 00:44:43 (UTC) |
---|---|---|
committer | sandman <sandman> | 2002-07-28 00:44:43 (UTC) |
commit | 72081cbfef03a69ed6f9ca7826854b6cf10dc2fe (patch) (side-by-side diff) | |
tree | 43e67bdc7cbb972f431b3912e2f068df3d2c97bf | |
parent | 4baf36396739502c5471950e29f18954cca4517b (diff) | |
download | opie-72081cbfef03a69ed6f9ca7826854b6cf10dc2fe.zip opie-72081cbfef03a69ed6f9ca7826854b6cf10dc2fe.tar.gz opie-72081cbfef03a69ed6f9ca7826854b6cf10dc2fe.tar.bz2 |
Workaround for a weird Qt/E bug, resulting in qpe hanging if clipboard
applet is loaded and qpe is terminated via shutdown applet.
-rw-r--r-- | core/applets/clipboardapplet/clipboard.cpp | 15 | ||||
-rw-r--r-- | core/applets/clipboardapplet/clipboard.h | 4 | ||||
-rw-r--r-- | core/launcher/desktop.cpp | 6 |
3 files changed, 22 insertions, 3 deletions
diff --git a/core/applets/clipboardapplet/clipboard.cpp b/core/applets/clipboardapplet/clipboard.cpp index 5848d0f..4fbdf6f 100644 --- a/core/applets/clipboardapplet/clipboard.cpp +++ b/core/applets/clipboardapplet/clipboard.cpp @@ -101,64 +101,73 @@ static const char * paste_xpm[] = { " *{>; ", " }}}@e:!;}}} ", "<x8=&:#@+;ll, ", "}k/=;;3}337|o ", "<k's24444m45o ", "}8'ss4xkkk]}a ", "<1s224keee|b4 ", "}r2itmkeee]]44", "<9iitmkeeehkw.", "<lt-u4keeb)pn.", "<fu-umkebhp(0.", "<cugg4kbh)_(q.", "<cyyymk))p(%q.", ",5vvv4k)p_%[q.", " ...$mljnn0qd.", " 4.......,"}; ClipboardApplet::ClipboardApplet( QWidget *parent, const char *name ) : QWidget( parent, name ) { setFixedWidth ( 14 ); setFixedHeight ( 18 ); m_clipboardPixmap = QPixmap ( paste_xpm ); - QTimer *timer = new QTimer ( this ); + m_timer = new QTimer ( this ); connect ( QApplication::clipboard ( ), SIGNAL( dataChanged ( )), this, SLOT( newData ( ))); - connect ( timer, SIGNAL( timeout ( )), this, SLOT( newData ( ))); + connect ( m_timer, SIGNAL( timeout ( )), this, SLOT( newData ( ))); + connect ( qApp, SIGNAL( aboutToQuit ( )), this, SLOT( shutdown ( ))); - timer-> start ( 1000 ); + m_timer-> start ( 1500 ); m_menu = 0; m_dirty = true; m_lasttext = QString::null; } ClipboardApplet::~ClipboardApplet ( ) { } +void ClipboardApplet::shutdown ( ) +{ + // the timer has to be stopped, or Qt/E will hang on quit() + // see launcher/desktop.cpp + + m_timer-> stop ( ); +} + void ClipboardApplet::mousePressEvent ( QMouseEvent *) { if ( m_dirty ) { delete m_menu; m_menu = new QPopupMenu ( this ); m_menu-> setCheckable ( true ); if ( m_history. count ( )) { for ( unsigned int i = 0; i < m_history. count ( ); i++ ) { QString str = m_history [i]; if ( str. length ( ) > 20 ) str = str. left ( 20 ) + "..."; m_menu-> insertItem ( QString ( "%1: %2" ). arg ( i + 1 ). arg ( str ), i ); m_menu-> setItemChecked ( i, false ); } m_menu-> setItemChecked ( m_history. count ( ) - 1, true ); m_menu-> insertSeparator ( ); } m_menu-> insertItem ( QIconSet ( Resource::loadPixmap ( "cut" )), tr( "Cut" ), 100 ); m_menu-> insertItem ( QIconSet ( Resource::loadPixmap ( "copy" )), tr( "Copy" ), 101 ); m_menu-> insertItem ( QIconSet ( Resource::loadPixmap ( "paste" )), tr( "Paste" ), 102 ); diff --git a/core/applets/clipboardapplet/clipboard.h b/core/applets/clipboardapplet/clipboard.h index 84743d9..ec87d39 100644 --- a/core/applets/clipboardapplet/clipboard.h +++ b/core/applets/clipboardapplet/clipboard.h @@ -3,51 +3,55 @@ ** ** This file is part of Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #ifndef __CLIPBOARD_APPLET_H__ #define __CLIPBOARD_APPLET_H__ #include <qwidget.h> #include <qpixmap.h> #include <qstringlist.h> +class QTimer; + class ClipboardApplet : public QWidget { Q_OBJECT public: ClipboardApplet ( QWidget *parent = 0, const char *name=0 ); ~ClipboardApplet ( ); protected: void mousePressEvent ( QMouseEvent *); void paintEvent ( QPaintEvent* ); private slots: void action ( int ); void newData ( ); + void shutdown ( ); private: QPopupMenu * m_menu; QStringList m_history; bool m_dirty; QString m_lasttext; + QTimer * m_timer; QPixmap m_clipboardPixmap; }; #endif // __CLIPBOARD_APPLET_H__ diff --git a/core/launcher/desktop.cpp b/core/launcher/desktop.cpp index e58b08c..f90da1a 100644 --- a/core/launcher/desktop.cpp +++ b/core/launcher/desktop.cpp @@ -665,48 +665,54 @@ void Desktop::styleChange( QStyle &s ) void DesktopApplication::shutdown() { if ( type() != GuiServer ) return; ShutdownImpl *sd = new ShutdownImpl( 0, 0, WDestructiveClose ); connect( sd, SIGNAL(shutdown(ShutdownImpl::Type)), this, SLOT(shutdown(ShutdownImpl::Type)) ); sd->showMaximized(); } void DesktopApplication::shutdown( ShutdownImpl::Type t ) { switch ( t ) { case ShutdownImpl::ShutdownSystem: execlp("shutdown", "shutdown", "-h", "now", (void*)0); break; case ShutdownImpl::RebootSystem: execlp("shutdown", "shutdown", "-r", "now", (void*)0); break; case ShutdownImpl::RestartDesktop: restart(); break; case ShutdownImpl::TerminateDesktop: prepareForTermination(FALSE); + + // This is a workaround for a Qt bug + // clipboard applet has to stop its poll timer, or Qt/E + // will hang on quit() right before it emits aboutToQuit() + emit aboutToQuit ( ); + quit(); break; } } void DesktopApplication::restart() { prepareForTermination(TRUE); #ifdef Q_WS_QWS for ( int fd = 3; fd < 100; fd++ ) close( fd ); #if defined(QT_DEMO_SINGLE_FLOPPY) execl( "/sbin/init", "qpe", 0 ); #elif defined(QT_QWS_CASSIOPEIA) execl( "/bin/sh", "sh", 0 ); #else execl( (qpeDir()+"/bin/qpe").latin1(), "qpe", 0 ); #endif exit(1); #endif } void Desktop::startTransferServer() |