Enrico Forestieri wrote:
On Wed, Aug 22, 2007 at 09:54:54AM +0200, Abdelrazak Younes wrote:
Enrico Forestieri wrote:
Crash:
When loading the attached file, the cursor is not visible and the text
is out of view.
I am not sure about this one but this one is fixed:
I started seeing it after your commit. Before that, it only happened
to me on *nix with X11. It invariably occurs with a cygwin build, but
only sometimes with a native mingw build.
This is fixed now. Please test on X11.
Backporting this to 1.5 should be easy but I don't have the time.
Abdel.
Author: younes
Date: Wed Aug 22 16:14:52 2007
New Revision: 19721
URL: http://www.lyx.org/trac/changeset/19721
Log:
Fix bug 3427:
http://bugzilla.lyx.org/show_bug.cgi?id=3427
The problem was that offset_ref_ was calculated based on an empty
metrics. The solution is delay the calculation up until the next metrics
update.
* BufferView:
- center(): now just set the anchor_ref and program a new screen
recentering.
- updateOffsetRef(): update the offset_ref_
Modified:
lyx-devel/trunk/src/BufferView.cpp
lyx-devel/trunk/src/BufferView.h
Modified: lyx-devel/trunk/src/BufferView.cpp
URL:
http://www.lyx.org/trac/file/lyx-devel/trunk/src/BufferView.cpp?rev=19721
==============================================================================
--- lyx-devel/trunk/src/BufferView.cpp (original)
+++ lyx-devel/trunk/src/BufferView.cpp Wed Aug 22 16:14:52 2007
@@ -126,7 +126,7 @@
: width_(0), height_(0), buffer_(buf), wh_(0),
cursor_(*this),
multiparsel_cache_(false), anchor_ref_(0), offset_ref_(0),
- intl_(new Intl), last_inset_(0)
+ need_centering_(false), intl_(new Intl), last_inset_(0)
{
xsel_cache_.set = false;
intl_->initKeyMapper(lyxrc.use_kbmap);
@@ -478,16 +478,37 @@
}
-void BufferView::center()
-{
+void BufferView::updateOffsetRef()
+{
+ if (!need_centering_)
+ return;
+
+ if (height_ == 0)
+ return;
+
CursorSlice & bot = cursor_.bottom();
TextMetrics & tm = text_metrics_[bot.text()];
pit_type const pit = bot.pit();
- tm.redoParagraph(pit);
ParagraphMetrics const & pm = tm.parMetrics(pit);
anchor_ref_ = pit;
- offset_ref_ = bv_funcs::coordOffset(*this, cursor_,
cursor_.boundary()).y_
- + pm.ascent() - height_ / 2;
+ //DocIterator dit;
+ //dit.push_back(bot);
+ //dit.pos() = 0;
+
+ Point p = bv_funcs::coordOffset(*this, cursor_, cursor_.boundary());
+ offset_ref_ = p.y_ + pm.ascent() - height_ / 2;
+
+ lyxerr << "p.y_ " << p.y_ << " pm.ascent() " << pm.ascent() << " h/2
" << height_/2
+ << " offset_ref_ " << offset_ref_ << endl;
+
+ need_centering_ = false;
+}
+
+
+void BufferView::center()
+{
+ anchor_ref_ = cursor_.bottom().pit();
+ need_centering_ = true;
}
@@ -1350,6 +1371,8 @@
if (!singlepar)
tm.redoParagraph(pit);
+ updateOffsetRef();
+
int y0 = tm.parMetrics(pit).ascent() - offset_ref_;
// Redo paragraphs above anchor if necessary.
Modified: lyx-devel/trunk/src/BufferView.h
URL: http://www.lyx.org/trac/file/lyx-devel/trunk/src/BufferView.h?rev=19721
==============================================================================
--- lyx-devel/trunk/src/BufferView.h (original)
+++ lyx-devel/trunk/src/BufferView.h Wed Aug 22 16:14:52 2007
@@ -284,6 +284,10 @@
pit_type anchor_ref_;
///
int offset_ref_;
+ ///
+ void updateOffsetRef();
+ ///
+ bool need_centering_;
/// keyboard mapping object.
boost::scoped_ptr<Intl> const intl_;