From 6520b0c3542e6f0f429710c62c29a7fb9136fdf6 Mon Sep 17 00:00:00 2001 From: zhangkun Date: Wed, 1 Jul 2026 19:47:26 +0800 Subject: [PATCH] fix(power): reschedule idle tasks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Query the current idle state from IdleWatcher when updating the power save plan. 2. Recalculate task delays differently when the session is already idle. 3. Drop the duplicated PowerSavePlan idle state to avoid stale scheduling decisions. Log: Reschedule power save tasks correctly when the idle state is already active. fix(power): 修复 idle 任务重排 1. 更新节能计划时从 IdleWatcher 查询当前 idle 状态。 2. 会话已处于 idle 状态时按任务自身延迟重新计算定时任务。 3. 移除 PowerSavePlan 重复维护的 idle 状态,避免使用过期状态调度任务。 Log: 已处于 idle 状态时正确重排节能任务。 --- src/plugin-qt/power/session/powersaveplan.cpp | 27 ++++++++++++------- src/plugin-qt/power/session/powersaveplan.h | 1 - 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/plugin-qt/power/session/powersaveplan.cpp b/src/plugin-qt/power/session/powersaveplan.cpp index dc08621..50786cf 100644 --- a/src/plugin-qt/power/session/powersaveplan.cpp +++ b/src/plugin-qt/power/session/powersaveplan.cpp @@ -124,14 +124,24 @@ void PowerSavePlan::Update(int screenSaverStartDelay, int lockDelay, } } - setScreenSaverTimeout(min); - + + bool isIdle = false; + if (m_powerManager) { + auto *iw = m_powerManager->idleWatcher(); + isIdle = iw && iw->isIdle(); + } + for (auto &t : m_metaTasks) { - int nSecs = t.delay - min; - t.realDelay = nSecs > 0 ? nSecs * 1000 : 1; + if (isIdle) { // 已经处于 idleon 状态的update(可能是插拔电源或者用户重新设置延迟), 重排任务 + t.realDelay = t.delay > 0 ? t.delay * 1000 : 1; + } else { // 到达 idleOn 后立即执行动作 + int nSecs = t.delay - min; + t.realDelay = nSecs > 0 ? nSecs * 1000 : 1; + } } - - if (m_isIdle) { + + setScreenSaverTimeout(min); + if (isIdle) { HandleIdleOn(); } } @@ -149,8 +159,6 @@ void PowerSavePlan::HandleIdleOn() return; } - m_isIdle = true; - for (const auto &t : m_metaTasks) { scheduleTask(t); } @@ -162,7 +170,6 @@ void PowerSavePlan::HandleIdleOn() void PowerSavePlan::HandleIdleOff() { qDebug(logPowerSession) << "HandleIdleOff"; - m_isIdle = false; interruptTasks(); if (!m_powerManager) return; m_powerManager->SetPrepareSuspend(static_cast(PS_Normal)); @@ -174,7 +181,7 @@ void PowerSavePlan::HandleIdleOff() void PowerSavePlan::scheduleTask(const MetaTask &t) { - qDebug(logPowerSession) << "Scheduling task" << t.name << "to run in" << t.realDelay << "ms"; + qWarning(logPowerSession) << "Scheduling task" << t.name << "to run in" << t.realDelay << "ms"; auto *timer = new QTimer(this); timer->setSingleShot(true); connect(timer, &QTimer::timeout, this, t.fn); diff --git a/src/plugin-qt/power/session/powersaveplan.h b/src/plugin-qt/power/session/powersaveplan.h index f9a72e6..e86c256 100644 --- a/src/plugin-qt/power/session/powersaveplan.h +++ b/src/plugin-qt/power/session/powersaveplan.h @@ -52,7 +52,6 @@ class PowerSavePlan : public QObject { QVector m_timers; QMap m_oldBrightness; bool m_screensaverRunning = false; - bool m_isIdle = false; bool m_allowScreenSaver = true; bool m_psmEnabled = false; uint m_psmDrop = 0;