Skip to content

Commit c400036

Browse files
fix: check QPainter::isActive() before drawing in Wayland (flameshot-org#4496)
On Wayland, the backing store may not be ready when paintEvent is called, causing QPainter to fail with 'Paint device returned engine == 0'. This adds isActive() checks to prevent crashes when the painter cannot be initialized. Fixes crashes on KDE Plasma Wayland with Qt 6.
1 parent bcf0766 commit c400036

File tree

9 files changed

+22
-0
lines changed

9 files changed

+22
-0
lines changed

src/widgets/capture/capturewidget.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,9 @@ void CaptureWidget::paintEvent(QPaintEvent* paintEvent)
644644
{
645645
Q_UNUSED(paintEvent)
646646
QPainter painter(this);
647+
if (!painter.isActive()) {
648+
return;
649+
}
647650
GeneralConf::xywh_position position =
648651
static_cast<GeneralConf::xywh_position>(m_config.showSelectionGeometry());
649652
/* QPainter::save and restore is somewhat costly so we try to guess

src/widgets/capture/magnifierwidget.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ MagnifierWidget::MagnifierWidget(const QPixmap& p,
3535
void MagnifierWidget::paintEvent(QPaintEvent*)
3636
{
3737
QPainter p(this);
38+
if (!p.isActive()) {
39+
return;
40+
}
3841
if (m_square) {
3942
drawMagnifier(p);
4043
} else {

src/widgets/capture/notifierbox.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ void NotifierBox::enterEvent(QEnterEvent*)
3434
void NotifierBox::paintEvent(QPaintEvent*)
3535
{
3636
QPainter painter(this);
37+
if (!painter.isActive()) {
38+
return;
39+
}
3740
// draw Ellipse
3841
painter.setRenderHint(QPainter::Antialiasing);
3942
painter.setBrush(QBrush(m_bgColor, Qt::SolidPattern));

src/widgets/capture/overlaymessage.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ QString OverlayMessage::compileFromKeyMap(
9999
void OverlayMessage::paintEvent(QPaintEvent* e)
100100
{
101101
QPainter painter(this);
102+
if (!painter.isActive())
103+
return;
102104
painter.setRenderHint(QPainter::Antialiasing);
103105

104106
painter.setBrush(QBrush(m_fillColor, Qt::SolidPattern));

src/widgets/capture/selectionwidget.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,9 @@ void SelectionWidget::parentMouseMoveEvent(QMouseEvent* e)
380380
void SelectionWidget::paintEvent(QPaintEvent*)
381381
{
382382
QPainter p(this);
383+
if (!p.isActive()) {
384+
return;
385+
}
383386
p.setPen(m_color);
384387
p.drawRect(rect() + QMargins(0, 0, -1, -1));
385388
p.setRenderHint(QPainter::Antialiasing);

src/widgets/colorpickerwidget.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ const QVector<QColor>& ColorPickerWidget::getDefaultLargeColorPalette()
2828
void ColorPickerWidget::paintEvent(QPaintEvent* e)
2929
{
3030
QPainter painter(this);
31+
if (!painter.isActive())
32+
return;
3133
painter.setRenderHint(QPainter::Antialiasing);
3234
painter.setPen(QColor(Qt::black));
3335

src/widgets/loadspinner.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ void LoadSpinner::stop()
5454
void LoadSpinner::paintEvent(QPaintEvent*)
5555
{
5656
QPainter painter(this);
57+
if (!painter.isActive())
58+
return;
5759
painter.setRenderHint(QPainter::Antialiasing, true);
5860
auto pen = QPen(m_color);
5961

src/widgets/orientablepushbutton.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ void OrientablePushButton::paintEvent(QPaintEvent* event)
3838
Q_UNUSED(event)
3939

4040
QStylePainter painter(this);
41+
if (!painter.isActive())
42+
return;
4143
QStyleOptionButton option;
4244
initStyleOption(&option);
4345

src/widgets/panel/colorgrabwidget.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@ bool ColorGrabWidget::eventFilter(QObject*, QEvent* event)
142142
void ColorGrabWidget::paintEvent(QPaintEvent*)
143143
{
144144
QPainter painter(this);
145+
if (!painter.isActive())
146+
return;
145147
painter.drawImage(QRectF(0, 0, width(), height()), m_previewImage);
146148
}
147149

0 commit comments

Comments
 (0)