http://bugzilla.lyx.org/show_bug.cgi?id=3427

As I cannot reproduce the problem on Windows, please test the patch on Unix. This patch has already been committed to trunk last week.

Abdel.
Index: src/BufferView.cpp
===================================================================
--- src/BufferView.cpp  (revision 19770)
+++ src/BufferView.cpp  (working copy)
@@ -126,7 +126,7 @@
        : width_(0), height_(0), buffer_(0), 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);
@@ -593,19 +593,34 @@
 }
 
 
-void BufferView::center()
+void BufferView::updateOffsetRef()
 {
+       // No need to update offset_ref_ in this case.
+       if (!need_centering_)
+               return;
+
+       // We are not properly started yet, delay until resizing is
+       // done.
+       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;
+       ParagraphMetrics const & pm = tm.parMetrics(bot.pit());
+       Point p = bv_funcs::coordOffset(*this, cursor_, cursor_.boundary());
+       offset_ref_ = p.y_ + pm.ascent() - height_ / 2;
+
+       need_centering_ = false;
 }
 
 
+void BufferView::center()
+{
+       anchor_ref_ = cursor_.bottom().pit();
+       need_centering_ = true;
+}
+
+
 FuncStatus BufferView::getStatus(FuncRequest const & cmd)
 {
        FuncStatus flag;
@@ -1481,6 +1496,8 @@
        if (!singlepar)
                tm.redoParagraph(pit);
 
+       updateOffsetRef();
+
        int y0 = tm.parMetrics(pit).ascent() - offset_ref_;
 
        // Redo paragraphs above anchor if necessary.
Index: src/BufferView.h
===================================================================
--- src/BufferView.h    (revision 19769)
+++ src/BufferView.h    (working copy)
@@ -290,6 +290,10 @@
        pit_type anchor_ref_;
        ///
        int offset_ref_;
+       ///
+       void updateOffsetRef();
+       ///
+       bool need_centering_;
 
        /// keyboard mapping object.
        boost::scoped_ptr<Intl> const intl_;
Index: status.15x
===================================================================
--- status.15x  (revision 19770)
+++ status.15x  (working copy)
@@ -82,6 +82,8 @@
 
 - Reset current cursor font when going to a bookmark.
 
+- Fix Document Largely Off-screen on Opening (Bug 3427).
+
 * DOCUMENTATION
 
 - Fix installation links for Hebrew (bug 4165)

Reply via email to