@blit-sh/core 0.19.0 → 0.20.0
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/dist/BlitConnection.d.ts +16 -2
- package/dist/BlitConnection.d.ts.map +1 -1
- package/dist/BlitConnection.js +183 -8
- package/dist/BlitConnection.js.map +1 -1
- package/dist/BlitSurfaceCanvas.d.ts +122 -0
- package/dist/BlitSurfaceCanvas.d.ts.map +1 -0
- package/dist/BlitSurfaceCanvas.js +582 -0
- package/dist/BlitSurfaceCanvas.js.map +1 -0
- package/dist/BlitTerminalSurface.d.ts +12 -0
- package/dist/BlitTerminalSurface.d.ts.map +1 -1
- package/dist/BlitTerminalSurface.js +51 -1
- package/dist/BlitTerminalSurface.js.map +1 -1
- package/dist/BlitWorkspace.d.ts +2 -0
- package/dist/BlitWorkspace.d.ts.map +1 -1
- package/dist/BlitWorkspace.js +27 -0
- package/dist/BlitWorkspace.js.map +1 -1
- package/dist/SurfaceStore.d.ts +69 -0
- package/dist/SurfaceStore.d.ts.map +1 -0
- package/dist/SurfaceStore.js +494 -0
- package/dist/SurfaceStore.js.map +1 -0
- package/dist/TerminalStore.d.ts.map +1 -1
- package/dist/TerminalStore.js +4 -1
- package/dist/TerminalStore.js.map +1 -1
- package/dist/bsp/index.d.ts +1 -1
- package/dist/bsp/index.d.ts.map +1 -1
- package/dist/bsp/index.js +1 -1
- package/dist/bsp/index.js.map +1 -1
- package/dist/bsp/layout.d.ts +9 -1
- package/dist/bsp/layout.d.ts.map +1 -1
- package/dist/bsp/layout.js +36 -4
- package/dist/bsp/layout.js.map +1 -1
- package/dist/gl-renderer.d.ts +6 -0
- package/dist/gl-renderer.d.ts.map +1 -1
- package/dist/gl-renderer.js +132 -0
- package/dist/gl-renderer.js.map +1 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/keyboard.d.ts +6 -0
- package/dist/keyboard.d.ts.map +1 -1
- package/dist/keyboard.js +25 -0
- package/dist/keyboard.js.map +1 -1
- package/dist/protocol.d.ts +19 -0
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +124 -1
- package/dist/protocol.js.map +1 -1
- package/dist/transports/webrtc-share.d.ts.map +1 -1
- package/dist/transports/webrtc-share.js +162 -61
- package/dist/transports/webrtc-share.js.map +1 -1
- package/dist/transports/webtransport.d.ts.map +1 -1
- package/dist/transports/webtransport.js +3 -1
- package/dist/transports/webtransport.js.map +1 -1
- package/dist/types.d.ts +41 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +29 -0
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,582 @@
|
|
|
1
|
+
import { CODEC_SUPPORT_H264, CODEC_SUPPORT_AV1, CODEC_SUPPORT_H265, } from "./types";
|
|
2
|
+
import { SURFACE_POINTER_DOWN, SURFACE_POINTER_UP, SURFACE_POINTER_MOVE, } from "./protocol";
|
|
3
|
+
/** Cached codec support bitmask. Computed once, reused for all resize messages. */
|
|
4
|
+
let _codecSupport = null;
|
|
5
|
+
/**
|
|
6
|
+
* Probe which video codecs the browser can decode via WebCodecs and return
|
|
7
|
+
* a bitmask of CODEC_SUPPORT_* flags. Result is cached after first call.
|
|
8
|
+
*/
|
|
9
|
+
export async function detectCodecSupport() {
|
|
10
|
+
if (_codecSupport !== null)
|
|
11
|
+
return _codecSupport;
|
|
12
|
+
if (typeof VideoDecoder === "undefined") {
|
|
13
|
+
_codecSupport = 0;
|
|
14
|
+
return 0;
|
|
15
|
+
}
|
|
16
|
+
let mask = 0;
|
|
17
|
+
const checks = [
|
|
18
|
+
["avc1.42001f", CODEC_SUPPORT_H264],
|
|
19
|
+
["av01.0.01M.08", CODEC_SUPPORT_AV1],
|
|
20
|
+
["hev1.1.6.L93.B0", CODEC_SUPPORT_H265],
|
|
21
|
+
];
|
|
22
|
+
await Promise.all(checks.map(async ([codec, bit]) => {
|
|
23
|
+
try {
|
|
24
|
+
const r = await VideoDecoder.isConfigSupported({
|
|
25
|
+
codec,
|
|
26
|
+
codedWidth: 1920,
|
|
27
|
+
codedHeight: 1080,
|
|
28
|
+
});
|
|
29
|
+
if (r.supported)
|
|
30
|
+
mask |= bit;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// not supported
|
|
34
|
+
}
|
|
35
|
+
}));
|
|
36
|
+
_codecSupport = mask;
|
|
37
|
+
return mask;
|
|
38
|
+
}
|
|
39
|
+
/** Return the cached codec support, or 0 if not yet probed. */
|
|
40
|
+
export function getCodecSupport() {
|
|
41
|
+
return _codecSupport ?? 0;
|
|
42
|
+
}
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
// CapsLock state tracking
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
// Track the believed CapsLock state inside each connection's compositor.
|
|
47
|
+
// Keyed by connectionId. Defaults to false because XkbConfig::default()
|
|
48
|
+
// starts with all lock modifiers off. A module-level map is used so the
|
|
49
|
+
// state survives across BlitSurfaceCanvas instances that share the same
|
|
50
|
+
// connection (e.g. switching surfaces in a BSP layout).
|
|
51
|
+
const _compositorCapsLock = new Map();
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
// EVDEV keycode map (DOM KeyboardEvent.code → Linux evdev scancode)
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
const EVDEV_MAP = {
|
|
56
|
+
Escape: 1,
|
|
57
|
+
Digit1: 2,
|
|
58
|
+
Digit2: 3,
|
|
59
|
+
Digit3: 4,
|
|
60
|
+
Digit4: 5,
|
|
61
|
+
Digit5: 6,
|
|
62
|
+
Digit6: 7,
|
|
63
|
+
Digit7: 8,
|
|
64
|
+
Digit8: 9,
|
|
65
|
+
Digit9: 10,
|
|
66
|
+
Digit0: 11,
|
|
67
|
+
Minus: 12,
|
|
68
|
+
Equal: 13,
|
|
69
|
+
Backspace: 14,
|
|
70
|
+
Tab: 15,
|
|
71
|
+
KeyQ: 16,
|
|
72
|
+
KeyW: 17,
|
|
73
|
+
KeyE: 18,
|
|
74
|
+
KeyR: 19,
|
|
75
|
+
KeyT: 20,
|
|
76
|
+
KeyY: 21,
|
|
77
|
+
KeyU: 22,
|
|
78
|
+
KeyI: 23,
|
|
79
|
+
KeyO: 24,
|
|
80
|
+
KeyP: 25,
|
|
81
|
+
BracketLeft: 26,
|
|
82
|
+
BracketRight: 27,
|
|
83
|
+
Enter: 28,
|
|
84
|
+
ControlLeft: 29,
|
|
85
|
+
KeyA: 30,
|
|
86
|
+
KeyS: 31,
|
|
87
|
+
KeyD: 32,
|
|
88
|
+
KeyF: 33,
|
|
89
|
+
KeyG: 34,
|
|
90
|
+
KeyH: 35,
|
|
91
|
+
KeyJ: 36,
|
|
92
|
+
KeyK: 37,
|
|
93
|
+
KeyL: 38,
|
|
94
|
+
Semicolon: 39,
|
|
95
|
+
Quote: 40,
|
|
96
|
+
Backquote: 41,
|
|
97
|
+
ShiftLeft: 42,
|
|
98
|
+
Backslash: 43,
|
|
99
|
+
KeyZ: 44,
|
|
100
|
+
KeyX: 45,
|
|
101
|
+
KeyC: 46,
|
|
102
|
+
KeyV: 47,
|
|
103
|
+
KeyB: 48,
|
|
104
|
+
KeyN: 49,
|
|
105
|
+
KeyM: 50,
|
|
106
|
+
Comma: 51,
|
|
107
|
+
Period: 52,
|
|
108
|
+
Slash: 53,
|
|
109
|
+
ShiftRight: 54,
|
|
110
|
+
AltLeft: 56,
|
|
111
|
+
Space: 57,
|
|
112
|
+
CapsLock: 58,
|
|
113
|
+
F1: 59,
|
|
114
|
+
F2: 60,
|
|
115
|
+
F3: 61,
|
|
116
|
+
F4: 62,
|
|
117
|
+
F5: 63,
|
|
118
|
+
F6: 64,
|
|
119
|
+
F7: 65,
|
|
120
|
+
F8: 66,
|
|
121
|
+
F9: 67,
|
|
122
|
+
F10: 68,
|
|
123
|
+
F11: 87,
|
|
124
|
+
F12: 88,
|
|
125
|
+
ArrowUp: 103,
|
|
126
|
+
ArrowLeft: 105,
|
|
127
|
+
ArrowRight: 106,
|
|
128
|
+
ArrowDown: 108,
|
|
129
|
+
Home: 102,
|
|
130
|
+
End: 107,
|
|
131
|
+
PageUp: 104,
|
|
132
|
+
PageDown: 109,
|
|
133
|
+
Insert: 110,
|
|
134
|
+
Delete: 111,
|
|
135
|
+
ControlRight: 97,
|
|
136
|
+
AltRight: 100,
|
|
137
|
+
MetaLeft: 125,
|
|
138
|
+
MetaRight: 126,
|
|
139
|
+
};
|
|
140
|
+
function domKeyToEvdev(code) {
|
|
141
|
+
return EVDEV_MAP[code] ?? 0;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Framework-agnostic surface canvas. Manages a `<canvas>` element that renders
|
|
145
|
+
* decoded video frames from a Wayland-like surface, and forwards
|
|
146
|
+
* pointer / keyboard / wheel input back to the server.
|
|
147
|
+
*
|
|
148
|
+
* Framework bindings (React, Solid, etc.) attach this to a container element
|
|
149
|
+
* and forward option changes via setters.
|
|
150
|
+
*/
|
|
151
|
+
export class BlitSurfaceCanvas {
|
|
152
|
+
constructor(options) {
|
|
153
|
+
this.container = null;
|
|
154
|
+
this.canvas = null;
|
|
155
|
+
this.ctx = null;
|
|
156
|
+
this.disposed = false;
|
|
157
|
+
/** Track which mouse buttons are currently pressed so we can send synthetic
|
|
158
|
+
* pointer-up events on dispose — preventing a dangling compositor grab. */
|
|
159
|
+
this.pressedButtons = new Set();
|
|
160
|
+
/** Track which keyboard keys are currently pressed (evdev keycodes) so we
|
|
161
|
+
* can release them when focus leaves or the canvas is disposed — preventing
|
|
162
|
+
* stuck modifiers and runaway key-repeat in the compositor. */
|
|
163
|
+
this.pressedKeys = new Set();
|
|
164
|
+
/**
|
|
165
|
+
* When non-null the canvas internal resolution is controlled externally
|
|
166
|
+
* (by the framework binding's ResizeObserver) and frames are drawn
|
|
167
|
+
* scaled to fill the canvas rather than the canvas being resized to
|
|
168
|
+
* match each frame.
|
|
169
|
+
*/
|
|
170
|
+
this._displaySize = null;
|
|
171
|
+
// subscriptions
|
|
172
|
+
this.unsubFrame = null;
|
|
173
|
+
this.unsubChange = null;
|
|
174
|
+
// bound event handlers
|
|
175
|
+
this.boundMouseDown = null;
|
|
176
|
+
this.boundMouseUp = null;
|
|
177
|
+
this.boundMouseMove = null;
|
|
178
|
+
this.boundWheel = null;
|
|
179
|
+
this.boundKeyDown = null;
|
|
180
|
+
this.boundKeyUp = null;
|
|
181
|
+
this.boundFocus = null;
|
|
182
|
+
this.boundBlur = null;
|
|
183
|
+
this.boundContextMenu = null;
|
|
184
|
+
this._workspace = options.workspace;
|
|
185
|
+
this._connectionId = options.connectionId;
|
|
186
|
+
this._surfaceId = options.surfaceId;
|
|
187
|
+
}
|
|
188
|
+
// -----------------------------------------------------------------------
|
|
189
|
+
// Public API
|
|
190
|
+
// -----------------------------------------------------------------------
|
|
191
|
+
get surfaceInfo() {
|
|
192
|
+
return this.surface;
|
|
193
|
+
}
|
|
194
|
+
get canvasElement() {
|
|
195
|
+
return this.canvas;
|
|
196
|
+
}
|
|
197
|
+
attach(container) {
|
|
198
|
+
if (this.disposed)
|
|
199
|
+
return;
|
|
200
|
+
this.container = container;
|
|
201
|
+
const canvas = document.createElement("canvas");
|
|
202
|
+
canvas.tabIndex = 0;
|
|
203
|
+
canvas.style.display = "block";
|
|
204
|
+
canvas.style.outline = "none";
|
|
205
|
+
canvas.style.width = "100%";
|
|
206
|
+
canvas.style.height = "100%";
|
|
207
|
+
if (this._displaySize) {
|
|
208
|
+
// Resizable mode: canvas resolution is pinned by the framework
|
|
209
|
+
// binding. No object-fit needed since canvas.width/height matches
|
|
210
|
+
// the container's physical pixel size.
|
|
211
|
+
canvas.width = this._displaySize.width;
|
|
212
|
+
canvas.height = this._displaySize.height;
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
// Non-resizable (thumbnail) mode: scale to fit.
|
|
216
|
+
canvas.style.objectFit = "contain";
|
|
217
|
+
canvas.width = this.surface?.width || 640;
|
|
218
|
+
canvas.height = this.surface?.height || 480;
|
|
219
|
+
}
|
|
220
|
+
container.appendChild(canvas);
|
|
221
|
+
this.canvas = canvas;
|
|
222
|
+
this.ctx = canvas.getContext("2d");
|
|
223
|
+
this.subscribe();
|
|
224
|
+
this.attachEvents();
|
|
225
|
+
}
|
|
226
|
+
dispose() {
|
|
227
|
+
if (this.disposed)
|
|
228
|
+
return;
|
|
229
|
+
this.disposed = true;
|
|
230
|
+
this.releaseAllKeys();
|
|
231
|
+
this.releaseAllButtons();
|
|
232
|
+
this.serverUnsubscribe();
|
|
233
|
+
this.detachEvents();
|
|
234
|
+
this.unsubFrame?.();
|
|
235
|
+
this.unsubChange?.();
|
|
236
|
+
this.unsubFrame = null;
|
|
237
|
+
this.unsubChange = null;
|
|
238
|
+
if (this.canvas && this.container) {
|
|
239
|
+
this.container.removeChild(this.canvas);
|
|
240
|
+
}
|
|
241
|
+
this.canvas = null;
|
|
242
|
+
this.ctx = null;
|
|
243
|
+
this.container = null;
|
|
244
|
+
}
|
|
245
|
+
setConnectionId(connectionId) {
|
|
246
|
+
if (this._connectionId === connectionId)
|
|
247
|
+
return;
|
|
248
|
+
this._connectionId = connectionId;
|
|
249
|
+
this.resubscribe();
|
|
250
|
+
}
|
|
251
|
+
setSurfaceId(surfaceId) {
|
|
252
|
+
if (this._surfaceId === surfaceId)
|
|
253
|
+
return;
|
|
254
|
+
this._surfaceId = surfaceId;
|
|
255
|
+
this.resubscribe();
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Request the server to resize the surface to the given pixel dimensions.
|
|
259
|
+
* The server will respond with a SURFACE_RESIZED message that updates the
|
|
260
|
+
* surface metadata and canvas size via the normal onChange path.
|
|
261
|
+
*/
|
|
262
|
+
requestResize(width, height, scale120 = 0, codecSupport = 0) {
|
|
263
|
+
const conn = this.getConn();
|
|
264
|
+
if (!conn || !this.surface)
|
|
265
|
+
return;
|
|
266
|
+
const w = Math.round(width);
|
|
267
|
+
const h = Math.round(height);
|
|
268
|
+
if (w <= 0 || h <= 0)
|
|
269
|
+
return;
|
|
270
|
+
conn.sendSurfaceResize(this.surface.sessionId, this._surfaceId, w, h, scale120, codecSupport);
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Set the display (canvas backing-buffer) size in physical pixels.
|
|
274
|
+
* When set, the canvas resolution is pinned to these dimensions and frames
|
|
275
|
+
* are drawn scaled to fill rather than the canvas being resized to match
|
|
276
|
+
* each incoming frame. Call with `null` to revert to frame-tracking mode.
|
|
277
|
+
*
|
|
278
|
+
* This should be called by the framework binding's ResizeObserver so the
|
|
279
|
+
* canvas is immediately at the correct resolution — no CSS scaling needed.
|
|
280
|
+
*/
|
|
281
|
+
setDisplaySize(width, height) {
|
|
282
|
+
if (width == null) {
|
|
283
|
+
this._displaySize = null;
|
|
284
|
+
if (this.canvas) {
|
|
285
|
+
this.canvas.style.objectFit = "contain";
|
|
286
|
+
}
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
const w = Math.round(width);
|
|
290
|
+
const h = Math.round(height);
|
|
291
|
+
if (w <= 0 || h <= 0)
|
|
292
|
+
return;
|
|
293
|
+
this._displaySize = { width: w, height: h };
|
|
294
|
+
if (this.canvas) {
|
|
295
|
+
// Switch from object-fit scaling to display-size pinned mode.
|
|
296
|
+
this.canvas.style.objectFit = "";
|
|
297
|
+
if (this.canvas.width !== w || this.canvas.height !== h) {
|
|
298
|
+
this.canvas.width = w;
|
|
299
|
+
this.canvas.height = h;
|
|
300
|
+
}
|
|
301
|
+
// Re-blit the last frame at the new canvas size.
|
|
302
|
+
const conn = this.getConn();
|
|
303
|
+
if (conn)
|
|
304
|
+
this.blitFromStore(conn.surfaceStore);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
// -----------------------------------------------------------------------
|
|
308
|
+
// Connection helper
|
|
309
|
+
// -----------------------------------------------------------------------
|
|
310
|
+
getConn() {
|
|
311
|
+
return this._workspace.getConnection(this._connectionId) ?? null;
|
|
312
|
+
}
|
|
313
|
+
// -----------------------------------------------------------------------
|
|
314
|
+
// Subscriptions
|
|
315
|
+
// -----------------------------------------------------------------------
|
|
316
|
+
subscribe() {
|
|
317
|
+
const conn = this.getConn();
|
|
318
|
+
if (!conn)
|
|
319
|
+
return;
|
|
320
|
+
const store = conn.surfaceStore;
|
|
321
|
+
this.surface = store.getSurface(this._surfaceId);
|
|
322
|
+
// Tell the server we want frames for this surface, but only if the
|
|
323
|
+
// browser can actually decode the video. Subscribing when WebCodecs
|
|
324
|
+
// is unavailable (non-secure context) drives the server encoder for
|
|
325
|
+
// nothing and can crash it.
|
|
326
|
+
if (this.surface && store.canDecodeVideo) {
|
|
327
|
+
conn.sendSurfaceSubscribe(this.surface.sessionId, this._surfaceId);
|
|
328
|
+
}
|
|
329
|
+
// Paint the latest frame immediately so newly-mounted views aren't blank.
|
|
330
|
+
this.blitFromStore(store);
|
|
331
|
+
this.unsubChange = store.onChange(() => {
|
|
332
|
+
const prev = this.surface;
|
|
333
|
+
this.surface = store.getSurface(this._surfaceId);
|
|
334
|
+
// Late-subscribe: the surface info may arrive after we attach.
|
|
335
|
+
if (!prev && this.surface && store.canDecodeVideo) {
|
|
336
|
+
conn.sendSurfaceSubscribe(this.surface.sessionId, this._surfaceId);
|
|
337
|
+
// Update canvas size to match actual surface dimensions,
|
|
338
|
+
// unless the display size is pinned by a ResizeObserver.
|
|
339
|
+
if (this.canvas && !this._displaySize) {
|
|
340
|
+
this.canvas.width = this.surface.width;
|
|
341
|
+
this.canvas.height = this.surface.height;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
this.unsubFrame = store.onFrame((sid) => {
|
|
346
|
+
if (sid !== this._surfaceId)
|
|
347
|
+
return;
|
|
348
|
+
this.blitFromStore(store);
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
/** Copy the shared backing canvas onto our visible canvas. */
|
|
352
|
+
blitFromStore(store) {
|
|
353
|
+
const src = store.getCanvas(this._surfaceId);
|
|
354
|
+
const canvas = this.canvas;
|
|
355
|
+
const ctx = this.ctx;
|
|
356
|
+
if (!src || !canvas || !ctx)
|
|
357
|
+
return;
|
|
358
|
+
if (src.width === 0 || src.height === 0)
|
|
359
|
+
return;
|
|
360
|
+
if (this._displaySize) {
|
|
361
|
+
// Resizable mode: canvas resolution is pinned to the container's
|
|
362
|
+
// physical pixel size. Draw the source frame scaled to fill.
|
|
363
|
+
ctx.drawImage(src, 0, 0, canvas.width, canvas.height);
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
// Frame-tracking mode: canvas resolution follows the source frame.
|
|
367
|
+
if (canvas.width !== src.width || canvas.height !== src.height) {
|
|
368
|
+
canvas.width = src.width;
|
|
369
|
+
canvas.height = src.height;
|
|
370
|
+
}
|
|
371
|
+
ctx.drawImage(src, 0, 0);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
resubscribe() {
|
|
375
|
+
this.serverUnsubscribe();
|
|
376
|
+
this.unsubFrame?.();
|
|
377
|
+
this.unsubChange?.();
|
|
378
|
+
this.unsubFrame = null;
|
|
379
|
+
this.unsubChange = null;
|
|
380
|
+
if (!this.disposed)
|
|
381
|
+
this.subscribe();
|
|
382
|
+
}
|
|
383
|
+
serverUnsubscribe() {
|
|
384
|
+
const conn = this.getConn();
|
|
385
|
+
if (!conn || !this.surface)
|
|
386
|
+
return;
|
|
387
|
+
conn.sendSurfaceUnsubscribe(this.surface.sessionId, this._surfaceId);
|
|
388
|
+
}
|
|
389
|
+
// -----------------------------------------------------------------------
|
|
390
|
+
// Event handling
|
|
391
|
+
// -----------------------------------------------------------------------
|
|
392
|
+
attachEvents() {
|
|
393
|
+
const canvas = this.canvas;
|
|
394
|
+
if (!canvas)
|
|
395
|
+
return;
|
|
396
|
+
this.boundMouseDown = (e) => this.handleMouse(e, SURFACE_POINTER_DOWN);
|
|
397
|
+
this.boundMouseUp = (e) => this.handleMouse(e, SURFACE_POINTER_UP);
|
|
398
|
+
this.boundMouseMove = (e) => this.handleMouse(e, SURFACE_POINTER_MOVE);
|
|
399
|
+
this.boundWheel = (e) => this.handleWheel(e);
|
|
400
|
+
this.boundKeyDown = (e) => this.handleKey(e, true);
|
|
401
|
+
this.boundKeyUp = (e) => this.handleKey(e, false);
|
|
402
|
+
this.boundFocus = () => this.handleFocus();
|
|
403
|
+
this.boundBlur = () => this.handleBlur();
|
|
404
|
+
this.boundContextMenu = (e) => e.preventDefault();
|
|
405
|
+
canvas.addEventListener("mousedown", this.boundMouseDown);
|
|
406
|
+
canvas.addEventListener("mouseup", this.boundMouseUp);
|
|
407
|
+
canvas.addEventListener("mousemove", this.boundMouseMove);
|
|
408
|
+
canvas.addEventListener("wheel", this.boundWheel, { passive: false });
|
|
409
|
+
canvas.addEventListener("keydown", this.boundKeyDown);
|
|
410
|
+
canvas.addEventListener("keyup", this.boundKeyUp);
|
|
411
|
+
canvas.addEventListener("focus", this.boundFocus);
|
|
412
|
+
canvas.addEventListener("blur", this.boundBlur);
|
|
413
|
+
canvas.addEventListener("contextmenu", this.boundContextMenu);
|
|
414
|
+
}
|
|
415
|
+
detachEvents() {
|
|
416
|
+
const canvas = this.canvas;
|
|
417
|
+
if (!canvas)
|
|
418
|
+
return;
|
|
419
|
+
if (this.boundMouseDown)
|
|
420
|
+
canvas.removeEventListener("mousedown", this.boundMouseDown);
|
|
421
|
+
if (this.boundMouseUp)
|
|
422
|
+
canvas.removeEventListener("mouseup", this.boundMouseUp);
|
|
423
|
+
if (this.boundMouseMove)
|
|
424
|
+
canvas.removeEventListener("mousemove", this.boundMouseMove);
|
|
425
|
+
if (this.boundWheel)
|
|
426
|
+
canvas.removeEventListener("wheel", this.boundWheel);
|
|
427
|
+
if (this.boundKeyDown)
|
|
428
|
+
canvas.removeEventListener("keydown", this.boundKeyDown);
|
|
429
|
+
if (this.boundKeyUp)
|
|
430
|
+
canvas.removeEventListener("keyup", this.boundKeyUp);
|
|
431
|
+
if (this.boundFocus)
|
|
432
|
+
canvas.removeEventListener("focus", this.boundFocus);
|
|
433
|
+
if (this.boundBlur)
|
|
434
|
+
canvas.removeEventListener("blur", this.boundBlur);
|
|
435
|
+
if (this.boundContextMenu)
|
|
436
|
+
canvas.removeEventListener("contextmenu", this.boundContextMenu);
|
|
437
|
+
}
|
|
438
|
+
handleMouse(e, type) {
|
|
439
|
+
const conn = this.getConn();
|
|
440
|
+
if (!conn || !this.canvas || !this.surface || !this._displaySize)
|
|
441
|
+
return;
|
|
442
|
+
if (type === SURFACE_POINTER_DOWN) {
|
|
443
|
+
this.canvas.focus();
|
|
444
|
+
this.pressedButtons.add(e.button);
|
|
445
|
+
}
|
|
446
|
+
else if (type === SURFACE_POINTER_UP) {
|
|
447
|
+
this.pressedButtons.delete(e.button);
|
|
448
|
+
}
|
|
449
|
+
const rect = this.canvas.getBoundingClientRect();
|
|
450
|
+
// Send logical (CSS-pixel) coordinates — the compositor and CLI both
|
|
451
|
+
// operate in the Wayland surface's logical coordinate space.
|
|
452
|
+
const x = Math.round(e.clientX - rect.left);
|
|
453
|
+
const y = Math.round(e.clientY - rect.top);
|
|
454
|
+
conn.sendSurfacePointer(this.surface.sessionId, this._surfaceId, type, e.button, x, y);
|
|
455
|
+
}
|
|
456
|
+
/** Send synthetic pointer-up for any buttons still held. Prevents the
|
|
457
|
+
* compositor's implicit pointer grab from outliving this canvas. */
|
|
458
|
+
releaseAllButtons() {
|
|
459
|
+
if (this.pressedButtons.size === 0)
|
|
460
|
+
return;
|
|
461
|
+
const conn = this.getConn();
|
|
462
|
+
if (!conn || !this.surface)
|
|
463
|
+
return;
|
|
464
|
+
for (const button of this.pressedButtons) {
|
|
465
|
+
conn.sendSurfacePointer(this.surface.sessionId, this._surfaceId, SURFACE_POINTER_UP, button, 0, 0);
|
|
466
|
+
}
|
|
467
|
+
this.pressedButtons.clear();
|
|
468
|
+
}
|
|
469
|
+
handleWheel(e) {
|
|
470
|
+
const conn = this.getConn();
|
|
471
|
+
if (!conn || !this.surface || !this._displaySize)
|
|
472
|
+
return;
|
|
473
|
+
e.preventDefault();
|
|
474
|
+
const axis = Math.abs(e.deltaX) > Math.abs(e.deltaY) ? 1 : 0;
|
|
475
|
+
const value = axis === 0 ? e.deltaY : e.deltaX;
|
|
476
|
+
conn.sendSurfaceAxis(this.surface.sessionId, this._surfaceId, axis, Math.round(value * 100));
|
|
477
|
+
}
|
|
478
|
+
handleKey(e, pressed) {
|
|
479
|
+
// If a global shortcut (capture-phase) already handled this event,
|
|
480
|
+
// don't forward it to the Wayland surface.
|
|
481
|
+
if (e.defaultPrevented)
|
|
482
|
+
return;
|
|
483
|
+
// Only forward input when interactive (resizable/focused mode).
|
|
484
|
+
// Sidebar previews should not intercept keyboard or send events.
|
|
485
|
+
if (!this._displaySize)
|
|
486
|
+
return;
|
|
487
|
+
// Always prevent default so keystrokes never leak to the terminal
|
|
488
|
+
// textarea, even when the surface info hasn't arrived yet.
|
|
489
|
+
e.preventDefault();
|
|
490
|
+
const conn = this.getConn();
|
|
491
|
+
if (!conn || !this.surface)
|
|
492
|
+
return;
|
|
493
|
+
// On keydown, sync CapsLock if the browser state drifted from the
|
|
494
|
+
// compositor's (e.g. the user toggled CapsLock while a different
|
|
495
|
+
// element or window was focused).
|
|
496
|
+
if (pressed) {
|
|
497
|
+
this.syncCapsLock(e, conn);
|
|
498
|
+
}
|
|
499
|
+
const keycode = domKeyToEvdev(e.code);
|
|
500
|
+
if (keycode !== 0) {
|
|
501
|
+
if (pressed) {
|
|
502
|
+
this.pressedKeys.add(keycode);
|
|
503
|
+
}
|
|
504
|
+
else {
|
|
505
|
+
this.pressedKeys.delete(keycode);
|
|
506
|
+
}
|
|
507
|
+
conn.sendSurfaceInput(this.surface.sessionId, this._surfaceId, keycode, pressed);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
/** Send synthetic key-up for every key still held. Prevents stuck
|
|
511
|
+
* modifiers and runaway key-repeat when focus leaves the canvas. */
|
|
512
|
+
releaseAllKeys() {
|
|
513
|
+
if (this.pressedKeys.size === 0)
|
|
514
|
+
return;
|
|
515
|
+
const conn = this.getConn();
|
|
516
|
+
if (!conn || !this.surface)
|
|
517
|
+
return;
|
|
518
|
+
for (const kc of this.pressedKeys) {
|
|
519
|
+
conn.sendSurfaceInput(this.surface.sessionId, this._surfaceId, kc, false);
|
|
520
|
+
}
|
|
521
|
+
this.pressedKeys.clear();
|
|
522
|
+
}
|
|
523
|
+
handleBlur() {
|
|
524
|
+
this.releaseAllKeys();
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* Ensure the compositor's CapsLock state matches the browser before the
|
|
528
|
+
* current key event is forwarded.
|
|
529
|
+
*
|
|
530
|
+
* The browser's `getModifierState("CapsLock")` always reflects the OS
|
|
531
|
+
* state, but the compositor only sees key events forwarded through
|
|
532
|
+
* `handleKey`. If CapsLock was toggled while the surface was unfocused,
|
|
533
|
+
* the compositor's XKB state drifts. We detect the mismatch and inject
|
|
534
|
+
* a synthetic CapsLock press+release to bring it back in sync.
|
|
535
|
+
*
|
|
536
|
+
* For a regular key (not CapsLock itself) the rule is simple: if the
|
|
537
|
+
* browser and compositor disagree, inject a toggle.
|
|
538
|
+
*
|
|
539
|
+
* When the key IS CapsLock, `getModifierState` already shows the
|
|
540
|
+
* *post-toggle* value. The compositor will also toggle when it receives
|
|
541
|
+
* our forwarded keydown. For the end state to match we need the
|
|
542
|
+
* compositor's *pre-toggle* state to be the opposite of the browser's
|
|
543
|
+
* post-toggle value, i.e. `compositorCaps === !browserCaps`. If that
|
|
544
|
+
* doesn't hold we inject an extra toggle first so the real key lands
|
|
545
|
+
* correctly.
|
|
546
|
+
*/
|
|
547
|
+
syncCapsLock(e, conn) {
|
|
548
|
+
const browserCaps = e.getModifierState("CapsLock");
|
|
549
|
+
const compositorCaps = _compositorCapsLock.get(this._connectionId) ?? false;
|
|
550
|
+
let needsSync;
|
|
551
|
+
if (e.code === "CapsLock") {
|
|
552
|
+
// Browser shows post-toggle. Compositor will toggle on our forwarded
|
|
553
|
+
// keydown. We need compositorCaps === !browserCaps for the toggle to
|
|
554
|
+
// land at browserCaps. If not, inject a corrective toggle first.
|
|
555
|
+
needsSync = compositorCaps === browserCaps;
|
|
556
|
+
}
|
|
557
|
+
else {
|
|
558
|
+
needsSync = compositorCaps !== browserCaps;
|
|
559
|
+
}
|
|
560
|
+
if (needsSync) {
|
|
561
|
+
const kc = EVDEV_MAP.CapsLock; // 58
|
|
562
|
+
conn.sendSurfaceInput(this.surface.sessionId, this._surfaceId, kc, true);
|
|
563
|
+
conn.sendSurfaceInput(this.surface.sessionId, this._surfaceId, kc, false);
|
|
564
|
+
}
|
|
565
|
+
// Update tracking to the expected compositor state after this event.
|
|
566
|
+
if (e.code === "CapsLock") {
|
|
567
|
+
// Compositor will toggle (possibly twice if synthetic was sent).
|
|
568
|
+
// Either way it ends at browserCaps.
|
|
569
|
+
_compositorCapsLock.set(this._connectionId, browserCaps);
|
|
570
|
+
}
|
|
571
|
+
else if (needsSync) {
|
|
572
|
+
_compositorCapsLock.set(this._connectionId, !compositorCaps);
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
handleFocus() {
|
|
576
|
+
const conn = this.getConn();
|
|
577
|
+
if (!conn || !this.surface)
|
|
578
|
+
return;
|
|
579
|
+
conn.sendSurfaceFocus(this.surface.sessionId, this._surfaceId);
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
//# sourceMappingURL=BlitSurfaceCanvas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BlitSurfaceCanvas.js","sourceRoot":"","sources":["../src/BlitSurfaceCanvas.ts"],"names":[],"mappings":"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"}
|
|
@@ -73,6 +73,8 @@ export declare class BlitTerminalSurface {
|
|
|
73
73
|
private predictedFromCol;
|
|
74
74
|
private wasmReady;
|
|
75
75
|
private disposed;
|
|
76
|
+
private _ctrlModifier;
|
|
77
|
+
private _ctrlModifierListeners;
|
|
76
78
|
private dirtyUnsub;
|
|
77
79
|
private readyUnsub;
|
|
78
80
|
private resizeObserver;
|
|
@@ -91,6 +93,16 @@ export declare class BlitTerminalSurface {
|
|
|
91
93
|
get currentTerminal(): Terminal | null;
|
|
92
94
|
get status(): ConnectionStatus;
|
|
93
95
|
focus(): void;
|
|
96
|
+
/**
|
|
97
|
+
* Set the Ctrl modifier state for the next typed character.
|
|
98
|
+
* When active, the next character typed via the soft keyboard will be
|
|
99
|
+
* converted to its Ctrl+char byte equivalent (e.g. 'c' → Ctrl+C = 0x03).
|
|
100
|
+
* The modifier auto-resets after one character is consumed.
|
|
101
|
+
*/
|
|
102
|
+
setCtrlModifier(active: boolean): void;
|
|
103
|
+
get ctrlModifier(): boolean;
|
|
104
|
+
/** Subscribe to Ctrl modifier state changes. Returns unsubscribe function. */
|
|
105
|
+
onCtrlModifierChange(listener: (active: boolean) => void): () => void;
|
|
94
106
|
/** Attach to a container element. Creates the canvas + textarea inside it. */
|
|
95
107
|
attach(container: HTMLDivElement): void;
|
|
96
108
|
/** Detach from the current container. Removes all DOM elements and listeners. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BlitTerminalSurface.d.ts","sourceRoot":"","sources":["../src/BlitTerminalSurface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAW5E,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,IAAI,IAAI,CAAC;CACf;AA+BD;;;;;GAKG;AACH,qBAAa,mBAAmB;IAE9B,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,SAAS,CAA2C;IAC5D,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,aAAa,CAAqB;IAG1C,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,SAAS,CAA+B;IAGhD,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,OAAO,CAAoC;IAGnD,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,UAAU,CAAyC;IAC3D,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,GAAG,CAAS;IAEpB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,eAAe,CAA8C;IACrE,OAAO,CAAC,YAAY,CAQJ;IAChB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,gBAAgB,CAAK;IAE7B,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,gBAAgB,CAA+C;IAEvE,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAKF;IAEhB,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,gBAAgB,CAAK;IAE7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAS;
|
|
1
|
+
{"version":3,"file":"BlitTerminalSurface.d.ts","sourceRoot":"","sources":["../src/BlitTerminalSurface.ts"],"names":[],"mappings":"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"}
|