Commit d425515a authored by Martin Flöser's avatar Martin Flöser
Browse files

Move pointer button handling from PointerInterface to SeatInterface

The button state is a seat-global state and not a per pointer state.
All pressed/released and axis events are moved to the SeatInterface
and just invoke the related method on the focused surface pointer.
parent a7463f6f
......@@ -237,7 +237,7 @@ void TestDataDevice::testDrag()
// first we need to fake the pointer enter
m_seatInterface->setFocusedPointerSurface(surfaceInterface);
m_seatInterface->focusedPointer()->buttonPressed(1);
m_seatInterface->pointerButtonPressed(1);
QCoreApplication::processEvents();
......@@ -289,7 +289,7 @@ void TestDataDevice::testDragInternally()
// first we need to fake the pointer enter
m_seatInterface->setFocusedPointerSurface(surfaceInterface);
m_seatInterface->focusedPointer()->buttonPressed(1);
m_seatInterface->pointerButtonPressed(1);
QCoreApplication::processEvents();
......
......@@ -333,10 +333,10 @@ void TestWaylandSeat::testPointer()
// test axis
m_seatInterface->setTimestamp(2);
serverPointer->axis(Qt::Horizontal, 10);
m_seatInterface->pointerAxis(Qt::Horizontal, 10);
QVERIFY(axisSpy.wait());
m_seatInterface->setTimestamp(3);
serverPointer->axis(Qt::Vertical, 20);
m_seatInterface->pointerAxis(Qt::Vertical, 20);
QVERIFY(axisSpy.wait());
QCOMPARE(axisSpy.first().at(0).value<quint32>(), quint32(2));
QCOMPARE(axisSpy.first().at(1).value<Pointer::Axis>(), Pointer::Axis::Horizontal);
......@@ -348,19 +348,19 @@ void TestWaylandSeat::testPointer()
// test button
m_seatInterface->setTimestamp(4);
serverPointer->buttonPressed(1);
m_seatInterface->pointerButtonPressed(1);
QVERIFY(buttonSpy.wait());
QCOMPARE(buttonSpy.at(0).at(0).value<quint32>(), m_display->serial());
m_seatInterface->setTimestamp(5);
serverPointer->buttonPressed(2);
m_seatInterface->pointerButtonPressed(2);
QVERIFY(buttonSpy.wait());
QCOMPARE(buttonSpy.at(1).at(0).value<quint32>(), m_display->serial());
m_seatInterface->setTimestamp(6);
serverPointer->buttonReleased(2);
m_seatInterface->pointerButtonReleased(2);
QVERIFY(buttonSpy.wait());
QCOMPARE(buttonSpy.at(2).at(0).value<quint32>(), m_display->serial());
m_seatInterface->setTimestamp(7);
serverPointer->buttonReleased(1);
m_seatInterface->pointerButtonReleased(1);
QVERIFY(buttonSpy.wait());
QCOMPARE(buttonSpy.count(), 4);
......@@ -376,14 +376,14 @@ void TestWaylandSeat::testPointer()
QCOMPARE(buttonSpy.at(1).at(2).value<quint32>(), quint32(2));
QCOMPARE(buttonSpy.at(1).at(3).value<KWayland::Client::Pointer::ButtonState>(), KWayland::Client::Pointer::ButtonState::Pressed);
QCOMPARE(buttonSpy.at(2).at(0).value<quint32>(), serverPointer->buttonSerial(2));
QCOMPARE(buttonSpy.at(2).at(0).value<quint32>(), m_seatInterface->pointerButtonSerial(2));
// timestamp
QCOMPARE(buttonSpy.at(2).at(1).value<quint32>(), quint32(6));
// button
QCOMPARE(buttonSpy.at(2).at(2).value<quint32>(), quint32(2));
QCOMPARE(buttonSpy.at(2).at(3).value<KWayland::Client::Pointer::ButtonState>(), KWayland::Client::Pointer::ButtonState::Released);
QCOMPARE(buttonSpy.at(3).at(0).value<quint32>(), serverPointer->buttonSerial(1));
QCOMPARE(buttonSpy.at(3).at(0).value<quint32>(), m_seatInterface->pointerButtonSerial(1));
// timestamp
QCOMPARE(buttonSpy.at(3).at(1).value<quint32>(), quint32(7));
// button
......@@ -473,28 +473,28 @@ void TestWaylandSeat::testPointerButton()
QFETCH(Qt::MouseButton, qtButton);
QFETCH(quint32, waylandButton);
quint32 msec = QDateTime::currentMSecsSinceEpoch();
QCOMPARE(serverPointer->isButtonPressed(waylandButton), false);
QCOMPARE(serverPointer->isButtonPressed(qtButton), false);
QCOMPARE(m_seatInterface->isPointerButtonPressed(waylandButton), false);
QCOMPARE(m_seatInterface->isPointerButtonPressed(qtButton), false);
m_seatInterface->setTimestamp(msec);
serverPointer->buttonPressed(qtButton);
QCOMPARE(serverPointer->isButtonPressed(waylandButton), true);
QCOMPARE(serverPointer->isButtonPressed(qtButton), true);
m_seatInterface->pointerButtonPressed(qtButton);
QCOMPARE(m_seatInterface->isPointerButtonPressed(waylandButton), true);
QCOMPARE(m_seatInterface->isPointerButtonPressed(qtButton), true);
QVERIFY(buttonChangedSpy.wait());
QCOMPARE(buttonChangedSpy.count(), 1);
QCOMPARE(buttonChangedSpy.last().at(0).value<quint32>(), serverPointer->buttonSerial(waylandButton));
QCOMPARE(buttonChangedSpy.last().at(0).value<quint32>(), serverPointer->buttonSerial(qtButton));
QCOMPARE(buttonChangedSpy.last().at(0).value<quint32>(), m_seatInterface->pointerButtonSerial(waylandButton));
QCOMPARE(buttonChangedSpy.last().at(0).value<quint32>(), m_seatInterface->pointerButtonSerial(qtButton));
QCOMPARE(buttonChangedSpy.last().at(1).value<quint32>(), msec);
QCOMPARE(buttonChangedSpy.last().at(2).value<quint32>(), waylandButton);
QCOMPARE(buttonChangedSpy.last().at(3).value<KWayland::Client::Pointer::ButtonState>(), Pointer::ButtonState::Pressed);
msec = QDateTime::currentMSecsSinceEpoch();
m_seatInterface->setTimestamp(QDateTime::currentMSecsSinceEpoch());
serverPointer->buttonReleased(qtButton);
QCOMPARE(serverPointer->isButtonPressed(waylandButton), false);
QCOMPARE(serverPointer->isButtonPressed(qtButton), false);
m_seatInterface->pointerButtonReleased(qtButton);
QCOMPARE(m_seatInterface->isPointerButtonPressed(waylandButton), false);
QCOMPARE(m_seatInterface->isPointerButtonPressed(qtButton), false);
QVERIFY(buttonChangedSpy.wait());
QCOMPARE(buttonChangedSpy.count(), 2);
QCOMPARE(buttonChangedSpy.last().at(0).value<quint32>(), serverPointer->buttonSerial(waylandButton));
QCOMPARE(buttonChangedSpy.last().at(0).value<quint32>(), serverPointer->buttonSerial(qtButton));
QCOMPARE(buttonChangedSpy.last().at(0).value<quint32>(), m_seatInterface->pointerButtonSerial(waylandButton));
QCOMPARE(buttonChangedSpy.last().at(0).value<quint32>(), m_seatInterface->pointerButtonSerial(qtButton));
QCOMPARE(buttonChangedSpy.last().at(1).value<quint32>(), msec);
QCOMPARE(buttonChangedSpy.last().at(2).value<quint32>(), waylandButton);
QCOMPARE(buttonChangedSpy.last().at(3).value<KWayland::Client::Pointer::ButtonState>(), Pointer::ButtonState::Released);
......
......@@ -118,27 +118,25 @@ void TestWaylandServerSeat::testPointerButton()
PointerInterface *pointer = seat->focusedPointer();
QVERIFY(!pointer);
#if 0
// no button pressed yet, should be released and no serial
QVERIFY(!pointer->isButtonPressed(0));
QVERIFY(!pointer->isButtonPressed(1));
QCOMPARE(pointer->buttonSerial(0), quint32(0));
QCOMPARE(pointer->buttonSerial(1), quint32(0));
QVERIFY(!seat->isPointerButtonPressed(0));
QVERIFY(!seat->isPointerButtonPressed(1));
QCOMPARE(seat->pointerButtonSerial(0), quint32(0));
QCOMPARE(seat->pointerButtonSerial(1), quint32(0));
// mark the button as pressed
pointer->buttonPressed(0);
QVERIFY(pointer->isButtonPressed(0));
QCOMPARE(pointer->buttonSerial(0), display.serial());
seat->pointerButtonPressed(0);
QVERIFY(seat->isPointerButtonPressed(0));
QCOMPARE(seat->pointerButtonSerial(0), display.serial());
// other button should still be unpressed
QVERIFY(!pointer->isButtonPressed(1));
QCOMPARE(pointer->buttonSerial(1), quint32(0));
QVERIFY(!seat->isPointerButtonPressed(1));
QCOMPARE(seat->pointerButtonSerial(1), quint32(0));
// release it again
pointer->buttonReleased(0);
QVERIFY(!pointer->isButtonPressed(0));
QCOMPARE(pointer->buttonSerial(0), display.serial());
#endif
seat->pointerButtonReleased(0);
QVERIFY(!seat->isPointerButtonPressed(0));
QCOMPARE(seat->pointerButtonSerial(0), display.serial());
}
void TestWaylandServerSeat::testPointerPos()
......@@ -151,35 +149,22 @@ void TestWaylandServerSeat::testPointerPos()
QVERIFY(seatPosSpy.isValid());
PointerInterface *pointer = seat->focusedPointer();
QVERIFY(!pointer);
#if 0
QSignalSpy posSpy(pointer, SIGNAL(globalPosChanged(QPointF)));
QVERIFY(posSpy.isValid());
QCOMPARE(pointer->globalPos(), QPointF());
QCOMPARE(seat->pointerPos(), QPointF());
pointer->setGlobalPos(QPointF(10, 15));
QCOMPARE(pointer->globalPos(), QPointF(10, 15));
seat->setPointerPos(QPointF(10, 15));
QCOMPARE(seat->pointerPos(), QPointF(10, 15));
QCOMPARE(posSpy.count(), 1);
QCOMPARE(posSpy.first().first().toPointF(), QPointF(10, 15));
QCOMPARE(seatPosSpy.count(), 1);
QCOMPARE(seatPosSpy.first().first().toPointF(), QPointF(10, 15));
pointer->setGlobalPos(QPointF(10, 15));
QCOMPARE(posSpy.count(), 1);
seat->setPointerPos(QPointF(10, 15));
QCOMPARE(seatPosSpy.count(), 1);
seat->setPointerPos(QPointF(5, 7));
QCOMPARE(pointer->globalPos(), QPointF(5, 7));
QCOMPARE(seat->pointerPos(), QPointF(5, 7));
QCOMPARE(posSpy.count(), 2);
QCOMPARE(posSpy.first().first().toPointF(), QPointF(10, 15));
QCOMPARE(posSpy.last().first().toPointF(), QPointF(5, 7));
QCOMPARE(seatPosSpy.count(), 2);
QCOMPARE(seatPosSpy.first().first().toPointF(), QPointF(10, 15));
QCOMPARE(seatPosSpy.last().first().toPointF(), QPointF(5, 7));
#endif
}
void TestWaylandServerSeat::testDestroyThroughTerminate()
......
......@@ -22,12 +22,8 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
#include "seat_interface.h"
#include "display.h"
#include "surface_interface.h"
// Qt
#include <QHash>
// Wayland
#include <wayland-server.h>
// linux
#include <linux/input.h>
namespace KWayland
{
......@@ -39,17 +35,9 @@ class PointerInterface::Private : public Resource::Private
{
public:
Private(SeatInterface *parent, wl_resource *parentResource, PointerInterface *q);
void updateButtonSerial(quint32 button, quint32 serial);
enum class ButtonState {
Released,
Pressed
};
void updateButtonState(quint32 button, ButtonState state);
SeatInterface *seat;
SurfaceInterface *focusedSurface = nullptr;
QHash<quint32, quint32> buttonSerials;
QHash<quint32, ButtonState> buttonStates;
QMetaObject::Connection destroyConnection;
private:
......@@ -122,132 +110,24 @@ void PointerInterface::setGlobalPos(const QPointF &pos)
d->seat->setPointerPos(pos);
}
static quint32 qtToWaylandButton(Qt::MouseButton button)
{
static const QHash<Qt::MouseButton, quint32> s_buttons({
{Qt::LeftButton, BTN_LEFT},
{Qt::RightButton, BTN_RIGHT},
{Qt::MiddleButton, BTN_MIDDLE},
{Qt::ExtraButton1, BTN_BACK}, // note: QtWayland maps BTN_SIDE
{Qt::ExtraButton2, BTN_FORWARD}, // note: QtWayland maps BTN_EXTRA
{Qt::ExtraButton3, BTN_TASK}, // note: QtWayland maps BTN_FORWARD
{Qt::ExtraButton4, BTN_EXTRA}, // note: QtWayland maps BTN_BACK
{Qt::ExtraButton5, BTN_SIDE}, // note: QtWayland maps BTN_TASK
{Qt::ExtraButton6, BTN_TASK + 1},
{Qt::ExtraButton7, BTN_TASK + 2},
{Qt::ExtraButton8, BTN_TASK + 3},
{Qt::ExtraButton9, BTN_TASK + 4},
{Qt::ExtraButton10, BTN_TASK + 5},
{Qt::ExtraButton11, BTN_TASK + 6},
{Qt::ExtraButton12, BTN_TASK + 7},
{Qt::ExtraButton13, BTN_TASK + 8}
// further mapping not possible, 0x120 is BTN_JOYSTICK
});
return s_buttons.value(button, 0);
};
void PointerInterface::buttonPressed(quint32 button)
void PointerInterface::buttonPressed(quint32 button, quint32 serial)
{
Q_D();
const quint32 serial = d->seat->display()->nextSerial();
d->updateButtonSerial(button, serial);
d->updateButtonState(button, Private::ButtonState::Pressed);
if (!d->focusedSurface) {
return;
}
Q_ASSERT(d->focusedSurface);
wl_pointer_send_button(d->resource, serial, d->seat->timestamp(), button, WL_POINTER_BUTTON_STATE_PRESSED);
}
void PointerInterface::buttonPressed(Qt::MouseButton button)
{
const quint32 nativeButton = qtToWaylandButton(button);
if (nativeButton == 0) {
return;
}
buttonPressed(nativeButton);
}
void PointerInterface::buttonReleased(quint32 button)
void PointerInterface::buttonReleased(quint32 button, quint32 serial)
{
Q_D();
const quint32 serial = d->seat->display()->nextSerial();
d->updateButtonSerial(button, serial);
d->updateButtonState(button, Private::ButtonState::Released);
if (!d->focusedSurface) {
return;
}
Q_ASSERT(d->focusedSurface);
wl_pointer_send_button(d->resource, serial, d->seat->timestamp(), button, WL_POINTER_BUTTON_STATE_RELEASED);
}
void PointerInterface::buttonReleased(Qt::MouseButton button)
{
const quint32 nativeButton = qtToWaylandButton(button);
if (nativeButton == 0) {
return;
}
buttonReleased(nativeButton);
}
void PointerInterface::Private::updateButtonSerial(quint32 button, quint32 serial)
{
auto it = buttonSerials.find(button);
if (it == buttonSerials.end()) {
buttonSerials.insert(button, serial);
return;
}
it.value() = serial;
}
quint32 PointerInterface::buttonSerial(quint32 button) const
{
Q_D();
auto it = d->buttonSerials.constFind(button);
if (it == d->buttonSerials.constEnd()) {
return 0;
}
return it.value();
}
quint32 PointerInterface::buttonSerial(Qt::MouseButton button) const
{
return buttonSerial(qtToWaylandButton(button));
}
void PointerInterface::Private::updateButtonState(quint32 button, ButtonState state)
{
auto it = buttonStates.find(button);
if (it == buttonStates.end()) {
buttonStates.insert(button, state);
return;
}
it.value() = state;
}
bool PointerInterface::isButtonPressed(quint32 button) const
{
Q_D();
auto it = d->buttonStates.constFind(button);
if (it == d->buttonStates.constEnd()) {
return false;
}
return it.value() == Private::ButtonState::Pressed ? true : false;
}
bool PointerInterface::isButtonPressed(Qt::MouseButton button) const
{
const quint32 nativeButton = qtToWaylandButton(button);
if (nativeButton == 0) {
return false;
}
return isButtonPressed(nativeButton);
}
void PointerInterface::axis(Qt::Orientation orientation, quint32 delta)
{
Q_D();
if (!d->focusedSurface) {
return;
}
Q_ASSERT(d->focusedSurface);
wl_pointer_send_axis(d->resource, d->seat->timestamp(),
(orientation == Qt::Vertical) ? WL_POINTER_AXIS_VERTICAL_SCROLL : WL_POINTER_AXIS_HORIZONTAL_SCROLL,
wl_fixed_from_int(delta));
......
......@@ -49,15 +49,6 @@ public:
* @see SeatInterface::pointerPos
**/
QPointF globalPos() const;
void buttonPressed(quint32 button);
void buttonPressed(Qt::MouseButton button);
void buttonReleased(quint32 button);
void buttonReleased(Qt::MouseButton button);
bool isButtonPressed(quint32 button) const;
bool isButtonPressed(Qt::MouseButton button) const;
quint32 buttonSerial(quint32 button) const;
quint32 buttonSerial(Qt::MouseButton button) const;
void axis(Qt::Orientation orientation, quint32 delta);
Q_SIGNALS:
/**
......@@ -69,6 +60,9 @@ Q_SIGNALS:
private:
void setFocusedSurface(SurfaceInterface *surface, quint32 serial);
SurfaceInterface *focusedSurface() const;
void buttonPressed(quint32 button, quint32 serial);
void buttonReleased(quint32 button, quint32 serial);
void axis(Qt::Orientation orientation, quint32 delta);
friend class SeatInterface;
explicit PointerInterface(SeatInterface *parent, wl_resource *parentResource);
class Private;
......
......@@ -31,6 +31,8 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
#ifndef WL_SEAT_NAME_SINCE_VERSION
#define WL_SEAT_NAME_SINCE_VERSION 2
#endif
// linux
#include <linux/input.h>
namespace KWayland
{
......@@ -68,6 +70,17 @@ public:
// Pointer related members
QPointF pointerPos;
struct Pointer {
enum class ButtonState {
Released,
Pressed
};
QHash<quint32, quint32> buttonSerials;
QHash<quint32, ButtonState> buttonStates;
};
Pointer globalPointer;
void updatePointerButtonSerial(quint32 button, quint32 serial);
void updatePointerButtonState(quint32 button, Pointer::ButtonState state);
static SeatInterface *get(wl_resource *native) {
auto s = cast(native);
......@@ -150,6 +163,26 @@ void SeatInterface::Private::unbind(wl_resource *r)
cast(r)->resources.removeAll(r);
}
void SeatInterface::Private::updatePointerButtonSerial(quint32 button, quint32 serial)
{
auto it = globalPointer.buttonSerials.find(button);
if (it == globalPointer.buttonSerials.end()) {
globalPointer.buttonSerials.insert(button, serial);
return;
}
it.value() = serial;
}
void SeatInterface::Private::updatePointerButtonState(quint32 button, Pointer::ButtonState state)
{
auto it = globalPointer.buttonStates.find(button);
if (it == globalPointer.buttonStates.end()) {
globalPointer.buttonStates.insert(button, state);
return;
}
it.value() = state;
}
void SeatInterface::Private::sendName(wl_resource *r)
{
if (wl_resource_get_version(r) < WL_SEAT_NAME_SINCE_VERSION) {
......@@ -406,5 +439,107 @@ QPointF SeatInterface::focusedPointerSurfacePosition() const
return d->focusedPointer.offset;
}
static quint32 qtToWaylandButton(Qt::MouseButton button)
{
static const QHash<Qt::MouseButton, quint32> s_buttons({
{Qt::LeftButton, BTN_LEFT},
{Qt::RightButton, BTN_RIGHT},
{Qt::MiddleButton, BTN_MIDDLE},
{Qt::ExtraButton1, BTN_BACK}, // note: QtWayland maps BTN_SIDE
{Qt::ExtraButton2, BTN_FORWARD}, // note: QtWayland maps BTN_EXTRA
{Qt::ExtraButton3, BTN_TASK}, // note: QtWayland maps BTN_FORWARD
{Qt::ExtraButton4, BTN_EXTRA}, // note: QtWayland maps BTN_BACK
{Qt::ExtraButton5, BTN_SIDE}, // note: QtWayland maps BTN_TASK
{Qt::ExtraButton6, BTN_TASK + 1},
{Qt::ExtraButton7, BTN_TASK + 2},
{Qt::ExtraButton8, BTN_TASK + 3},
{Qt::ExtraButton9, BTN_TASK + 4},
{Qt::ExtraButton10, BTN_TASK + 5},
{Qt::ExtraButton11, BTN_TASK + 6},
{Qt::ExtraButton12, BTN_TASK + 7},
{Qt::ExtraButton13, BTN_TASK + 8}
// further mapping not possible, 0x120 is BTN_JOYSTICK
});
return s_buttons.value(button, 0);
};
bool SeatInterface::isPointerButtonPressed(Qt::MouseButton button) const
{
return isPointerButtonPressed(qtToWaylandButton(button));
}
bool SeatInterface::isPointerButtonPressed(quint32 button) const
{
Q_D();
auto it = d->globalPointer.buttonStates.constFind(button);
if (it == d->globalPointer.buttonStates.constEnd()) {
return false;
}
return it.value() == Private::Pointer::ButtonState::Pressed ? true : false;
}
void SeatInterface::pointerAxis(Qt::Orientation orientation, quint32 delta)
{
Q_D();
if (d->focusedPointer.pointer && d->focusedPointer.surface) {
d->focusedPointer.pointer->axis(orientation, delta);
}
}
void SeatInterface::pointerButtonPressed(Qt::MouseButton button)
{
const quint32 nativeButton = qtToWaylandButton(button);
if (nativeButton == 0) {
return;
}
pointerButtonPressed(nativeButton);
}
void SeatInterface::pointerButtonPressed(quint32 button)
{
Q_D();
const quint32 serial = d->display->nextSerial();
d->updatePointerButtonSerial(button, serial);
d->updatePointerButtonState(button, Private::Pointer::ButtonState::Pressed);
if (d->focusedPointer.pointer && d->focusedPointer.surface) {
d->focusedPointer.pointer->buttonPressed(button, serial);
}
}
void SeatInterface::pointerButtonReleased(Qt::MouseButton button)
{
const quint32 nativeButton = qtToWaylandButton(button);
if (nativeButton == 0) {
return;
}
pointerButtonReleased(nativeButton);
}
void SeatInterface::pointerButtonReleased(quint32 button)
{
Q_D();
const quint32 serial = d->display->nextSerial();
d->updatePointerButtonSerial(button, serial);
d->updatePointerButtonState(button, Private::Pointer::ButtonState::Released);
if (d->focusedPointer.pointer && d->focusedPointer.surface) {
d->focusedPointer.pointer->buttonReleased(button, serial);
}
}
quint32 SeatInterface::pointerButtonSerial(Qt::MouseButton button) const
{
return pointerButtonSerial(qtToWaylandButton(button));
}
quint32 SeatInterface::pointerButtonSerial(quint32 button) const
{
Q_D();
auto it = d->globalPointer.buttonSerials.constFind(button);
if (it == d->globalPointer.buttonSerials.constEnd()) {
return 0;
}
return it.value();
}
}
}
......@@ -73,6 +73,15 @@ public:
PointerInterface *focusedPointer() const;
void setFocusedPointerSurfacePosition(const QPointF &surfacePosition);
QPointF focusedPointerSurfacePosition() const;
void pointerButtonPressed(quint32 button);
void pointerButtonPressed(Qt::MouseButton button);
void pointerButtonReleased(quint32 button);
void pointerButtonReleased(Qt::MouseButton button);
bool isPointerButtonPressed(quint32 button) const;
bool isPointerButtonPressed(Qt::MouseButton button) const;
quint32 pointerButtonSerial(quint32 button) const;
quint32 pointerButtonSerial(Qt::MouseButton button) const;
void pointerAxis(Qt::Orientation orientation, quint32 delta);
static SeatInterface *get(wl_resource *native);
......
......@@ -151,34 +151,26 @@ void CompositorWindow::mousePressEvent(QMouseEvent *event)
}
}
m_seat->setTimestamp(event->timestamp());
if (auto pointer = m_seat->focusedPointer()) {
pointer->buttonPressed(event->button());
}
m_seat->pointerButtonPressed(event->button());
}
void CompositorWindow::mouseReleaseEvent(QMouseEvent *event)
{
QWidget::mouseReleaseEvent(event);
m_seat->setTimestamp(event->timestamp());
if (auto pointer = m_seat->focusedPointer()) {
pointer->buttonReleased(event->button());
}
m_seat->pointerButtonReleased(event->button());
}
void CompositorWindow::wheelEvent(QWheelEvent *event)
{
QWidget::wheelEvent(event);