What I meant is something like follows. The patch does not work correctly yet, but shows my point.
1. src/bufferlist.C: remove quitWriteBuffer and quitWriteAll. 2. LFUN_LYX_QUIT triggers LFUN_WINDOW_CLOSE 3. LFUN_WINDOW_CLOSE triggers LFUN_BUFFER_CLOSE one by one 4. closeEvent triggers LFUN_LYX_QUIT. That is to say, no one takes the shortcut quitWriteAll. lyx-close experts (Peter, Enrico, Abdel), what do you think? Anything seriously wrong here? Bo Index: src/bufferlist.C =================================================================== --- src/bufferlist.C (revision 16658) +++ src/bufferlist.C (working copy) @@ -96,76 +96,6 @@ } -bool BufferList::quitWriteBuffer(Buffer * buf) -{ - BOOST_ASSERT(buf); - - docstring file; - if (buf->isUnnamed()) - file = from_utf8(onlyFilename(buf->fileName())); - else - file = makeDisplayPath(buf->fileName(), 30); - - docstring const text = - bformat(_("The document %1$s has unsaved changes.\n\n" - "Do you want to save the document or discard the changes?"), - file); - int const ret = Alert::prompt(_("Save changed document?"), - text, 0, 2, _("&Save"), _("&Discard"), _("&Cancel")); - - if (ret == 0) { - // FIXME: WriteAs can be asynch ! - // but not right now...maybe we should remove that - - bool succeeded; - - if (buf->isUnnamed()) - succeeded = writeAs(buf); - else - succeeded = menuWrite(buf); - - if (!succeeded) - return false; - } else if (ret == 1) { - // if we crash after this we could - // have no autosave file but I guess - // this is really inprobable (Jug) - if (buf->isUnnamed()) - removeAutosaveFile(buf->fileName()); - - } else { - return false; - } - - return true; -} - - -bool BufferList::quitWriteAll() -{ - BufferStorage::iterator it = bstore.begin(); - BufferStorage::iterator end = bstore.end(); - for (; it != end; ++it) { - if ((*it)->isClean()) - continue; - - if (!quitWriteBuffer(*it)) - return false; - } - // now, all buffers have been written sucessfully - // save file names to .lyx/session - it = bstore.begin(); - for (; it != end; ++it) { - // if master/slave are both open, do not save slave since it - // will be automatically loaded when the master is loaded - if ((*it)->getMasterBuffer() == (*it)) - LyX::ref().session().lastOpened().add(FileName((*it)->fileName())); - } - - return true; -} - - void BufferList::release(Buffer * buf) { BOOST_ASSERT(buf); Index: src/bufferlist.h =================================================================== --- src/bufferlist.h (revision 16658) +++ src/bufferlist.h (working copy) @@ -42,9 +42,6 @@ iterator end(); const_iterator end() const; - /// write all buffers, asking the user, returns false if cancelled - bool quitWriteAll(); - /// create a new buffer Buffer * newBuffer(std::string const & s, bool ronly = false); @@ -104,8 +101,6 @@ void setCurrentAuthor(docstring const & name, docstring const & email); private: - /// ask to save a buffer on quit, returns false if should cancel - bool quitWriteBuffer(Buffer * buf); typedef std::vector<Buffer *> BufferStorage; Index: src/lyxfunc.C =================================================================== --- src/lyxfunc.C (revision 16658) +++ src/lyxfunc.C (working copy) @@ -1074,7 +1074,8 @@ case LFUN_LYX_QUIT: // quitting is triggered by the gui code // (leaving the event loop). - if (theBufferList().quitWriteAll()) + dispatch(FuncRequest(LFUN_WINDOW_CLOSE)); + if (theBufferList().empty()) theApp()->gui().closeAllViews(); break; @@ -1703,13 +1704,19 @@ case LFUN_WINDOW_CLOSE: BOOST_ASSERT(lyx_view_); BOOST_ASSERT(theApp()); - // update bookmark pit of the current buffer before window close - for (size_t i = 0; i < LyX::ref().session().bookmarks().size(); ++i) - gotoBookmark(i+1, false, false); - // ask the user for saving changes or cancel quit - if (!theBufferList().quitWriteAll()) - break; - lyx_view_->close(); + // close buffer one by one + while (true) { + string const file = lyx_view_->buffer()->fileName(); + dispatch(FuncRequest(LFUN_BUFFER_CLOSE)); + // all files closed + if (theBufferList().empty()) { + lyx_view_->close(); + break; + // buffer close failed + if (file == lyx_view_->buffer()->fileName()) + break; + } + } return; case LFUN_BOOKMARK_GOTO: Index: src/frontends/qt4/GuiView.C =================================================================== --- src/frontends/qt4/GuiView.C (revision 16658) +++ src/frontends/qt4/GuiView.C (working copy) @@ -237,7 +237,8 @@ // we may have been called through the close window button // which bypasses the LFUN machinery. if (!quitting_by_menu_) { - if (!theBufferList().quitWriteAll()) { + dispatch(FuncRequest(LFUN_LYX_QUIT)); + if (!theBufferList().empty()) { close_event->ignore(); return; }