mirror of
https://invent.kde.org/network/kdeconnect-kde.git
synced 2025-12-22 12:14:23 +01:00
app: make it possible to lock the mouse when using the remote input
It makes it possible to use normal touchpads and mice
This commit is contained in:
committed by
Aleix Pol Gonzalez
parent
55b946f825
commit
cf8ada2b5d
72
declarativeplugin/pointerlocker.cpp
Normal file
72
declarativeplugin/pointerlocker.cpp
Normal file
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
SPDX-FileCopyrightText: 2018 Roman Gilg <subdiff@gmail.com>
|
||||
SPDX-FileCopyrightText: 2021 Aleix Pol Gonzalez <aleixpol@kde.org>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||
*/
|
||||
|
||||
#include "pointerlocker.h"
|
||||
|
||||
#include <QGuiApplication>
|
||||
#include <QQmlContext>
|
||||
#include <QQmlEngine>
|
||||
#include <QCursor>
|
||||
|
||||
#include <QDebug>
|
||||
#include <QScopedPointer>
|
||||
|
||||
void AbstractPointerLocker::setWindow(QWindow* window)
|
||||
{
|
||||
if (m_window == window) {
|
||||
return;
|
||||
}
|
||||
m_window = window;
|
||||
Q_EMIT windowChanged();
|
||||
}
|
||||
|
||||
PointerLockerQt::PointerLockerQt(QObject *parent)
|
||||
: AbstractPointerLocker(parent)
|
||||
{
|
||||
}
|
||||
|
||||
PointerLockerQt::~PointerLockerQt() = default;
|
||||
|
||||
void PointerLockerQt::setLocked(bool lock)
|
||||
{
|
||||
if (isLocked() == lock) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (lock) {
|
||||
/* Cursor needs to be hidden such that Xwayland emulates warps. */
|
||||
QGuiApplication::setOverrideCursor(QCursor(Qt::BlankCursor));
|
||||
m_originalPosition = QCursor::pos();
|
||||
m_window->installEventFilter(this);
|
||||
Q_EMIT lockedChanged(true);
|
||||
Q_EMIT lockEffectiveChanged(true);
|
||||
} else {
|
||||
m_window->removeEventFilter(this);
|
||||
QGuiApplication::restoreOverrideCursor();
|
||||
Q_EMIT lockedChanged(false);
|
||||
Q_EMIT lockEffectiveChanged(false);
|
||||
}
|
||||
}
|
||||
|
||||
bool PointerLockerQt::isLocked() const
|
||||
{
|
||||
return !m_originalPosition.isNull();
|
||||
}
|
||||
|
||||
bool PointerLockerQt::eventFilter(QObject *watched, QEvent *event)
|
||||
{
|
||||
if (watched != m_window || event->type() != QEvent::MouseMove || !isLocked()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const auto newPos = QCursor::pos();
|
||||
const QPointF dist = newPos - m_originalPosition;
|
||||
Q_EMIT pointerMoved({ dist.x(), dist.y() });
|
||||
QCursor::setPos(m_originalPosition);
|
||||
|
||||
return true;
|
||||
}
|
||||
Reference in New Issue
Block a user