@windypro-rourou/dsh-logcat 0.6.0-preview.2 → 0.6.0-preview.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.js CHANGED
@@ -148,9 +148,19 @@ window.__ModuleLoader__.load({
148
148
  constructor() {
149
149
  this.panelOpen = false;
150
150
  this.listeners = new Set();
151
+ this._snap = { panelOpen: false };
152
+ // Bound as instance arrow properties: useSyncExternalStore calls them
153
+ // WITHOUT a receiver, so prototype methods would lose `this` (white
154
+ // panel). Arrow properties also give stable references.
155
+ this.getSnapshot = () => {
156
+ if (this._snap.panelOpen !== this.panelOpen) this._snap = { panelOpen: this.panelOpen };
157
+ return this._snap;
158
+ };
159
+ this.subscribe = (fn) => {
160
+ this.listeners.add(fn);
161
+ return () => { this.listeners.delete(fn); };
162
+ };
151
163
  }
152
- getSnapshot() { return { panelOpen: this.panelOpen }; }
153
- subscribe(fn) { this.listeners.add(fn); return () => { this.listeners.delete(fn); }; }
154
164
  open() { if (this.panelOpen) return; this.panelOpen = true; this.notify(); }
155
165
  close() { if (!this.panelOpen) return; this.panelOpen = false; this.notify(); }
156
166
  toggle() { if (this.panelOpen) this.close(); else this.open(); }
@@ -215,6 +225,7 @@ window.__ModuleLoader__.load({
215
225
  const [screenImg, setScreenImg] = useState(null);
216
226
  const [screenText, setScreenText] = useState("");
217
227
  const [screenOn, setScreenOn] = useState(false);
228
+ const [hostScreenCapable, setHostScreenCapable] = useState(false);
218
229
  const panelOpen = useSyncExternalStore(controller.subscribe, controller.getSnapshot).panelOpen;
219
230
 
220
231
  const wsRef = useRef(null);
@@ -394,6 +405,7 @@ window.__ModuleLoader__.load({
394
405
  setDevices(body.devices ?? []);
395
406
  setStreaming(body.streaming ?? []);
396
407
  setEventsStreaming(body.eventsStreaming ?? []);
408
+ setHostScreenCapable(body.screenCapable === true);
397
409
  setCurrentPackage(body.currentPackage ?? "");
398
410
  setCurrentVersion(body.currentVersion ?? "");
399
411
  setLatestVersion(body.latestVersion ?? "");
@@ -965,17 +977,19 @@ window.__ModuleLoader__.load({
965
977
  : tab === "screen"
966
978
  ? h("div", { className: "lc-screen" },
967
979
  h("div", { className: "lc-screen-bar" },
968
- h("span", { className: "lc-dot " + (screenOn ? "on" : "off") }),
969
- h("span", null, screenOn ? "投屏中 (~1fps)" : "投屏未开启"),
980
+ h("span", { className: "lc-dot " + (screenOn && hostScreenCapable ? "on" : "off") }),
981
+ h("span", null, !hostScreenCapable ? "宿主版本过旧" : (screenOn ? "投屏中 (~1fps)" : "投屏未开启")),
970
982
  h("input", { placeholder: "输入文字后回车发送…", value: screenText, onChange: (e) => setScreenText(e.target.value), onKeyDown: (e) => { if (e.key === "Enter") sendScreenText(); }, style: { flex: 1, minWidth: 140 } }),
971
983
  h("button", { type: "button", className: "lc-btn", onClick: downloadScreen, title: "下载当前帧 PNG" }, "下载"),
972
984
  h("span", { className: "lc-screen-hint" }, "点击=点按 · 拖动=滑动"),
973
985
  ),
974
- h("div", { className: "lc-screen-img", ref: screenWrapRef, onMouseDown: screenMouseDown, onMouseUp: screenMouseUp, onMouseLeave: screenMouseUp },
975
- screenImg !== null
976
- ? h("img", { ref: screenImgRef, src: screenImg, alt: "设备屏幕", draggable: false })
977
- : h("div", { className: "lc-empty" }, "等待画面…(设备连接后自动开始,1fps)"),
978
- ),
986
+ !hostScreenCapable
987
+ ? h("div", { className: "lc-empty" }, "⚠ 运行中的 GUI 宿主版本过旧(0.6.0-preview.1)——请重启 GUI(dsh web)后刷新,投屏功能才会生效")
988
+ : h("div", { className: "lc-screen-img", ref: screenWrapRef, onMouseDown: screenMouseDown, onMouseUp: screenMouseUp, onMouseLeave: screenMouseUp },
989
+ screenImg !== null
990
+ ? h("img", { ref: screenImgRef, src: screenImg, alt: "设备屏幕", draggable: false })
991
+ : h("div", { className: "lc-empty" }, "等待画面…(设备连接后自动开始,1fps)"),
992
+ ),
979
993
  )
980
994
  : eventsOn
981
995
  ? (filteredEvents.length === 0
package/lib/index.js CHANGED
@@ -890,6 +890,7 @@ function makeRoutes(engine) {
890
890
  devices: engine.deviceList(),
891
891
  streaming: [...engine.streams.keys()],
892
892
  eventsStreaming: [...engine.eventsStreams.keys()],
893
+ screenCapable: true,
893
894
  currentPackage: engine.currentPackage,
894
895
  currentVersion: OWN_MANIFEST.version,
895
896
  latestVersion,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@windypro-rourou/dsh-logcat",
3
3
  "description": "Android Logcat viewer for the dsh web GUI: auto-connects to any adb device in debug mode, live logcat stream with level/keyword filters, pause/clear/export, plus agent tools (logcat_recent). Hot-pluggable — mounted via ~/.dsh/cordis.patch.yml + a profile node_modules copy, no dsh source changes.",
4
- "version": "0.6.0-preview.2",
4
+ "version": "0.6.0-preview.4",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@11.22.0",
7
7
  "engines": {