Jean-Marc Lasgouttes wrote:
"Abdelrazak" == Abdelrazak Younes <[EMAIL PROTECTED]> writes:
Abdelrazak> Looking at the backtrace, it seems that a resize event is
Abdelrazak> triggered just after the doGreyOut() method is initiated
Abdelrazak> and before it is finished, hence the crash. Now the
Abdelrazak> question is why a resize is triggered?
Because we remove the scroll bar? (shot in the dark)
I think you were right and I fixed this. Bennet, please update and check
that it works for you.
Abdel.
Author: younes
Date: Thu Jan 4 13:36:17 2007
New Revision: 16499
URL: http://www.lyx.org/trac/changeset/16499
Log:
Reorganize window resizing so that no painting occurs during a
resizeEvent(). This caused the crash on MacOSX because the splash image
drawing was not finished before the resizeEvent() occurred because of
scrollbar hiding.
* WorkArea::resizeBufferView(): delete redraw() call.
* GuiWorkArea:
- need_resize_: new private member.
- expose(): move pixmap painting code to new private updateScreen()
method.
- paintEvent(): resize the backing pixmap if need be.
- resizeEvent(): move the resizing code to paintEvent().
Modified:
lyx-devel/trunk/src/frontends/WorkArea.C
lyx-devel/trunk/src/frontends/qt4/GuiWorkArea.C
lyx-devel/trunk/src/frontends/qt4/GuiWorkArea.h
Modified: lyx-devel/trunk/src/frontends/WorkArea.C
URL:
http://www.lyx.org/trac/file/lyx-devel/trunk/src/frontends/WorkArea.C?rev=16499
==============================================================================
--- lyx-devel/trunk/src/frontends/WorkArea.C (original)
+++ lyx-devel/trunk/src/frontends/WorkArea.C Thu Jan 4 13:36:17 2007
@@ -227,7 +227,6 @@
lyx_view_.message(_("Formatting document..."));
buffer_view_->workAreaResize(width(), height());
lyx_view_.updateLayoutChoice();
- redraw();
lyx_view_.busy(false);
lyx_view_.clearMessage();
}
Modified: lyx-devel/trunk/src/frontends/qt4/GuiWorkArea.C
URL:
http://www.lyx.org/trac/file/lyx-devel/trunk/src/frontends/qt4/GuiWorkArea.C?rev=16499
==============================================================================
--- lyx-devel/trunk/src/frontends/qt4/GuiWorkArea.C (original)
+++ lyx-devel/trunk/src/frontends/qt4/GuiWorkArea.C Thu Jan 4 13:36:17 2007
@@ -159,7 +159,7 @@
GuiWorkArea::GuiWorkArea(int w, int h, int id, LyXView & lyx_view)
- : WorkArea(id, lyx_view)
+ : WorkArea(id, lyx_view), need_resize_(false)
{
cursor_ = new frontend::CursorWidget();
cursor_->hide();
@@ -430,12 +430,9 @@
void GuiWorkArea::resizeEvent(QResizeEvent * ev)
{
- stopBlinkingCursor();
- screen_ = QPixmap(ev->size().width(), ev->size().height());
verticalScrollBar()->setPageStep(viewport()->height());
QAbstractScrollArea::resizeEvent(ev);
- resizeBufferView();
- startBlinkingCursor();
+ need_resize_ = true;
}
@@ -500,6 +497,13 @@
<< " h: " << rc.height() << endl;
*/
+ if (need_resize_) {
+ screen_ = QPixmap(viewport()->width(), viewport()->height());
+ resizeBufferView();
+ updateScreen();
+ need_resize_ = false;
+ }
+
QPainter pain(viewport());
pain.drawPixmap(rc, screen_, rc);
cursor_->draw(pain);
@@ -508,19 +512,24 @@
void GuiWorkArea::expose(int x, int y, int w, int h)
{
+ updateScreen();
+ update(x, y, w, h);
+}
+
+
+void GuiWorkArea::updateScreen()
+{
QLPainter pain(&screen_);
if (greyed_out_) {
lyxerr[Debug::GUI] << "splash screen requested" << endl;
+ verticalScrollBar()->hide();
doGreyOut(pain);
- verticalScrollBar()->hide();
- update(0, 0, width(), height());
return;
}
verticalScrollBar()->show();
paintText(*buffer_view_, pain);
- update(x, y, w, h);
}
Modified: lyx-devel/trunk/src/frontends/qt4/GuiWorkArea.h
URL:
http://www.lyx.org/trac/file/lyx-devel/trunk/src/frontends/qt4/GuiWorkArea.h?rev=16499
==============================================================================
--- lyx-devel/trunk/src/frontends/qt4/GuiWorkArea.h (original)
+++ lyx-devel/trunk/src/frontends/qt4/GuiWorkArea.h Thu Jan 4 13:36:17 2007
@@ -166,7 +166,11 @@
///
CursorWidget * cursor_;
///
+ void updateScreen();
+ ///
QPixmap screen_;
+ ///
+ bool need_resize_;
};
} // namespace frontend