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