@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 +23 -9
- package/lib/index.js +1 -0
- package/package.json +1 -1
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
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
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.
|
|
4
|
+
"version": "0.6.0-preview.4",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "pnpm@11.22.0",
|
|
7
7
|
"engines": {
|