diff --git a/development/Win32/lyx-devel.patch b/development/Win32/lyx-devel.patch new file mode 100644 index 0000000000..d2f76edfde --- /dev/null +++ b/development/Win32/lyx-devel.patch @@ -0,0 +1,2219 @@ +Index: src/BufferView.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/BufferView.C,v +retrieving revision 1.256 +diff -u -r1.256 BufferView.C +--- src/BufferView.C 30 Nov 2004 01:59:29 -0000 1.256 ++++ src/BufferView.C 31 Jan 2005 11:19:24 -0000 +@@ -290,10 +290,17 @@ + screen().hideCursor(); + } + +- +-LyXText * BufferView::getLyXText() const ++LyXText * BufferView::getLyXText() + { + LyXText * text = cursor().innerText(); ++ BOOST_ASSERT(text); ++ return text; ++} ++ ++ ++LyXText const * BufferView::getLyXText() const ++{ ++ LyXText const * text = cursor().innerText(); + BOOST_ASSERT(text); + return text; + } +Index: src/BufferView.h +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/BufferView.h,v +retrieving revision 1.183 +diff -u -r1.183 BufferView.h +--- src/BufferView.h 19 Jan 2005 15:03:26 -0000 1.183 ++++ src/BufferView.h 31 Jan 2005 11:15:54 -0000 +@@ -102,7 +102,10 @@ + Change const getCurrentChange(); + + /// return the lyxtext we are using +- LyXText * getLyXText() const; ++ LyXText * getLyXText(); ++ ++ /// return the lyxtext we are using ++ LyXText const * getLyXText() const; + + /// simple replacing. Use the font of the first selected character + void replaceSelectionWithString(std::string const & str); +Index: src/BufferView_pimpl.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/BufferView_pimpl.C,v +retrieving revision 1.569 +diff -u -r1.569 BufferView_pimpl.C +--- src/BufferView_pimpl.C 27 Jan 2005 21:05:30 -0000 1.569 ++++ src/BufferView_pimpl.C 31 Jan 2005 12:25:38 -0000 +@@ -445,7 +445,6 @@ + t.redoParagraph(anchor_ref_); + int const h = t.getPar(anchor_ref_).height(); + offset_ref_ = int((bar * t.paragraphs().size() - anchor_ref_) * h); +- lyxerr << "scrolling: " << value << std::endl; + update(); + + if (!lyxrc.cursor_follows_scrollbar) +@@ -612,6 +611,7 @@ + + CoordCache backup; + std::swap(theCoords, backup); ++ theCoords.startUpdating(); + // + ViewMetricsInfo vi = metrics(); + +@@ -622,8 +622,11 @@ + if (forceupdate) { + // second drawing step + screen().redraw(*bv_, vi); +- } else ++ theCoords.doneUpdating(); ++ } else { ++ // Abort updating of the coord cache - just restore the old one + std::swap(theCoords, backup); ++ } + } else + screen().greyOut(); + +@@ -743,7 +746,7 @@ + + void BufferView::Pimpl::center() + { +- CursorSlice const & bot = bv_->cursor().bottom(); ++ CursorSlice & bot = bv_->cursor().bottom(); + lyx::pit_type const pit = bot.pit(); + bot.text()->redoParagraph(pit); + Paragraph const & par = bot.text()->paragraphs()[pit]; +@@ -1247,7 +1250,7 @@ + int y = y1; + for (lyx::pit_type pit = pit1; pit <= pit2; ++pit) { + y += text->getPar(pit).ascent(); +- theCoords.pars_[text][pit] = Point(0, y); ++ theCoords.parPos()[text][pit] = Point(0, y); + y += text->getPar(pit).descent(); + } + +Index: src/DepTable.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/DepTable.C,v +retrieving revision 1.41 +diff -u -r1.41 DepTable.C +--- src/DepTable.C 13 Oct 2003 01:01:33 -0000 1.41 ++++ src/DepTable.C 19 Jan 2005 10:35:54 -0000 +@@ -26,7 +26,9 @@ + #include + + #ifndef CXX_GLOBAL_CSTD ++# ifndef _WIN32 + using std::time; ++# endif + #endif + + using lyx::support::ltrim; +Index: src/RowList_fwd.h +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/RowList_fwd.h,v +retrieving revision 1.5 +diff -u -r1.5 RowList_fwd.h +--- src/RowList_fwd.h 16 Nov 2004 20:41:37 -0000 1.5 ++++ src/RowList_fwd.h 27 Jan 2005 10:58:08 -0000 +@@ -16,6 +16,11 @@ + + #include + ++/** ++ * Each paragraph is broken up into a number of rows on the screen. ++ * This is a list of such on-screen rows, ordered from the top row ++ * downwards. ++ */ + typedef std::vector RowList; + + #endif +Index: src/buffer.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/buffer.C,v +retrieving revision 1.609 +diff -u -r1.609 buffer.C +--- src/buffer.C 31 Jan 2005 10:42:17 -0000 1.609 ++++ src/buffer.C 31 Jan 2005 11:08:10 -0000 +@@ -77,7 +77,11 @@ + #include + #include + +-#include ++#ifdef _WIN32 ++# include ++#else ++# include ++#endif + + #include + #include +Index: src/buffer.h +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/buffer.h,v +retrieving revision 1.189 +diff -u -r1.189 buffer.h +--- src/buffer.h 17 Dec 2004 16:27:07 -0000 1.189 ++++ src/buffer.h 31 Jan 2005 09:58:01 -0000 +@@ -49,10 +49,15 @@ + + + /** The buffer object. +- This is the buffer object. It contains all the informations about +- a document loaded into LyX. I am not sure if the class is complete or +- minimal, probably not. +- \author Lars Gullik Bjønnes ++ * This is the buffer object. It contains all the informations about ++ * a document loaded into LyX. ++ * The buffer object owns the LyXText (wrapped in an InsetText), which ++ * contains the individual paragraphs of the document. ++ * ++ * ++ * I am not sure if the class is complete or ++ * minimal, probably not. ++ * \author Lars Gullik Bjønnes + */ + class Buffer { + public: +Index: src/bufferview_funcs.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/bufferview_funcs.C,v +retrieving revision 1.146 +diff -u -r1.146 bufferview_funcs.C +--- src/bufferview_funcs.C 6 Jan 2005 16:39:21 -0000 1.146 ++++ src/bufferview_funcs.C 31 Jan 2005 11:54:25 -0000 +@@ -180,8 +180,8 @@ + Point getPos(DocIterator const & dit) + { + CursorSlice const & bot = dit.bottom(); +- CoordCache::InnerParPosCache & cache = theCoords.pars_[bot.text()]; +- CoordCache::InnerParPosCache::iterator it = cache.find(bot.pit()); ++ CoordCache::InnerParPosCache const & cache = theCoords.getParPos().find(bot.text())->second; ++ CoordCache::InnerParPosCache::const_iterator it = cache.find(bot.pit()); + if (it == cache.end()) { + //lyxerr << "cursor out of view" << std::endl; + return Point(-1,-1); +@@ -195,7 +195,7 @@ + // this could be used elsewhere as well? + CurStatus status(BufferView const * bv, DocIterator const & dit) + { +- CoordCache::InnerParPosCache & cache = theCoords.pars_[dit.bottom().text()]; ++ CoordCache::InnerParPosCache const & cache = theCoords.getParPos().find(dit.bottom().text())->second; + + if (cache.find(dit.bottom().pit()) != cache.end()) + return CUR_INSIDE; +Index: src/coordcache.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/coordcache.C,v +retrieving revision 1.5 +diff -u -r1.5 coordcache.C +--- src/coordcache.C 12 Jan 2005 10:30:44 -0000 1.5 ++++ src/coordcache.C 31 Jan 2005 10:20:07 -0000 +@@ -21,20 +21,24 @@ + } + + +-void lyxaborter(int x, int y) +-{ +- lyxerr << "abort on x: " << x << " y: " << y << std::endl; +- BOOST_ASSERT(false); +-} +- +- + void CoordCache::clear() + { ++ BOOST_ASSERT(updating); + arrays_.clear(); + insets_.clear(); + pars_.clear(); + } + ++void CoordCache::startUpdating() { ++ BOOST_ASSERT(!updating); ++ updating = true; ++} ++ ++ ++void CoordCache::doneUpdating() { ++ BOOST_ASSERT(updating); ++ updating = false; ++} + + Point CoordCache::get(LyXText const * text, lyx::pit_type pit) + { +Index: src/coordcache.h +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/coordcache.h,v +retrieving revision 1.6 +diff -u -r1.6 coordcache.h +--- src/coordcache.h 19 Jan 2005 15:03:29 -0000 1.6 ++++ src/coordcache.h 31 Jan 2005 12:23:49 -0000 +@@ -12,13 +12,7 @@ + + #include + +- +-// All positions cached in this cache are only valid between subsequent +-// updated. (x,y) == (0,0) is the upper left screen corner, x increases +-// to the right, y increases downwords. +- + void lyxbreaker(void const * data, const char * hint, int size); +-void lyxaborter(int x, int y); + + class Point { + public: +@@ -92,21 +86,55 @@ + cache_type data_; + }; + +- ++/** ++ * A global cache that allows us to come from a paragraph in a document ++ * to a position point on the screen. ++ * All points cached in this cache are only valid between subsequent ++ * updated. (x,y) == (0,0) is the upper left screen corner, x increases ++ * to the right, y increases downwords. ++ * The cache is built in BufferView::Pimpl::metrics which is called ++ * from BufferView::Pimpl::update. The individual points are added ++ * while we paint them. See for instance paintPar in RowPainter.C. ++ */ + class CoordCache { + public: ++ CoordCache() : updating(false) { } ++ /// In order to find bugs, we record when we start updating the cache ++ void startUpdating(); ++ /// When we are done, we record that to help find bugs ++ void doneUpdating(); ++ + void clear(); + Point get(LyXText const *, lyx::pit_type); + ++ /// A map from paragraph index number to screen point ++ typedef std::map InnerParPosCache; ++ /// A map from a LyXText to the map of paragraphs to screen points ++ typedef std::map ParPosCache; ++ ++ /// A map from MathArray to position on the screen ++ CoordCacheBase & arrays() { BOOST_ASSERT(updating); return arrays_; } ++ CoordCacheBase const & getArrays() const { return arrays_; } ++ /// A map from insets to positions on the screen ++ CoordCacheBase & insets() { BOOST_ASSERT(updating); return insets_; } ++ CoordCacheBase const & getInsets() const { return insets_; } ++ /// A map from (LyXText, paragraph) pair to screen positions ++ ParPosCache & parPos() { BOOST_ASSERT(updating); return pars_; } ++ ParPosCache const & getParPos() const { return pars_; } ++private: + CoordCacheBase arrays_; + + // all insets + CoordCacheBase insets_; + + // paragraph grouped by owning text +- typedef std::map InnerParPosCache; +- typedef std::map ParPosCache; + ParPosCache pars_; ++ ++ /** ++ * Debugging flag only: Set to true while the cache is being built. ++ * No changes to the structure are allowed unless we are updating. ++ */ ++ bool updating; + }; + + extern CoordCache theCoords; +Index: src/cursor.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/cursor.C,v +retrieving revision 1.119 +diff -u -r1.119 cursor.C +--- src/cursor.C 18 Jan 2005 14:15:55 -0000 1.119 ++++ src/cursor.C 31 Jan 2005 11:08:09 -0000 +@@ -58,7 +58,9 @@ + using std::vector; + using std::endl; + #ifndef CXX_GLOBAL_CSTD ++# ifndef _WIN32 + using std::isalpha; ++# endif + #endif + using std::min; + using std::swap; +@@ -1086,7 +1088,7 @@ + if (operator[](s).text()) + break; + CursorSlice const & sl = operator[](s); +- LyXText & text = *sl.text(); ++ LyXText const & text = *sl.text(); + LyXFont font = text.getPar(sl.pit()).getFont( + bv().buffer()->params(), sl.pos(), outerFont(sl.pit(), text.paragraphs())); + return font.language()->encoding(); +@@ -1127,7 +1129,7 @@ + if (operator[](s).text()) + break; + CursorSlice const & sl = operator[](s); +- LyXText & text = *sl.text(); ++ LyXText const & text = *sl.text(); + LyXFont font = text.getPar(sl.pit()).getFont( + bv().buffer()->params(), + sl.pos(), +Index: src/cursor_slice.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/cursor_slice.C,v +retrieving revision 1.26 +diff -u -r1.26 cursor_slice.C +--- src/cursor_slice.C 24 Nov 2004 21:53:38 -0000 1.26 ++++ src/cursor_slice.C 31 Jan 2005 11:01:13 -0000 +@@ -104,7 +104,13 @@ + } + + +-LyXText * CursorSlice::text() const ++LyXText * CursorSlice::text() ++{ ++ BOOST_ASSERT(inset_); ++ return inset_->getText(idx_); ++} ++ ++LyXText const * CursorSlice::text() const + { + BOOST_ASSERT(inset_); + return inset_->getText(idx_); +Index: src/cursor_slice.h +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/cursor_slice.h,v +retrieving revision 1.20 +diff -u -r1.20 cursor_slice.h +--- src/cursor_slice.h 30 Nov 2004 01:59:33 -0000 1.20 ++++ src/cursor_slice.h 31 Jan 2005 11:01:13 -0000 +@@ -97,7 +97,9 @@ + /// see comment for the member + bool & boundary() { return boundary_; } + /// +- LyXText * text() const; ++ LyXText * text(); ++ /// ++ LyXText const * text() const; + /// + UpdatableInset * asUpdatableInset() const; + /// +Index: src/dociterator.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/dociterator.C,v +retrieving revision 1.21 +diff -u -r1.21 dociterator.C +--- src/dociterator.C 30 Nov 2004 01:59:33 -0000 1.21 ++++ src/dociterator.C 31 Jan 2005 11:11:59 -0000 +@@ -123,7 +123,13 @@ + } + + +-LyXText * DocIterator::text() const ++LyXText * DocIterator::text() ++{ ++ BOOST_ASSERT(!empty()); ++ return top().text(); ++} ++ ++LyXText const * DocIterator::text() const + { + BOOST_ASSERT(!empty()); + return top().text(); +@@ -146,12 +152,14 @@ + + Row & DocIterator::textRow() + { ++ BOOST_ASSERT(!paragraph().rows().empty()); + return paragraph().getRow(pos()); + } + + + Row const & DocIterator::textRow() const + { ++ BOOST_ASSERT(!paragraph().rows().empty()); + return paragraph().getRow(pos()); + } + +@@ -233,7 +241,18 @@ + } + + +-LyXText * DocIterator::innerText() const ++LyXText * DocIterator::innerText() ++{ ++ BOOST_ASSERT(!empty()); ++ // go up until first non-0 text is hit ++ // (innermost text is 0 in mathed) ++ for (int i = size() - 1; i >= 0; --i) ++ if (operator[](i).text()) ++ return operator[](i).text(); ++ return 0; ++} ++ ++LyXText const * DocIterator::innerText() const + { + BOOST_ASSERT(!empty()); + // go up until first non-0 text is hit +Index: src/dociterator.h +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/dociterator.h,v +retrieving revision 1.14 +diff -u -r1.14 dociterator.h +--- src/dociterator.h 30 Nov 2004 01:59:33 -0000 1.14 ++++ src/dociterator.h 31 Jan 2005 11:11:59 -0000 +@@ -151,11 +151,15 @@ + /// the row in the paragraph we're in + Row const & textRow() const; + /// +- LyXText * text() const; ++ LyXText * text(); ++ /// ++ LyXText const * text() const; + /// + InsetBase * innerInsetOfType(int code) const; + /// +- LyXText * innerText() const; ++ LyXText * innerText(); ++ /// ++ LyXText const * innerText() const; + + // + // elementary moving +Index: src/ispell.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/ispell.C,v +retrieving revision 1.25 +diff -u -r1.25 ispell.C +--- src/ispell.C 20 Jan 2005 16:17:36 -0000 1.25 ++++ src/ispell.C 23 Jan 2005 12:09:37 -0000 +@@ -24,11 +24,17 @@ + + #include "support/forkedcall.h" + ++#ifdef _WIN32 ++# include "support/os_win32.h" ++#endif ++ + // HP-UX 11.x doesn't have this header + #ifdef HAVE_SYS_SELECT_H + #include + #endif +-#include ++#ifndef _WIN32 ++# include ++#endif + + using boost::shared_ptr; + +@@ -88,6 +94,7 @@ + } + + // child process ++#ifndef _WIN32 + dup2(pipein[0], STDIN_FILENO); + dup2(pipeout[1], STDOUT_FILENO); + dup2(pipeerr[1], STDERR_FILENO); +@@ -180,6 +187,7 @@ + + lyxerr << "LyX: Failed to start ispell!" << endl; + _exit(0); ++#endif + } + + +@@ -191,6 +199,7 @@ + { + lyxerr[Debug::GUI] << "Created ispell" << endl; + ++#ifndef _WIN32 + // static due to the setvbuf. Ugly. + static char o_buf[BUFSIZ]; + +@@ -275,6 +284,7 @@ + close(pipeerr[1]); + child_->kill(); + child_.reset(0); ++#endif + } + + +@@ -295,18 +305,23 @@ + fclose(out); + } + ++#ifndef _WIN32 + close(pipein[0]); + close(pipein[1]); + close(pipeout[0]); + close(pipeout[1]); + close(pipeerr[0]); + close(pipeerr[1]); ++#endif + delete [] str; + } + + + bool ISpell::select(bool & err_read) + { ++#ifdef _WIN32 ++ return false; ++#else + fd_set infds; + struct timeval tv; + int retval = 0; +@@ -316,11 +331,15 @@ + tv.tv_sec = 2; + tv.tv_usec = 0; + ++#ifdef HAVE_SELECT + retval = ::select(SELECT_TYPE_ARG1 (max(pipeout[0], pipeerr[0]) + 1), + SELECT_TYPE_ARG234 (&infds), + 0, + 0, + SELECT_TYPE_ARG5 (&tv)); ++#else ++ retval = -1; ++#endif + + // error + if (retval <= 0) +@@ -335,6 +354,7 @@ + fgets(buf, BUFSIZ, in); + err_read = false; + return false; ++#endif + } + + +Index: src/lyx_cb.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyx_cb.C,v +retrieving revision 1.247 +diff -u -r1.247 lyx_cb.C +--- src/lyx_cb.C 31 Jan 2005 10:42:18 -0000 1.247 ++++ src/lyx_cb.C 31 Jan 2005 10:57:53 -0000 +@@ -44,6 +44,10 @@ + #include "support/path.h" + #include "support/systemcall.h" + ++#ifdef _WIN32 ++# include "support/os_win32.h" // fork() ++#endif ++ + #include + #include + +Index: src/lyxlex_pimpl.h +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxlex_pimpl.h,v +retrieving revision 1.22 +diff -u -r1.22 lyxlex_pimpl.h +--- src/lyxlex_pimpl.h 21 Jan 2005 08:39:13 -0000 1.22 ++++ src/lyxlex_pimpl.h 25 Jan 2005 12:40:01 -0000 +@@ -23,6 +23,7 @@ + #include + #include + #include ++#include // for std::filebuf + + /// + class LyXLex::Pimpl : boost::noncopyable { +Index: src/lyxrow.h +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxrow.h,v +retrieving revision 1.42 +diff -u -r1.42 lyxrow.h +--- src/lyxrow.h 30 Nov 2004 01:59:34 -0000 1.42 ++++ src/lyxrow.h 27 Jan 2005 10:55:12 -0000 +@@ -17,7 +17,11 @@ + + #include "support/types.h" + +-/// ++/** ++ * An on-screen row of text. A paragraph is broken into a ++ * RowList for display. Each Row contains position pointers ++ * into the first and last character positions of that row. ++ */ + class Row { + public: + /// +Index: src/lyxserver.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxserver.C,v +retrieving revision 1.59 +diff -u -r1.59 lyxserver.C +--- src/lyxserver.C 20 Jan 2005 15:07:36 -0000 1.59 ++++ src/lyxserver.C 21 Jan 2005 09:47:31 -0000 +@@ -54,6 +54,10 @@ + #include + #include + ++#ifdef _WIN32 ++# include "support/os_win32.h" // F_SETFL, O_NONBLOCK, fcntl ++#endif ++ + #ifdef __EMX__ + #include + #include +@@ -182,6 +186,8 @@ + // Imported handles can be used both with OS/2 APIs and emx + // library functions. + fd = _imphandle(os2fd); ++#elif defined(_WIN32) ++ + #else + if (::access(filename.c_str(), F_OK) == 0) { + lyxerr << "LyXComm: Pipe " << filename << " already exists.\n" +@@ -236,10 +242,12 @@ + } + #endif + ++#ifndef _WIN32 + if (::close(fd) < 0) { + lyxerr << "LyXComm: Could not close pipe " << filename + << '\n' << strerror(errno) << endl; + } ++#endif + + // OS/2 pipes are deleted automatically + #ifndef __EMX__ +@@ -275,7 +283,13 @@ + errno = 0; + int status; + // the single = is intended here. +- while ((status = ::read(infd, charbuf, charbuf_size - 1))) { ++ while ((status = ++#ifndef _WIN32 ++ ::read(infd, charbuf, charbuf_size - 1) ++#else ++ -1 ++#endif ++ )) { + + if (status > 0) { + charbuf[status] = '\0'; // turn it into a c string +@@ -332,6 +346,9 @@ + + if (pipename.empty()) return; + ++#ifdef _WIN32 ++ return; ++#else + if (!ready) { + lyxerr << "LyXComm: Pipes are closed. Could not send " + << msg << endl; +@@ -342,6 +359,7 @@ + closeConnection(); + openConnection(); + } ++#endif + #ifdef __EMX__ + APIRET rc; + int errnum; +Index: src/lyxsocket.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxsocket.C,v +retrieving revision 1.6 +diff -u -r1.6 lyxsocket.C +--- src/lyxsocket.C 23 Jul 2004 19:01:48 -0000 1.6 ++++ src/lyxsocket.C 19 Jan 2005 11:18:01 -0000 +@@ -68,7 +68,9 @@ + LyXServerSocket::~LyXServerSocket() + { + lyx_gui::unregister_socket_callback(fd_); ++#ifndef _WIN32 + ::close(fd_); ++#endif + lyx::support::unlink(address_); + lyxerr[Debug::LYXSERVER] << "lyx: Server socket quitting" << endl; + } +@@ -155,7 +157,11 @@ + { + string const linen(line + '\n'); + int const size = linen.size(); ++#ifndef _WIN32 + int const written = ::write(fd_, linen.c_str(), size); ++#else ++ int const written = -1; ++#endif + if (written < size) { // Allways mean end of connection. + if ((written == -1) && (errno == EPIPE)) { + // The program will also receive a SIGPIPE +@@ -194,7 +200,9 @@ + + LyXDataSocket::~LyXDataSocket() + { ++#ifndef _WIN32 + ::close(fd_); ++#endif + + lyx_gui::unregister_socket_callback(fd_); + lyxerr[Debug::LYXSERVER] << "lyx: Data socket " << fd_ << " quitting." +@@ -216,7 +224,13 @@ + int count; + + // read and store characters in buffer +- while ((count = ::read(fd_, charbuf, charbuf_size - 1)) > 0) { ++ while ((count = ++#ifndef _WIN32 ++ ::read(fd_, charbuf, charbuf_size - 1) ++#else ++ 0 ++#endif ++ ) > 0) { + buffer_.append(charbuf, charbuf + count); + } + +@@ -250,7 +264,11 @@ + { + string const linen(line + '\n'); + int const size = linen.size(); ++#ifndef _WIN32 + int const written = ::write(fd_, linen.c_str(), size); ++#else ++ int const written = -1; ++#endif + if (written < size) { // Allways mean end of connection. + if ((written == -1) && (errno == EPIPE)) { + // The program will also receive a SIGPIPE +Index: src/lyxtext.h +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxtext.h,v +retrieving revision 1.316 +diff -u -r1.316 lyxtext.h +--- src/lyxtext.h 17 Dec 2004 16:27:07 -0000 1.316 ++++ src/lyxtext.h 31 Jan 2005 09:58:00 -0000 +@@ -70,7 +70,7 @@ + bool toggleall); + + /// what you expect when pressing at cursor position +- void breakParagraph(LCursor & cur, char keep_layout = 0); ++ void breakParagraph(LCursor & cur, bool keep_layout = false); + + /// set layout over selection + pit_type setLayout(pit_type start, pit_type end, +@@ -124,7 +124,7 @@ + FuncStatus & status) const; + + /// access to out BufferView. This should go... +- BufferView * bv(); ++// BufferView * bv(); + /// access to out BufferView. This should go... + BufferView * bv() const; + +Index: src/paragraph.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/paragraph.C,v +retrieving revision 1.400 +diff -u -r1.400 paragraph.C +--- src/paragraph.C 24 Jan 2005 17:12:18 -0000 1.400 ++++ src/paragraph.C 27 Jan 2005 12:17:23 -0000 +@@ -1795,6 +1795,8 @@ + + Row & Paragraph::getRow(pos_type pos) + { ++ BOOST_ASSERT(!rows().empty()); ++ + RowList::iterator rit = rows_.end(); + RowList::iterator const begin = rows_.begin(); + +@@ -1807,6 +1809,8 @@ + + Row const & Paragraph::getRow(pos_type pos) const + { ++ BOOST_ASSERT(!rows().empty()); ++ + RowList::const_iterator rit = rows_.end(); + RowList::const_iterator const begin = rows_.begin(); + +@@ -1819,6 +1823,8 @@ + + size_t Paragraph::pos2row(pos_type pos) const + { ++ BOOST_ASSERT(!rows().empty()); ++ + RowList::const_iterator rit = rows_.end(); + RowList::const_iterator const begin = rows_.begin(); + +@@ -1873,11 +1879,3 @@ + } + } + +-//void Paragraph::metrics(MetricsInfo & mi, Dimension & dim, LyXText & text) +-//{ +-//} +-// +-// +-//void draw(PainterInfo & pi, int x, int y, LyXText & text) const +-//{ +-//} +Index: src/paragraph.h +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/paragraph.h,v +retrieving revision 1.146 +diff -u -r1.146 paragraph.h +--- src/paragraph.h 19 Jan 2005 15:03:29 -0000 1.146 ++++ src/paragraph.h 27 Jan 2005 12:58:12 -0000 +@@ -134,7 +134,7 @@ + lyx::depth_type depth) const; + + /// Can we drop the standard paragraph wrapper? +- bool Paragraph::emptyTag() const; ++ bool emptyTag() const; + + /// Get the id of the paragraph, usefull for docbook and linuxdoc + std::string getID(Buffer const & buf, +@@ -293,7 +293,7 @@ + BOOST_ASSERT(pos < int(text_.size())); + return text_[pos]; + } +- /// ++ /// Get the char, but mirror all bracket characters if it is right-to-left + value_type getUChar(BufferParams const &, lyx::pos_type pos) const; + /// The position must already exist. + void setChar(lyx::pos_type pos, value_type c); +@@ -326,6 +326,9 @@ + InsetBase * getInset(lyx::pos_type pos); + /// + InsetBase const * getInset(lyx::pos_type pos) const; ++ /// ++ InsetList insetlist; ++ + + /// + bool isHfill(lyx::pos_type pos) const; +@@ -344,7 +347,7 @@ + /// returns -1 if inset not found + int getPositionOfInset(InsetBase const * inset) const; + +- /// ++ /// Returns the number of line breaks and white-space stripped at the start + int stripLeadingSpaces(); + + /// return true if we allow multiple spaces +@@ -352,7 +355,7 @@ + + /// return true if we allow this par to stay empty + bool allowEmpty() const; +- //// ++ /// + unsigned char transformChar(unsigned char c, lyx::pos_type pos) const; + /// + ParagraphParameters & params(); +@@ -366,37 +369,34 @@ + /// + size_t pos2row(lyx::pos_type pos) const; + +- /// +- InsetList insetlist; +- + /// total height of paragraph + unsigned int height() const { return dim_.height(); } + /// total width of paragraph, may differ from workwidth + unsigned int width() const { return dim_.width(); } + unsigned int ascent() const { return dim_.ascent(); } + unsigned int descent() const { return dim_.descent(); } +- /// ++ /// LyXText updates the rows using this access point + RowList & rows() { return rows_; } +- /// ++ /// The painter and others use this + RowList const & rows() const { return rows_; } + +- // compute paragraph metrics +- void metrics(MetricsInfo & mi, Dimension & dim, LyXText & text); +- // draw paragraph +- void draw(PainterInfo & pi, int x, int y, LyXText & text) const; +- /// dump some information +- void dump() const; ++ /// LyXText::redoParagraph updates this ++ Dimension & dim() { return dim_; } + ++ /// dump some information to lyxerr ++ void dump() const; ++private: + /// cached dimensions of paragraph + Dimension dim_; + +-private: + /// + mutable RowList rows_; + /// + LyXLayout_ptr layout_; +- /// keeping this here instead of in the pimpl makes LyX >10% faster +- // for average tasks as buffer loading/switching etc. ++ /** ++ * Keeping this here instead of in the pimpl makes LyX >10% faster ++ * for average tasks as buffer loading/switching etc. ++ */ + TextContainer text_; + /// end of label + lyx::pos_type begin_of_body_; +@@ -406,7 +406,6 @@ + friend class Paragraph::Pimpl; + /// + Pimpl * pimpl_; +- + }; + + +Index: src/paragraph_funcs.h +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/paragraph_funcs.h,v +retrieving revision 1.46 +diff -u -r1.46 paragraph_funcs.h +--- src/paragraph_funcs.h 30 Nov 2004 01:59:36 -0000 1.46 ++++ src/paragraph_funcs.h 27 Jan 2005 13:19:36 -0000 +@@ -21,8 +21,15 @@ + class Paragraph; + class ParagraphList; + +- +-/// ++/** ++ * This breaks a paragraph at the specified position. ++ * The new paragraph will: ++ * get the default layout, when flag == 0 ++ * will inherit the existing one, except for depth, when flag == 1 ++ * will inherit the existing one, including depth, when flag == 2 ++ * Be aware that the old or new paragraph does not contain any rows ++ * after this. ++ */ + void breakParagraph(BufferParams const & bparams, + ParagraphList & paragraphs, + lyx::pit_type par, +Index: src/rowpainter.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/rowpainter.C,v +retrieving revision 1.140 +diff -u -r1.140 rowpainter.C +--- src/rowpainter.C 18 Jan 2005 14:15:55 -0000 1.140 ++++ src/rowpainter.C 31 Jan 2005 11:59:07 -0000 +@@ -58,7 +58,7 @@ + public: + /// initialise and run painter + RowPainter(PainterInfo & pi, LyXText const & text, +- pit_type pit, Row & row, int x, int y); ++ pit_type pit, Row const & row, int x, int y); + + // paint various parts + void paintAppendix(); +@@ -101,7 +101,7 @@ + ParagraphList & pars_; + + /// The row to paint +- Row & row_; ++ Row const & row_; + + /// Row's paragraph + pit_type const pit_; +@@ -119,7 +119,7 @@ + + + RowPainter::RowPainter(PainterInfo & pi, +- LyXText const & text, pit_type pit, Row & row, int x, int y) ++ LyXText const & text, pit_type pit, Row const & row, int x, int y) + : bv_(*pi.base.bv), pain_(pi.pain), text_(text), pars_(text.paragraphs()), + row_(row), pit_(pit), par_(text.paragraphs()[pit]), + xo_(x), yo_(y), width_(text_.width()) +@@ -178,7 +178,7 @@ + PainterInfo pi(const_cast(&bv_), pain_); + pi.base.font = getFont(pos); + pi.ltr_pos = (text_.bidi.level(pos) % 2 == 0); +- theCoords.insets_.add(inset, int(x_), yo_); ++ theCoords.insets().add(inset, int(x_), yo_); + inset->drawSelection(pi, int(x_), yo_); + inset->draw(pi, int(x_), yo_); + x_ += inset->width(); +@@ -738,12 +738,12 @@ + + Paragraph & par = text.paragraphs()[pit]; + +- RowList::iterator const rb = par.rows().begin(); +- RowList::iterator const re = par.rows().end(); +- theCoords.pars_[&text][pit] = Point(x, y); ++ RowList::const_iterator const rb = par.rows().begin(); ++ RowList::const_iterator const re = par.rows().end(); ++ theCoords.parPos()[&text][pit] = Point(x, y); + + y -= rb->ascent(); +- for (RowList::iterator rit = rb; rit != re; ++rit) { ++ for (RowList::const_iterator rit = rb; rit != re; ++rit) { + y += rit->ascent(); + bool const inside = (y + rit->descent() >= 0 + && y - rit->ascent() < ww); +@@ -801,12 +801,12 @@ + } + + // and grey out above (should not happen later) +- lyxerr << "par ascent: " << text->getPar(vi.p1).ascent() << endl; ++// lyxerr << "par ascent: " << text->getPar(vi.p1).ascent() << endl; + if (vi.y1 > 0) + pain.fillRectangle(0, 0, bv.workWidth(), vi.y1, LColor::bottomarea); + + // and possibly grey out below +- lyxerr << "par descent: " << text->getPar(vi.p1).ascent() << endl; ++// lyxerr << "par descent: " << text->getPar(vi.p1).ascent() << endl; + if (vi.y2 < bv.workHeight()) + pain.fillRectangle(0, vi.y2, bv.workWidth(), bv.workHeight() - vi.y2, LColor::bottomarea); + } +Index: src/text.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/text.C,v +retrieving revision 1.592 +diff -u -r1.592 text.C +--- src/text.C 19 Jan 2005 08:42:32 -0000 1.592 ++++ src/text.C 31 Jan 2005 10:05:42 -0000 +@@ -376,12 +376,6 @@ + } // namespace anon + + +-BufferView * LyXText::bv() +-{ +- BOOST_ASSERT(bv_owner != 0); +- return bv_owner; +-} +- + + BufferView * LyXText::bv() const + { +@@ -1017,7 +1011,7 @@ + + } + +-void LyXText::breakParagraph(LCursor & cur, char keep_layout) ++void LyXText::breakParagraph(LCursor & cur, bool keep_layout) + { + BOOST_ASSERT(this == cur.text()); + // allow only if at start or end, or all previous is new text +@@ -1045,25 +1039,30 @@ + if (cur.pos() != cur.lastpos() && cpar.isLineSeparator(cur.pos())) + cpar.erase(cur.pos()); + +- // break the paragraph ++ // How should the layout for the new paragraph be? ++ int preserve_layout = 0; + if (keep_layout) +- keep_layout = 2; ++ preserve_layout = 2; + else +- keep_layout = layout->isEnvironment(); ++ preserve_layout = layout->isEnvironment(); ++ ++ // We need to remember this before we break the paragraph, because ++ // that invalidates the layout variable ++ bool sensitive = layout->labeltype == LABEL_SENSITIVE; + +- // we need to set this before we insert the paragraph. IMO the +- // breakParagraph call should return a bool if it inserts the +- // paragraph before or behind and we should react on that one +- // but we can fix this in 1.3.0 (Jug 20020509) ++ // we need to set this before we insert the paragraph. + bool const isempty = cpar.allowEmpty() && cpar.empty(); ++ + ::breakParagraph(cur.buffer().params(), paragraphs(), cpit, +- cur.pos(), keep_layout); ++ cur.pos(), preserve_layout); ++ ++ // After this, neither paragraph contains any rows! + + cpit = cur.pit(); + pit_type next_par = cpit + 1; + + // well this is the caption hack since one caption is really enough +- if (layout->labeltype == LABEL_SENSITIVE) { ++ if (sensitive) { + if (cur.pos() == 0) + // set to standard-layout + pars_[cpit].applyLayout(tclass.defaultLayout()); +@@ -1072,16 +1071,6 @@ + pars_[next_par].applyLayout(tclass.defaultLayout()); + } + +- // if the cursor is at the beginning of a row without prior newline, +- // move one row up! +- // This touches only the screen-update. Otherwise we would may have +- // an empty row on the screen +- if (cur.pos() != 0 && cur.textRow().pos() == cur.pos() +- && !pars_[cpit].isNewline(cur.pos() - 1)) +- { +- cursorLeft(cur); +- } +- + while (!pars_[next_par].empty() && pars_[next_par].isNewline(0)) + pars_[next_par].erase(0); + +@@ -1172,8 +1161,8 @@ + cur.message(_("You cannot insert a space at the " + "beginning of a paragraph. Please read the Tutorial.")); + sent_space_message = true; +- return; + } ++ return; + } + BOOST_ASSERT(cur.pos() > 0); + if (par.isLineSeparator(cur.pos() - 1) +@@ -1686,7 +1675,7 @@ + + dim.asc += par.rows()[0].ascent(); + dim.des -= par.rows()[0].ascent(); +- par.dim_ = dim; ++ par.dim() = dim; + //lyxerr << "redoParagraph: " << par.rows().size() << " rows\n"; + } + +Index: src/text2.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/text2.C,v +retrieving revision 1.594 +diff -u -r1.594 text2.C +--- src/text2.C 6 Jan 2005 16:39:30 -0000 1.594 ++++ src/text2.C 31 Jan 2005 12:01:19 -0000 +@@ -119,7 +119,7 @@ + InsetBase * inset = iit->inset; + #if 1 + lyxerr << "examining inset " << inset << endl; +- if (theCoords.insets_.has(inset)) ++ if (theCoords.getInsets().has(inset)) + lyxerr + << " xo: " << inset->xo() << "..." + << inset->xo() + inset->width() +@@ -1122,8 +1122,8 @@ + pit_type LyXText::getPitNearY(int y) const + { + BOOST_ASSERT(!paragraphs().empty()); +- BOOST_ASSERT(theCoords.pars_.find(this) != theCoords.pars_.end()); +- CoordCache::InnerParPosCache const & cc = theCoords.pars_[this]; ++ BOOST_ASSERT(theCoords.getParPos().find(this) != theCoords.getParPos().end()); ++ CoordCache::InnerParPosCache const & cc = theCoords.getParPos().find(this)->second; + lyxerr << "LyXText::getPitNearY: y: " << y << " cache size: " + << cc.size() << endl; + +@@ -1282,8 +1282,6 @@ + + void LyXText::cursorDown(LCursor & cur) + { +- +- + Paragraph const & par = cur.paragraph(); + int const row = par.pos2row(cur.pos()); + int const x = cur.targetX(); +Index: src/text3.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/text3.C,v +retrieving revision 1.280 +diff -u -r1.280 text3.C +--- src/text3.C 27 Jan 2005 21:05:34 -0000 1.280 ++++ src/text3.C 31 Jan 2005 12:11:17 -0000 +@@ -353,7 +353,7 @@ + void LyXText::dispatch(LCursor & cur, FuncRequest & cmd) + { + lyxerr[Debug::ACTION] << "LyXText::dispatch: cmd: " << cmd << endl; +- //lyxerr << "*** LyXText::dispatch: cmd: " << cmd << endl; ++ lyxerr << "*** LyXText::dispatch: cmd: " << cmd << endl; + + BOOST_ASSERT(cur.text() == this); + BufferView * bv = &cur.bv(); +Index: src/client/client.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/client/client.C,v +retrieving revision 1.7 +diff -u -r1.7 client.C +--- src/client/client.C 20 Jan 2005 15:38:13 -0000 1.7 ++++ src/client/client.C 21 Jan 2005 09:43:09 -0000 +@@ -25,12 +25,14 @@ + # include + #endif + ++#ifndef _WIN32 + // select() +-#include ++# include + + // socket(), connect() +-#include +-#include ++# include ++# include ++#endif + + // fcntl() + #include +Index: src/frontends/LyXView.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/LyXView.C,v +retrieving revision 1.49 +diff -u -r1.49 LyXView.C +--- src/frontends/LyXView.C 20 Jan 2005 15:38:14 -0000 1.49 ++++ src/frontends/LyXView.C 21 Jan 2005 09:43:10 -0000 +@@ -39,7 +39,9 @@ + + #include + +-#include ++#ifndef _WIN32 ++# include ++#endif + #ifdef HAVE_UNISTD_H + # include + #endif +Index: src/frontends/qt2/QDialogView.h +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/qt2/QDialogView.h,v +retrieving revision 1.10 +diff -u -r1.10 QDialogView.h +--- src/frontends/qt2/QDialogView.h 19 May 2004 15:11:33 -0000 1.10 ++++ src/frontends/qt2/QDialogView.h 25 Jan 2005 12:45:06 -0000 +@@ -13,6 +13,7 @@ + #define QDIALOGVIEW_H + + #include "Dialog.h" ++ + #include + + #include +@@ -110,7 +111,11 @@ + template + QDialog * QView::form() const + { +- return dialog_.get(); ++ /* Brain dead MSVC compiler wants to know the class hierarchy at the ++ definition site of the template, rather than the instantation point ++ to downcast correctly. So, rather than including all dialogs to ++ provide that, we just cast it with the ugly hammer. */ ++ return (QDialog *) dialog_.get(); + } + + +Index: src/frontends/qt2/QLPainter.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/qt2/QLPainter.C,v +retrieving revision 1.34 +diff -u -r1.34 QLPainter.C +--- src/frontends/qt2/QLPainter.C 20 May 2004 09:36:27 -0000 1.34 ++++ src/frontends/qt2/QLPainter.C 31 Jan 2005 12:29:53 -0000 +@@ -202,8 +202,9 @@ + int tmpx = x; + size_t ls = s.length(); + for (size_t i = 0; i < ls; ++i) { +- QChar const c = s[i].upper(); +- if (c != s[i]) { ++ // Brain-dead MSVC wants at(i) rather than operator[] ++ QChar const c = s.at(i).upper(); ++ if (c != s.at(i)) { + qp_->setFont(qsmallfont); + qp_->drawText(tmpx, y, c); + tmpx += qsmallfontm.width(c); +@@ -229,7 +230,8 @@ + #if QT_VERSION >= 300 + str.setLength(ls); + for (size_t i = 0; i < ls; ++i) +- str[i] = QChar(encoding->ucs(s[i])); ++ // Brain-dead MSVC wants at(i) rather than operator[] ++ str.at(i) = QChar(encoding->ucs(s[i])); + // HACK: QT3 refuses to show single compose characters + if (ls == 1 && str[0].unicode() >= 0x05b0 && str[0].unicode() <= 0x05c2) + str = ' ' + str; +Index: src/frontends/qt2/lengthvalidator.h +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/qt2/lengthvalidator.h,v +retrieving revision 1.4 +diff -u -r1.4 lengthvalidator.h +--- src/frontends/qt2/lengthvalidator.h 22 Nov 2004 12:22:19 -0000 1.4 ++++ src/frontends/qt2/lengthvalidator.h 23 Jan 2005 09:47:57 -0000 +@@ -19,7 +19,7 @@ + class QWidget; + + +-class Q_EXPORT LengthValidator : public QValidator ++class LengthValidator : public QValidator + { + Q_OBJECT + public: +Index: src/insets/inset.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/inset.C,v +retrieving revision 1.131 +diff -u -r1.131 inset.C +--- src/insets/inset.C 5 Jan 2005 20:21:26 -0000 1.131 ++++ src/insets/inset.C 31 Jan 2005 09:31:42 -0000 +@@ -79,5 +79,5 @@ + void InsetOld::setPosCache(PainterInfo const &, int x, int y) const + { + //lyxerr << "InsetOld:: position cache to " << x << " " << y << std::endl; +- theCoords.insets_.add(this, x, y); ++ theCoords.insets().add(this, x, y); + } +Index: src/insets/insetbase.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insetbase.C,v +retrieving revision 1.39 +diff -u -r1.39 insetbase.C +--- src/insets/insetbase.C 19 Jan 2005 15:03:30 -0000 1.39 ++++ src/insets/insetbase.C 31 Jan 2005 12:01:20 -0000 +@@ -293,13 +293,13 @@ + + int InsetBase::xo() const + { +- return theCoords.insets_.x(this); ++ return theCoords.getInsets().x(this); + } + + + int InsetBase::yo() const + { +- return theCoords.insets_.y(this); ++ return theCoords.getInsets().y(this); + } + + +@@ -310,7 +310,7 @@ + // << " x1: " << xo() << " x2: " << xo() + width() + // << " y1: " << yo() - ascent() << " y2: " << yo() + descent() + // << std::endl; +- return theCoords.insets_.has(this) ++ return theCoords.getInsets().has(this) + && x >= xo() + && x <= xo() + width() + && y >= yo() - ascent() +Index: src/insets/insettabular.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insettabular.C,v +retrieving revision 1.452 +diff -u -r1.452 insettabular.C +--- src/insets/insettabular.C 27 Jan 2005 21:05:42 -0000 1.452 ++++ src/insets/insettabular.C 31 Jan 2005 12:01:20 -0000 +@@ -1024,7 +1024,7 @@ + { + int xx = 0; + int yy = 0; +- Point o = theCoords.insets_.xy(&inset); ++ Point o = theCoords.getInsets().xy(&inset); + int const xo = o.x_; + int const yo = o.y_; + +@@ -1055,7 +1055,7 @@ + idx_type idx_min = 0; + int dist_min = std::numeric_limits::max(); + for (idx_type i = 0; i < nargs(); ++i) { +- if (theCoords.insets_.has(tabular.getCellInset(i).get())) { ++ if (theCoords.getInsets().has(tabular.getCellInset(i).get())) { + int d = dist(*tabular.getCellInset(i), x, y); + if (d < dist_min) { + dist_min = d; +Index: src/insets/updatableinset.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/updatableinset.C,v +retrieving revision 1.50 +diff -u -r1.50 updatableinset.C +--- src/insets/updatableinset.C 27 Jan 2005 21:05:43 -0000 1.50 ++++ src/insets/updatableinset.C 31 Jan 2005 12:01:20 -0000 +@@ -43,7 +43,7 @@ + } + + int const workW = bv.workWidth(); +- int xo_ = theCoords.insets_.x(this); ++ int xo_ = theCoords.getInsets().x(this); + int const tmp_xo_ = xo_ - scx; + + if (tmp_xo_ > 0 && tmp_xo_ + width() < workW) +@@ -63,7 +63,7 @@ + + void UpdatableInset::scroll(BufferView & bv, int offset) const + { +- int const xo_ = theCoords.insets_.x(this); ++ int const xo_ = theCoords.getInsets().x(this); + if (offset > 0) { + if (!scx && xo_ >= 20) + return; +Index: src/mathed/math_data.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/mathed/math_data.C,v +retrieving revision 1.59 +diff -u -r1.59 math_data.C +--- src/mathed/math_data.C 5 Jan 2005 20:21:27 -0000 1.59 ++++ src/mathed/math_data.C 31 Jan 2005 12:01:19 -0000 +@@ -411,17 +411,17 @@ + void MathArray::setXY(int x, int y) const + { + //lyxerr << "setting position cache for MathArray " << this << std::endl; +- theCoords.arrays_.add(this, x, y); ++ theCoords.arrays().add(this, x, y); + } + + + int MathArray::xo() const + { +- return theCoords.arrays_.x(this); ++ return theCoords.getArrays().x(this); + } + + + int MathArray::yo() const + { +- return theCoords.arrays_.y(this); ++ return theCoords.getArrays().y(this); + } +Index: src/mathed/math_diminset.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/mathed/math_diminset.C,v +retrieving revision 1.23 +diff -u -r1.23 math_diminset.C +--- src/mathed/math_diminset.C 14 Aug 2004 14:03:42 -0000 1.23 ++++ src/mathed/math_diminset.C 31 Jan 2005 09:31:42 -0000 +@@ -40,5 +40,5 @@ + void MathDimInset::setPosCache(PainterInfo const &, int x, int y) const + { + //lyxerr << "MathDimInset: cache to " << x << " " << y << std::endl; +- theCoords.insets_.add(this, x, y); ++ theCoords.insets().add(this, x, y); + } +Index: src/mathed/math_nestinset.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/mathed/math_nestinset.C,v +retrieving revision 1.143 +diff -u -r1.143 math_nestinset.C +--- src/mathed/math_nestinset.C 6 Jan 2005 16:07:01 -0000 1.143 ++++ src/mathed/math_nestinset.C 31 Jan 2005 12:01:19 -0000 +@@ -110,23 +110,23 @@ + // absolute again when actually drawing the cursor. What a mess. + BOOST_ASSERT(ptr_cmp(&sl.inset(), this)); + MathArray const & ar = sl.cell(); +- if (!theCoords.arrays_.has(&ar)) { +- // this can (semi-)legally happen if we jsut created this cell ++ if (!theCoords.getArrays().has(&ar)) { ++ // this can (semi-)legally happen if we just created this cell + // and it never has been drawn before. So don't ASSERT. + //lyxerr << "no cached data for array " << &ar << endl; + x = 0; + y = 0; + return; + } +- Point const pt = theCoords.arrays_.xy(&ar); +- if (!theCoords.insets_.has(this)) { ++ Point const pt = theCoords.getArrays().xy(&ar); ++ if (!theCoords.getInsets().has(this)) { + // same as above + //lyxerr << "no cached data for inset " << this << endl; + x = 0; + y = 0; + return; + } +- Point const pt2 = theCoords.insets_.xy(this); ++ Point const pt2 = theCoords.getInsets().xy(this); + //lyxerr << "retrieving position cache for MathArray " + // << pt.x_ << ' ' << pt.y_ << std::endl; + x = pt.x_ - pt2.x_ + ar.pos2x(sl.pos()); +Index: src/support/chdir.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/support/chdir.C,v +retrieving revision 1.10 +diff -u -r1.10 chdir.C +--- src/support/chdir.C 20 Jan 2005 15:38:14 -0000 1.10 ++++ src/support/chdir.C 25 Jan 2005 12:47:15 -0000 +@@ -16,11 +16,17 @@ + # include + #endif + ++#ifdef _WIN32 ++# include ++#endif ++ + int lyx::support::chdir(std::string const & name) + { +-#ifndef __EMX__ +- return ::chdir(name.c_str()); +-#else ++#ifdef __EMX__ + return ::_chdir2(name.c_str()); ++#elif defined(_WIN32) ++ return SetCurrentDirectory(name.c_str()) != 0 ? 0 : -1; ++#else ++ return ::chdir(name.c_str()); + #endif + } +Index: src/support/filetools.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/support/filetools.C,v +retrieving revision 1.204 +diff -u -r1.204 filetools.C +--- src/support/filetools.C 31 Jan 2005 10:42:23 -0000 1.204 ++++ src/support/filetools.C 31 Jan 2005 11:08:10 -0000 +@@ -1153,6 +1153,11 @@ + + cmd_ret const RunCommand(string const & cmd) + { ++#ifdef _WIN32 ++ // TODO: Implement this, or merge it into forkedcall. ++ // Used for lyx2lyx in buffer.C, echo in math_extern and kpse in this file ++ return make_pair(-1, string()); ++#else + // FIXME: replace all calls to RunCommand with ForkedCall + // (if the output is not needed) or the code in ispell.C + // (if the output is needed). +@@ -1193,6 +1198,7 @@ + sigprocmask(SIG_SETMASK, &oldMask, 0); + + return make_pair(pret, ret); ++#endif + } + + +Index: src/support/forkedcall.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/support/forkedcall.C,v +retrieving revision 1.21 +diff -u -r1.21 forkedcall.C +--- src/support/forkedcall.C 20 Jan 2005 15:38:14 -0000 1.21 ++++ src/support/forkedcall.C 25 Jan 2005 12:41:14 -0000 +@@ -30,6 +30,10 @@ + #include "support/lyxlib.h" + #include "support/filetools.h" + #include "support/os.h" ++#ifdef _WIN32 ++#include "os_win32.h" ++#include ++#endif + + #include "debug.h" + +@@ -41,7 +45,9 @@ + #include + #include + #include +-#include ++#ifndef _WIN32 ++# include ++#endif + #ifdef HAVE_UNISTD_H + # include + #endif +@@ -70,7 +76,9 @@ + if (secs > 0) { + new Murder(secs, pid); + } else if (pid != 0) { ++#ifdef SIGKILL + lyx::support::kill(pid, SIGKILL); ++#endif + } + } + +@@ -78,7 +86,9 @@ + void kill() + { + if (pid_ != 0) { ++#ifdef SIGKILL + lyx::support::kill(pid_, SIGKILL); ++#endif + } + lyxerr << "Killed " << pid_ << std::endl; + delete this; +@@ -152,14 +162,16 @@ + if (!pid()) + return false; + ++#ifndef _WIN32 + // Un-UNIX like, but we don't have much use for + // knowing if a zombie exists, so just reap it first. + int waitstatus; + waitpid(pid(), &waitstatus, WNOHANG); + + // Racy of course, but it will do. +- if (::kill(pid(), 0) && errno == ESRCH) ++ if (lyx::kill(pid(), 0) && errno == ESRCH) + return false; ++#endif + return true; + } + +@@ -178,6 +190,7 @@ + Murder::killItDead(0, pid()); + + } else { ++#ifdef SIGHUP + int ret = lyx::support::kill(pid(), SIGHUP); + + // The process is already dead if wait_for_death is false +@@ -186,6 +199,7 @@ + if (wait_for_death) { + Murder::killItDead(tolerance, pid()); + } ++#endif + } + } + +@@ -195,6 +209,7 @@ + { + // We'll pretend that the child returns 1 on all error conditions. + retval_ = 1; ++#ifndef _WIN32 + int status; + bool wait = true; + while (wait) { +@@ -223,6 +238,7 @@ + wait = false; + } + } ++#endif + return retval_; + } + +@@ -299,7 +315,12 @@ + std::cout << *ait << std::endl; + argv.push_back(0); + +-#ifndef __EMX__ ++#ifdef __EMX ++ pid_t const cpid = spawnvp(P_SESSION|P_DEFAULT|P_MINIMIZE|P_BACKGROUND, ++ argv[0], &*argv.begin()); ++#elif defined(_WIN32) ++ pid_t const cpid = spawnvp(_P_NOWAIT, argv[0], &*argv.begin()); ++#else + pid_t const cpid = ::fork(); + if (cpid == 0) { + // Child +@@ -310,9 +331,6 @@ + << strerror(errno) << endl; + _exit(1); + } +-#else +- pid_t const cpid = spawnvp(P_SESSION|P_DEFAULT|P_MINIMIZE|P_BACKGROUND, +- argv[0], &*argv.begin()); + #endif + + if (cpid < 0) { +Index: src/support/forkedcall.h +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/support/forkedcall.h,v +retrieving revision 1.19 +diff -u -r1.19 forkedcall.h +--- src/support/forkedcall.h 26 Sep 2004 14:19:47 -0000 1.19 ++++ src/support/forkedcall.h 17 Jan 2005 12:17:09 -0000 +@@ -31,6 +31,10 @@ + + #include + ++#ifdef _WIN32 ++typedef int pid_t; ++#endif ++ + namespace lyx { + namespace support { + +Index: src/support/forkedcontr.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/support/forkedcontr.C,v +retrieving revision 1.27 +diff -u -r1.27 forkedcontr.C +--- src/support/forkedcontr.C 20 Jan 2005 15:38:14 -0000 1.27 ++++ src/support/forkedcontr.C 21 Jan 2005 09:51:07 -0000 +@@ -19,14 +19,22 @@ + + #include "debug.h" + ++#ifdef _WIN32 ++#include "os_win32.h" ++#include ++#endif ++ + #include + + #include + #include ++ + #ifdef HAVE_UNISTD_H + # include + #endif +-#include ++#ifndef _WIN32 ++# include ++#endif + + using boost::bind; + +@@ -176,7 +184,9 @@ + ForkedcallsController::Data & store = + fcc.reaped_children[++fcc.current_child]; + // Clean up the child process. ++#ifndef _WIN32 + store.pid = wait(&store.status); ++#endif + } + + } // namespace anon +@@ -193,11 +203,12 @@ + ForkedcallsController::ForkedcallsController() + : reaped_children(50), current_child(-1) + { ++#ifndef _WIN32 + signal(SIGCHLD, child_handler); +- + sigemptyset(&oldMask); + sigemptyset(&newMask); + sigaddset(&newMask, SIGCHLD); ++#endif + } + + +@@ -206,7 +217,9 @@ + // I want to print or something. + ForkedcallsController::~ForkedcallsController() + { ++#ifndef _WIN32 + signal(SIGCHLD, SIG_DFL); ++#endif + } + + +@@ -215,6 +228,7 @@ + forkedCalls.push_back(newcall.clone()); + + if (forkedCalls.size() > reaped_children.size()) { ++#ifndef _WIN32 + // Block the SIGCHLD signal. + sigprocmask(SIG_BLOCK, &newMask, &oldMask); + +@@ -222,6 +236,7 @@ + + // Unblock the SIGCHLD signal and restore the old mask. + sigprocmask(SIG_SETMASK, &oldMask, 0); ++#endif + } + } + +@@ -255,8 +270,10 @@ + if (current_child == -1) + return; + ++#ifndef _WIN32 + // Block the SIGCHLD signal. + sigprocmask(SIG_BLOCK, &newMask, &oldMask); ++#endif + + for (int i = 0; i != 1 + current_child; ++i) { + Data & store = reaped_children[i]; +@@ -312,8 +329,10 @@ + // Reset the counter + current_child = -1; + ++#ifndef _WIN32 + // Unblock the SIGCHLD signal and restore the old mask. + sigprocmask(SIG_SETMASK, &oldMask, 0); ++#endif + } + + } // namespace support +Index: src/support/forkedcontr.h +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/support/forkedcontr.h,v +retrieving revision 1.18 +diff -u -r1.18 forkedcontr.h +--- src/support/forkedcontr.h 7 Nov 2004 13:22:51 -0000 1.18 ++++ src/support/forkedcontr.h 23 Jan 2005 12:25:33 -0000 +@@ -19,7 +19,10 @@ + #include + + #include +-//#include // needed for pid_t ++#ifdef _WIN32 ++typedef int pid_t; ++#endif ++#include // needed for pid_t + #include + #include + +@@ -79,8 +82,10 @@ + /// The child processes + ListType forkedCalls; + ++#ifndef _WIN32 + /// Used to block SIGCHLD signals. + sigset_t newMask, oldMask; ++#endif + }; + + } // namespace support +Index: src/support/fs_extras.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/support/fs_extras.C,v +retrieving revision 1.1 +diff -u -r1.1 fs_extras.C +--- src/support/fs_extras.C 31 Jan 2005 10:42:24 -0000 1.1 ++++ src/support/fs_extras.C 31 Jan 2005 11:31:39 -0000 +@@ -22,6 +22,10 @@ + # endif + # endif + ++#ifdef BOOST_WINDOWS ++# include ++#endif ++ + namespace fs = boost::filesystem; + + namespace boost { +@@ -32,6 +36,12 @@ + #ifdef BOOST_POSIX + return ::access(ph.string().c_str(), R_OK) == 0; + #endif ++#ifdef BOOST_WINDOWS ++ DWORD const attr = ::GetFileAttributes( ph.string().c_str() ); ++ return attr != INVALID_FILE_ATTRIBUTES && ++ ( attr & FILE_ATTRIBUTE_DIRECTORY ) != FILE_ATTRIBUTE_DIRECTORY; ++ ++#endif + } + + +@@ -40,14 +50,21 @@ + #ifdef BOOST_POSIX + return ::access(ph.string().c_str(), W_OK) == 0; + #endif ++#ifdef BOOST_WINDOWS ++ DWORD const attr = ::GetFileAttributes( ph.string().c_str() ); ++ if (attr != INVALID_FILE_ATTRIBUTES && (attr & FILE_ATTRIBUTE_READONLY) != 0) { ++ // Read-only - no write access ++ return false; ++ } ++ return attr != INVALID_FILE_ATTRIBUTES && ++ ( attr & FILE_ATTRIBUTE_DIRECTORY ) != FILE_ATTRIBUTE_DIRECTORY; ++#endif + } + + + bool is_readonly(path const & ph) + { +-#ifdef BOOST_POSIX + return is_readable(ph) && !is_writable(ph); +-#endif + } + + +@@ -115,6 +132,16 @@ + "boost::filesystem::copy_file", + source, target, + fs::detail::system_error_code())); ++#endif ++ ++#ifdef BOOST_WINDOWS ++ if (::CopyFile(source.string().c_str(), target.string().c_str(), FALSE) == 0) { ++ boost::throw_exception( ++ filesystem_error( ++ "boost::filesystem::copy_file", ++ source, target, ++ fs::detail::system_error_code())); ++ } + #endif + } + +Index: src/support/getcwd.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/support/getcwd.C,v +retrieving revision 1.12 +diff -u -r1.12 getcwd.C +--- src/support/getcwd.C 20 Jan 2005 15:38:14 -0000 1.12 ++++ src/support/getcwd.C 21 Jan 2005 09:50:41 -0000 +@@ -19,6 +19,10 @@ + # include + #endif + ++#ifdef _WIN32 ++# include ++#endif ++ + using boost::scoped_array; + + using std::string; +@@ -29,10 +33,13 @@ + inline + char * l_getcwd(char * buffer, size_t size) + { +-#ifndef __EMX__ +- return ::getcwd(buffer, size); +-#else ++#ifdef __EMX + return ::_getcwd2(buffer, size); ++#elif defined(_WIN32) ++ GetCurrentDirectory(size, buffer); ++ return buffer; ++#else ++ return ::getcwd(buffer, size); + #endif + } + +Index: src/support/kill.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/support/kill.C,v +retrieving revision 1.12 +diff -u -r1.12 kill.C +--- src/support/kill.C 7 Nov 2004 13:22:51 -0000 1.12 ++++ src/support/kill.C 20 Jan 2005 11:46:47 -0000 +@@ -15,7 +15,38 @@ + #include + #include + ++#ifdef _WIN32 ++#include "debug.h" ++#include "os.h" ++ ++#include ++#include ++ ++using std::endl; ++#endif //_WIN32 ++ + int lyx::support::kill(int pid, int sig) + { ++#ifdef _WIN32 ++ if (pid == (int)GetCurrentProcessId()) { ++ return -(raise(sig)); ++ } else { ++ HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, pid); ++ if (!hProcess) { ++ lyxerr << "kill OpenProcess failed!" << endl; ++ return -1; ++ } else { ++ if (!TerminateProcess(hProcess, sig)){ ++ lyxerr << "kill process failed!" << endl; ++ CloseHandle(hProcess); ++ return -1; ++ } ++ CloseHandle(hProcess); ++ } ++ } ++ return 0; ++ ++#else + return ::kill(pid, sig); ++#endif + } +Index: src/support/mkdir.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/support/mkdir.C,v +retrieving revision 1.16 +diff -u -r1.16 mkdir.C +--- src/support/mkdir.C 20 Jan 2005 15:38:14 -0000 1.16 ++++ src/support/mkdir.C 25 Jan 2005 12:52:02 -0000 +@@ -18,6 +18,9 @@ + #ifdef HAVE_UNISTD_H + # include + #endif ++#ifdef _WIN32 ++# include ++#endif + + int lyx::support::mkdir(std::string const & pathname, unsigned long int mode) + { +@@ -30,12 +33,12 @@ + // POSIX + return ::mkdir(pathname.c_str(), mode_t(mode)); + # endif +-#else +-# if HAVE__MKDIR ++#elif defined(_WIN32) + // plain Windows 32 +- return ::_mkdir(pathname.c_str()); +-# else +-# error "Don't know how to create a directory on this system." +-# endif ++ return CreateDirectory(pathname.c_str(), 0) != 0 ? 0 : -1; ++#elif HAVE__MKDIR ++ return ::_mkdir(pathname.c_str()); ++#else ++# error "Don't know how to create a directory on this system." + #endif + } +Index: src/support/os_win32.h +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/support/os_win32.h,v +retrieving revision 1.1 +diff -u -r1.1 os_win32.h +--- src/support/os_win32.h 22 Jan 2005 15:36:53 -0000 1.1 ++++ src/support/os_win32.h 25 Jan 2005 12:40:09 -0000 +@@ -65,16 +65,6 @@ + #define O_NONBLOCK 0x4000 + inline int fcntl (int, int, ...) {return -1;} + +-//signal.h +-#define SIGHUP 1 +-#define SIGKILL 9 +- +-//sys/time.h +-//struct timeval { +-// long tv_sec; +-// long tv_usec; +-//}; +- + //unistd.h + inline int fork () {return -1;} + #define pipe(a) _pipe(a,0,0) +Index: src/support/rmdir.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/support/rmdir.C,v +retrieving revision 1.8 +diff -u -r1.8 rmdir.C +--- src/support/rmdir.C 20 Jan 2005 15:38:14 -0000 1.8 ++++ src/support/rmdir.C 25 Jan 2005 12:13:39 -0000 +@@ -16,7 +16,15 @@ + # include + #endif + ++#ifdef _WIN32 ++# include ++#endif ++ + int lyx::support::rmdir(std::string const & dir) + { +- return ::rmdir(dir.c_str()); ++#ifdef _WIN32 ++ return ::RemoveDirectory(dir.c_str()) != 0 ? 0 : -1; ++#else ++ return :rmdir(dir.c_str()); ++#endif + } +Index: src/support/socktools.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/support/socktools.C,v +retrieving revision 1.6 +diff -u -r1.6 socktools.C +--- src/support/socktools.C 20 Jan 2005 15:38:14 -0000 1.6 ++++ src/support/socktools.C 21 Jan 2005 09:43:42 -0000 +@@ -15,8 +15,10 @@ + + #include "debug.h" + ++#ifndef _WIN32 + #include + #include ++#endif + #include + #ifdef HAVE_UNISTD_H + # include +@@ -48,6 +50,7 @@ + // special file 'name' will be created in the filesystem. + int listen(string const & name, int queue) + { ++#ifndef _WIN32 + int fd; // File descriptor for the socket + sockaddr_un addr; // Structure that hold the socket address + +@@ -105,14 +108,17 @@ + lyx::support::unlink(name); + return -1; + } +- + return fd; ++#else ++ return -1; ++#endif + } + + // Returns a file descriptor for a new connection from the socket + // descriptor 'sd' (or -1 in case of error) + int accept(int sd) + { ++#ifndef _WIN32 + int fd; + + // Returns the new file descriptor or -1 in case of error +@@ -132,6 +138,9 @@ + return -1; + } + return fd; ++#else ++ return -1; ++#endif + } + + } // namespace socktools +Index: src/support/tempname.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/support/tempname.C,v +retrieving revision 1.25 +diff -u -r1.25 tempname.C +--- src/support/tempname.C 20 Jan 2005 15:38:14 -0000 1.25 ++++ src/support/tempname.C 24 Jan 2005 07:51:08 -0000 +@@ -30,6 +30,10 @@ + # include + #endif + ++#ifdef _WIN32 ++# include ++#endif ++ + using boost::scoped_array; + + using std::string; +@@ -42,6 +46,9 @@ + { + #if defined(HAVE_MKSTEMP) + return ::mkstemp(templ); ++#elif defined(_WIN32) ++ ::_mktemp(templ); ++ return (int) ::fopen(templ, "w"); + #elif defined(HAVE_MKTEMP) + // This probably just barely works... + ::mktemp(templ); +@@ -58,7 +65,9 @@ + { + string const tmpdir(dir.empty() ? package().temp_dir() : dir); + string tmpfl(AddName(tmpdir, mask)); ++#ifndef _WIN32 + tmpfl += convert(getpid()); ++#endif + tmpfl += "XXXXXX"; + + // The supposedly safe mkstemp version +@@ -69,7 +78,11 @@ + int const tmpf = make_tempfile(tmpl.get()); + if (tmpf != -1) { + string const t(tmpl.get()); ++#ifdef _WIN32 ++ ::fclose((FILE *) tmpf); ++#else + ::close(tmpf); ++#endif + lyxerr[Debug::FILES] << "Temporary file `" << t + << "' created." << endl; + return t; +Index: src/support/userinfo.C +=================================================================== +RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/support/userinfo.C,v +retrieving revision 1.9 +diff -u -r1.9 userinfo.C +--- src/support/userinfo.C 20 Jan 2005 15:38:14 -0000 1.9 ++++ src/support/userinfo.C 21 Jan 2005 09:43:42 -0000 +@@ -15,7 +15,9 @@ + + #include + +-#include ++#ifndef _WIN32 ++# include ++#endif + #ifdef HAVE_UNISTD_H + # include + #endif +@@ -28,6 +30,7 @@ + + string const user_name() + { ++#ifndef _WIN32 + struct passwd * pw(getpwuid(geteuid())); + BOOST_ASSERT(pw); + +@@ -35,6 +38,9 @@ + if (name.empty()) + name = pw->pw_name; + return name; ++#else ++ return "dummy"; ++#endif + } + + diff --git a/development/Win32/readme.txt b/development/Win32/readme.txt new file mode 100644 index 0000000000..4d1796f8d4 --- /dev/null +++ b/development/Win32/readme.txt @@ -0,0 +1,24 @@ +To compile using MicroSoft Visual Studio 2003.NET, do this: + +1) Checkout Qt/Free from CVS next to lyx-devel and compile. + See http://kde-cygwin.sourceforge.net/qt3-win32/compile-net.php + for more info. +2) Make sure QTDIR is set in your global environment, and QTDIR\bin + is in your path. Control panel, system, advanced, environment + variables in your friend on Windows XP. +3) Apply the lyx-devel.patch using GNU patch. Download from + http://gnuwin32.sourceforge.net/packages/patch.htm + and type "patch -p0 development\win32\lyx-devel.patch" in cmd box with current working directory right outside + lyx-devel +4) Open the development\win32\lyx.sln file in Visual Studio, + compile and run. You can probably also use the free version + of Microsoft's compiler, but I haven't tried that. + +Development: + +To get a stack-trace for assertions in LyX, make a breakpoint +in src/Boost.C. + +To run LyX, you need a bunch of generated files from configure. +You can find these on the LyX mailing list in January 2005. +