]> git.lyx.org Git - features.git/blobdiff - src/frontends/qt/GuiView.cpp
Fix a bunch of warnings.
[features.git] / src / frontends / qt / GuiView.cpp
index 32d6d9334f58777b3ee7cb8e0172037362cbd187..1b98d989e19cf320f990377008d098f242e8b85f 100644 (file)
@@ -316,8 +316,8 @@ class GuiView::GuiViewPrivate
        void operator=(GuiViewPrivate const &);
 public:
        GuiViewPrivate(GuiView * gv)
-               : gv_(gv), current_work_area_(0), current_main_work_area_(0),
-               layout_(0), autosave_timeout_(5000),
+               : gv_(gv), current_work_area_(nullptr), current_main_work_area_(nullptr),
+               layout_(nullptr), autosave_timeout_(5000),
                in_show_(false)
        {
                // hardcode here the platform specific icon size
@@ -480,6 +480,29 @@ public:
                return icon_size;
        }
 
+       static Buffer::ExportStatus previewAndDestroy(Buffer const * orig,
+                       Buffer * buffer, string const & format);
+       static Buffer::ExportStatus exportAndDestroy(Buffer const * orig,
+                       Buffer * buffer, string const & format);
+       static Buffer::ExportStatus compileAndDestroy(Buffer const * orig,
+                       Buffer * buffer, string const & format);
+       static docstring autosaveAndDestroy(Buffer const * orig, Buffer * buffer);
+
+       template<class T>
+       static Buffer::ExportStatus runAndDestroy(const T& func,
+                       Buffer const * orig, Buffer * buffer, string const & format);
+
+       // TODO syncFunc/previewFunc: use bind
+       bool asyncBufferProcessing(string const & argument,
+                                  Buffer const * used_buffer,
+                                  docstring const & msg,
+                                  Buffer::ExportStatus (*asyncFunc)(Buffer const *, Buffer *, string const &),
+                                  Buffer::ExportStatus (Buffer::*syncFunc)(string const &, bool) const,
+                                  Buffer::ExportStatus (Buffer::*previewFunc)(string const &) const,
+                                  bool allow_async);
+
+       QVector<GuiWorkArea*> guiWorkAreas();
+
 public:
        GuiView * gv_;
        GuiWorkArea * current_work_area_;
@@ -504,17 +527,10 @@ public:
        ///
        map<string, DialogPtr> dialogs_;
 
-       unsigned int smallIconSize;
-       unsigned int normalIconSize;
-       unsigned int bigIconSize;
-       unsigned int hugeIconSize;
-       unsigned int giantIconSize;
        ///
        QTimer statusbar_timer_;
        /// auto-saving of buffers
        Timeout autosave_timeout_;
-       /// flag against a race condition due to multiclicks, see bug #1119
-       bool in_show_;
 
        ///
        TocModels toc_models_;
@@ -527,28 +543,15 @@ public:
        string processing_format;
 
        static QSet<Buffer const *> busyBuffers;
-       static Buffer::ExportStatus previewAndDestroy(Buffer const * orig,
-                       Buffer * buffer, string const & format);
-       static Buffer::ExportStatus exportAndDestroy(Buffer const * orig,
-                       Buffer * buffer, string const & format);
-       static Buffer::ExportStatus compileAndDestroy(Buffer const * orig,
-                       Buffer * buffer, string const & format);
-       static docstring autosaveAndDestroy(Buffer const * orig, Buffer * buffer);
 
-       template<class T>
-       static Buffer::ExportStatus runAndDestroy(const T& func,
-                       Buffer const * orig, Buffer * buffer, string const & format);
-
-       // TODO syncFunc/previewFunc: use bind
-       bool asyncBufferProcessing(string const & argument,
-                                  Buffer const * used_buffer,
-                                  docstring const & msg,
-                                  Buffer::ExportStatus (*asyncFunc)(Buffer const *, Buffer *, string const &),
-                                  Buffer::ExportStatus (Buffer::*syncFunc)(string const &, bool) const,
-                                  Buffer::ExportStatus (Buffer::*previewFunc)(string const &) const,
-                                  bool allow_async);
+       unsigned int smallIconSize;
+       unsigned int normalIconSize;
+       unsigned int bigIconSize;
+       unsigned int hugeIconSize;
+       unsigned int giantIconSize;
 
