From: Enrico Forestieri Date: Fri, 13 Apr 2012 00:57:25 +0000 (+0200) Subject: Fix bugs #6871 and #8119. X-Git-Tag: 2.0.4~137 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=482355e7b4781cc3f9951861bd4fc655d95fa9c4;p=features.git Fix bugs #6871 and #8119. Both bugs above were due to a missing screen update. This patch updates the current view after dispatching a lyxserver command and thus solves both. The patch is quite strightforward and the only difficulty was due to the fact that the lyxserver needs the result of the dispatched command. Now, GuiApplication::dispatch(FuncRequest const &) does update the view, but does not return any result, while GuiApplication::dispatch(FuncRequest const &, DispatchResult &), which is also called by the former, does not update the view. So, I split the first one, isolating the code performing the update, such that the second one can also update the current view when the caller is the lyx server. When the action is initiated by anything different from the lyx server, the behavior is unchanged. (cherry picked from commit ea3154184833f4f2426eb2a956878e83ddd822d9) --- diff --git a/src/FuncRequest.h b/src/FuncRequest.h index 7fd3e1222f..175eb59fd1 100644 --- a/src/FuncRequest.h +++ b/src/FuncRequest.h @@ -35,6 +35,7 @@ public: TOOLBAR, // A toolbar icon KEYBOARD, // a keyboard binding COMMANDBUFFER, + LYXSERVER, TOC }; diff --git a/src/Server.cpp b/src/Server.cpp index b6ae8d8b1f..7ec096e25d 100644 --- a/src/Server.cpp +++ b/src/Server.cpp @@ -1172,10 +1172,10 @@ void Server::callback(string const & msg) // connect to the lyxfunc in the single GuiView we // support currently. (Lgb) - FuncRequest const fr(lyxaction.lookupFunc(cmd), arg); + FuncRequest fr(lyxaction.lookupFunc(cmd), arg); + fr.setOrigin(FuncRequest::LYXSERVER); DispatchResult dr; theApp()->dispatch(fr, dr); - theApp()->dispatch(FuncRequest(LFUN_PARAGRAPH_UPDATE)); string const rval = to_utf8(dr.message()); // all commands produce an INFO or ERROR message diff --git a/src/ServerSocket.cpp b/src/ServerSocket.cpp index 7940b7fc38..7b9d6df5af 100644 --- a/src/ServerSocket.cpp +++ b/src/ServerSocket.cpp @@ -141,9 +141,10 @@ void ServerSocket::dataCallback(int fd) string const key = line.substr(0, pos); if (key == "LYXCMD") { string const cmd = line.substr(pos + 1); + FuncRequest fr(lyxaction.lookupFunc(cmd)); + fr.setOrigin(FuncRequest::LYXSERVER); DispatchResult dr; - theApp()->dispatch(lyxaction.lookupFunc(cmd), dr); - theApp()->dispatch(FuncRequest(LFUN_PARAGRAPH_UPDATE)); + theApp()->dispatch(fr, dr); string const rval = to_utf8(dr.message()); if (dr.error()) client->writeln("ERROR:" + cmd + ':' + rval); diff --git a/src/frontends/qt4/GuiApplication.cpp b/src/frontends/qt4/GuiApplication.cpp index a2c60c9d29..fe6bf95526 100644 --- a/src/frontends/qt4/GuiApplication.cpp +++ b/src/frontends/qt4/GuiApplication.cpp @@ -1097,7 +1097,12 @@ void GuiApplication::dispatch(FuncRequest const & cmd) // This is done unless explicitly requested otherwise dr.screenUpdate(Update::FitCursor); dispatch(cmd, dr); + updateCurrentView(cmd, dr); +} + +void GuiApplication::updateCurrentView(FuncRequest const & cmd, DispatchResult & dr) +{ if (!current_view_) return; @@ -1268,6 +1273,13 @@ void GuiApplication::dispatch(FuncRequest const & cmd, DispatchResult & dr) return; }; + if (cmd.origin() == FuncRequest::LYXSERVER) { + if (current_view_ && current_view_->currentBufferView()) + current_view_->currentBufferView()->cursor().saveBeforeDispatchPosXY(); + // we will also need to redraw the screen at the end + dr.screenUpdate(Update::FitCursor); + } + // Assumes that the action will be dispatched. dr.dispatched(true); @@ -1620,6 +1632,9 @@ void GuiApplication::dispatch(FuncRequest const & cmd, DispatchResult & dr) current_view_->dispatch(cmd, dr); break; } + + if (cmd.origin() == FuncRequest::LYXSERVER) + updateCurrentView(cmd, dr); } diff --git a/src/frontends/qt4/GuiApplication.h b/src/frontends/qt4/GuiApplication.h index d1a10784b8..380507f7bf 100644 --- a/src/frontends/qt4/GuiApplication.h +++ b/src/frontends/qt4/GuiApplication.h @@ -185,6 +185,8 @@ private: /// void validateCurrentView(); /// + void updateCurrentView(FuncRequest const & cmd, DispatchResult & dr); + /// bool closeAllViews(); /// read the given ui (menu/toolbar) file bool readUIFile(QString const & name, bool include = false); diff --git a/status.20x b/status.20x index b7bd859347..dd98a18523 100644 --- a/status.20x +++ b/status.20x @@ -89,9 +89,6 @@ What's new flag by using the same latex backend used for previewing the document instead of always using the plain latex backend. -- Fix crash when dissolving a math macro whose first argument is another - parameterless macro (bug 8105). - * USER INTERFACE @@ -134,6 +131,13 @@ What's new - Made it possible to delete local layout in Document>Settings. +- Fix crash when dissolving a math macro whose first argument is another + parameterless macro (bug 8105). + +- Update the current view after dispatching a command through the lyxserver. + The missing screen update could cause either a failure in executing the + command or could even crash LyX (bugs 6871 and 8119). + * DOCUMENTATION AND LOCALIZATION