From d76c15eea8e27df8695116746278718387455cbd Mon Sep 17 00:00:00 2001 From: deepin-wm Date: Thu, 18 Jun 2026 21:27:52 +0800 Subject: [PATCH] fix: add Wayland screen-off in systemTurnOffScreen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Replace TODO placeholder in systemTurnOffScreen() Wayland branch with working implementation 2. Add doPrepareSuspend/undoPrepareSuspend to prevent idle watcher race during screen-off transition 3. Lock screen before turning off if screenBlackLock config is true 4. Call Power1 TurnOffScreen via systemBus DBus for wlr-output-power-management-v1 output control 5. Add 500ms delay after lock for lock UI rendering Log: Fixed power button screen-off not working on Wayland/Treeland Influence: 1. Test power button screen-off in Treeland session 2. Verify lock screen appears before display turns off 3. Test wake from screen-off resumes to lock screen 4. Verify X11 screen-off path is not affected fix: 实现 Wayland 熄屏功能 1. 替换 systemTurnOffScreen() Wayland 分支的 TODO 占位符为完整实现 2. 添加 doPrepareSuspend/undoPrepareSuspend 防止 熄屏过渡期间 idle watcher 冲突 3. 熄屏前根据 screenBlackLock 配置判断是否先锁屏 4. 通过 systemBus DBus 调用 Power1 TurnOffScreen 使用 wlr-output-power-management-v1 关闭显示器 5. 锁屏后延迟 500ms 等待锁屏 UI 渲染完成 Log: 修复 Wayland/Treeland 下按电源键熄屏无响应的问题 Influence: 1. 在 Treeland 会话下测试按电源键熄屏功能 2. 验证熄屏前锁屏界面正常显示 3. 测试从熄屏唤醒后回到锁屏界面 4. 验证 X11 熄屏路径不受影响 PMS: BUG-209669 --- .../dde-shortcut-tool/powercontroller.cpp | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/plugin-qt/shortcut/tools/dde-shortcut-tool/powercontroller.cpp b/src/plugin-qt/shortcut/tools/dde-shortcut-tool/powercontroller.cpp index a4b59ca..078ecad 100644 --- a/src/plugin-qt/shortcut/tools/dde-shortcut-tool/powercontroller.cpp +++ b/src/plugin-qt/shortcut/tools/dde-shortcut-tool/powercontroller.cpp @@ -410,7 +410,30 @@ void PowerController::systemTurnOffScreen() qInfo() << "PowerController: turn off screen"; if (isWaylandSession()) { - // TODO: adapt screen-off for Treeland Wayland (DPMS path TBD). + // Wayland/Treeland: use Power1 TurnOffScreen which calls + // wlr-output-power-management-v1 to set outputs off. + doPrepareSuspend(); + + DConfig *config = createPowerConfig(this); + const bool screenBlackLock = shouldLockOnScreenBlack(config); + if (screenBlackLock) { + doLock(true); + QThread::msleep(500); + } + + QDBusInterface power("org.deepin.dde.Power1", "/org/deepin/dde/Power1", + "org.deepin.dde.Power1", QDBusConnection::systemBus()); + if (power.isValid()) { + power.call("TurnOffScreen"); + } else { + qWarning() << "PowerController: Power1 unavailable for TurnOffScreen"; + } + + undoPrepareSuspend(); + + QFile dpmsState("/tmp/dpms-state"); + if (dpmsState.open(QIODevice::WriteOnly | QIODevice::Truncate)) + dpmsState.write("1"); return; }