-       QVector<GuiWorkArea*> guiWorkAreas();
+       /// flag against a race condition due to multiclicks, see bug #1119
+       bool in_show_;
 };
 
 QSet<Buffer const *> GuiView::GuiViewPrivate::busyBuffers;
@@ -853,7 +856,7 @@ bool GuiView::restoreLayout()
        QSettings settings;
        zoom_ratio_ = settings.value("zoom_ratio", 1.0).toDouble();
        // Actual zoom value: default zoom + fractional offset
-       int zoom = lyxrc.defaultZoom * zoom_ratio_;
+       int zoom = (int)(lyxrc.defaultZoom * zoom_ratio_);
        if (zoom < static_cast<int>(zoom_min_))
                zoom = zoom_min_;
        lyxrc.currentZoom = zoom;
@@ -921,7 +924,7 @@ GuiToolbar * GuiView::toolbar(string const & name)
                return it->second;
 
        LYXERR(Debug::GUI, "Toolbar::display: no toolbar named " << name);
-       return 0;
+       return nullptr;
 }
 
 
@@ -1292,7 +1295,7 @@ void GuiView::on_currentWorkAreaChanged(GuiWorkArea * wa)
 {
        if (d.current_work_area_)
                // disconnect the current work area from all slots
-               QObject::disconnect(d.current_work_area_, 0, this, 0);
+               QObject::disconnect(d.current_work_area_, nullptr, this, nullptr);
        disconnectBuffer();
        disconnectBufferView();
        connectBufferView(wa->bufferView());
@@ -1496,7 +1499,7 @@ GuiWorkArea * GuiView::workArea(int index)
        if (TabWorkArea * twa = d.currentTabWorkArea())
                if (index < twa->count())
                        return twa->workArea(index);
-       return 0;
+       return nullptr;
 }
 
 
@@ -1507,7 +1510,7 @@ GuiWorkArea * GuiView::workArea(Buffer & buffer)
                return currentWorkArea();
        if (TabWorkArea * twa = d.currentTabWorkArea())
                return twa->workArea(buffer);
-       return 0;
+       return nullptr;
 }
 
 
@@ -1549,7 +1552,7 @@ GuiWorkArea * GuiView::currentWorkArea()
 GuiWorkArea const * GuiView::currentMainWorkArea() const
 {
        if (!d.currentTabWorkArea())
-               return 0;
+               return nullptr;
        return d.currentTabWorkArea()->currentWorkArea();
 }
 
@@ -1557,7 +1560,7 @@ GuiWorkArea const * GuiView::currentMainWorkArea() const
 GuiWorkArea * GuiView::currentMainWorkArea()
 {
        if (!d.currentTabWorkArea())
-               return 0;
+               return nullptr;
        return d.currentTabWorkArea()->currentWorkArea();
 }
 
