X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FServer.cpp;h=522060e91b6a70682b7ad0163ae9449cafbb240e;hb=5be391b274f2cbf4a1da03bc5ee2136cb6c4e660;hp=5fb089d758300cc69b3980081fb912afe7e75d4d;hpb=d55077477233fba7bb1154661634c4f005995707;p=lyx.git diff --git a/src/Server.cpp b/src/Server.cpp index 5fb089d758..522060e91b 100644 --- a/src/Server.cpp +++ b/src/Server.cpp @@ -55,13 +55,16 @@ #include "support/lassert.h" #include "support/lstrings.h" #include "support/os.h" -#include "support/signals.h" #include #ifdef _WIN32 -#include -#include +# include +# include +#else +# ifdef HAVE_UNISTD_H +# include +# endif #endif #include @@ -172,7 +175,7 @@ bool LyXComm::pipeServer() 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); @@ -378,6 +381,9 @@ bool LyXComm::pipeServer() if (!resetPipe(i, !success)) return false; break; + case CONNECTING_STATE: + LYXERR0("Wrong pipe state"); + break; } } @@ -483,7 +489,7 @@ bool LyXComm::resetPipe(DWORD index, bool close_handle) 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); @@ -521,7 +527,7 @@ void LyXComm::openConnection() } // 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; @@ -860,7 +866,7 @@ int LyXComm::startPipe(string const & file, bool write) if (!write) { // Make sure not to call read_ready after destruction. weak_ptr tracker = tracker_.p(); - theApp()->registerSocketCallback(fd, [=](){ + theApp()->registerSocketCallback(fd, [this, tracker](){ if (!tracker.expired()) read_ready(); }); @@ -1000,16 +1006,27 @@ struct Sleep : QThread } // namespace -bool LyXComm::loadFilesInOtherInstance() +bool LyXComm::loadFilesInOtherInstance() const { + int pipefd; + 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 pipefd; + int loaded_files = 0; - FileName const pipe(inPipeName()); vector::iterator it = theFilesToLoad().begin(); while (it != theFilesToLoad().end()) { FileName fname = fileSearch(string(), os::internal_path(*it),