On Tue, 28 Oct 2003, Alfredo Braunstein wrote:
> João, it would be asking too much to repost an updated version of all your
> pending patches?
>
> I'll apply non-controversial ones and ask for advice on the rest.
* putenv.diff: allocate space for the exported string and store the
pointers in a static map<>. Pointers are deleted when a variable is
overwritten, so the function doesn't leak memory.
* export-socket.diff: export variables EDITOR and LYXSOCKET when the
socket is created. Since there is no need of passing the socket address
through $$a, it is removed from format.C. Xdvi must then be called with no
arguments, and kdvi works if the editor is defined as 'lyxclient -g %f
%l'.
* export-lyxclient.diff: makes lyxclient work with LYXSOCKET environment
variable.
* lyxclient.man: manual page for lyxclient. I again ask some native
english speaker to revise it, please.
* socket-qt.diff: bring lyxsocket to qt.
* socket_callback.{C,h}: class analogous to io_callback for sockets. They
must be placed under src/frontends/qt2.
TODO:
* make lib/configure detect if there is a --src or --src-specials option
available for latex or if there is a srcltx.sty package and then set the
variable
\srcspecials latexoption "--src-specials"
or
\srcspecials package "srcltx.sty"
(or whatever is best)
* Make latex generate source specials only when previewing, not when
exporting DVI. Alfredo, I have been looking at the "flavours" code. Do you
think that a good solution would be defining a latex + src specials
flavour?
* forward search.
Regards,
Jo�o.
Index: src/support/ChangeLog
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/support/ChangeLog,v
retrieving revision 1.228
diff -u -r1.228 ChangeLog
--- src/support/ChangeLog 2003/11/03 17:47:28 1.228
+++ src/support/ChangeLog 2003/11/05 06:08:40
@@ -1,3 +1,10 @@
+2003-11-05 Jo�o Luis M. Assirati <[EMAIL PROTECTED]>
+
+ * putenv.C: allocate the string before putting it into the
+ environment.
+
+ * lyxlib.h: adjust.
+
2003-11-03 Lars Gullik Bj�nnes <[EMAIL PROTECTED]>
* tempname.C (tempName): use scoped_array for exception safety
Index: src/support/putenv.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/support/putenv.C,v
retrieving revision 1.8
diff -u -r1.8 putenv.C
--- src/support/putenv.C 2003/08/23 00:16:57 1.8
+++ src/support/putenv.C 2003/11/05 06:08:40
@@ -4,6 +4,7 @@
* Licence details can be found in the file COPYING.
*
* \author Lars Gullik Bj�nnes
+ * \author Jo�o Luis M. Assirati
*
* Full author contact details are available in file CREDITS.
*/
@@ -13,8 +14,24 @@
#include "lyxlib.h"
#include <cstdlib>
+#include <string>
+#include <map>
-int lyx::support::putenv(char const * str)
+using std::string;
+using std::map;
+
+bool lyx::support::putenv(string const & varname, string const & value)
{
- return ::putenv(const_cast<char*>(str));
+ static map<string, char *> varmap;
+
+ string str = varname + '=' + value;
+ char * newptr = new char[str.size() + 1];
+ newptr[str.copy(newptr, string::npos)] = '\0';
+ bool status = (::putenv(newptr) == 0);
+
+ char * oldptr = varmap[varname];
+ if(oldptr) delete oldptr;
+ varmap[varname] = newptr;
+
+ return status;
}
Index: src/support/lyxlib.h
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/support/lyxlib.h,v
retrieving revision 1.34
diff -u -r1.34 lyxlib.h
--- src/support/lyxlib.h 2003/10/06 15:43:18 1.34
+++ src/support/lyxlib.h 2003/11/05 06:08:40
@@ -40,8 +40,8 @@
void abort();
/// create the given directory with the given mode
int mkdir(std::string const & pathname, unsigned long int mode);
-/// put a C std::string into the environment
-int putenv(char const * str);
+/// put variable=value as a C std::string into the environment
+bool putenv(std::string const & varname, std::string const & value);
/// unlink the given file
int unlink(std::string const & file);
/// remove the given directory
Index: development/lyxsocket/lyxclient.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/development/lyxsocket/lyxclient.C,v
retrieving revision 1.1
diff -u -r1.1 lyxclient.C
--- development/lyxsocket/lyxclient.C 2003/10/13 12:25:08 1.1
+++ development/lyxsocket/lyxclient.C 2003/11/05 06:12:32
@@ -13,7 +13,6 @@
#include <map>
#include <iostream>
-
// getpid(), getppid()
#include <sys/types.h>
#include <unistd.h>
@@ -35,6 +34,8 @@
// fcntl()
#include <fcntl.h>
+// getenv()
+#include <cstdlib>
using std::string;
using std::vector;
@@ -75,8 +76,7 @@
// Parts stolen from lyx::support::DirList()
-// Returns pathnames begining with dir and ending with
-// pathname separator (/ in unix)
+// Returns the absolute pathnames of all lyx local sockets
vector<string> lyxSockets(string const & dir, string const & pid)
{
vector<string> dirlist;
@@ -94,6 +94,7 @@
string lyxsocket = dir + '/' + fil + "/lyxsocket";
struct stat status;
// not checking if it is a socket -- just if it exists
+ // and has reading permissions
if (!::stat(lyxsocket.c_str(), &status)) {
dirlist.push_back(lyxsocket);
}
@@ -124,7 +125,7 @@
addr.sun_path[len] = '\0';
if((fd = ::socket(PF_UNIX, SOCK_STREAM, 0))== -1) {
- cerr << "lyxclient: Could not create socket: "
+ cerr << "lyxclient: Could not create socket descriptor: "
<< strerror(errno) << endl;
return -1;
}
@@ -415,7 +416,8 @@
return 2;
}
-char * serverAddress;
+// 0 if LYXSOCKET is not set in the environment
+char * serverAddress = getenv("LYXSOCKET");
int a(vector<char *> const & arg)
{
if(arg.size() < 1) {
@@ -423,6 +425,7 @@
<< endl;
return -1;
}
+ // -a supercedes LYXSOCKET environment variable
serverAddress = arg[0];
return 1;
}
@@ -457,25 +460,25 @@
int main(int argc, char * argv[])
{
- CmdLineParser parser;
- parser.helper["-h"] = cmdline::h;
- parser.helper["-c"] = cmdline::c;
- parser.helper["-g"] = cmdline::g;
- parser.helper["-n"] = cmdline::n;
- parser.helper["-a"] = cmdline::a;
- parser.helper["-t"] = cmdline::t;
- parser.helper["-p"] = cmdline::p;
+ CmdLineParser args;
+ args.helper["-h"] = cmdline::h;
+ args.helper["-c"] = cmdline::c;
+ args.helper["-g"] = cmdline::g;
+ args.helper["-n"] = cmdline::n;
+ args.helper["-a"] = cmdline::a;
+ args.helper["-t"] = cmdline::t;
+ args.helper["-p"] = cmdline::p;
// Command line failure conditions:
- if((!parser.parse(argc, argv))
- || (parser.isset["-c"] && parser.isset["-g"])
- || (parser.isset["-a"] && parser.isset["-p"])) {
+ if((!args.parse(argc, argv))
+ || (args.isset["-c"] && args.isset["-g"])
+ || (args.isset["-a"] && args.isset["-p"])) {
cmdline::usage();
return 1;
}
LyXDataSocket * server;
- if(parser.isset["-a"]) {
+ if(cmdline::serverAddress) {
server = new LyXDataSocket(cmdline::serverAddress);
if(!server->connected()) {
cerr << "lyxclient: " << "Could not connect to "
@@ -526,7 +529,7 @@
return 1;
}
- if(parser.isset["-g"] || parser.isset["-c"]) {
+ if(args.isset["-g"] || args.isset["-c"]) {
server->writeln(cmdline::singleCommand);
iowatch.wait(2.0);
if(iowatch.isset(serverfd) && server->readln(answer)) {
Index: src/ChangeLog
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/ChangeLog,v
retrieving revision 1.1682
diff -u -r1.1682 ChangeLog
--- src/ChangeLog 2003/11/04 12:36:52 1.1682
+++ src/ChangeLog 2003/11/05 06:10:55
@@ -1,3 +1,9 @@
+2003-11-05 Jo�o Luis M. Assirati <[EMAIL PROTECTED]>
+
+ * lyxsocket.C: export variables XEDITOR and LYXSOCKET
+
+ * format.C: remove unneeded $$a
+
2003-11-04 Andr� P�nitz <[EMAIL PROTECTED]>
* cursor.[Ch]: restructure
Index: src/lyxsocket.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/lyxsocket.C,v
retrieving revision 1.3
diff -u -r1.3 lyxsocket.C
--- src/lyxsocket.C 2003/11/03 17:47:22 1.3
+++ src/lyxsocket.C 2003/11/05 06:10:55
@@ -45,6 +45,13 @@
lyxerr << "lyx: Disabling LyX socket." << endl;
return;
}
+
+ // These env vars are used by DVI inverse search
+ // Needed by xdvi
+ lyx::support::putenv("XEDITOR", "lyxclient -g %f %l");
+ // Needed by lyxclient
+ lyx::support::putenv("LYXSOCKET", address_);
+
lyx_gui::set_serversocket_callback(this);
lyxerr[Debug::LYXSERVER] << "lyx: New server socket "
<< fd_ << ' ' << address_ << endl;
Index: src/format.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/format.C,v
retrieving revision 1.20
diff -u -r1.20 format.C
--- src/format.C 2003/10/14 11:35:50 1.20
+++ src/format.C 2003/11/05 06:10:55
@@ -16,7 +16,6 @@
#include "lyxrc.h"
#include "debug.h"
#include "gettext.h"
-#include "lyxsocket.h"
#include "frontends/Alert.h" //to be removed?
@@ -37,13 +36,10 @@
using std::string;
-extern LyXServerSocket * lyxsocket;
-
namespace {
string const token_from("$$i");
string const token_path("$$p");
-string const token_socket("$$a");
} //namespace anon
@@ -199,7 +195,6 @@
command = subst(command, token_from,
QuoteName(OnlyFilename(filename)));
command = subst(command, token_path, QuoteName(OnlyPath(filename)));
- command = subst(command, token_socket, QuoteName(lyxsocket->address()));
lyxerr[Debug::FILES] << "Executing command: " << command << std::endl;
buffer.message(_("Executing command: ") + command);
Index: src/frontends/qt2/ChangeLog
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/qt2/ChangeLog,v
retrieving revision 1.605
diff -u -r1.605 ChangeLog
--- src/frontends/qt2/ChangeLog 2003/11/04 12:01:10 1.605
+++ src/frontends/qt2/ChangeLog 2003/11/05 06:14:06
@@ -1,3 +1,10 @@
+2003-11-05 Jo�o Luis M. Assirati <[EMAIL PROTECTED]>
+
+ * {set,remove}_{server,data}socket_callback(): Working functions
+
+ * socket_callback.[Ch]: new files with a class to connect sockets
+
+ * Makefile.dialogs: add the above
2003-11-04 Alfredo Braunstein <[EMAIL PROTECTED]>
Index: src/frontends/qt2/Makefile.dialogs
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/qt2/Makefile.dialogs,v
retrieving revision 1.45
diff -u -r1.45 Makefile.dialogs
--- src/frontends/qt2/Makefile.dialogs 2003/10/23 11:58:00 1.45
+++ src/frontends/qt2/Makefile.dialogs 2003/11/05 06:14:06
@@ -125,4 +125,5 @@
QURLDialog.C QURLDialog.h \
QVCLogDialog.C QVCLogDialog.h \
QWrapDialog.C QWrapDialog.h \
- QLToolbar.C QLToolbar.h
+ QLToolbar.C QLToolbar.h \
+ socket_callback.C socket_callback.h
// -*- C++ -*-
/**
* \file io_callback.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author unknown
* \author John Levon
* \author Jo�o Luis M. Assirati
*
* Full author contact details are available in file CREDITS.
*/
#ifndef SOCKET_CALLBACK_H
#define SOCKET_CALLBACK_H
#include <qobject.h>
#include <qsocketnotifier.h>
#include <boost/scoped_ptr.hpp>
class LyXServerSocket;
class LyXDataSocket;
/**
* socket_callback - a simple wrapper for asynchronous socket notification
*
* This is used by the lyxsocket to notice the socket is ready to be
* connected/read.
*
* FIXME: this code apparently will not work on Windows.
*/
class socket_callback : public QObject {
Q_OBJECT
public:
/// connect a connection notification from the LyXServerSocket
socket_callback(LyXServerSocket * server);
socket_callback(LyXDataSocket * data);
public slots:
void server_received();
void data_received();
private:
/// our notifier
boost::scoped_ptr<QSocketNotifier> sn_;
LyXServerSocket * server_;
LyXDataSocket * data_;
};
#endif // SOCKET_CALLBACK_H
/**
* \file io_callback.C
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author unknown
* \author John Levon
* \author Jo�o Luis M. Assirati
*
* Full author contact details are available in file CREDITS.
*/
#include <config.h>
#include "lyxsocket.h"
#include "socket_callback.h"
socket_callback::socket_callback(LyXServerSocket * server)
: server_(server)
{
sn_.reset(new QSocketNotifier(server->fd(), QSocketNotifier::Read, this));
connect(sn_.get(), SIGNAL(activated(int)), this, SLOT(server_received()));
}
socket_callback::socket_callback(LyXDataSocket * data)
: data_(data)
{
sn_.reset(new QSocketNotifier(data->fd(), QSocketNotifier::Read, this));
connect(sn_.get(), SIGNAL(activated(int)), this, SLOT(data_received()));
}
void socket_callback::server_received()
{
server_->serverCallback();
}
void socket_callback::data_received()
{
data_->server()->dataCallback(data_);
}