#include "support/lassert.h"
#include "support/lstrings.h"
#include "support/os.h"
-#include "support/signals.h"
#include <iostream>
#ifdef _WIN32
-#include <io.h>
-#include <QCoreApplication>
+# include <io.h>
+# include <QCoreApplication>
+#else
+# ifdef HAVE_UNISTD_H
+# include <unistd.h>
+# endif
#endif
#include <QThread>
pipe_[i].overlap.hEvent = event_[i];
pipe_[i].iobuf.erase();
- pipe_[i].handle = CreateNamedPipe(pipename.c_str(),
+ pipe_[i].handle = CreateNamedPipeA(pipename.c_str(),
open_mode | FILE_FLAG_OVERLAPPED, PIPE_WAIT,
MAX_CLIENTS, PIPE_BUFSIZE, PIPE_BUFSIZE,
PIPE_TIMEOUT, NULL);
error = GetLastError();
- if (success && error == ERROR_IO_PENDING) {
+ if (success && (error == ERROR_IO_PENDING || error == NO_ERROR)) {
// The write operation is still pending.
// We get here when a reader is started
// well before a reply is ready, so delay
if (!resetPipe(i, !success))
return false;
break;
+ case CONNECTING_STATE:
+ LYXERR0("Wrong pipe state");
+ break;
}
}
CloseHandle(pipe_[index].handle);
pipe_[index].iobuf.erase();
- pipe_[index].handle = CreateNamedPipe(name.c_str(),
+ pipe_[index].handle = CreateNamedPipeA(name.c_str(),
open_mode | FILE_FLAG_OVERLAPPED, PIPE_WAIT,
MAX_CLIENTS, PIPE_BUFSIZE, PIPE_BUFSIZE,
PIPE_TIMEOUT, NULL);
}
// Check whether the pipe name is being used by some other instance.
- if (!stopserver_ && WaitNamedPipe(inPipeName().c_str(), 0)) {
+ if (!stopserver_ && WaitNamedPipeA(inPipeName().c_str(), 0)) {
// Tell the running instance to load the files
if (run_mode == USE_REMOTE && loadFilesInOtherInstance()) {
deferred_loading_ = true;
if (!write) {
// Make sure not to call read_ready after destruction.
weak_ptr<void> tracker = tracker_.p();
- theApp()->registerSocketCallback(fd, [=](){
+ theApp()->registerSocketCallback(fd, [this, tracker](){
if (!tracker.expired())
read_ready();
});
} // namespace
-bool LyXComm::loadFilesInOtherInstance()
+bool LyXComm::loadFilesInOtherInstance() const
{
int pipefd;
- int loaded_files = 0;
FileName const pipe(inPipeName());
+
+ if (theFilesToLoad().empty()) {
+ LYXERR0("LyX is already running in another instance\n"
+ "and 'use single instance' is active.");
+ // Wait a while for the other instance to reset the connection
+ Sleep::millisec(200);
+ pipefd = ::open(pipe.toFilesystemEncoding().c_str(), O_WRONLY);
+ if (pipefd >= 0) {
+ string const cmd = "LYXCMD:pipe:window-raise\n";
+ if (::write(pipefd, cmd.c_str(), cmd.length()) < 0)
+ LYXERR0("Cannot communicate with running instance!");
+ ::close(pipefd);
+ }
+ return true;
+ }
+
+ int loaded_files = 0;
vector<string>::iterator it = theFilesToLoad().begin();
while (it != theFilesToLoad().end()) {
FileName fname = fileSearch(string(), os::internal_path(*it),
string message;
for (int i = 0; i != numclients_; ++i) {
message = "LYXSRV:" + clients_[i] + ":bye\n";
- // ignore exceptions, we are quitting anyway
- try {
- pipes_.send(message);
- } catch (...) {}
+ pipes_.send(message);
}
}
// connect to the lyxfunc in the single GuiView we
// support currently. (Lgb)
- FuncRequest fr(lyxaction.lookupFunc(cmd), from_ascii(arg));
+ FuncRequest fr(lyxaction.lookupFunc(cmd), from_utf8(arg));
fr.setOrigin(FuncRequest::LYXSERVER);
DispatchResult dr;
theApp()->dispatch(fr, dr);