130 lines
4.0 KiB
C++
Raw Normal View History

2024-06-29 11:52:32 +06:00
/*
Gwenview: an image viewer
Copyright 2019 Steffen Hartleib <steffenhartleib@t-online.de>
Copyright 2022 Carl Schwan <carlschwan@kde.org>
Copyright 2022 Bharadwaj Raju <bharadwaj.raju777@protonmail.com>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Cambridge, MA 02110-1301, USA.
*/
#include "qwayland-pointer-gestures-unstable-v1.h"
#include <QGuiApplication>
#include <QtWaylandClient/qwaylandclientextension.h>
#include <qnamespace.h>
#include <qpa/qplatformnativeinterface.h>
#include <wayland-util.h>
#include "wayland-pointer-gestures-unstable-v1-client-protocol.h"
#include "waylandgestures.h"
using namespace Gwenview;
class PointerGestures : public QWaylandClientExtensionTemplate<PointerGestures>, public QtWayland::zwp_pointer_gestures_v1
{
public:
PointerGestures()
: QWaylandClientExtensionTemplate<PointerGestures>(3)
{
}
};
class PinchGesture : public QObject, public QtWayland::zwp_pointer_gesture_pinch_v1
{
Q_OBJECT
public:
public:
PinchGesture(struct ::zwp_pointer_gesture_pinch_v1 *object, QObject *parent)
: QObject(parent)
, zwp_pointer_gesture_pinch_v1(object)
{
}
Q_SIGNALS:
void gestureBegin(uint32_t serial, uint32_t time, uint32_t fingers);
void gestureUpdate(uint32_t time, wl_fixed_t dx, wl_fixed_t dy, wl_fixed_t scale, wl_fixed_t rotation);
void gestureEnd(uint32_t serial, uint32_t time, int32_t cancelled);
private:
virtual void zwp_pointer_gesture_pinch_v1_begin(uint32_t serial, uint32_t time, struct ::wl_surface *surface, uint32_t fingers) override
{
Q_UNUSED(surface);
Q_EMIT gestureBegin(serial, time, fingers);
}
virtual void zwp_pointer_gesture_pinch_v1_update(uint32_t time, wl_fixed_t dx, wl_fixed_t dy, wl_fixed_t scale, wl_fixed_t rotation) override
{
Q_EMIT gestureUpdate(time, dx, dy, scale, rotation);
}
virtual void zwp_pointer_gesture_pinch_v1_end(uint32_t serial, uint32_t time, int32_t cancelled) override
{
Q_EMIT gestureEnd(serial, time, cancelled);
}
};
WaylandGestures::WaylandGestures(QObject *parent)
: QObject(parent)
{
m_startZoom = 1.0;
m_zoomModifier = 1.0;
m_pointerGestures = new PointerGestures();
connect(m_pointerGestures, &PointerGestures::activeChanged, this, [this]() {
init();
});
}
WaylandGestures::~WaylandGestures()
{
if (m_pointerGestures) {
m_pointerGestures->release();
}
if (m_pinchGesture) {
m_pinchGesture->destroy();
}
}
void WaylandGestures::setStartZoom(double startZoom)
{
m_startZoom = startZoom;
}
void WaylandGestures::init()
{
QPlatformNativeInterface *native = qGuiApp->platformNativeInterface();
if (!native) {
return;
}
const auto pointer = reinterpret_cast<wl_pointer *>(native->nativeResourceForIntegration(QByteArrayLiteral("wl_pointer")));
if (!pointer) {
return;
}
m_pinchGesture = new PinchGesture(m_pointerGestures->get_pinch_gesture(pointer), this);
connect(m_pinchGesture, &PinchGesture::gestureBegin, this, [this]() {
Q_EMIT pinchGestureStarted();
});
connect(m_pinchGesture, &PinchGesture::gestureUpdate, this, [this](uint32_t time, wl_fixed_t dx, wl_fixed_t dy, wl_fixed_t scale, wl_fixed_t rotation) {
Q_EMIT pinchZoomChanged(m_startZoom * wl_fixed_to_double(scale) * m_zoomModifier);
});
}
#include "waylandgestures.moc"
#include "moc_waylandgestures.cpp"