Skip to content

Commit c448b21

Browse files
committed
fix(power): reschedule idle tasks
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 状态时正确重排节能任务。
1 parent b1b7819 commit c448b21

2 files changed

Lines changed: 17 additions & 11 deletions

File tree

src/plugin-qt/power/session/powersaveplan.cpp

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -124,14 +124,24 @@ void PowerSavePlan::Update(int screenSaverStartDelay, int lockDelay,
124124
}
125125
}
126126

127-
setScreenSaverTimeout(min);
128-
127+
128+
bool isIdle = false;
129+
if (m_powerManager) {
130+
auto *iw = m_powerManager->idleWatcher();
131+
isIdle = iw && iw->isIdle();
132+
}
133+
129134
for (auto &t : m_metaTasks) {
130-
int nSecs = t.delay - min;
131-
t.realDelay = nSecs > 0 ? nSecs * 1000 : 1;
135+
if (isIdle) { // 已经处于 idleon 状态的update(可能是插拔电源或者用户重新设置延迟), 重排任务
136+
t.realDelay = t.delay > 0 ? t.delay * 1000 : 1;
137+
} else { // 到达 idleOn 后立即执行动作
138+
int nSecs = t.delay - min;
139+
t.realDelay = nSecs > 0 ? nSecs * 1000 : 1;
140+
}
132141
}
133-
134-
if (m_isIdle) {
142+
143+
setScreenSaverTimeout(min);
144+
if (isIdle) {
135145
HandleIdleOn();
136146
}
137147
}
@@ -149,8 +159,6 @@ void PowerSavePlan::HandleIdleOn()
149159
return;
150160
}
151161

152-
m_isIdle = true;
153-
154162
for (const auto &t : m_metaTasks) {
155163
scheduleTask(t);
156164
}
@@ -162,7 +170,6 @@ void PowerSavePlan::HandleIdleOn()
162170
void PowerSavePlan::HandleIdleOff()
163171
{
164172
qDebug(logPowerSession) << "HandleIdleOff";
165-
m_isIdle = false;
166173
interruptTasks();
167174
if (!m_powerManager) return;
168175
m_powerManager->SetPrepareSuspend(static_cast<int>(PS_Normal));
@@ -174,7 +181,7 @@ void PowerSavePlan::HandleIdleOff()
174181

175182
void PowerSavePlan::scheduleTask(const MetaTask &t)
176183
{
177-
qDebug(logPowerSession) << "Scheduling task" << t.name << "to run in" << t.realDelay << "ms";
184+
qWarning(logPowerSession) << "Scheduling task" << t.name << "to run in" << t.realDelay << "ms";
178185
auto *timer = new QTimer(this);
179186
timer->setSingleShot(true);
180187
connect(timer, &QTimer::timeout, this, t.fn);

src/plugin-qt/power/session/powersaveplan.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ class PowerSavePlan : public QObject {
5252
QVector<QTimer *> m_timers;
5353
QMap<QString, double> m_oldBrightness;
5454
bool m_screensaverRunning = false;
55-
bool m_isIdle = false;
5655
bool m_allowScreenSaver = true;
5756
bool m_psmEnabled = false;
5857
uint m_psmDrop = 0;

0 commit comments

Comments
 (0)