diff --git a/ChangeLog b/ChangeLog index 55f8bcf31..4f26af23e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +1998-10-08 Stefan Taferner (KMail-1.0.5) + + * Sorting messages: replaced sorting algorithm, which caused + random hangs, with stock qsort -- hopefully working now ;-) + + * Fixed: folder list went out of scope (current item pointing to + nowhere) when folder was deleted. + + * Composer: fixed broken confirm-close dialog. + + * Increased version to better match upcoming Kde-1.1 release. + + * Added call to kapp->quit() when last window is closed. + 1998-09-26 Stefan Taferner (KMail-0.8.1) * Fixed crash upon close of a main- or composer window. diff --git a/kmcomposewin.cpp b/kmcomposewin.cpp index df39dc629..0bd0dbd6e 100644 --- a/kmcomposewin.cpp +++ b/kmcomposewin.cpp @@ -185,6 +185,8 @@ KMComposeWin::KMComposeWin(KMMessage *aMsg) : KMComposeWinInherited(), //----------------------------------------------------------------------------- KMComposeWin::~KMComposeWin() { + debug("~KMComposeWin()"); + writeConfig(); if (mAutoDeleteMsg && mMsg) delete mMsg; @@ -887,10 +889,13 @@ bool KMComposeWin::applyChanges(void) //----------------------------------------------------------------------------- void KMComposeWin::closeEvent(QCloseEvent* e) { + int rc; + if(mEditor->isModified()) { - if((KMsgBox::yesNo(0,i18n("KMail Confirm"), - i18n("Close and discard\nedited message?")) == 2)) + rc = KMsgBox::yesNo(0,i18n("KMail Confirm"), + i18n("Close and discard\nedited message?")); + if (rc != 1) { e->ignore(); return; diff --git a/kmfolder.cpp b/kmfolder.cpp index 2029cb3e5..ca728815b 100644 --- a/kmfolder.cpp +++ b/kmfolder.cpp @@ -705,7 +705,7 @@ int KMFolder::moveMsg(KMMessage* aMsg, int* aIndex_ret) rc = addMsg(aMsg, aIndex_ret); close(); - debug("KMFolder::moveMsg() rc=%i",rc); + // debug("KMFolder::moveMsg() rc=%i",rc); return rc; } diff --git a/kmfoldertree.cpp b/kmfoldertree.cpp index a4d03afc4..2842988c1 100644 --- a/kmfoldertree.cpp +++ b/kmfoldertree.cpp @@ -28,8 +28,6 @@ KMFolderTree::KMFolderTree(QWidget *parent,const char *name) : initMetaObject(); - mLastIdx = -1; - mDropZone = new KDNDDropZone(this, DndRawData); connect(mDropZone, SIGNAL(dropAction(KDNDDropZone*)), this, SLOT(doDropAction(KDNDDropZone*))); @@ -120,6 +118,7 @@ void KMFolderTree::reload(void) void KMFolderTree::doFolderListChanged() { uint idx = currentItem(); + debug("doFolderListChanged()"); reload(); if (idx >= 0 && idx < count()) setCurrentItem(idx); } @@ -188,23 +187,20 @@ void KMFolderTree::doFolderSelected(int index, int) { KMFolder* folder; - if (index < 0 || index == mLastIdx) return; - mLastIdx = index; + if (index < 0) return; folder = (KMFolder*)mList.at(index); - - printf("doFolderSelected\n"); if(folder) + { + if (folder->isDir()) { - if (folder->isDir()) - { - debug("Folder `%s' is a directory -> ignoring it.", - (const char*)folder->name()); - emit folderSelected(NULL); - } - - else emit folderSelected(folder); + debug("Folder `%s' is a directory -> ignoring it.", + (const char*)folder->name()); + emit folderSelected(NULL); } + + else emit folderSelected(folder); + } } diff --git a/kmfoldertree.h b/kmfoldertree.h index 8ae9828e3..35e1c6d9d 100644 --- a/kmfoldertree.h +++ b/kmfoldertree.h @@ -41,7 +41,6 @@ protected: KMFolderNodeList mList; KDNDDropZone* mDropZone; - int mLastIdx; }; #endif diff --git a/kmheaders.cpp b/kmheaders.cpp index 0268b53aa..2437fd703 100644 --- a/kmheaders.cpp +++ b/kmheaders.cpp @@ -277,6 +277,12 @@ void KMHeaders::headerClicked(int column) KMMsgBasePtr cur; const char* sortStr = "(unknown)"; QString msg; + static bool working = FALSE; + + if (working) return; + working = TRUE; + + kbp->busy(); if (idx >= 0) cur = (*mFolder)[idx]; else cur = NULL; @@ -302,13 +308,12 @@ void KMHeaders::headerClicked(int column) else if (mSortCol==(int)KMMsgList::sfFrom) sortStr = i18n("sender"); else if (mSortCol==(int)KMMsgList::sfStatus) sortStr = i18n("status"); - if (mSortDescending) msg.sprintf(i18n("Sorting messages descending by %s"), sortStr); + if (mSortDescending) msg.sprintf(i18n("Sorting messages descending by %s"), + sortStr); else msg.sprintf(i18n("Sorting messages ascending by %s"), sortStr); mOwner->statusMsg(msg); - kbp->busy(); sort(); - kbp->idle(); if (cur) idx = mFolder->find(cur); else idx = 0; @@ -317,6 +322,11 @@ void KMHeaders::headerClicked(int column) idx -= 3; if (idx < 0) idx = 0; setTopItem(idx); + + mOwner->statusMsg(msg); + kapp->processEvents(200); + working = FALSE; + kbp->idle(); } diff --git a/kmmainwin.cpp b/kmmainwin.cpp index e62c9e75a..7ca02f579 100644 --- a/kmmainwin.cpp +++ b/kmmainwin.cpp @@ -120,6 +120,8 @@ KMMainWin::KMMainWin(QWidget *, char *name) : //----------------------------------------------------------------------------- KMMainWin::~KMMainWin() { + debug("~KMMainWin()"); + writeConfig(); if (mHeaders) delete mHeaders; diff --git a/kmmsglist.cpp b/kmmsglist.cpp index 00fc8f8b9..5ca090360 100644 --- a/kmmsglist.cpp +++ b/kmmsglist.cpp @@ -4,6 +4,9 @@ #include #include +static KMMsgList::SortField sSortField; +static bool sSortDescending; + //----------------------------------------------------------------------------- KMMsgList::KMMsgList(int initSize): KMMsgListInherited(initSize) @@ -181,8 +184,11 @@ void KMMsgList::rethinkHigh(void) } } -void KMMsgList::qsort(int left, int right, SortField aField, bool aDescending) { - debug("KMmsgList::qsort()"); + +//----------------------------------------------------------------------------- +void KMMsgList::qsort(int left, int right, SortField aField, bool aDescending) +{ + // debug("KMmsgList::qsort()"); if(right <= left) return; @@ -192,7 +198,7 @@ void KMMsgList::qsort(int left, int right, SortField aField, bool aDescending) { int j = right; // $markus: Yes, I am paranoid ;-) - if((i + j / 2) < 0 || (i +j / 2) > KMMsgListInherited::size()) + if((i + j / 2) < 0 || (i + j / 2) > KMMsgListInherited::size()) return; KMMsgBasePtr pivot = KMMsgListInherited::at((int)((i + j) / 2)); @@ -212,40 +218,47 @@ void KMMsgList::qsort(int left, int right, SortField aField, bool aDescending) { } } while(i <= j); - if(left < j) - this->qsort(left, j, aField, aDescending); - if(i < right) - this->qsort(i, right, aField, aDescending); + if(left < j) qsort(left, j, aField, aDescending); + if(i < right) qsort(i, right, aField, aDescending); - debug("KMsgList::qsort() leaving"); + // debug("KMsgList::qsort() leaving"); } + +//----------------------------------------------------------------------------- +int qsortCompFunc(const void* a, const void* b) +{ + return KMMsgList::msgSortCompFunc(*(KMMsgBasePtr*)a, *(KMMsgBasePtr*)b, + sSortField, sSortDescending); +} + + //----------------------------------------------------------------------------- void KMMsgList::sort(SortField aField, bool aDescending) { +#define SLOW_SORT #ifndef SLOW_SORT qsort(0, mHigh-1, aField, aDescending); -#else +#else /*SLOW_SORT*/ debug("KMMsgList::sort()"); - int i, j; - KMMsgBasePtr mb; + + KMMsgBasePtr sortList[mHigh]; + int i; if (mHigh < 2) return; - for (j=0; j 0) - { - mb = KMMsgListInherited::at(i); - KMMsgListInherited::at(i) = KMMsgListInherited::at(i+1); - KMMsgListInherited::at(i+1) = mb; - } - } - } -#endif + sSortField = aField; + sSortDescending = aDescending; + + for (i=0; i +int KMTopLevelWidget::sWindowCount = 0; //----------------------------------------------------------------------------- KMTopLevelWidget::KMTopLevelWidget(const char* aName): KMTopLevelWidgetInherited(aName) { initMetaObject(); + sWindowCount++; } //----------------------------------------------------------------------------- KMTopLevelWidget::~KMTopLevelWidget() { + sWindowCount--; + if (sWindowCount <= 0) kapp->quit(); } diff --git a/kmtopwidget.h b/kmtopwidget.h index 7785b5520..ea1975b88 100644 --- a/kmtopwidget.h +++ b/kmtopwidget.h @@ -53,7 +53,11 @@ public: // virtual bool close(bool forceKill=FALSE); protected: - virtual void closeEvent(QCloseEvent*); + virtual void closeEvent(QCloseEvent*); + +private: + // app->quit() is called when sWindowCount<=0 in destructor + static int sWindowCount; }; #endif /*kmtopwidget_h*/ diff --git a/kmversion.h b/kmversion.h index df5821778..cb48d219f 100644 --- a/kmversion.h +++ b/kmversion.h @@ -3,6 +3,6 @@ #ifndef kmversion_h #define kmversion_h -#define KMAIL_VERSION "0.8.1" +#define KMAIL_VERSION "1.0.5" #endif /*kmversion_h*/