]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiApplication.cpp
QDialogButtonBox for the remaining dialogs.
[lyx.git] / src / frontends / qt4 / GuiApplication.cpp
index b2a67dce05d05d5833a69f2cb0d2566c6202b92d..25eff65ec2221a897a54dd4cb6c64a27e89428ae 100644 (file)
@@ -1345,12 +1345,12 @@ bool GuiApplication::getStatus(FuncRequest const & cmd, FuncStatus & flag) const
 static docstring makeDispatchMessage(docstring const & msg,
                                     FuncRequest const & cmd)
 {
-       const bool verbose = (cmd.origin() == FuncRequest::MENU
+       const bool be_verbose = (cmd.origin() == FuncRequest::MENU
                              || cmd.origin() == FuncRequest::TOOLBAR
                              || cmd.origin() == FuncRequest::COMMANDBUFFER);
 
-       if (cmd.action() == LFUN_SELF_INSERT || !verbose) {
-               LYXERR(Debug::ACTION, "dispatch msg is " << msg);
+       if (cmd.action() == LFUN_SELF_INSERT || !be_verbose) {
+               LYXERR(Debug::ACTION, "dispatch msg is `" << msg << "'");
                return msg;
        }
 
@@ -1387,21 +1387,31 @@ static docstring makeDispatchMessage(docstring const & msg,
 
 DispatchResult const & GuiApplication::dispatch(FuncRequest const & cmd)
 {
+       DispatchResult dr;
+
        Buffer * buffer = 0;
+       if (cmd.view_origin() && current_view_ != cmd.view_origin()) {
+               //setCurrentView(cmd.view_origin); //does not work
+               dr.setError(true);
+               dr.setMessage(_("Wrong focus!"));
+               d->dispatch_result_ = dr;
+               return d->dispatch_result_;
+       }
        if (current_view_ && current_view_->currentBufferView()) {
                current_view_->currentBufferView()->cursor().saveBeforeDispatchPosXY();
                buffer = &current_view_->currentBufferView()->buffer();
        }
-       // This handles undo groups automagically
-       UndoGroupHelper ugh(buffer);
 
-       DispatchResult dr;
+       dr.screenUpdate(Update::FitCursor);
+       {
+               // This handles undo groups automagically
+               UndoGroupHelper ugh(buffer);
+               dispatch(cmd, dr);
+       }
+
        // redraw the screen at the end (first of the two drawing steps).
        // This is done unless explicitly requested otherwise
-       dr.screenUpdate(Update::FitCursor);
-       dispatch(cmd, dr);
        updateCurrentView(cmd, dr);
-
        d->dispatch_result_ = dr;
        return d->dispatch_result_;
 }
@@ -1846,8 +1856,11 @@ void GuiApplication::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                        dr.setMessage(bformat(_("Cannot iterate more than %1$d times"), max_iter));
                        dr.setError(true);
                } else {
-                       for (int i = 0; i < count; ++i)
-                               dispatch(lyxaction.lookupFunc(rest));
+                       for (int i = 0; i < count; ++i) {
+                               FuncRequest lfun = lyxaction.lookupFunc(rest);
+                               lfun.allowAsync(false);
+                               dispatch(lfun);
+                       }
                }
                break;
        }
@@ -1864,6 +1877,7 @@ void GuiApplication::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                        string first;
                        arg = split(arg, first, ';');
                        FuncRequest func(lyxaction.lookupFunc(first));
+                       func.allowAsync(false);
                        func.setOrigin(cmd.origin());
                        dispatch(func);
                }
@@ -1871,7 +1885,8 @@ void GuiApplication::dispatch(FuncRequest const & cmd, DispatchResult & dr)
        }
 
        case LFUN_BUFFER_FORALL: {
-               FuncRequest const funcToRun = lyxaction.lookupFunc(cmd.getLongArg(0));
+               FuncRequest funcToRun = lyxaction.lookupFunc(cmd.getLongArg(0));
+               funcToRun.allowAsync(false);
 
                map<Buffer *, GuiView *> views_lVisible;
                map<GuiView *, Buffer *> activeBuffers;
@@ -2271,8 +2286,12 @@ void GuiApplication::processFuncRequestAsync(FuncRequest const & func)
 void GuiApplication::processFuncRequestQueue()
 {
        while (!d->func_request_queue_.empty()) {
-               processFuncRequest(d->func_request_queue_.front());
+               // take the item from the stack _before_ processing the
+               // request in order to avoid race conditions from nested
+               // or parallel requests (see #10406)
+               FuncRequest const fr(d->func_request_queue_.front());
                d->func_request_queue_.pop();
+               processFuncRequest(fr);
        }
 }