Fix issue where cursor doesn't reappear when disabling the KWin plugin

deactivate() wasn't getting triggered, add a deconstructor
This commit is contained in:
wheaney 2025-09-08 10:38:49 -07:00
parent 229ee9749a
commit 8967c00666
2 changed files with 20 additions and 19 deletions

View File

@ -92,14 +92,10 @@ namespace KWin
{ {
BreezyDesktopEffect::BreezyDesktopEffect() BreezyDesktopEffect::BreezyDesktopEffect()
: m_shutdownTimer(new QTimer(this))
{ {
qCCritical(KWIN_XR) << "\t\t\tBreezy - constructor"; qCCritical(KWIN_XR) << "\t\t\tBreezy - constructor";
qmlRegisterUncreatableType<BreezyDesktopEffect>("org.kde.kwin.effect.breezy_desktop", 1, 0, "BreezyDesktopEffect", QStringLiteral("BreezyDesktop cannot be created in QML")); qmlRegisterUncreatableType<BreezyDesktopEffect>("org.kde.kwin.effect.breezy_desktop", 1, 0, "BreezyDesktopEffect", QStringLiteral("BreezyDesktop cannot be created in QML"));
m_shutdownTimer->setSingleShot(true);
connect(m_shutdownTimer, &QTimer::timeout, this, &BreezyDesktopEffect::realDeactivate);
setupGlobalShortcut( setupGlobalShortcut(
BreezyShortcuts::TOGGLE, BreezyShortcuts::TOGGLE,
[this]() { this->toggle(); } [this]() { this->toggle(); }
@ -165,6 +161,23 @@ BreezyDesktopEffect::BreezyDesktopEffect()
} }
} }
BreezyDesktopEffect::~BreezyDesktopEffect()
{
qCCritical(KWIN_XR) << "\t\t\tBreezy - destructor";
if (m_shmFileWatcher) {
if (!DataView::SHM_PATH.isEmpty()) {
m_shmFileWatcher->removePath(DataView::SHM_PATH);
}
m_shmFileWatcher->deleteLater();
m_shmFileWatcher = nullptr;
}
if (m_shmDirectoryWatcher) {
m_shmDirectoryWatcher->deleteLater();
m_shmDirectoryWatcher = nullptr;
}
deactivate();
}
void BreezyDesktopEffect::setupGlobalShortcut(const BreezyShortcuts::Shortcut &shortcut, std::function<void()> triggeredFunc) { void BreezyDesktopEffect::setupGlobalShortcut(const BreezyShortcuts::Shortcut &shortcut, std::function<void()> triggeredFunc) {
QAction *action = new QAction(this); QAction *action = new QAction(this);
action->setObjectName(shortcut.actionName); action->setObjectName(shortcut.actionName);
@ -241,10 +254,6 @@ void BreezyDesktopEffect::activate()
void BreezyDesktopEffect::deactivate() void BreezyDesktopEffect::deactivate()
{ {
if (m_shutdownTimer->isActive()) {
return;
}
qCCritical(KWIN_XR) << "\t\t\tBreezy - deactivate"; qCCritical(KWIN_XR) << "\t\t\tBreezy - deactivate";
disconnect(effects, &EffectsHandler::cursorShapeChanged, this, &BreezyDesktopEffect::updateCursorImage); disconnect(effects, &EffectsHandler::cursorShapeChanged, this, &BreezyDesktopEffect::updateCursorImage);
m_cursorUpdateTimer->stop(); m_cursorUpdateTimer->stop();
@ -255,9 +264,7 @@ void BreezyDesktopEffect::deactivate()
} }
m_virtualOutputs.clear(); m_virtualOutputs.clear();
// this triggers realDeactivate with a delay so if it's triggered from QML it gives the QML function time to setRunning(false);
// exit, avoiding a crash
m_shutdownTimer->start(250);
} }
void BreezyDesktopEffect::enableDriver() void BreezyDesktopEffect::enableDriver()
@ -270,12 +277,6 @@ void BreezyDesktopEffect::enableDriver()
XRDriverIPC::instance().writeConfig(obj); XRDriverIPC::instance().writeConfig(obj);
} }
void BreezyDesktopEffect::realDeactivate()
{
qCCritical(KWIN_XR) << "\t\t\tBreezy - realDeactivate";
setRunning(false);
}
void BreezyDesktopEffect::addVirtualDisplay(QSize size) void BreezyDesktopEffect::addVirtualDisplay(QSize size)
{ {
// QSize size(2560, 1440); // QSize size(2560, 1440);

View File

@ -39,6 +39,7 @@ namespace KWin
public: public:
BreezyDesktopEffect(); BreezyDesktopEffect();
~BreezyDesktopEffect() override;
void reconfigure(ReconfigureFlags) override; void reconfigure(ReconfigureFlags) override;
@ -101,13 +102,12 @@ namespace KWin
QVariantMap initialProperties(Output *screen) override; QVariantMap initialProperties(Output *screen) override;
private: private:
void realDeactivate(); void teardown();
bool checkParityByte(const char* data); bool checkParityByte(const char* data);
void setupGlobalShortcut(const BreezyShortcuts::Shortcut &shortcut, void setupGlobalShortcut(const BreezyShortcuts::Shortcut &shortcut,
std::function<void()> triggeredFunc); std::function<void()> triggeredFunc);
void recenter(); void recenter();
QTimer *m_shutdownTimer;
QString m_cursorImageSource; QString m_cursorImageSource;
QSize m_cursorImageSize; QSize m_cursorImageSize;