File indexing completed on 2024-11-10 04:57:44

0001 /*
0002     KWin - the KDE window manager
0003     This file is part of the KDE project.
0004 
0005     SPDX-FileCopyrightText: 2015 Martin Gräßlin <mgraesslin@kde.org>
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 #include "dpmsinputeventfilter.h"
0010 #include "core/output.h"
0011 #include "core/outputbackend.h"
0012 #include "core/session.h"
0013 #include "input_event.h"
0014 #include "main.h"
0015 #include "wayland/seat.h"
0016 #include "wayland_server.h"
0017 #include "workspace.h"
0018 
0019 #include <QGuiApplication>
0020 #include <QKeyEvent>
0021 
0022 namespace KWin
0023 {
0024 
0025 DpmsInputEventFilter::DpmsInputEventFilter()
0026     : InputEventFilter()
0027 {
0028     KSharedConfig::Ptr kwinSettings = kwinApp()->config();
0029     m_enableDoubleTap = kwinSettings->group(QStringLiteral("Wayland")).readEntry<bool>("DoubleTapWakeup", true);
0030     if (Session *session = kwinApp()->outputBackend()->session()) {
0031         connect(session, &Session::awoke, this, &DpmsInputEventFilter::notify);
0032     }
0033 }
0034 
0035 DpmsInputEventFilter::~DpmsInputEventFilter()
0036 {
0037     notify();
0038 }
0039 
0040 bool DpmsInputEventFilter::pointerEvent(MouseEvent *event, quint32 nativeButton)
0041 {
0042     notify();
0043     return true;
0044 }
0045 
0046 bool DpmsInputEventFilter::wheelEvent(WheelEvent *event)
0047 {
0048     notify();
0049     return true;
0050 }
0051 
0052 bool DpmsInputEventFilter::keyEvent(KeyEvent *event)
0053 {
0054     if (event->type() == QKeyEvent::KeyPress) {
0055         notify();
0056     } else if (event->type() == QKeyEvent::KeyRelease) {
0057         return false;
0058     }
0059     return true;
0060 }
0061 
0062 bool DpmsInputEventFilter::touchDown(qint32 id, const QPointF &pos, std::chrono::microseconds time)
0063 {
0064     if (m_enableDoubleTap) {
0065         if (m_touchPoints.isEmpty()) {
0066             if (!m_doubleTapTimer.isValid()) {
0067                 // this is the first tap
0068                 m_doubleTapTimer.start();
0069             } else {
0070                 if (m_doubleTapTimer.elapsed() < qApp->doubleClickInterval()) {
0071                     m_secondTap = true;
0072                 } else {
0073                     // took too long. Let's consider it a new click
0074                     m_doubleTapTimer.restart();
0075                 }
0076             }
0077         } else {
0078             // not a double tap
0079             m_doubleTapTimer.invalidate();
0080             m_secondTap = false;
0081         }
0082         m_touchPoints << id;
0083     }
0084     return true;
0085 }
0086 
0087 bool DpmsInputEventFilter::touchUp(qint32 id, std::chrono::microseconds time)
0088 {
0089     if (m_enableDoubleTap) {
0090         m_touchPoints.removeAll(id);
0091         if (m_touchPoints.isEmpty() && m_doubleTapTimer.isValid() && m_secondTap) {
0092             if (m_doubleTapTimer.elapsed() < qApp->doubleClickInterval()) {
0093                 waylandServer()->seat()->setTimestamp(std::chrono::duration_cast<std::chrono::milliseconds>(time));
0094                 notify();
0095             }
0096             m_doubleTapTimer.invalidate();
0097             m_secondTap = false;
0098         }
0099     }
0100     return true;
0101 }
0102 
0103 bool DpmsInputEventFilter::touchMotion(qint32 id, const QPointF &pos, std::chrono::microseconds time)
0104 {
0105     // ignore the event
0106     return true;
0107 }
0108 
0109 void DpmsInputEventFilter::notify()
0110 {
0111     const QList<Output *> outputs = workspace()->outputs();
0112     for (Output *output : outputs) {
0113         output->setDpmsMode(Output::DpmsMode::On);
0114     }
0115 }
0116 
0117 }
0118 #include "moc_dpmsinputeventfilter.cpp"