31 return pointer->d.get();
50 return resourceMap().values(client->
client());
61 qCDebug(KWIN_CORE,
"Denied set_cursor request from unfocused client");
68 if (surface_resource) {
71 wl_resource_post_error(resource->handle, WL_DISPLAY_ERROR_INVALID_OBJECT,
"invalid surface");
75 static SurfaceRole cursorRole(QByteArrayLiteral(
"cursor"));
77 if (role != &cursorRole) {
78 wl_resource_post_error(resource->handle, error_role,
"the wl_surface already has a role assigned %s", role->name().constData());
87 cursor = std::make_unique<PointerSurfaceCursor>();
90 cursor->d->surface = surface;
97 wl_resource_destroy(resource->handle);
104 if (focusedClient && focusedClient->
client() == resource->client()) {
107 if (resource->version() >= WL_POINTER_FRAME_SINCE_VERSION) {
108 send_frame(resource->handle);
116 for (Resource *resource : pointerResources) {
124 for (Resource *resource : pointerResources) {
125 send_enter(resource->handle, serial,
focusedSurface->
resource(), wl_fixed_from_double(position.x()), wl_fixed_from_double(position.y()));
132 for (Resource *resource : pointerResources) {
133 if (resource->version() >= WL_POINTER_FRAME_SINCE_VERSION) {
134 send_frame(resource->handle);
141 if (newTimestamp.count() -
timestamp.count() >= 1000) {
160 return d->focusedSurface;
165 return d->focusedSerial;
170 if (d->focusedSurface == surface) {
174 if (d->focusedSurface) {
175 d->sendLeave(serial);
176 if (d->focusedSurface->client() != surface->
client()) {
179 disconnect(d->destroyConnection);
182 d->focusedSurface = surface;
183 d->focusedSerial = serial;
185 d->sendLeave(d->seat->display()->nextSerial());
187 d->focusedSurface = nullptr;
188 Q_EMIT focusedSurfaceChanged();
191 d->sendEnter(d->focusedSurface->toSurfaceLocal(position), serial);
193 d->lastPosition = position;
195 Q_EMIT focusedSurfaceChanged();
200 if (!d->focusedSurface) {
204 d->sendLeave(serial);
207 d->focusedSurface =
nullptr;
208 disconnect(d->destroyConnection);
210 Q_EMIT focusedSurfaceChanged();
215 if (!d->focusedSurface) {
219 const auto pointerResources = d->pointersForClient(d->focusedSurface->client());
220 for (PointerInterfacePrivate::Resource *resource : pointerResources) {
221 d->send_button(resource->handle, serial, d->seat->timestamp().count(), button, quint32(state));
225static void updateAccumulators(Qt::Orientation orientation, qreal delta, qint32 deltaV120,
PointerInterfacePrivate *d, qint32 &valueAxisLowRes, qint32 &valueDiscrete)
227 const int newDirection = deltaV120 > 0 ? 1 : -1;
235 accum.direction = newDirection;
238 accum.axis120 += deltaV120;
241 if (std::abs(accum.axis120) >= 60) {
242 const int steps = accum.axis120 / 120;
243 valueDiscrete += steps;
245 valueDiscrete += accum.direction;
248 accum.axis120 -= valueDiscrete * 120;
253 valueAxisLowRes = accum.axis;
264 qint32 valueAxisLowRes = 0;
265 qint32 valueDiscrete = 0;
268 updateAccumulators(orientation, delta, deltaV120, d.
get(),
269 valueAxisLowRes, valueDiscrete);
271 valueAxisLowRes = delta;
275 for (PointerInterfacePrivate::Resource *resource : pointerResources) {
276 const quint32
version = resource->version();
280 if (
version < WL_POINTER_AXIS_VALUE120_SINCE_VERSION && deltaV120 && !valueDiscrete) {
285 PointerInterfacePrivate::axis_source wlSource;
288 wlSource = PointerInterfacePrivate::axis_source_wheel;
291 wlSource = PointerInterfacePrivate::axis_source_finger;
294 wlSource = PointerInterfacePrivate::axis_source_continuous;
297 wlSource = PointerInterfacePrivate::axis_source_wheel_tilt;
303 d->send_axis_source(resource->handle, wlSource);
306 const auto wlOrientation =
307 (orientation == Qt::Vertical) ? PointerInterfacePrivate::axis_vertical_scroll : PointerInterfacePrivate::axis_horizontal_scroll;
310 if (
version >= WL_POINTER_AXIS_RELATIVE_DIRECTION_SINCE_VERSION) {
311 auto wlRelativeDirection = direction ==
PointerAxisRelativeDirection::Normal ? PointerInterfacePrivate::axis_relative_direction_identical : PointerInterfacePrivate::axis_relative_direction_inverted;
313 d->send_axis_relative_direction(resource->handle, wlOrientation, wlRelativeDirection);
316 if (
version >= WL_POINTER_AXIS_VALUE120_SINCE_VERSION) {
318 d->send_axis_value120(resource->handle, wlOrientation, deltaV120);
319 d->send_axis(resource->handle, d->
seat->
timestamp().count(), wlOrientation,
320 wl_fixed_from_double(delta));
322 if (
version >= WL_POINTER_AXIS_DISCRETE_SINCE_VERSION && valueDiscrete) {
324 d->send_axis_discrete(resource->handle, wlOrientation,
328 d->send_axis(resource->handle, d->
seat->
timestamp().count(), wlOrientation,
329 wl_fixed_from_double(valueAxisLowRes));
333 d->send_axis(resource->handle, d->
seat->
timestamp().count(), wlOrientation,
334 wl_fixed_from_double(delta));
336 }
else if (
version >= WL_POINTER_AXIS_STOP_SINCE_VERSION) {
337 d->send_axis_stop(resource->handle, d->
seat->
timestamp().count(), wlOrientation);
353 for (PointerInterfacePrivate::Resource *resource : pointerResources) {
354 d->send_motion(resource->handle, d->
seat->
timestamp().count(), wl_fixed_from_double(localPos.x()), wl_fixed_from_double(localPos.y()));
373 return pointerPrivate->q;
399#include "moc_pointer.cpp"
Convenient Class which represents a wl_client.
wl_client * client() const
qreal scaleOverride() const
quint32 focusedSerial() const
void sendButton(quint32 button, PointerButtonState state, quint32 serial)
SeatInterface * seat() const
void sendLeave(quint32 serial)
void sendAxis(Qt::Orientation orientation, qreal delta, qint32 deltaV120, PointerAxisSource source, PointerAxisRelativeDirection direction)
~PointerInterface() override
SurfaceInterface * focusedSurface() const
void cursorChanged(const PointerCursor &cursor)
void sendEnter(SurfaceInterface *surface, const QPointF &position, quint32 serial)
void sendMotion(const QPointF &position)
static PointerInterface * get(wl_resource *native)
SurfaceInterface * focusedSurface
void sendLeave(quint32 serial)
std::unique_ptr< PointerSurfaceCursor > cursor
void pointer_set_cursor(Resource *resource, uint32_t serial, ::wl_resource *surface_resource, int32_t hotspot_x, int32_t hotspot_y) override
QList< Resource * > pointersForClient(ClientConnection *client) const
void pointer_bind_resource(Resource *resource) override
AxisAccumulator axisAccumulator
void pointer_release(Resource *resource) override
void sendEnter(const QPointF &parentSurfacePosition, quint32 serial)
PointerInterfacePrivate(PointerInterface *q, SeatInterface *seat)
~PointerInterfacePrivate() override
static PointerInterfacePrivate * get(PointerInterface *pointer)
SurfaceInterface * surface() const
QPointer< SurfaceInterface > surface
Represents a Seat on the Wayland Display.
Display * display() const
std::chrono::milliseconds timestamp() const
Resource representing a wl_surface.
ClientConnection * client() const
static SurfaceInterface * get(wl_resource *native)
void aboutToBeDestroyed()
QPoint toSurfaceLocal(const QPoint &point) const
SurfaceRole * role() const
wl_resource * resource() const
void setRole(SurfaceRole *role)
PointerAxisRelativeDirection
bool shouldReset(int newDirection, std::chrono::milliseconds newTimestamp) const
std::chrono::milliseconds timestamp