diff --git a/autotests/decorationbuttontest.cpp b/autotests/decorationbuttontest.cpp --- a/autotests/decorationbuttontest.cpp +++ b/autotests/decorationbuttontest.cpp @@ -60,6 +60,7 @@ void testMenuDoubleClick(); void testMenuPressAndHold(); void testApplicationMenu(); + void testHoverEdge(); }; void DecorationButtonTest::testButton() @@ -1342,5 +1343,48 @@ QCOMPARE(pressedChangedSpy.last().first().toBool(), false); } +void DecorationButtonTest::testHoverEdge() +{ + MockBridge bridge; + MockDecoration mockDecoration(&bridge); + + MockButton button1(KDecoration2::DecorationButtonType::Custom, &mockDecoration); + button1.setGeometry(QRectF(0, 0, 10, 10)); + button1.setEnabled(true); + button1.setVisible(true); + + MockButton button2(KDecoration2::DecorationButtonType::Custom, &mockDecoration); + button2.setGeometry(QRectF(10, 0, 10, 10)); + button2.setEnabled(true); + button2.setVisible(true); + + QSignalSpy button1PointerEnteredSpy(&button1, SIGNAL(pointerEntered())); + QVERIFY(button1PointerEnteredSpy.isValid()); + QSignalSpy button1HoveredChangedSpy(&button1, SIGNAL(hoveredChanged(bool))); + QVERIFY(button1HoveredChangedSpy.isValid()); + + QSignalSpy button2PointerEnteredSpy(&button2, SIGNAL(pointerEntered())); + QVERIFY(button2PointerEnteredSpy.isValid()); + QSignalSpy button2HoveredChangedSpy(&button2, SIGNAL(hoveredChanged(bool))); + QVERIFY(button2HoveredChangedSpy.isValid()); + + QHoverEvent enterEvent(QEvent::HoverEnter, QPoint(10, 5), QPoint()); + + enterEvent.setAccepted(false); + button1.event(&enterEvent); + QCOMPARE(enterEvent.isAccepted(), false); + QCOMPARE(button1.isHovered(), false); + QCOMPARE(button1PointerEnteredSpy.count(), 0); + QCOMPARE(button1HoveredChangedSpy.count(), 0); + + enterEvent.setAccepted(false); + button2.event(&enterEvent); + QCOMPARE(enterEvent.isAccepted(), true); + QCOMPARE(button2.isHovered(), true); + QCOMPARE(button2PointerEnteredSpy.count(), 1); + QCOMPARE(button2HoveredChangedSpy.count(), 1); + QCOMPARE(button2HoveredChangedSpy.last().first().toBool(), true); +} + QTEST_MAIN(DecorationButtonTest) #include "decorationbuttontest.moc" diff --git a/src/decoration.cpp b/src/decoration.cpp --- a/src/decoration.cpp +++ b/src/decoration.cpp @@ -330,7 +330,7 @@ continue; } const bool hovered = button->isHovered(); - const bool contains = button->geometry().contains(event->pos()); + const bool contains = button->geometry().toRect().contains(event->pos()); if (!hovered && contains) { QHoverEvent e(QEvent::HoverEnter, event->posF(), event->oldPosF(), event->modifiers()); QCoreApplication::instance()->sendEvent(button, &e); diff --git a/src/decorationbutton.cpp b/src/decorationbutton.cpp --- a/src/decorationbutton.cpp +++ b/src/decorationbutton.cpp @@ -476,16 +476,16 @@ void DecorationButton::hoverEnterEvent(QHoverEvent *event) { - if (!d->enabled || !d->visible || !d->geometry.contains(event->posF())) { + if (!d->enabled || !d->visible || !d->geometry.toRect().contains(event->pos())) { return; } d->setHovered(true); event->setAccepted(true); } void DecorationButton::hoverLeaveEvent(QHoverEvent *event) { - if (!d->enabled || !d->visible || !d->hovered || d->geometry.contains(event->posF())) { + if (!d->enabled || !d->visible || !d->hovered || d->geometry.toRect().contains(event->pos())) { return; } d->setHovered(false); @@ -502,15 +502,15 @@ if (!d->enabled || !d->visible || !d->hovered) { return; } - if (!d->geometry.contains(event->localPos())) { + if (!d->geometry.toRect().contains(event->pos())) { d->setHovered(false); event->setAccepted(true); } } void DecorationButton::mousePressEvent(QMouseEvent *event) { - if (!d->enabled || !d->visible || !d->geometry.contains(event->localPos()) || !d->acceptedButtons.testFlag(event->button())) { + if (!d->enabled || !d->visible || !d->geometry.toRect().contains(event->pos()) || !d->acceptedButtons.testFlag(event->button())) { return; } d->setPressed(event->button(), true); @@ -533,7 +533,7 @@ if (!d->enabled || !d->visible || !d->isPressed(event->button())) { return; } - if (d->geometry.contains(event->localPos())) { + if (d->geometry.toRect().contains(event->pos())) { if (!d->pressAndHold || event->button() != Qt::LeftButton) { emit clicked(event->button()); } else {