X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fscreen.C;h=d7a1f34e55dad26386c26ecefe6c9f32f52c53dc;hb=36945644e70db39a8316570bb44fabc7a3bd3d49;hp=525b3912e1b9cc1918bce57711978f4a44358f3f;hpb=99aacdad5ce32c5905149d800405ff48ffb3a3d6;p=lyx.git diff --git a/src/frontends/screen.C b/src/frontends/screen.C index 525b3912e1..d7a1f34e55 100644 --- a/src/frontends/screen.C +++ b/src/frontends/screen.C @@ -21,6 +21,7 @@ #include "BufferView.h" #include "buffer.h" #include "bufferparams.h" +#include "coordcache.h" #include "cursor.h" #include "debug.h" #include "language.h" @@ -34,8 +35,6 @@ #include "rowpainter.h" #include "version.h" -#include "insets/updatableinset.h" - #include "graphics/GraphicsImage.h" #include "graphics/GraphicsLoader.h" @@ -121,12 +120,12 @@ SplashScreen::SplashScreen() LyXScreen::LyXScreen() - : cursor_visible_(false), greyed_out_(true) + : greyed_out_(true), cursor_visible_(false) { // Start loading the pixmap as soon as possible if (lyxrc.show_banner) { SplashScreen const & splash = SplashScreen::get(); - splash.connect(boost::bind(&LyXScreen::greyOut, this)); + splash.connect(boost::bind(&LyXScreen::checkAndGreyOut, this)); splash.startLoading(); } } @@ -137,12 +136,15 @@ LyXScreen::~LyXScreen() } -void LyXScreen::showCursor(BufferView & bv) +void LyXScreen::checkAndGreyOut() { - // this is needed to make sure we copy back the right - // pixmap on the hide for the Qt frontend - lyx_gui::sync_events(); + if (greyed_out_) + greyOut(); +} + +void LyXScreen::showCursor(BufferView & bv) +{ if (cursor_visible_) return; @@ -167,17 +169,18 @@ void LyXScreen::showCursor(BufferView & bv) if (realfont.language() == latex_language) shape = BAR_SHAPE; - int ascent = font_metrics::maxAscent(realfont); - int descent = font_metrics::maxDescent(realfont); - 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 + bv.top_y(); + y -= asc; //lyxerr << "LyXScreen::showCursor x: " << x << " y: " << y << endl; - // if it doesn't fit entirely on the screen, don't try to show it - if (y < 0 || y + h > workarea().workHeight()) + // if it doesn't touch the screen, don't try to show it + if (y + h < 0 || y >= workarea().workHeight()) return; cursor_visible_ = true; @@ -204,80 +207,27 @@ void LyXScreen::toggleCursor(BufferView & bv) } -bool LyXScreen::fitCursor(BufferView * bv) +void LyXScreen::prepareCursor() { - int const top_y = bv->top_y(); - int const h = workarea().workHeight(); - int newtop = top_y; - int x, y, asc, desc; - - bv->cursor().getPos(x, y); - //lyxerr << "LyXScreen::fitCursor: x: " << x << " y: " << y - // << " top_y: " << top_y << endl; - bv->cursor().getDim(asc, desc); - - bool const big_row = h / 4 < asc + desc && asc + desc < h; - - if (y + desc - top_y >= h) { - if (big_row) - newtop = y + desc - h; - else - newtop = y - h / 2; - - } else if (top_y > max(y - asc, 0)) { - if (big_row) - newtop = y - asc; - else { - newtop = y - h / 2; - newtop = min(newtop, top_y); - } - } - - newtop = max(newtop, 0); - if (newtop == top_y) - return false; - - bv->top_y(newtop); - return true; + cursor_visible_ = false; } -void LyXScreen::redraw(BufferView & bv) +void LyXScreen::redraw(BufferView & bv, ViewMetricsInfo const & vi) { - greyed_out_ = !bv.text(); - - if (greyed_out_) { - greyOut(); - return; - } - + greyed_out_ = false; workarea().getPainter().start(); - - hideCursor(); - - int const y = paintText(bv); - - // maybe we have to clear the screen at the bottom - int const y2 = workarea().workHeight(); - if (y < y2 && !bv.text()->isInInset()) { - workarea().getPainter().fillRectangle(0, y, - workarea().workWidth(), y2 - y, - LColor::bottomarea); - } - - lyxerr << "Redraw screen" << endl; - + paintText(bv, vi); + lyxerr[Debug::DEBUG] << "Redraw screen" << endl; expose(0, 0, workarea().workWidth(), workarea().workHeight()); - workarea().getPainter().end(); + theCoords.doneUpdating(); } void LyXScreen::greyOut() { - if (!greyed_out_) - return; - + greyed_out_ = true; workarea().getPainter().start(); workarea().getPainter().fillRectangle(0, 0,