THis partially fixes wrong cursor size in math (cursor is at least of
correct size on top-level insets).
I'll commit this unless someone objects.
Andre'
Index: cursor.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/cursor.C,v
retrieving revision 1.117
diff -u -p -r1.117 cursor.C
--- cursor.C 5 Jan 2005 20:21:24 -0000 1.117
+++ cursor.C 9 Jan 2005 19:25:41 -0000
@@ -160,7 +160,6 @@ namespace {
return false;
}
-
} // namespace anon
@@ -192,7 +191,8 @@ void LCursor::setCursor(DocIterator cons
void LCursor::dispatch(FuncRequest const & cmd0)
{
- lyxerr[Debug::DEBUG] << "LCursor::dispatch: cmd: " << cmd0 << endl <<
*this << endl;
+ lyxerr[Debug::DEBUG] << "LCursor::dispatch: cmd: "
+ << cmd0 << endl << *this << endl;
if (empty())
return;
@@ -200,7 +200,8 @@ void LCursor::dispatch(FuncRequest const
LCursor safe = *this;
for (; size(); pop()) {
- lyxerr[Debug::DEBUG] << "LCursor::dispatch: cmd: " << cmd0 <<
endl << *this << endl;
+ lyxerr[Debug::DEBUG] << "LCursor::dispatch: cmd: "
+ << cmd0 << endl << *this << endl;
BOOST_ASSERT(pos() <= lastpos());
BOOST_ASSERT(idx() <= lastidx());
BOOST_ASSERT(pit() <= lastpit());
@@ -304,25 +305,6 @@ int LCursor::currentMode()
}
-void LCursor::getDim(int & asc, int & des) const
-{
- if (inMathed()) {
- BOOST_ASSERT(inset().asMathInset());
- //inset().asMathInset()->getCursorDim(asc, des);
- asc = 10;
- des = 2;
- } else if (inTexted()) {
- LyXFont const & realfont = text()->real_current_font;
- asc = font_metrics::maxAscent(realfont);
- des = font_metrics::maxDescent(realfont);
- } else {
- lyxerr << "should this happen?" << endl;
- asc = 10;
- des = 10;
- }
-}
-
-
void LCursor::getPos(int & x, int & y) const
{
Point p = bv_funcs::getPos(*this);
@@ -1131,4 +1113,25 @@ void LCursor::needsUpdate()
void LCursor::noUpdate()
{
disp_.update(false);
+}
+
+
+LyXFont LCursor::getFont() const
+{
+ // HACK. far from being perfect...
+ int s = 0;
+ // go up until first non-0 text is hit
+ // (innermost text is 0 in mathed)
+ for (s = size() - 1; s >= 0; --s)
+ if (operator[](s).text())
+ break;
+ CursorSlice const & sl = operator[](s);
+ LyXText & text = *sl.text();
+ LyXFont font = text.getPar(sl.pit()).getFont(
+ bv().buffer()->params(),
+ sl.pos(),
+ outerFont(sl.pit(), text.paragraphs()));
+ for (; s < size(); ++s)
+ ;
+ return font;
}
Index: cursor.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/cursor.h,v
retrieving revision 1.69
diff -u -p -r1.69 cursor.h
--- cursor.h 5 Jan 2005 20:21:24 -0000 1.69
+++ cursor.h 9 Jan 2005 19:25:43 -0000
@@ -23,6 +23,7 @@ class BufferView;
class FuncStatus;
class FuncRequest;
class Point;
+class LyXFont;
// these should go
class MathUnknownInset;
@@ -99,8 +100,6 @@ public:
bool & macromode() { return macromode_; }
/// returns x,y position
void getPos(int & x, int & y) const;
- /// returns cursor dimension
- void getDim(int & asc, int & desc) const;
//
// common part
@@ -275,8 +274,9 @@ public:
bool openable(MathAtom const &) const;
///
Encoding const * getEncoding() const;
+ /// font at cursor position
+ LyXFont getFont() const;
};
-
#endif // LYXCURSOR_H
Index: BufferView_pimpl.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/BufferView_pimpl.C,v
retrieving revision 1.565
diff -u -p -r1.565 BufferView_pimpl.C
--- BufferView_pimpl.C 6 Jan 2005 16:39:18 -0000 1.565
+++ BufferView_pimpl.C 9 Jan 2005 19:25:52 -0000
@@ -56,6 +56,7 @@
#include "frontends/Alert.h"
#include "frontends/Dialogs.h"
#include "frontends/FileDialog.h"
+#include "frontends/font_metrics.h"
#include "frontends/LyXView.h"
#include "frontends/LyXScreenFactory.h"
#include "frontends/screen.h"
@@ -586,8 +587,9 @@ void BufferView::Pimpl::workAreaResize()
bool BufferView::Pimpl::fitCursor()
{
if (bv_funcs::status(bv_, bv_->cursor()) == bv_funcs::CUR_INSIDE) {
- int asc, des;
- bv_->cursor().getDim(asc, des);
+ LyXFont const font = bv_->cursor().getFont();
+ int const asc = font_metrics::maxAscent(font);
+ int const des = font_metrics::maxDescent(font);
Point p = bv_funcs::getPos(bv_->cursor());
if (p.y_ - asc >= 0 && p.y_ + des < bv_->workHeight())
return false;
Index: frontends/screen.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/screen.C,v
retrieving revision 1.98
diff -u -p -r1.98 screen.C
--- frontends/screen.C 6 Dec 2004 21:59:23 -0000 1.98
+++ frontends/screen.C 9 Jan 2005 19:25:52 -0000
@@ -174,13 +174,14 @@ void LyXScreen::showCursor(BufferView &
if (realfont.language() == latex_language)
shape = BAR_SHAPE;
- int ascent, descent;
- bv.cursor().getDim(ascent, descent);
- int h = ascent + descent;
+ LyXFont const font = bv.cursor().getFont();
+ int const asc = font_metrics::maxAscent(font);
+ int const des = font_metrics::maxDescent(font);
+ int h = asc + des;
int x = 0;
int y = 0;
bv.cursor().getPos(x, y);
- y -= ascent;
+ y -= asc;
//lyxerr << "LyXScreen::showCursor x: " << x << " y: " << y << endl;
// if it doesn't touch the screen, don't try to show it