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_;




Reply via email to