shift-shell/components/hapticsplugin/vibrationmanager.cpp
Devin Lin cd7dd7c8e5 Guard coroutine calls
Fixes https://invent.kde.org/plasma/plasma-mobile/-/issues/480

This ensures that coroutines are properly guarded against object
deletion.
2026-01-13 09:41:08 -05:00

42 lines
1.2 KiB
C++

// SPDX-FileCopyrightText: 2023-2025 Devin Lin <devin@kde.org>
// SPDX-License-Identifier: GPL-2.0-or-later
#include "vibrationmanager.h"
#include <QPointer>
VibrationManager::VibrationManager(QObject *parent)
: QObject{parent}
{
qDBusRegisterMetaType<VibrationEvent>();
qDBusRegisterMetaType<VibrationEventList>();
}
QCoro::Task<void> VibrationManager::vibrateTask(int durationMs)
{
// Only create interface when needed.
if (!m_interface) {
const auto objectPath = QStringLiteral("/org/sigxcpu/Feedback");
m_interface = new OrgSigxcpuFeedbackHapticInterface("org.sigxcpu.Feedback", objectPath, QDBusConnection::sessionBus(), this);
}
const QString appId = QStringLiteral("org.kde.plasmashell");
const VibrationEvent event{1.0, static_cast<quint32>(durationMs)};
const VibrationEventList pattern = {event};
QPointer<VibrationManager> guard(this);
QDBusPendingReply<bool> reply = co_await m_interface->Vibrate(appId, pattern);
if (!guard) {
co_return;
}
if (!reply.isValid() || !reply.value()) {
qWarning() << "feedbackd vibration failed";
}
}
QCoro::QmlTask VibrationManager::vibrate(int durationMs)
{
return vibrateTask(durationMs);
}