防休眠锁
from uda import Uda, WakeLockType
with Uda() as uda: # 只阻止屏幕变暗/关闭,系统仍可待机 with uda.wakelock(WakeLockType.DISPLAY, reason="正在演示") as lock: print("屏幕保持点亮")
# 同时阻止系统空闲挂起 with uda.wakelock(WakeLockType.SYSTEM, reason="视频转码") as lock: print("系统保持唤醒")| 类型 | 语义 |
|---|---|
WakeLockType.DISPLAY |
阻止显示器关闭。用户按电源键仍可手动休眠 |
WakeLockType.SYSTEM |
阻止系统空闲判定与自动挂起 |
平台映射上,Linux 侧对应 org.freedesktop.ScreenSaver.Inhibit 的 flags(8 = Idle,12 = Idle + Suspend),Windows 侧对应 SetThreadExecutionState 的 ES_CONTINUOUS 加上 ES_DISPLAY_REQUIRED / ES_SYSTEM_REQUIRED。
| 平台 | 机制 |
|---|---|
| Linux | 会话总线上的 org.freedesktop.ScreenSaver.Inhibit;DISPLAY 锁传 flag 8(idle),SYSTEM 锁传 12(idle + suspend)。释放时用守护进程返回的 cookie 调用 UnInhibit |
| Windows | SetThreadExecutionState:DISPLAY 锁为 ES_CONTINUOUS | ES_DISPLAY_REQUIRED,SYSTEM 锁再加 ES_SYSTEM_REQUIRED;释放时恢复默认的 ES_CONTINUOUS |
没有更多回退层级:Linux 侧 ScreenSaver 服务是唯一后端,Windows 侧 SetThreadExecutionState 总可用。会话总线不可达时调用返回类型化错误。
RAII 释放
Section titled “RAII 释放”WakeLock 实现了上下文管理器,离开 with 块即释放:
with uda.wakelock(reason="下载") as lock: download() # 即使抛异常,锁也会释放也可以手动释放,且重复调用是安全的:
lock = uda.wakelock(reason="下载")lock.release()lock.release() # no-opNode.js 侧用 release():
const lock = uda.wakelock('system', '视频转码');// ...lock.release();reason 的选择
Section titled “reason 的选择”reason 字符串会传给平台用于日志与诊断——例如屏幕保护程序显示是谁在阻止休眠,或 Windows 的电源请求追踪。保持简短可读;它不会作为通知展示给用户。
常见误用与约束
Section titled “常见误用与约束”- 能力与降级——两层均不可用时的行为
docs/internals/wakelock_specs.md——协议级映射
