From 82fac72dfb43a584cf32f1b6c8e64b66f1c8d5b1 Mon Sep 17 00:00:00 2001 From: Ye ShanShan Date: Wed, 7 May 2025 10:54:26 +0800 Subject: [PATCH] fix: prevent duplicate OSD actions for same type MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Added lastOsdType tracking in OsdPanel to store the most recent OSD type 2. Modified displaymode, kblayout and windoweffect OSD handlers to only perform actions if the current OSD type matches the last one 3. This prevents duplicate actions when multiple OSD events of same type are triggered in quick succession 4. Added updateLastOsdType method to track and clear the last OSD type when hiding fix: 防止相同类型OSD的重复操作 1. 在OsdPanel中添加lastOsdType跟踪最近显示的OSD类型 2. 修改了displaymode、kblayout和windoweffect的OSD处理逻辑,仅在当前OSD类 型与最后一次相同时才执行操作 3. 防止在快速连续触发相同类型OSD事件时重复执行操作 4. 添加updateLastOsdType方法来跟踪并在隐藏时清除最后OSD类型 --- .../notification/osd/displaymode/package/main.qml | 4 +++- panels/notification/osd/kblayout/package/main.qml | 4 +++- panels/notification/osd/osdpanel.cpp | 14 ++++++++++++++ panels/notification/osd/osdpanel.h | 4 ++++ .../notification/osd/windoweffect/package/main.qml | 8 +++++--- 5 files changed, 29 insertions(+), 5 deletions(-) diff --git a/panels/notification/osd/displaymode/package/main.qml b/panels/notification/osd/displaymode/package/main.qml index 9f654ad20..c418c8dbc 100644 --- a/panels/notification/osd/displaymode/package/main.qml +++ b/panels/notification/osd/displaymode/package/main.qml @@ -26,7 +26,9 @@ AppletItem { Applet.doAction() } } else if (osdType === "SwitchMonitors") { - Applet.next() + if (Panel.lastOsdType() === osdType) { + Applet.next() + } } return true diff --git a/panels/notification/osd/kblayout/package/main.qml b/panels/notification/osd/kblayout/package/main.qml index 9fda2bf3f..74fe2b7de 100644 --- a/panels/notification/osd/kblayout/package/main.qml +++ b/panels/notification/osd/kblayout/package/main.qml @@ -20,7 +20,9 @@ AppletItem { { if (match(osdType)) { Applet.sync() - Applet.next() + if (Panel.lastOsdType() === osdType) { + Applet.next() + } return true } return false diff --git a/panels/notification/osd/osdpanel.cpp b/panels/notification/osd/osdpanel.cpp index ff351da55..b97edb614 100644 --- a/panels/notification/osd/osdpanel.cpp +++ b/panels/notification/osd/osdpanel.cpp @@ -78,6 +78,7 @@ void OsdPanel::hideOsd() { m_osdTimer->stop(); setVisible(false); + updateLastOsdType({}); } void OsdPanel::showOsd() @@ -86,6 +87,7 @@ void OsdPanel::showOsd() m_osdTimer->start(); setVisible(true); + updateLastOsdType(m_osdType); } void OsdPanel::setVisible(const bool visible) @@ -102,6 +104,18 @@ void OsdPanel::setOsdType(const QString &osdType) emit osdTypeChanged(m_osdType); } +void OsdPanel::updateLastOsdType(const QString &osdType) +{ + if (m_lastOsdType != osdType) { + m_lastOsdType = osdType; + } +} + +QString OsdPanel::lastOsdType() const +{ + return m_lastOsdType; +} + D_APPLET_CLASS(OsdPanel) } diff --git a/panels/notification/osd/osdpanel.h b/panels/notification/osd/osdpanel.h index 11d1c2e9b..e2b0e908c 100644 --- a/panels/notification/osd/osdpanel.h +++ b/panels/notification/osd/osdpanel.h @@ -24,6 +24,8 @@ class OsdPanel : public DS_NAMESPACE::DPanel bool visible() const; QString osdType() const; + Q_INVOKABLE QString lastOsdType() const; + public Q_SLOTS: void ShowOSD(const QString &text); @@ -37,11 +39,13 @@ private Q_SLOTS: void showOsd(); void setVisible(const bool visible); void setOsdType(const QString &osdType); + void updateLastOsdType(const QString &osdType); private: bool m_visible = false; QTimer *m_osdTimer = nullptr; QString m_osdType; + QString m_lastOsdType; int m_interval {2000}; }; diff --git a/panels/notification/osd/windoweffect/package/main.qml b/panels/notification/osd/windoweffect/package/main.qml index e81c8cb45..c32a2cc72 100644 --- a/panels/notification/osd/windoweffect/package/main.qml +++ b/panels/notification/osd/windoweffect/package/main.qml @@ -49,9 +49,11 @@ AppletItem { function update(osdType) { if (match(osdType)) { - Qt.callLater(function() { - control.selectIndex = (control.selectIndex + 1) % effectModel.count - }) + if (Panel.lastOsdType() === osdType) { + Qt.callLater(function() { + control.selectIndex = (control.selectIndex + 1) % effectModel.count + }) + } return true } return false