commit f48cf461010daa8aceb220a6762cb50c1192db0d Author: Jean-Marc Lasgouttes <lasgout...@lyx.org> Date: Sat Jul 15 11:46:25 2023 +0200
Add "full" drawing strategy With this patch, 3 draw strategies (set in prefs with \draw_strategy partial|backingstore|full) are available: - "partial": only draw the parts of text that have changed since last paint event (default for X11 and windows) - "backingstore": the same, but drawing happens on an offspring pixmap; this breaks subpixel rendering (default for Wayland and macOS) - "full": the screen is fully redrawn at each paint event and should therefore always be correct; this is presumably slower but introducing it will allow to test it. This would deserve a proper UI eventually. --- src/BufferView.cpp | 3 +++ src/LyXRC.cpp | 6 +++++- src/LyXRC.h | 4 ++-- src/frontends/qt/GuiApplication.cpp | 9 +++++---- src/frontends/qt/GuiApplication.h | 4 ++-- src/frontends/qt/GuiWorkArea.cpp | 10 +++++++--- 6 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/BufferView.cpp b/src/BufferView.cpp index 755e2f7b4e..4e81bcbe3f 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -592,6 +592,9 @@ void BufferView::processUpdateFlags(Update::flags flags) flags = (flags & ~Update::FitCursor) | Update::ForceDraw; } + if (lyxrc.draw_strategy == LyXRC::DS_FULL) + flags = flags | Update::ForceDraw; + // Add flags to the the update flags. These will be reset to None // after the redraw is actually done d->update_flags_ = d->update_flags_ | flags; diff --git a/src/LyXRC.cpp b/src/LyXRC.cpp index 9c8decab43..edd9a58240 100644 --- a/src/LyXRC.cpp +++ b/src/LyXRC.cpp @@ -1147,8 +1147,9 @@ LyXRC::ReturnValues LyXRC::read(Lexer & lexrc, bool check_format) draw_strategy = DS_PARTIAL; else if (tmp == "backingstore") draw_strategy = DS_BACKINGSTORE; + else if (tmp == "full") + draw_strategy = DS_FULL; else { - draw_strategy = DS_PARTIAL; LYXERR0("Unrecognized draw strategy " << tmp <<'"'); } } @@ -2055,6 +2056,9 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c draw_strategy != system_lyxrc.draw_strategy) { string status; switch (draw_strategy) { + case DS_FULL: + status = "full"; + break; case DS_PARTIAL: status = "partial"; break; diff --git a/src/LyXRC.h b/src/LyXRC.h index c437021c06..753a6f4f61 100644 --- a/src/LyXRC.h +++ b/src/LyXRC.h @@ -580,8 +580,8 @@ public: BookmarksVisibility bookmarks_visibility = BMK_NONE; enum DrawStrategy { - // draw all (not implemented yet) - // FS_FULL, + // draw all + DS_FULL, // draw only what has changed DS_PARTIAL, // draw in backing store (only what has changed) diff --git a/src/frontends/qt/GuiApplication.cpp b/src/frontends/qt/GuiApplication.cpp index 516c970e71..d903e85f5d 100644 --- a/src/frontends/qt/GuiApplication.cpp +++ b/src/frontends/qt/GuiApplication.cpp @@ -2730,13 +2730,14 @@ Menus & GuiApplication::menus() } -bool GuiApplication::needsBackingStore() const +bool GuiApplication::noPartialDraw() const { /* Qt on macOS and Wayland does not respect the * Qt::WA_OpaquePaintEvent attribute and resets the widget backing - * store at each update. Therefore, we use our own backing store - * in these two cases. It is also possible to force the use of the - * backing store for cases like x11 with transparent WM themes. + * store at each update. Therefore, if it not good to use + * "partial" draw strategy in these cases. It is also possible to + * force the use of the backing store for cases like x11 with + * transparent WM themes. */ return platformName() == "cocoa" || platformName().contains("wayland"); } diff --git a/src/frontends/qt/GuiApplication.h b/src/frontends/qt/GuiApplication.h index b27964dde4..67ba9590e5 100644 --- a/src/frontends/qt/GuiApplication.h +++ b/src/frontends/qt/GuiApplication.h @@ -113,8 +113,8 @@ public: /// Menus & menus(); - /// \returns true if painting the workarea requires a backing store. - bool needsBackingStore() const; + /// \returns true the "partial" draw strategy is known to be broken + bool noPartialDraw() const; /// \name Methods inherited from QApplication class //@{ diff --git a/src/frontends/qt/GuiWorkArea.cpp b/src/frontends/qt/GuiWorkArea.cpp index 8b86615b4e..c136ffee14 100644 --- a/src/frontends/qt/GuiWorkArea.cpp +++ b/src/frontends/qt/GuiWorkArea.cpp @@ -131,9 +131,13 @@ GuiWorkArea::Private::Private(GuiWorkArea * parent) : p(parent), completer_(new GuiCompleter(p, p)) { use_backingstore_ = lyxrc.draw_strategy == LyXRC::DS_BACKINGSTORE - || guiApp->needsBackingStore(); - LYXERR(Debug::WORKAREA, "Drawing strategy is: " - << (use_backingstore_ ? "backingstore" : "partial")); + || (lyxrc.draw_strategy == LyXRC::DS_PARTIAL && guiApp->noPartialDraw()); + if (use_backingstore_) + LYXERR(Debug::WORKAREA, "Drawing strategy: partial draw on backing store"); + else + LYXERR(Debug::WORKAREA, "Drawing strategy: " + << (lyxrc.draw_strategy == LyXRC::DS_PARTIAL ? "partial draw" + : "full draw")); int const time = QApplication::cursorFlashTime() / 2; if (time > 0) { -- lyx-cvs mailing list lyx-cvs@lists.lyx.org http://lists.lyx.org/mailman/listinfo/lyx-cvs