]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiView.cpp
Fix a crash when closing LyX while a master and a dirty child were open, and if the...
[lyx.git] / src / frontends / qt4 / GuiView.cpp
index 3bbc8c6e4b30f0926e696b24be501286a88f57fa..df9986b29e7fab6bc735549aab8417e6a54110bb 100644 (file)
@@ -604,13 +604,14 @@ bool GuiView::closeBufferAll(bool tolastopened)
                if (twa->count() == 0)
                        ++empty_twa;
 
-               for (; twa_count; --twa_count) {
+               for (; twa == d.tabWorkArea(empty_twa) && twa_count; --twa_count) {
                        twa->setCurrentIndex(twa_count-1);
 
                        GuiWorkArea * wa = twa->currentWorkArea();
                        bool const is_active_wa = active_wa == wa;
-                       Buffer * b = &wa->bufferView().buffer();
-                       if (b->parent()) {
+                       Buffer & b = wa->bufferView().buffer();
+
+                       if (b.parent()) {
                                // This is a child document, just close the tab
                                // after saving but keep the file loaded.
                                if (!closeWorkArea(wa, false, tolastopened, is_active_wa))
@@ -618,7 +619,7 @@ bool GuiView::closeBufferAll(bool tolastopened)
                                continue;
                        }
 
-                       vector<Buffer *> clist = b->getChildren();
+                       vector<Buffer *> clist = b.getChildren();
                        for (vector<Buffer *>::const_iterator it = clist.begin();
                                 it != clist.end(); ++it) {
                                if ((*it)->isClean())
@@ -637,7 +638,7 @@ bool GuiView::closeBufferAll(bool tolastopened)
 
                        // closeBuffer() needs buffer workArea still alive and
                        // set as currrent one, and destroys it
-                       if (b && !closeWorkArea(wa, close_buffer, tolastopened, is_active_wa))
+                       if (!closeWorkArea(wa, close_buffer, tolastopened, is_active_wa))
                                return false;
                }
        }
@@ -1938,8 +1939,12 @@ bool GuiView::closeWorkArea(GuiWorkArea * wa, bool close_buffer,
        for (size_t i = 0; i < theSession().bookmarks().size(); ++i)
                theLyXFunc().gotoBookmark(i+1, false, false);
 
+       // if we are only hiding the buffer and there are multiple views
+       // of the buffer, then we do not need to ensure a clean buffer.
+       bool const allow_dirty = inMultiTabs(wa) && !close_buffer;
+
        Buffer & buf = wa->bufferView().buffer();
-       if (saveBufferIfNeeded(buf, !close_buffer)) {
+       if (allow_dirty || saveBufferIfNeeded(buf, !close_buffer)) {
                // save in sessions if requested
                // do not save childs if their master
                // is opened as well
@@ -2013,6 +2018,19 @@ bool GuiView::saveBufferIfNeeded(Buffer & buf, bool hiding)
 }
 
 
+bool GuiView::inMultiTabs(GuiWorkArea * wa)
+{
+       Buffer & buf = wa->bufferView().buffer();
+
+       for (int i = 0; i != d.splitter_->count(); ++i) {
+               GuiWorkArea * wa_ = d.tabWorkArea(i)->workArea(buf);
+               if (wa_ && wa_ != wa)
+                       return true;
+       }
+       return inMultiViews(wa);
+}
+
+
 bool GuiView::inMultiViews(GuiWorkArea * wa)
 {
        QList<int> const ids = guiApp->viewIds();