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 ea31541848)
This commit is contained in:
Enrico Forestieri 2012-04-13 02:57:25 +02:00
parent fe47997587
commit 482355e7b4
6 changed files with 30 additions and 7 deletions

View File

@ -35,6 +35,7 @@ public:
TOOLBAR, // A toolbar icon
KEYBOARD, // a keyboard binding
COMMANDBUFFER,
LYXSERVER,
TOC
};

View File

@ -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

View File

@ -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);

View File

@ -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);
}

View File

@ -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);

View File

@ -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