@@ -1566,7 +1569,7 @@ void GuiView::setCurrentWorkArea(GuiWorkArea * wa)
 {
        LYXERR(Debug::DEBUG, "Setting current wa: " << wa << endl);
        if (!wa) {
-               d.current_work_area_ = 0;
+               d.current_work_area_ = nullptr;
                d.setBackground();
                Q_EMIT bufferViewChanged();
                return;
@@ -1617,8 +1620,8 @@ void GuiView::removeWorkArea(GuiWorkArea * wa)
        if (wa == d.current_work_area_) {
                disconnectBuffer();
                disconnectBufferView();
-               d.current_work_area_ = 0;
-               d.current_main_work_area_ = 0;
+               d.current_work_area_ = nullptr;
+               d.current_main_work_area_ = nullptr;
        }
 
        bool found_twa = false;
@@ -1628,7 +1631,7 @@ void GuiView::removeWorkArea(GuiWorkArea * wa)
                        // Found in this tab group, and deleted the GuiWorkArea.
                        found_twa = true;
                        if (twa->count() != 0) {
-                               if (d.current_work_area_ == 0)
+                               if (d.current_work_area_ == nullptr)
                                        // This means that we are closing the current GuiWorkArea, so
                                        // switch to the next GuiWorkArea in the found TabWorkArea.
                                        setCurrentWorkArea(twa->currentWorkArea());
@@ -1644,13 +1647,13 @@ void GuiView::removeWorkArea(GuiWorkArea * wa)
        // should be deleted by other means.
        LASSERT(found_twa, return);
 
-       if (d.current_work_area_ == 0) {
+       if (d.current_work_area_ == nullptr) {
                if (d.splitter_->count() != 0) {
                        TabWorkArea * twa = d.currentTabWorkArea();
                        setCurrentWorkArea(twa->currentWorkArea());
                } else {
                        // No more work areas, switch to the background widget.
-                       setCurrentWorkArea(0);
+                       setCurrentWorkArea(nullptr);
                }
        }
 }
@@ -1710,7 +1713,7 @@ void GuiView::setBuffer(Buffer * newBuffer, bool switch_to)
        LASSERT(newBuffer, return);
 
        GuiWorkArea * wa = workArea(*newBuffer);
-       if (wa == 0) {
+       if (wa == nullptr) {
                setBusy(true);
                newBuffer->masterBuffer()->updateBuffer();
                setBusy(false);
@@ -1741,7 +1744,7 @@ void GuiView::connectBuffer(Buffer & buf)
 void GuiView::disconnectBuffer()
 {
        if (d.current_work_area_)
-               d.current_work_area_->bufferView().buffer().setGuiDelegate(0);
+               d.current_work_area_->bufferView().buffer().setGuiDelegate(nullptr);
 }
 
 
@@ -1754,7 +1757,7 @@ void GuiView::connectBufferView(BufferView & bv)
 void GuiView::disconnectBufferView()
 {
        if (d.current_work_area_)
-               d.current_work_area_->bufferView().setGuiDelegate(0);
+               d.current_work_area_->bufferView().setGuiDelegate(nullptr);
 }
 
 
@@ -1818,7 +1821,7 @@ BufferView * GuiView::documentBufferView()
 {
        return currentMainWorkArea()
                ? &currentMainWorkArea()->bufferView()
-               : 0;
+               : nullptr;
 }
 
 
@@ -1826,19 +1829,19 @@ BufferView const * GuiView::documentBufferView() const
 {
        return currentMainWorkArea()
                ? &currentMainWorkArea()->bufferView()
-               : 0;
+               : nullptr;
 }
 
 
 BufferView * GuiView::currentBufferView()
 {
-       return d.current_work_area_ ? &d.current_work_area_->bufferView() : 0;
+       return d.current_work_area_ ? &d.current_work_area_->bufferView() : nullptr;
 }
 
 
 BufferView const * GuiView::currentBufferView() const
 {
-       return d.current_work_area_ ? &d.current_work_area_->bufferView() : 0;
+       return d.current_work_area_ ? &d.current_work_area_->bufferView() : nullptr;
 }
 
 
@@ -1859,7 +1862,7 @@ void GuiView::autoSave()
        LYXERR(Debug::INFO, "Running autoSave()");
 
        Buffer * buffer = documentBufferView()
-               ? &documentBufferView()->buffer() : 0;
+               ? &documentBufferView()->buffer() : nullptr;
        if (!buffer) {
                resetAutosaveTimers();
                return;
@@ -1884,9 +1887,9 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
 {
        bool enable = true;
        Buffer * buf = currentBufferView()
-               ? &currentBufferView()->buffer() : 0;
+               ? &currentBufferView()->buffer() : nullptr;
        Buffer * doc_buffer = documentBufferView()
-               ? &(documentBufferView()->buffer()) : 0;
+               ? &(documentBufferView()->buffer()) : nullptr;
 
 #ifdef Q_OS_MAC
        /* In LyX/Mac, when a dialog is open, the menus of the
@@ -1925,7 +1928,7 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
 
        case LFUN_MASTER_BUFFER_EXPORT:
                enable = doc_buffer
-                       && (doc_buffer->parent() != 0
+                       && (doc_buffer->parent() != nullptr
                            || doc_buffer->hasChildren())
                        && !d.processing_thread_watcher_.isRunning()
                        // this launches a dialog, which would be in the wrong Buffer
@@ -1935,7 +1938,7 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
        case LFUN_MASTER_BUFFER_UPDATE:
        case LFUN_MASTER_BUFFER_VIEW:
                enable = doc_buffer
-                       && (doc_buffer->parent() != 0
+                       && (doc_buffer->parent() != nullptr
                            || doc_buffer->hasChildren())
                        && !d.processing_thread_watcher_.isRunning();
                break;
@@ -1960,12 +1963,37 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
                break;
 
        case LFUN_BUFFER_RESET_EXPORT:
-               enable = doc_buffer != 0;
+               enable = doc_buffer != nullptr;
                break;
 
        case LFUN_BUFFER_CHILD_OPEN:
-               enable = doc_buffer != 0;
+               enable = doc_buffer != nullptr;
+               break;
+
+       case LFUN_MASTER_BUFFER_FORALL: {
+               if (doc_buffer == nullptr) {
+                       flag.message(from_utf8(N_("Command not allowed without a buffer open")));
+                       enable = false;
+                       break;
+               }
+               FuncRequest const cmdToPass = lyxaction.lookupFunc(cmd.getLongArg(0));
+               if (cmdToPass.action() == LFUN_UNKNOWN_ACTION) {
+                       flag.message(from_utf8(N_("Invalid argument of master-buffer-forall")));
+                       enable = false;
+                       break;
+               }
+               enable = false;
+               for (Buffer * buf : doc_buffer->allRelatives()) {
+                       GuiWorkArea * wa = workArea(*buf);
+                       if (!wa)
+                               continue;
+                       if (wa->bufferView().getStatus(cmdToPass, flag)) {
+                               enable = flag.enabled();
+                               break;
+                       }
+               }
                break;
+       }
 
        case LFUN_BUFFER_WRITE:
                enable = doc_buffer && (doc_buffer->isUnnamed() || !doc_buffer->isClean());
@@ -2010,7 +2038,7 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
                // fall through
        case LFUN_BUFFER_WRITE_AS:
        case LFUN_BUFFER_WRITE_AS_TEMPLATE:
-               enable = doc_buffer != 0;
+               enable = doc_buffer != nullptr;
                break;
 
        case LFUN_EXPORT_CANCEL:
@@ -2019,7 +2047,7 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
 
        case LFUN_BUFFER_CLOSE:
        case LFUN_VIEW_CLOSE:
-               enable = doc_buffer != 0;
+               enable = doc_buffer != nullptr;
                break;
 
        case LFUN_BUFFER_CLOSE_ALL:
@@ -2095,7 +2123,7 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
                break;
 
        case LFUN_DROP_LAYOUTS_CHOICE:
-               enable = buf != 0;
+               enable = buf != nullptr;
                break;
 
        case LFUN_UI_TOGGLE:
@@ -2328,7 +2356,7 @@ Buffer * GuiView::loadDocument(FileName const & filename, bool tolastfiles)
 {
        setBusy(true);
 
-       Buffer * newBuffer = 0;
+       Buffer * newBuffer = nullptr;
        try {
                newBuffer = checkAndLoadLyXFile(filename);
        } catch (ExceptionMessage const & e) {
@@ -2339,7 +2367,7 @@ Buffer * GuiView::loadDocument(FileName const & filename, bool tolastfiles)
 
        if (!newBuffer) {
                message(_("Document not loaded."));
-               return 0;
+               return nullptr;
        }
 
        setBuffer(newBuffer);
@@ -2448,7 +2476,7 @@ static bool import(GuiView * lv, FileName const & filename,
                        string const tofile =
                                support::changeExtension(filename.absFileName(),
                                theFormats().extension(*it));
-                       if (theConverters().convert(0, filename, FileName(tofile),
+                       if (theConverters().convert(nullptr, filename, FileName(tofile),
                                filename, format, *it, errorList) != Converters::SUCCESS)
                                return false;
                        loader_format = *it;
@@ -3155,7 +3183,7 @@ bool GuiView::closeBuffer(Buffer & buf)
        for (; it != bend; ++it) {
                Buffer * child_buf = *it;
                if (theBufferList().isOthersChild(&buf, child_buf)) {
-                       child_buf->setParent(0);
+                       child_buf->setParent(nullptr);
                        continue;
                }
 
@@ -3423,7 +3451,7 @@ void GuiView::checkExternallyModifiedBuffers()
 void GuiView::dispatchVC(FuncRequest const & cmd, DispatchResult & dr)
 {
        Buffer * buffer = documentBufferView()
-               ? &(documentBufferView()->buffer()) : 0;
+               ? &(documentBufferView()->buffer()) : nullptr;
 
        switch (cmd.action()) {
        case LFUN_VC_REGISTER:
@@ -3493,8 +3521,7 @@ void GuiView::dispatchVC(FuncRequest const & cmd, DispatchResult & dr)
                break;
 
        case LFUN_VC_LOCKING_TOGGLE:
-               LASSERT(buffer, return);
-               if (!ensureBufferClean(buffer) || buffer->hasReadonlyFlag())
+               if (!buffer || !ensureBufferClean(buffer) || buffer->hasReadonlyFlag())
                        break;
                if (buffer->lyxvc().inUse()) {
                        string res = buffer->lyxvc().lockingToggle();
@@ -3509,7 +3536,8 @@ void GuiView::dispatchVC(FuncRequest const & cmd, DispatchResult & dr)
                break;
 
        case LFUN_VC_REVERT:
-               LASSERT(buffer, return);
+               if (!buffer)
+                       break;
                if (buffer->lyxvc().revert()) {
                        reloadBuffer(*buffer);
                        dr.clearMessageUpdate();
@@ -3517,14 +3545,16 @@ void GuiView::dispatchVC(FuncRequest const & cmd, DispatchResult & dr)
                break;
 
        case LFUN_VC_UNDO_LAST:
-               LASSERT(buffer, return);
+               if (!buffer)
+                       break;
                buffer->lyxvc().undoLast();
                reloadBuffer(*buffer);
                dr.clearMessageUpdate();
                break;
 
        case LFUN_VC_REPO_UPDATE:
-               LASSERT(buffer, return);
+               if (!buffer)
+                       break;
                if (ensureBufferClean(buffer)) {
                        dr.setMessage(buffer->lyxvc().repoUpdate());
                        checkExternallyModifiedBuffers();
@@ -3578,10 +3608,11 @@ void GuiView::dispatchVC(FuncRequest const & cmd, DispatchResult & dr)
                        lyx::dispatch(FuncRequest(LFUN_DIALOG_SHOW, "comparehistory"));
                        break;
                }
+               if (!buffer)
+                       break;
 
                string rev1 = cmd.getArg(0);
                string f1, f2;
-               LATTEST(buffer)
 
                // f1
                if (!buffer->lyxvc().prepareFileRevision(rev1, f1))
@@ -3617,7 +3648,7 @@ void GuiView::openChildDocument(string const & fname)
        Buffer & buffer = documentBufferView()->buffer();
        FileName const filename = support::makeAbsPath(fname, buffer.filePath());
        documentBufferView()->saveBookmark(false);
-       Buffer * child = 0;
+       Buffer * child = nullptr;
        if (theBufferList().exists(filename)) {
                child = theBufferList().getBuffer(filename);
                setBuffer(child);
@@ -3640,7 +3671,7 @@ bool GuiView::goToFileRow(string const & argument)
        int row = -1;
        size_t i = argument.find_last_of(' ');
        if (i != string::npos) {
-               file_name = os::internal_path(trim(argument.substr(0, i)));
+               file_name = os::internal_path(FileName(trim(argument.substr(0, i))).realPath());
                istringstream is(argument.substr(i + 1));
                is >> row;
                if (is.fail())
@@ -3650,21 +3681,15 @@ bool GuiView::goToFileRow(string const & argument)
                LYXERR0("Wrong argument: " << argument);
                return false;
        }
-       Buffer * buf = 0;
-       string const abstmp = package().temp_dir().absFileName();
+       Buffer * buf = nullptr;
        string const realtmp = package().temp_dir().realPath();
        // We have to use os::path_prefix_is() here, instead of
        // simply prefixIs(), because the file name comes from
        // an external application and may need case adjustment.
-       if (os::path_prefix_is(file_name, abstmp, os::CASE_ADJUSTED)
-               || os::path_prefix_is(file_name, realtmp, os::CASE_ADJUSTED)) {
-               // Needed by inverse dvi search. If it is a file
-               // in tmpdir, call the apropriated function.
-               // If tmpdir is a symlink, we may have the real
-               // path passed back, so we correct for that.
-               if (!prefixIs(file_name, abstmp))
-                       file_name = subst(file_name, realtmp, abstmp);
-               buf = theBufferList().getBufferFromTmp(file_name);
+       if (os::path_prefix_is(file_name, realtmp, os::CASE_ADJUSTED)) {
+               buf = theBufferList().getBufferFromTmp(file_name, true);
+               LYXERR(Debug::FILES, "goToFileRow: buffer lookup for " << file_name
+                          << (buf ? " success" : " failed"));
        } else {
                // Must replace extension of the file to be .lyx
                // and get full path
@@ -3875,7 +3900,7 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
        dr.dispatched(true);
 
        Buffer * doc_buffer = documentBufferView()
-               ? &(documentBufferView()->buffer()) : 0;
+               ? &(documentBufferView()->buffer()) : nullptr;
 
        if (cmd.origin() == FuncRequest::TOC) {
                GuiToc * toc = static_cast<GuiToc*>(findOrBuild("toc", false));
@@ -3934,7 +3959,7 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                                                _("Exporting ..."),
                                                &GuiViewPrivate::exportAndDestroy,
                                                &Buffer::doExport,
-                                               0, cmd.allowAsync());
+                                               nullptr, cmd.allowAsync());
                        // TODO Inform user about success
                        break;
                }
@@ -3954,7 +3979,7 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                                                _("Exporting ..."),
                                                &GuiViewPrivate::compileAndDestroy,
                                                &Buffer::doExport,
-                                               0, cmd.allowAsync());
+                                               nullptr, cmd.allowAsync());
                        break;
                }
                case LFUN_BUFFER_VIEW: {
@@ -3962,25 +3987,25 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                                                doc_buffer,
                                                _("Previewing ..."),
                                                &GuiViewPrivate::previewAndDestroy,
-                                               0,
+                                               nullptr,
                                                &Buffer::preview, cmd.allowAsync());
                        break;
                }
                case LFUN_MASTER_BUFFER_UPDATE: {
                        d.asyncBufferProcessing(argument,
-                                               (doc_buffer ? doc_buffer->masterBuffer() : 0),
+                                               (doc_buffer ? doc_buffer->masterBuffer() : nullptr),
                                                docstring(),
                                                &GuiViewPrivate::compileAndDestroy,
                                                &Buffer::doExport,
-                                               0, cmd.allowAsync());
+                                               nullptr, cmd.allowAsync());
                        break;
                }
                case LFUN_MASTER_BUFFER_VIEW: {
                        d.asyncBufferProcessing(argument,
-                                               (doc_buffer ? doc_buffer->masterBuffer() : 0),
+                                               (doc_buffer ? doc_buffer->masterBuffer() : nullptr),
                                                docstring(),
                                                &GuiViewPrivate::previewAndDestroy,
-                                               0, &Buffer::preview, cmd.allowAsync());
+                                               nullptr, &Buffer::preview, cmd.allowAsync());
                        break;
                }
                case LFUN_EXPORT_CANCEL: {
@@ -4179,6 +4204,25 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                        break;
                }
 
+               case LFUN_MASTER_BUFFER_FORALL: {
+                       if (!doc_buffer)
+                               break;
+
+                       FuncRequest funcToRun = lyxaction.lookupFunc(cmd.getLongArg(0));
+                       funcToRun.allowAsync(false);
+
+                       for (Buffer const * buf : doc_buffer->allRelatives()) {
+                               // Switch to other buffer view and resend cmd
+                               lyx::dispatch(FuncRequest(
+                                       LFUN_BUFFER_SWITCH, buf->absFileName()));
+                               lyx::dispatch(funcToRun);
+                       }
+                       // switch back
+                       lyx::dispatch(FuncRequest(
+                               LFUN_BUFFER_SWITCH, doc_buffer->absFileName()));
+                       break;
+               }
+
                case LFUN_BUFFER_EXTERNAL_MODIFICATION_CLEAR:
                        LASSERT(doc_buffer, break);
                        doc_buffer->clearExternalModification();
@@ -4273,7 +4317,7 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                        break;
 
                case LFUN_DIALOG_HIDE: {
-                       guiApp->hideDialogs(to_utf8(cmd.argument()), 0);
+                       guiApp->hideDialogs(to_utf8(cmd.argument()), nullptr);
                        break;
                }
 
@@ -4282,8 +4326,8 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                        string sdata = trim(to_utf8(cmd.argument()).substr(name.size()));
 
                        if (name == "latexlog") {
-                               // gettatus checks that
-                               LATTEST(doc_buffer);
+                               // getStatus checks that
+                               LASSERT(doc_buffer, break);
                                Buffer::LogType type;
                                string const logfile = doc_buffer->logName(&type);
                                switch (type) {
@@ -4298,7 +4342,7 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                                showDialog("log", sdata);
                        } else if (name == "vclog") {
                                // getStatus checks that
-                               LATTEST(doc_buffer);
+                               LASSERT(doc_buffer, break);
                                string const sdata2 = "vc " +
                                        Lexer::quoteString(doc_buffer->lyxvc().getLogFile());
                                showDialog("log", sdata2);
@@ -4343,14 +4387,14 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                case LFUN_TAB_GROUP_CLOSE:
                        if (TabWorkArea * twa = d.currentTabWorkArea()) {
                                closeTabWorkArea(twa);
-                               d.current_work_area_ = 0;
+                               d.current_work_area_ = nullptr;
                                twa = d.currentTabWorkArea();
                                // Switch to the next GuiWorkArea in the found TabWorkArea.
                                if (twa) {
                                        // Make sure the work area is up to date.
                                        setCurrentWorkArea(twa->currentWorkArea());
                                } else {
-                                       setCurrentWorkArea(0);
+                                       setCurrentWorkArea(nullptr);
                                }
                        }
                        break;
@@ -4358,14 +4402,14 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                case LFUN_VIEW_CLOSE:
                        if (TabWorkArea * twa = d.currentTabWorkArea()) {
                                closeWorkArea(twa->currentWorkArea());
-                               d.current_work_area_ = 0;
+                               d.current_work_area_ = nullptr;
                                twa = d.currentTabWorkArea();
                                // Switch to the next GuiWorkArea in the found TabWorkArea.
                                if (twa) {
                                        // Make sure the work area is up to date.
                                        setCurrentWorkArea(twa->currentWorkArea());
                                } else {
-                                       setCurrentWorkArea(0);
+                                       setCurrentWorkArea(nullptr);
                                }
                        }
                        break;
@@ -4420,7 +4464,7 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                        }
 
                        // Actual zoom value: default zoom + fractional extra value
-                       int zoom = lyxrc.defaultZoom * zoom_ratio_;
+                       int zoom = (int)(lyxrc.defaultZoom * zoom_ratio_);
                        if (zoom < static_cast<int>(zoom_min_))
                                zoom = zoom_min_;
 
@@ -4460,7 +4504,7 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                case LFUN_FORWARD_SEARCH: {
                        // it seems safe to assume we have a document buffer, since
                        // getStatus wants one.
-                       LATTEST(doc_buffer);
+                       LASSERT(doc_buffer, break);
                        Buffer const * doc_master = doc_buffer->masterBuffer();
                        FileName const path(doc_master->temppath());
                        string const texname = doc_master->isChild(doc_buffer)
@@ -4591,7 +4635,7 @@ void GuiView::toggleFullScreen()
                statusBar()->show();
        } else {
                // bug 5274
-               hideDialogs("prefs", 0);
+               hideDialogs("prefs", nullptr);
                for (int i = 0; i != d.splitter_->count(); ++i)
                        d.tabWorkArea(i)->setFullScreen(true);
                setContentsMargins(-2, -2, -2, -2);
@@ -4616,7 +4660,7 @@ void GuiView::toggleFullScreen()
 Buffer const * GuiView::updateInset(Inset const * inset)
 {
        if (!inset)
-               return 0;
+               return nullptr;
 
        Buffer const * inset_buffer = &(inset->buffer());
 
@@ -4688,7 +4732,7 @@ private:
 bool isValidName(string const & name)
 {
        return find_if(dialognames, end_dialognames,
-                               cmpCStr(name.c_str())) != end_dialognames;
+               cmpCStr(name.c_str())) != end_dialognames;
 }
 
 } // namespace
@@ -4697,7 +4741,7 @@ bool isValidName(string const & name)
 void GuiView::resetDialogs()
 {
        // Make sure that no LFUN uses any GuiView.
-       guiApp->setCurrentView(0);
+       guiApp->setCurrentView(nullptr);
        saveLayout();
        saveUISettings();
        menuBar()->clear();
@@ -4714,7 +4758,7 @@ void GuiView::resetDialogs()
 Dialog * GuiView::findOrBuild(string const & name, bool hide_it)
 {
        if (!isValidName(name))
-               return 0;
+               return nullptr;
 
        map<string, DialogPtr>::iterator it = d.dialogs_.find(name);
 
@@ -4802,7 +4846,7 @@ void GuiView::hideDialog(string const & name, Inset * inset)
        if (dialog->isVisibleView())
                dialog->hideView();
        if (currentBufferView())
-               currentBufferView()->editInset(name, 0);
+               currentBufferView()->editInset(name, nullptr);
 }
 
 
@@ -4811,7 +4855,7 @@ void GuiView::disconnectDialog(string const & name)
        if (!isValidName(name))
                return;
        if (currentBufferView())
-               currentBufferView()->editInset(name, 0);
+               currentBufferView()->editInset(name, nullptr);
 }
 
 
@@ -4834,7 +4878,7 @@ void GuiView::updateDialogs()
                Dialog * dialog = it->second.get();
                if (dialog) {
                        if (dialog->needBufferOpen() && !documentBufferView())
-                               hideDialog(fromqstr(dialog->name()), 0);
+                               hideDialog(fromqstr(dialog->name()), nullptr);
                        else if (dialog->isVisibleView())
                                dialog->checkStatus();
                }
@@ -4889,7 +4933,7 @@ Dialog * createGuiProgressView(GuiView & lv);
 
 Dialog * GuiView::build(string const & name)
 {
-       LASSERT(isValidName(name), return 0);
+       LASSERT(isValidName(name), return nullptr);
 
        Dialog * dialog = createDialog(*this, name);
        if (dialog)
@@ -4970,7 +5014,7 @@ Dialog * GuiView::build(string const & name)
        if (name == "progress")
                return createGuiProgressView(*this);
 
-       return 0;
+       return nullptr;
 }