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);
}
+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
#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;
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;
///
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