feat: 大屏增强——一键亮屏按钮、卡片显示设备名+IP+熄屏状态(thumb 响应头 X-Screen-State)、点击卡片进入设备操作弹窗(实时流+触控+按键+文字),工具页远程看屏子分栏移除并入大屏

This commit is contained in:
2026-08-19 14:17:33 +08:00
parent c78f17d72f
commit e07b339a51
5 changed files with 269 additions and 199 deletions
+20 -1
View File
@@ -1042,6 +1042,7 @@ def api_screen_thumb():
一次性请求(非流),与任务并发安全(与任务截图同走 u2 minicap)。
大屏按需轮询:每设备约 2.5s 一帧,20 台 ≈ 0.2 核 CPU + 100KB/s。
响应头 X-Screen-State: on/off/unknown —— 大屏据此显示「亮屏中/熄屏中」。
"""
serial = request.args.get("serial", "")
if not serial:
@@ -1059,10 +1060,28 @@ def api_screen_thumb():
buf = io.BytesIO()
img.convert("RGB").save(buf, "JPEG", quality=55)
return Response(buf.getvalue(), mimetype="image/jpeg",
headers={"Cache-Control": "no-store"})
headers={"Cache-Control": "no-store",
"X-Screen-State": _device_screen_state(serial)})
except Exception as e:
return jsonify({"ok": False, "error": str(e)}), 503
def _device_screen_state(serial):
"""设备屏幕状态:on/off/unknown(dumpsys display 只读查询)。
USB 设备(远程 adb server)查询失败返回 unknown,不影响缩略图。
"""
try:
if ":" not in serial:
return "unknown"
out = _adb("-s", serial, "shell", "dumpsys", "display") or ""
m = re.search(r"m(?:Global)?ScreenState=(\w+)", out)
if m:
return "on" if m.group(1).upper() == "ON" else "off"
except Exception:
pass
return "unknown"
@app.route("/api/screen/tap", methods=["POST"])
@perm_required(PERM_DEVICES)
def api_screen_tap():