36#include <linux/input.h>
42static const int s_version = 9;
50 : QtWaylandServer::wl_seat(*display, s_version)
66 if (resource->version() >= WL_SEAT_NAME_SINCE_VERSION) {
67 send_name(resource->handle,
name);
74 pointerPrivate->add(resource->client(),
id, resource->version());
80 keyboardPrivate->add(resource->client(),
id, resource->version());
86 touchPrivate->add(resource->client(),
id, resource->version());
91 wl_resource_destroy(resource->handle);
99 displayPrivate->
seats.append(
this);
106 displayPrivate->
seats.removeOne(
this);
137 if ((*it)->client() == *surface->
client()) {
146 Q_ASSERT(dataDevice->
seat() ==
q);
148 auto dataDeviceCleanup = [
this, dataDevice] {
152 QObject::connect(dataDevice, &QObject::destroyed,
q, dataDeviceCleanup);
154 updateSelection(dataDevice);
156 QObject::connect(dataDevice,
160 q->
startDrag(source, origin, serial, dragIcon);
176 auto list = d->dataDevicesForSurface(surface);
177 if (list.isEmpty()) {
193 Q_ASSERT(dataDevice->
seat() ==
q);
195 auto dataDeviceCleanup = [
this, dataDevice] {
198 QObject::connect(dataDevice, &QObject::destroyed,
q, dataDeviceCleanup);
233 Q_ASSERT(primarySelectionDevice->
seat() ==
q);
236 auto dataDeviceCleanup = [
this, primarySelectionDevice] {
240 QObject::connect(primarySelectionDevice, &QObject::destroyed,
q, dataDeviceCleanup);
242 updatePrimarySelection(primarySelectionDevice);
277 return targetHasDataDevice;
289 if (dragTargetDevice && dragSource->
isAccepted()) {
291 dragTargetDevice->
drop();
299 if (dragTargetDevice) {
321void SeatInterfacePrivate::updatePrimarySelection(PrimarySelectionDeviceV1Interface *primarySelectionDevice)
323 PrimarySelectionSourceV1Interface *selection = primarySelectionDevice->selection();
336 const auto seatResources = resourceMap();
337 for (SeatInterfacePrivate::Resource *resource : seatResources) {
348 d->capabilities |= SeatInterfacePrivate::capability_keyboard;
353 d->sendCapabilities();
363 d->capabilities |= SeatInterfacePrivate::capability_pointer;
368 d->sendCapabilities();
378 d->capabilities |= SeatInterfacePrivate::capability_touch;
383 d->sendCapabilities();
389 if (d->name ==
name) {
394 const auto seatResources = d->resourceMap();
395 for (SeatInterfacePrivate::Resource *resource : seatResources) {
396 if (resource->version() >= WL_SEAT_NAME_SINCE_VERSION) {
397 d->send_name(resource->handle, d->name);
411 return d->capabilities & SeatInterfacePrivate::capability_pointer;
416 return d->capabilities & SeatInterfacePrivate::capability_keyboard;
421 return d->capabilities & SeatInterfacePrivate::capability_touch;
432 return seatPrivate->q;
439 return d->globalPointer.pos;
447 if (d->globalPointer.pos == pos) {
450 d->globalPointer.pos = pos;
454 if (!focusedSurface) {
457 if (d->dragInhibitsPointer(focusedSurface)) {
466 if (!effectiveFocusedSurface) {
467 effectiveFocusedSurface = focusedSurface;
469 if (focusedSurface != effectiveFocusedSurface) {
470 localPosition = focusedSurface->
mapToChild(effectiveFocusedSurface, localPosition);
473 if (d->pointer->focusedSurface() != effectiveFocusedSurface) {
474 d->pointer->sendEnter(effectiveFocusedSurface, localPosition,
display()->nextSerial());
476 d->keyboard->setModifierFocusSurface(effectiveFocusedSurface);
480 d->pointer->sendMotion(localPosition);
490 const auto milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(time);
491 if (d->timestamp == milliseconds) {
494 d->timestamp = milliseconds;
500 const QPointF &globalPosition,
501 const QMatrix4x4 &inputTransformation)
503 if (surface == d->drag.surface) {
507 const quint32 serial = d->display->nextSerial();
508 if (d->drag.target) {
509 d->drag.target->updateDragTarget(
nullptr, serial);
515 d->drag.target = dropTarget;
524 if (d->drag.target) {
525 QMatrix4x4 surfaceInputTransformation = inputTransformation;
527 d->drag.surface = surface;
528 d->drag.transformation = surfaceInputTransformation;
529 if (d->dragInhibitsPointer(surface)) {
532 d->drag.target->updateDragTarget(surface, serial);
534 d->drag.surface =
nullptr;
546 setDragTarget(target, surface, d->globalTouch.focus.firstTouchPos, inputTransformation);
552 return d->globalPointer.focus.surface;
558 m.translate(-surfacePosition.x(), -surfacePosition.y());
560 if (d->globalPointer.focus.surface) {
561 d->globalPointer.focus.offset = surfacePosition;
570 if (d->dragInhibitsPointer(surface)) {
575 const quint32 serial = d->display->nextSerial();
577 if (d->globalPointer.focus.surface) {
578 disconnect(d->globalPointer.focus.destroyConnection);
581 d->globalPointer.focus.surface = surface;
582 d->globalPointer.focus.destroyConnection = connect(surface, &QObject::destroyed,
this, [
this] {
585 d->globalPointer.focus.serial = serial;
586 d->globalPointer.focus.transformation = transformation;
587 d->globalPointer.focus.offset = QPointF();
589 d->globalPointer.pos = position;
592 if (!effectiveFocusedSurface) {
593 effectiveFocusedSurface = surface;
595 if (surface != effectiveFocusedSurface) {
596 localPosition = surface->
mapToChild(effectiveFocusedSurface, localPosition);
598 d->pointer->sendEnter(effectiveFocusedSurface, localPosition, serial);
600 d->keyboard->setModifierFocusSurface(effectiveFocusedSurface);
610 if (d->globalPointer.focus.surface) {
611 disconnect(d->globalPointer.focus.destroyConnection);
615 const quint32 serial = d->display->nextSerial();
616 d->pointer->sendLeave(serial);
618 d->keyboard->setModifierFocusSurface(
nullptr);
624 if (d->globalPointer.focus.surface) {
625 d->globalPointer.focus.offset = surfacePosition;
626 d->globalPointer.focus.transformation = QMatrix4x4();
627 d->globalPointer.focus.transformation.translate(-surfacePosition.x(), -surfacePosition.y());
633 return d->globalPointer.focus.offset;
638 if (d->globalPointer.focus.surface) {
639 d->globalPointer.focus.transformation = transformation;
645 return d->globalPointer.focus.transformation;
650 return d->pointer.get();
653static quint32 qtToWaylandButton(Qt::MouseButton button)
655 static const QHash<Qt::MouseButton, quint32> s_buttons({
656 {Qt::LeftButton, BTN_LEFT},
657 {Qt::RightButton, BTN_RIGHT},
658 {Qt::MiddleButton, BTN_MIDDLE},
659 {Qt::ExtraButton1, BTN_BACK},
660 {Qt::ExtraButton2, BTN_FORWARD},
661 {Qt::ExtraButton3, BTN_TASK},
662 {Qt::ExtraButton4, BTN_EXTRA},
663 {Qt::ExtraButton5, BTN_SIDE},
664 {Qt::ExtraButton6, BTN_TASK + 1},
665 {Qt::ExtraButton7, BTN_TASK + 2},
666 {Qt::ExtraButton8, BTN_TASK + 3},
667 {Qt::ExtraButton9, BTN_TASK + 4},
668 {Qt::ExtraButton10, BTN_TASK + 5},
669 {Qt::ExtraButton11, BTN_TASK + 6},
670 {Qt::ExtraButton12, BTN_TASK + 7},
671 {Qt::ExtraButton13, BTN_TASK + 8}
674 return s_buttons.value(button, 0);
684 auto it = d->globalPointer.buttonStates.constFind(button);
685 if (it == d->globalPointer.buttonStates.constEnd()) {
700 d->pointer->sendAxis(orientation, delta, deltaV120, source, direction);
705 const quint32 nativeButton = qtToWaylandButton(button);
706 if (nativeButton == 0) {
717 const quint32 serial = d->display->nextSerial();
720 d->updatePointerButtonSerial(button, serial);
728 d->updatePointerButtonSerial(button, serial);
731 if (d->drag.dragImplicitGrabSerial != currentButtonSerial) {
735 d->pointer->sendButton(button, state, serial);
741 d->pointer->sendButton(button, state, serial);
749 d->pointer->sendFrame();
759 auto it = d->globalPointer.buttonSerials.constFind(button);
760 if (it == d->globalPointer.buttonSerials.constEnd()) {
773 if (relativePointer) {
774 relativePointer->sendRelativeMotion(delta, deltaNonAccelerated, time);
786 swipeGesture->sendBegin(d->display->nextSerial(), fingerCount);
798 swipeGesture->sendUpdate(delta);
810 swipeGesture->sendEnd(d->display->nextSerial());
822 swipeGesture->sendCancel(d->display->nextSerial());
834 pinchGesture->sendBegin(d->display->nextSerial(), fingerCount);
846 pinchGesture->sendUpdate(delta, scale, rotation);
858 pinchGesture->sendEnd(d->display->nextSerial());
870 pinchGesture->sendCancel(d->display->nextSerial());
882 holdGesture->sendBegin(d->display->nextSerial(), fingerCount);
894 holdGesture->sendEnd(d->display->nextSerial());
906 holdGesture->sendCancel(d->display->nextSerial());
912 return d->globalKeyboard.focus.surface;
922 const quint32 serial = d->display->nextSerial();
924 if (d->globalKeyboard.focus.surface) {
925 disconnect(d->globalKeyboard.focus.destroyConnection);
928 d->globalKeyboard.focus.surface = surface;
930 d->keyboard->setFocusedSurface(surface, serial);
932 if (d->globalKeyboard.focus.surface) {
933 d->globalKeyboard.focus.destroyConnection = connect(surface, &QObject::destroyed,
this, [
this]() {
936 d->globalKeyboard.focus.serial = serial;
938 const QList<DataDeviceInterface *> dataDevices = d->dataDevicesForSurface(surface);
939 d->globalKeyboard.focus.selections = dataDevices;
940 for (
auto dataDevice : dataDevices) {
944 QList<PrimarySelectionDeviceV1Interface *> primarySelectionDevices;
945 for (
auto it = d->primarySelectionDevices.constBegin(); it != d->primarySelectionDevices.constEnd(); ++it) {
946 if ((*it)->client() == *surface->
client()) {
947 primarySelectionDevices << *it;
951 d->globalKeyboard.focus.primarySelections = primarySelectionDevices;
952 for (
auto primaryDataDevice : primarySelectionDevices) {
953 primaryDataDevice->sendSelection(d->currentPrimarySelection);
965 return d->keyboard.get();
973 d->keyboard->sendKey(keyCode, state);
981 d->keyboard->sendModifiers(depressed, latched, locked, group);
989 d->touch->sendCancel();
995 d->globalTouch.ids.clear();
1000 return d->globalTouch.focus.surface;
1005 return d->globalTouch.focus.offset;
1010 return !d->globalTouch.ids.isEmpty();
1015 return d->touch.get();
1020 return d->globalTouch.focus.firstTouchPos;
1035 if (d->globalTouch.focus.surface) {
1036 disconnect(d->globalTouch.focus.destroyConnection);
1039 d->globalTouch.focus.surface = surface;
1042 if (d->globalTouch.focus.surface) {
1043 d->globalTouch.focus.destroyConnection = connect(surface, &QObject::destroyed,
this, [
this]() {
1046 d->touch->sendCancel();
1055 d->globalTouch.focus.offset = surfacePosition;
1056 d->globalTouch.focus.transformation = QMatrix4x4();
1057 d->globalTouch.focus.transformation.translate(-surfacePosition.x(), -surfacePosition.y());
1066 auto pos = globalPosition - d->globalTouch.focus.offset;
1071 }
else if (!effectiveFocusedSurface) {
1074 d->touch->sendDown(
id, serial, pos, effectiveFocusedSurface);
1077 d->globalTouch.focus.firstTouchPos = globalPosition;
1085 d->pointer->sendEnter(effectiveFocusedSurface, pos, serial);
1086 d->pointer->sendMotion(pos);
1087 d->pointer->sendFrame();
1091 d->globalTouch.ids[id] = serial;
1099 auto itTouch = d->globalTouch.ids.constFind(
id);
1100 if (itTouch == d->globalTouch.ids.constEnd()) {
1102 qCWarning(KWIN_CORE) <<
"Detected a touch move that never has been down, discarding";
1106 auto pos = globalPosition - d->globalTouch.focus.offset;
1115 d->touch->sendMotion(
id, pos);
1119 d->globalTouch.focus.firstTouchPos = globalPosition;
1125 d->pointer->sendMotion(pos);
1126 d->pointer->sendFrame();
1130 Q_EMIT
touchMoved(
id, *itTouch, globalPosition);
1139 auto itTouch = d->globalTouch.ids.find(
id);
1140 if (itTouch == d->globalTouch.ids.end()) {
1142 qCWarning(KWIN_CORE) <<
"Detected a touch that never started, discarding";
1145 const qint32 serial = d->display->nextSerial();
1150 d->touch->sendUp(
id, serial);
1158 d->pointer->sendFrame();
1162 d->globalTouch.ids.erase(itTouch);
1170 d->touch->sendFrame();
1175 if (!d->globalTouch.focus.surface) {
1179 return d->globalTouch.ids.key(serial, -1) != -1;
1199 const auto &serials = d->globalPointer.buttonSerials;
1200 for (
auto it = serials.constBegin(), end = serials.constEnd(); it != end; it++) {
1201 if (it.value() == serial) {
1210 return d->drag.transformation;
1215 return d->drag.surface;
1220 return d->drag.source;
1225 if (
auto source = qobject_cast<DataSourceInterface *>(d->drag.source)) {
1226 return source->xdgToplevelDrag();
1233 const quint32 serial = d->display->nextSerial();
1235 if (d->focusedTextInputSurface == surface) {
1239 if (d->focusedTextInputSurface) {
1240 disconnect(d->focusedSurfaceDestroyConnection);
1241 d->textInputV1->d->sendLeave(d->focusedTextInputSurface);
1242 d->textInputV2->d->sendLeave(serial, d->focusedTextInputSurface);
1243 d->textInputV3->d->sendLeave(d->focusedTextInputSurface);
1245 d->focusedTextInputSurface = surface;
1251 d->textInputV1->d->sendEnter(surface);
1252 d->textInputV2->d->sendEnter(surface, serial);
1253 d->textInputV3->d->sendEnter(surface);
1261 return d->focusedTextInputSurface;
1266 return d->textInputV1;
1271 return d->textInputV2;
1276 return d->textInputV3;
1280 return d->currentSelection;
1289 if (d->currentSelection) {
1290 d->currentSelection->cancel();
1291 disconnect(d->currentSelection,
nullptr,
this,
nullptr);
1295 auto cleanup = [
this]() {
1303 for (
auto focussedSelection : std::as_const(d->globalKeyboard.focus.selections)) {
1304 focussedSelection->sendSelection(
selection);
1307 for (
auto control : std::as_const(d->dataControlDevices)) {
1316 return d->currentPrimarySelection;
1321 if (d->currentPrimarySelection ==
selection) {
1324 if (d->currentPrimarySelection) {
1325 d->currentPrimarySelection->cancel();
1326 disconnect(d->currentPrimarySelection,
nullptr,
this,
nullptr);
1330 auto cleanup = [
this]() {
1338 for (
auto focussedSelection : std::as_const(d->globalKeyboard.focus.primarySelections)) {
1339 focussedSelection->sendSelection(
selection);
1341 for (
auto control : std::as_const(d->dataControlDevices)) {
1342 control->sendPrimarySelection(
selection);
1352 d->drag.transformation = d->globalPointer.focus.transformation;
1355 d->drag.transformation = d->globalTouch.focus.transformation;
1361 d->drag.dragImplicitGrabSerial = dragSerial;
1364 d->drag.surface = originSurface;
1374 if (!d->dataDevicesForSurface(originSurface).isEmpty()) {
1375 d->drag.target = d->dataDevicesForSurface(originSurface)[0];
1377 if (d->drag.target) {
1378 if (d->dragInhibitsPointer(originSurface)) {
1381 d->drag.target->updateDragTarget(originSurface,
display()->nextSerial());
1389 return d->drag.dragIcon;
1393#include "moc_seat.cpp"
The AbstractDataSource class abstracts the data that can be transferred to another client.
virtual void dndCancelled()
virtual void dropPerformed()
virtual bool isAccepted() const
void aboutToBeDestroyed()
virtual void updateDragTarget(SurfaceInterface *surface, quint32 serial)=0
wl_client * client() const
DataControlSourceV1Interface * selection() const
void primarySelectionChanged(KWin::DataControlSourceV1Interface *dataSource)
SeatInterface * seat() const
void sendPrimarySelection(AbstractDataSource *other)
void sendSelection(AbstractDataSource *other)
void selectionChanged(KWin::DataControlSourceV1Interface *dataSource)
DataControlSourceV1Interface * primarySelection() const
QStringList mimeTypes() const override
DataDeviceInterface allows clients to share data by copy-and-paste and drag-and-drop.
void selectionChanged(KWin::DataSourceInterface *)
void dragStarted(AbstractDataSource *source, SurfaceInterface *originSurface, quint32 serial, DragAndDropIcon *dragIcon)
SeatInterface * seat() const
DataSourceInterface * selection() const
void sendSelection(KWin::AbstractDataSource *other)
Represents the Resource for the wl_data_source interface.
Class holding the Wayland server display loop.
QList< SeatInterface * > seats
static DisplayPrivate * get(Display *display)
Resource for the wl_keyboard interface.
static KeyboardInterfacePrivate * get(KeyboardInterface *keyboard)
static PointerHoldGestureV1Interface * get(PointerInterface *pointer)
static PointerInterfacePrivate * get(PointerInterface *pointer)
static PointerPinchGestureV1Interface * get(PointerInterface *pointer)
static PointerSwipeGestureV1Interface * get(PointerInterface *pointer)
Represents the Resource for the wl_data_device interface.
void sendSelection(AbstractDataSource *other)
SeatInterface * seat() const
void selectionChanged(KWin::PrimarySelectionSourceV1Interface *)
wl_client * client() const
static RelativePointerV1Interface * get(PointerInterface *pointer)
Represents a Seat on the Wayland Display.
SeatInterface(Display *display, QObject *parent=nullptr)
SurfaceInterface * focusedTextInputSurface() const
void endPointerHoldGesture()
void setFocusedTouchSurface(SurfaceInterface *surface, const QPointF &surfacePosition=QPointF())
quint32 pointerButtonSerial(quint32 button) const
void setHasTouch(bool has)
void setFocusedPointerSurfacePosition(const QPointF &surfacePosition)
void cancelPointerHoldGesture()
Display * display() const
void updatePointerSwipeGesture(const QPointF &delta)
QPointF pointerPos() const
TextInputV1Interface * textInputV1() const
SurfaceInterface * focusedTouchSurface() const
void endPointerPinchGesture()
void setHasKeyboard(bool has)
void setTimestamp(std::chrono::microseconds time)
void focusedKeyboardSurfaceAboutToChange(SurfaceInterface *nextSurface)
void setDragTarget(AbstractDropHandler *dropTarget, SurfaceInterface *surface, const QPointF &globalPosition, const QMatrix4x4 &inputTransformation)
SurfaceInterface * dragSurface() const
void setSelection(AbstractDataSource *selection)
XdgToplevelDragV1Interface * xdgTopleveldrag() const
bool isTouchSequence() const
bool hasImplicitTouchGrab(quint32 serial) const
void notifyKeyboardKey(quint32 keyCode, KeyboardKeyState state)
void notifyPointerMotion(const QPointF &pos)
void touchMoved(qint32 id, quint32 serial, const QPointF &globalPosition)
void setPrimarySelection(AbstractDataSource *selection)
void cancelPointerSwipeGesture()
void dragSurfaceChanged()
void setName(const QString &name)
void focusedTextInputSurfaceChanged()
void startPointerHoldGesture(quint32 fingerCount)
void setHasPointer(bool has)
void notifyTouchMotion(qint32 id, const QPointF &globalPosition)
SurfaceInterface * focusedPointerSurface() const
SurfaceInterface * focusedKeyboardSurface() const
void updatePointerPinchGesture(const QPointF &delta, qreal scale, qreal rotation)
PointerInterface * pointer() const
QPointF focusedPointerSurfacePosition() const
static SeatInterface * get(wl_resource *native)
QPointF firstTouchPointPosition() const
void setFocusedTextInputSurface(SurfaceInterface *surface)
void notifyPointerEnter(SurfaceInterface *surface, const QPointF &position, const QPointF &surfacePosition=QPointF())
TextInputV2Interface * textInputV2() const
void hasTouchChanged(bool)
void setFocusedPointerSurfaceTransformation(const QMatrix4x4 &transformation)
void notifyPointerLeave()
bool isDragPointer() const
bool hasImplicitPointerGrab(quint32 serial) const
bool isPointerButtonPressed(quint32 button) const
void hasKeyboardChanged(bool)
void startPointerPinchGesture(quint32 fingerCount)
std::chrono::milliseconds timestamp() const
void endPointerSwipeGesture()
void selectionChanged(KWin::AbstractDataSource *)
void primarySelectionChanged(KWin::AbstractDataSource *)
AbstractDropHandler * dropHandlerForSurface(SurfaceInterface *surface) const
void pointerPosChanged(const QPointF &pos)
void notifyPointerAxis(Qt::Orientation orientation, qreal delta, qint32 deltaV120, PointerAxisSource source, PointerAxisRelativeDirection direction=PointerAxisRelativeDirection::Normal)
KeyboardInterface * keyboard() const
void notifyKeyboardModifiers(quint32 depressed, quint32 latched, quint32 locked, quint32 group)
TouchInterface * touch() const
QPointF focusedTouchSurfacePosition() const
void notifyPointerFrame()
void startPointerSwipeGesture(quint32 fingerCount)
void notifyTouchUp(qint32 id)
void startDrag(AbstractDataSource *source, SurfaceInterface *sourceSurface, int dragSerial=-1, DragAndDropIcon *dragIcon=nullptr)
void relativePointerMotion(const QPointF &delta, const QPointF &deltaNonAccelerated, std::chrono::microseconds timestamp)
AbstractDataSource * selection() const
QMatrix4x4 dragSurfaceTransformation() const
void setFocusedTouchSurfacePosition(const QPointF &surfacePosition)
void nameChanged(const QString &)
QMatrix4x4 focusedPointerSurfaceTransformation() const
void hasPointerChanged(bool)
AbstractDataSource * primarySelection() const
void notifyPointerButton(quint32 button, PointerButtonState state)
void setFocusedKeyboardSurface(SurfaceInterface *surface)
DragAndDropIcon * dragIcon() const
void cancelPointerPinchGesture()
TextInputV3Interface * textInputV3() const
AbstractDataSource * dragSource() const
void notifyTouchDown(qint32 id, const QPointF &globalPosition)
void seat_release(Resource *resource) override
void registerPrimarySelectionDevice(PrimarySelectionDeviceV1Interface *primarySelectionDevice)
void registerDataControlDevice(DataControlDeviceV1Interface *dataDevice)
bool dragInhibitsPointer(SurfaceInterface *surface) const
void seat_get_keyboard(Resource *resource, uint32_t id) override
void seat_get_touch(Resource *resource, uint32_t id) override
void updatePointerButtonSerial(quint32 button, quint32 serial)
SeatInterfacePrivate(SeatInterface *q, Display *display)
void seat_bind_resource(Resource *resource) override
static KWIN_EXPORT SeatInterfacePrivate * get(SeatInterface *seat)
void registerDataDevice(DataDeviceInterface *dataDevice)
std::unique_ptr< PointerInterface > pointer
QList< DataDeviceInterface * > dataDevicesForSurface(SurfaceInterface *surface) const
void seat_get_pointer(Resource *resource, uint32_t id) override
void updatePointerButtonState(quint32 button, Pointer::State state)
std::unique_ptr< TouchInterface > touch
AbstractDataSource * currentSelection
QList< DataControlDeviceV1Interface * > dataControlDevices
QList< PrimarySelectionDeviceV1Interface * > primarySelectionDevices
QPointer< TextInputV3Interface > textInputV3
QList< DataDeviceInterface * > dataDevices
QPointer< TextInputV2Interface > textInputV2
AbstractDataSource * currentPrimarySelection
QPointer< TextInputV1Interface > textInputV1
std::unique_ptr< KeyboardInterface > keyboard
Resource representing a wl_surface.
ClientConnection * client() const
void aboutToBeDestroyed()
QPointF mapToChild(SurfaceInterface *child, const QPointF &point) const
LockedPointerV1Interface * lockedPointer() const
qreal scaleOverride() const
SurfaceInterface * inputSurfaceAt(const QPointF &position)
Represents a generic Resource for a text input object.
Represents a generic Resource for a text input object.
Represents a generic Resource for a text input object.A TextInputV3Interface gets created by the Text...
static TouchInterfacePrivate * get(TouchInterface *touch)
bool hasTouchesForClient(ClientConnection *client) const
PointerAxisRelativeDirection
QMetaObject::Connection dragSourceDestroyConnection
QPointer< AbstractDropHandler > target
AbstractDataSource * source
QList< PrimarySelectionDeviceV1Interface * > primarySelections
SurfaceInterface * surface
QList< DataDeviceInterface * > selections
QHash< quint32, State > buttonStates
QHash< quint32, quint32 > buttonSerials