]> git.lyx.org Git - lyx.git/commitdiff
Use backing store also with wayland platform
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Sat, 13 Jul 2019 14:21:37 +0000 (16:21 +0200)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Thu, 7 Nov 2019 11:40:40 +0000 (12:40 +0100)
Like with macOS, the Wayland compositor seems to require a
backingstore when doing partial updates like we do.

This extends the mechanism that has been introduced for macOS. This
has to be done at run time, not compile time.

Fixes bug #11692.

(cherry picked from commit 575761c665229e70d9ce9b2bd941d01a1873b9f1)

src/frontends/qt4/GuiWorkArea.cpp
src/frontends/qt4/GuiWorkArea_Private.h
status.23x

index 5ef177dc37fb12bb8f5685f1459d015d90a3ebc1..e16ea16e2d413664ee1bf8646b9975cc7905ea73 100644 (file)
@@ -239,13 +239,27 @@ SyntheticMouseEvent::SyntheticMouseEvent()
 
 
 GuiWorkArea::Private::Private(GuiWorkArea * parent)
-: p(parent), buffer_view_(0), lyx_view_(0),
-  caret_(0), caret_visible_(false),
-  need_resize_(false), preedit_lines_(1),
-  last_pixel_ratio_(1.0),
-  completer_(new GuiCompleter(p, p)), dialog_mode_(false), shell_escape_(false),
-  read_only_(false), clean_(true), externally_modified_(false)
-{
+: p(parent), buffer_view_(0), lyx_view_(0), caret_(0),
+  caret_visible_(false), need_resize_(false), preedit_lines_(1),
+  last_pixel_ratio_(1.0), completer_(new GuiCompleter(p, p)),
+  dialog_mode_(false), shell_escape_(false), read_only_(false),
+  clean_(true), externally_modified_(false)
+{
+/* 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. */
+#if QT_VERSION >= 0x050000
+       use_backingstore_ = guiApp->platformName() == "cocoa"
+               || guiApp->platformName().contains("wayland");
+#else
+#  ifdef Q_OS_MAC
+       use_backingstore_ = true;
+#  else
+       use_backingstore_ = false;
+#  endif
+#endif
+
        int const time = QApplication::cursorFlashTime() / 2;
        if (time > 0) {
                caret_timeout_.setInterval(time);
@@ -1257,6 +1271,41 @@ void GuiWorkArea::Private::paintPreeditText(GuiPainter & pain)
 }
 
 
+void GuiWorkArea::Private::resetScreen()
+{
+       if (use_backingstore_) {
+               int const pr = p->pixelRatio();
+               screen_ = QImage(static_cast<int>(pr * p->viewport()->width()),
+                                static_cast<int>(pr * p->viewport()->height()),
+                                QImage::Format_ARGB32_Premultiplied);
+#  if QT_VERSION >= 0x050000
+               screen_.setDevicePixelRatio(pr);
+#  endif
+       }
+}
+
+
+QPaintDevice * GuiWorkArea::Private::screenDevice()
+{
+       if (use_backingstore_)
+               return &screen_;
+       else
+               return p->viewport();
+}
+
+
+void GuiWorkArea::Private::updateScreen(QRectF const & rc)
+{
+       if (use_backingstore_) {
+               QPainter qpain(p->viewport());
+               double const pr = p->pixelRatio();
+               QRectF const rcs = QRectF(rc.x() * pr, rc.y() * pr,
+                                         rc.width() * pr, rc.height() * pr);
+               qpain.drawImage(rc, screen_, rcs);
+       }
+}
+
+
 void GuiWorkArea::paintEvent(QPaintEvent * ev)
 {
        // Do not trigger the painting machinery if we are not ready (see
index 83012fa99f10123329936de2a27f254a7387d87e..6342eaba4ac153fc7b1bf6201453ba39f5bd140b 100644 (file)
 #include <QMouseEvent>
 #include <QTimer>
 
-#ifdef Q_OS_MAC
-/* Qt on macOS 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 this case */
-#define LYX_BACKINGSTORE 1
-#include <QPainter>
-#endif
-
 namespace lyx {
 
 class Buffer;
@@ -107,37 +99,12 @@ struct GuiWorkArea::Private
 
        void paintPreeditText(GuiPainter & pain);
 
-       void resetScreen() {
-#ifdef LYX_BACKINGSTORE
-               int const pr = p->pixelRatio();
-               screen_ = QImage(static_cast<int>(pr * p->viewport()->width()),
-                                static_cast<int>(pr * p->viewport()->height()),
-                                QImage::Format_ARGB32_Premultiplied);
-#  if QT_VERSION >= 0x050000
-               screen_.setDevicePixelRatio(pr);
-#  endif
-#endif
-       }
-
-       QPaintDevice * screenDevice() {
-#ifdef LYX_BACKINGSTORE
-               return &screen_;
-#else
-               return p->viewport();
-#endif
-       }
-
-#ifdef LYX_BACKINGSTORE
-       void updateScreen(QRectF const & rc) {
-               QPainter qpain(p->viewport());
-               double const pr = p->pixelRatio();
-               QRectF const rcs = QRectF(rc.x() * pr, rc.y() * pr,
-                                         rc.width() * pr, rc.height() * pr);
-               qpain.drawImage(rc, screen_, rcs);
-       }
-#else
-       void updateScreen(QRectF const & ) {}
-#endif
+       /// Prepare screen for next painting
+       void resetScreen();
+       /// Where painting takes place
+       QPaintDevice * screenDevice();
+       /// Put backingstore to screen if necessary
+       void updateScreen(QRectF const & rc);
 
        ///
        GuiWorkArea * p;
@@ -146,10 +113,11 @@ struct GuiWorkArea::Private
        ///
        GuiView * lyx_view_;
 
-#ifdef LYX_BACKINGSTORE
+       /// Do we need an intermediate image when painting (for now macOS and Wayland)
+       bool use_backingstore_;
        ///
        QImage screen_;
-#endif
+
        ///
        CaretWidget * caret_;
        /// is the caret currently displayed
index 8026ad9ae273e64b777b9bda41d2c6f60dbf5c32..62d9787b23931b2e3fbc7a68a3342733611d8824 100644 (file)
@@ -34,6 +34,7 @@ What's new
 - Do not issue error dialog when no tag is found in git repository for
   tree-revision info inset.
 
+- Fix display with Wayland (bug 11692).
 
 
 * DOCUMENTATION AND LOCALIZATION