kwin/src/wayland/pointergestures_v1_interface.cpp

326 lines
10 KiB
C++

/*
SPDX-FileCopyrightText: 2016 Martin Gräßlin <mgraesslin@kde.org>
SPDX-FileCopyrightText: 2020 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#include "pointergestures_v1_interface.h"
#include "clientconnection.h"
#include "display.h"
#include "pointer_interface_p.h"
#include "pointergestures_v1_interface_p.h"
#include "seat_interface.h"
#include "surface_interface.h"
namespace KWaylandServer
{
static const int s_version = 3;
PointerGesturesV1InterfacePrivate::PointerGesturesV1InterfacePrivate(Display *display)
: QtWaylandServer::zwp_pointer_gestures_v1(*display, s_version)
{
}
void PointerGesturesV1InterfacePrivate::zwp_pointer_gestures_v1_get_swipe_gesture(Resource *resource, uint32_t id, struct ::wl_resource *pointer_resource)
{
PointerInterface *pointer = PointerInterface::get(pointer_resource);
if (!pointer) {
wl_resource_post_error(resource->handle, WL_DISPLAY_ERROR_INVALID_OBJECT, "invalid pointer");
return;
}
PointerSwipeGestureV1Interface *swipeGesture = PointerSwipeGestureV1Interface::get(pointer);
swipeGesture->add(resource->client(), id, resource->version());
}
void PointerGesturesV1InterfacePrivate::zwp_pointer_gestures_v1_get_pinch_gesture(Resource *resource, uint32_t id, struct ::wl_resource *pointer_resource)
{
PointerInterface *pointer = PointerInterface::get(pointer_resource);
if (!pointer) {
wl_resource_post_error(resource->handle, WL_DISPLAY_ERROR_INVALID_OBJECT, "invalid pointer");
return;
}
PointerPinchGestureV1Interface *pinchGesture = PointerPinchGestureV1Interface::get(pointer);
pinchGesture->add(resource->client(), id, resource->version());
}
void PointerGesturesV1InterfacePrivate::zwp_pointer_gestures_v1_get_hold_gesture(Resource *resource, uint32_t id, struct ::wl_resource *pointer_resource)
{
PointerInterface *pointer = PointerInterface::get(pointer_resource);
if (!pointer) {
wl_resource_post_error(resource->handle, WL_DISPLAY_ERROR_INVALID_OBJECT,
"invalid pointer");
return;
}
PointerHoldGestureV1Interface *holdGesture = PointerHoldGestureV1Interface::get(pointer);
holdGesture->add(resource->client(), id, resource->version());
}
void PointerGesturesV1InterfacePrivate::zwp_pointer_gestures_v1_release(Resource *resource)
{
wl_resource_destroy(resource->handle);
}
PointerGesturesV1Interface::PointerGesturesV1Interface(Display *display, QObject *parent)
: QObject(parent)
, d(new PointerGesturesV1InterfacePrivate(display))
{
}
PointerGesturesV1Interface::~PointerGesturesV1Interface()
{
}
PointerSwipeGestureV1Interface::PointerSwipeGestureV1Interface(PointerInterface *pointer)
: pointer(pointer)
{
}
PointerSwipeGestureV1Interface *PointerSwipeGestureV1Interface::get(PointerInterface *pointer)
{
if (pointer) {
PointerInterfacePrivate *pointerPrivate = PointerInterfacePrivate::get(pointer);
return pointerPrivate->swipeGesturesV1.get();
}
return nullptr;
}
void PointerSwipeGestureV1Interface::zwp_pointer_gesture_swipe_v1_destroy(Resource *resource)
{
wl_resource_destroy(resource->handle);
}
void PointerSwipeGestureV1Interface::sendBegin(quint32 serial, quint32 fingerCount)
{
if (focusedClient) {
return;
}
if (!pointer->focusedSurface()) {
return;
}
const SurfaceInterface *focusedSurface = pointer->focusedSurface();
focusedClient = focusedSurface->client();
SeatInterface *seat = pointer->seat();
const QList<Resource *> swipeResources = resourceMap().values(focusedClient->client());
for (Resource *swipeResource : swipeResources) {
send_begin(swipeResource->handle, serial, seat->timestamp(), focusedSurface->resource(), fingerCount);
}
}
void PointerSwipeGestureV1Interface::sendUpdate(const QSizeF &delta)
{
if (!focusedClient) {
return;
}
SeatInterface *seat = pointer->seat();
const QList<Resource *> swipeResources = resourceMap().values(focusedClient->client());
for (Resource *swipeResource : swipeResources) {
send_update(swipeResource->handle, seat->timestamp(), wl_fixed_from_double(delta.width()), wl_fixed_from_double(delta.height()));
}
}
void PointerSwipeGestureV1Interface::sendEnd(quint32 serial)
{
if (!focusedClient) {
return;
}
SeatInterface *seat = pointer->seat();
const QList<Resource *> swipeResources = resourceMap().values(focusedClient->client());
for (Resource *swipeResource : swipeResources) {
send_end(swipeResource->handle, serial, seat->timestamp(), false);
}
// The gesture session has been just finished, reset the cached focused client.
focusedClient = nullptr;
}
void PointerSwipeGestureV1Interface::sendCancel(quint32 serial)
{
if (!focusedClient) {
return;
}
SeatInterface *seat = pointer->seat();
const QList<Resource *> swipeResources = resourceMap().values(focusedClient->client());
for (Resource *swipeResource : swipeResources) {
send_end(swipeResource->handle, serial, seat->timestamp(), true);
}
// The gesture session has been just finished, reset the cached focused client.
focusedClient = nullptr;
}
PointerPinchGestureV1Interface::PointerPinchGestureV1Interface(PointerInterface *pointer)
: pointer(pointer)
{
}
PointerPinchGestureV1Interface *PointerPinchGestureV1Interface::get(PointerInterface *pointer)
{
if (pointer) {
PointerInterfacePrivate *pointerPrivate = PointerInterfacePrivate::get(pointer);
return pointerPrivate->pinchGesturesV1.get();
}
return nullptr;
}
void PointerPinchGestureV1Interface::zwp_pointer_gesture_pinch_v1_destroy(Resource *resource)
{
wl_resource_destroy(resource->handle);
}
void PointerPinchGestureV1Interface::sendBegin(quint32 serial, quint32 fingerCount)
{
if (focusedClient) {
return; // gesture is already active
}
if (!pointer->focusedSurface()) {
return;
}
const SurfaceInterface *focusedSurface = pointer->focusedSurface();
focusedClient = focusedSurface->client();
SeatInterface *seat = pointer->seat();
const QList<Resource *> pinchResources = resourceMap().values(*focusedClient);
for (Resource *pinchResource : pinchResources) {
send_begin(pinchResource->handle, serial, seat->timestamp(), focusedSurface->resource(), fingerCount);
}
}
void PointerPinchGestureV1Interface::sendUpdate(const QSizeF &delta, qreal scale, qreal rotation)
{
if (!focusedClient) {
return;
}
SeatInterface *seat = pointer->seat();
const QList<Resource *> pinchResources = resourceMap().values(*focusedClient);
for (Resource *pinchResource : pinchResources) {
send_update(pinchResource->handle,
seat->timestamp(),
wl_fixed_from_double(delta.width()),
wl_fixed_from_double(delta.height()),
wl_fixed_from_double(scale),
wl_fixed_from_double(rotation));
}
}
void PointerPinchGestureV1Interface::sendEnd(quint32 serial)
{
if (!focusedClient) {
return;
}
SeatInterface *seat = pointer->seat();
const QList<Resource *> pinchResources = resourceMap().values(*focusedClient);
for (Resource *pinchResource : pinchResources) {
send_end(pinchResource->handle, serial, seat->timestamp(), false);
}
// The gesture session has been just finished, reset the cached focused client.
focusedClient = nullptr;
}
void PointerPinchGestureV1Interface::sendCancel(quint32 serial)
{
if (!focusedClient) {
return;
}
SeatInterface *seat = pointer->seat();
const QList<Resource *> pinchResources = resourceMap().values(*focusedClient);
for (Resource *pinchResource : pinchResources) {
send_end(pinchResource->handle, serial, seat->timestamp(), true);
}
// The gesture session has been just finished, reset the cached focused client.
focusedClient = nullptr;
}
PointerHoldGestureV1Interface::PointerHoldGestureV1Interface(PointerInterface *pointer)
: pointer(pointer)
{
}
PointerHoldGestureV1Interface *PointerHoldGestureV1Interface::get(PointerInterface *pointer)
{
if (pointer) {
PointerInterfacePrivate *pointerPrivate = PointerInterfacePrivate::get(pointer);
return pointerPrivate->holdGesturesV1.get();
}
return nullptr;
}
void PointerHoldGestureV1Interface::zwp_pointer_gesture_hold_v1_destroy(Resource *resource)
{
wl_resource_destroy(resource->handle);
}
void PointerHoldGestureV1Interface::sendBegin(quint32 serial, quint32 fingerCount)
{
if (focusedClient) {
return; // gesture is already active
}
if (!pointer->focusedSurface()) {
return;
}
const SurfaceInterface *focusedSurface = pointer->focusedSurface();
focusedClient = focusedSurface->client();
SeatInterface *seat = pointer->seat();
const QList<Resource *> holdResources = resourceMap().values(*focusedClient);
for (Resource *holdResource : holdResources) {
send_begin(holdResource->handle, serial, seat->timestamp(), focusedSurface->resource(), fingerCount);
}
}
void PointerHoldGestureV1Interface::sendEnd(quint32 serial)
{
if (!focusedClient) {
return;
}
SeatInterface *seat = pointer->seat();
const QList<Resource *> holdResources = resourceMap().values(*focusedClient);
for (Resource *holdResource : holdResources) {
send_end(holdResource->handle, serial, seat->timestamp(), false);
}
// The gesture session has been just finished, reset the cached focused client.
focusedClient = nullptr;
}
void PointerHoldGestureV1Interface::sendCancel(quint32 serial)
{
if (!focusedClient) {
return;
}
SeatInterface *seat = pointer->seat();
const QList<Resource *> holdResources = resourceMap().values(*focusedClient);
for (Resource *holdResource : holdResources) {
send_end(holdResource->handle, serial, seat->timestamp(), true);
}
// The gesture session has been just finished, reset the cached focused client.
focusedClient = nullptr;
}
} // namespace KWaylandServer