diff --git a/pointer_input.cpp b/pointer_input.cpp --- a/pointer_input.cpp +++ b/pointer_input.cpp @@ -51,6 +51,7 @@ #include #include +#include // Wayland #include @@ -1221,6 +1222,7 @@ if (auto dragIcon = ddi->icon()) { if (auto buffer = dragIcon->buffer()) { additionalIcon = buffer->data().copy(); + additionalIcon.setOffset(dragIcon->offset()); } } } @@ -1253,7 +1255,32 @@ return; } m_drag.cursor.hotSpot = c->hotspot(); - m_drag.cursor.image = buffer->data().copy(); + + if (additionalIcon.isNull()) { + m_drag.cursor.image = buffer->data().copy(); + } else { + QRect cursorRect = buffer->data().rect(); + QRect iconRect = additionalIcon.rect(); + + if (-m_drag.cursor.hotSpot.x() < additionalIcon.offset().x()) { + iconRect.moveLeft(m_drag.cursor.hotSpot.x() - additionalIcon.offset().x()); + } else { + cursorRect.moveLeft(-additionalIcon.offset().x() - m_drag.cursor.hotSpot.x()); + } + if (-m_drag.cursor.hotSpot.y() < additionalIcon.offset().y()) { + iconRect.moveTop(m_drag.cursor.hotSpot.y() - additionalIcon.offset().y()); + } else { + cursorRect.moveTop(-additionalIcon.offset().y() - m_drag.cursor.hotSpot.y()); + } + + m_drag.cursor.image = QImage(cursorRect.united(iconRect).size(), QImage::Format_ARGB32_Premultiplied); + m_drag.cursor.image.fill(Qt::transparent); + QPainter p(&m_drag.cursor.image); + p.drawImage(iconRect, additionalIcon); + p.drawImage(cursorRect, buffer->data()); + p.end(); + } + if (needsEmit) { emit changed(); }