@gjsify/video 0.1.15

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.
@@ -0,0 +1,496 @@
1
+ import GObject from 'gi://GObject';
2
+ import GLib from 'gi://GLib?version=2.0';
3
+ import Gtk from 'gi://Gtk?version=4.0';
4
+ import { HTMLVideoElement } from '@gjsify/dom-elements';
5
+ import { BridgeEnvironment } from '@gjsify/bridge-types';
6
+ type VideoReadyCallback = (video: globalThis.HTMLVideoElement) => void;
7
+ /**
8
+ * A `Gtk.Box` subclass that hosts a `Gtk.Picture` for video rendering:
9
+ * - Creates an `HTMLVideoElement` on construction
10
+ * - Renders video via GStreamer `gtk4paintablesink` → `Gdk.Paintable` → `Gtk.Picture`
11
+ * - Supports `video.srcObject = mediaStream` (from getUserMedia/WebRTC)
12
+ * - Supports `video.src = "file:///..."` (URI playback via playbin)
13
+ * - Fires `onReady()` callbacks with the HTMLVideoElement
14
+ * - `installGlobals()` sets `globalThis.HTMLVideoElement`
15
+ *
16
+ * Usage:
17
+ * ```ts
18
+ * const bridge = new VideoBridge();
19
+ * bridge.installGlobals();
20
+ * bridge.onReady((video) => {
21
+ * video.srcObject = mediaStream; // from getUserMedia
22
+ * });
23
+ * window.set_child(bridge);
24
+ * ```
25
+ */
26
+ export declare const VideoBridge: {
27
+ new (params?: Partial<Gtk.Box.ConstructorProps>): {
28
+ _picture: Gtk.Picture;
29
+ _video: HTMLVideoElement;
30
+ _pipeline: any | null;
31
+ _readyCallbacks: VideoReadyCallback[];
32
+ _resizeCallbacks: ((w: number, h: number) => void)[];
33
+ _environment: BridgeEnvironment;
34
+ _timeOrigin: number;
35
+ _ready: boolean;
36
+ /** The HTMLVideoElement backing this bridge. */
37
+ get element(): HTMLVideoElement;
38
+ /** Alias for element — matches browser naming. */
39
+ get videoElement(): HTMLVideoElement;
40
+ /** The isolated browser environment for this bridge. */
41
+ get environment(): BridgeEnvironment;
42
+ /**
43
+ * Register a callback to be invoked once the video element is ready.
44
+ * If already ready, the callback fires synchronously.
45
+ */
46
+ onReady(cb: VideoReadyCallback): void;
47
+ /** Register a callback invoked whenever the widget is resized. */
48
+ onResize(cb: (width: number, height: number) => void): void;
49
+ /** Sets browser globals for video support. */
50
+ installGlobals(): void;
51
+ /** @internal Handle srcObject change (MediaStream) */
52
+ _onSrcObjectChange(): void;
53
+ /** @internal Handle src change (URI) */
54
+ _onSrcChange(): void;
55
+ /** @internal Tear down the GStreamer pipeline */
56
+ _destroyPipeline(): void;
57
+ get baseline_child(): number;
58
+ set baseline_child(val: number);
59
+ get baselineChild(): number;
60
+ set baselineChild(val: number);
61
+ get baseline_position(): Gtk.BaselinePosition;
62
+ set baseline_position(val: Gtk.BaselinePosition);
63
+ get baselinePosition(): Gtk.BaselinePosition;
64
+ set baselinePosition(val: Gtk.BaselinePosition);
65
+ get homogeneous(): boolean;
66
+ set homogeneous(val: boolean);
67
+ get spacing(): number;
68
+ set spacing(val: number);
69
+ $signals: Gtk.Box.SignalSignatures;
70
+ _init(...args: any[]): void;
71
+ connect<K extends keyof Gtk.Box.SignalSignatures>(signal: K, callback: GObject.SignalCallback</*elided*/ any, Gtk.Box.SignalSignatures[K]>): number;
72
+ connect(signal: string, callback: (...args: any[]) => any): number;
73
+ connect_after<K extends keyof Gtk.Box.SignalSignatures>(signal: K, callback: GObject.SignalCallback</*elided*/ any, Gtk.Box.SignalSignatures[K]>): number;
74
+ connect_after(signal: string, callback: (...args: any[]) => any): number;
75
+ emit<K extends keyof Gtk.Box.SignalSignatures>(signal: K, ...args: GObject.GjsParameters<Gtk.Box.SignalSignatures[K]> extends [any, ...infer Q] ? Q : never): void;
76
+ emit(signal: string, ...args: any[]): void;
77
+ append(child: Gtk.Widget): void;
78
+ get_baseline_child(): number;
79
+ get_baseline_position(): Gtk.BaselinePosition;
80
+ get_homogeneous(): boolean;
81
+ get_spacing(): number;
82
+ insert_child_after(child: Gtk.Widget, sibling?: Gtk.Widget | null): void;
83
+ prepend(child: Gtk.Widget): void;
84
+ remove(child: Gtk.Widget): void;
85
+ reorder_child_after(child: Gtk.Widget, sibling?: Gtk.Widget | null): void;
86
+ set_baseline_child(child: number): void;
87
+ set_baseline_position(position: Gtk.BaselinePosition): void;
88
+ set_homogeneous(homogeneous: boolean): void;
89
+ set_spacing(spacing: number): void;
90
+ get accessible_role(): Gtk.AccessibleRole;
91
+ set accessible_role(val: Gtk.AccessibleRole);
92
+ get accessibleRole(): Gtk.AccessibleRole;
93
+ set accessibleRole(val: Gtk.AccessibleRole);
94
+ get orientation(): Gtk.Orientation;
95
+ set orientation(val: Gtk.Orientation);
96
+ announce(message: string, priority: Gtk.AccessibleAnnouncementPriority): void;
97
+ get_accessible_id(): string | null;
98
+ get_accessible_parent(): Gtk.Accessible | null;
99
+ get_accessible_role(): Gtk.AccessibleRole;
100
+ get_at_context(): Gtk.ATContext;
101
+ get_bounds(): [boolean, number, number, number, number];
102
+ get_first_accessible_child(): Gtk.Accessible | null;
103
+ get_next_accessible_sibling(): Gtk.Accessible | null;
104
+ get_platform_state(state: Gtk.AccessiblePlatformState): boolean;
105
+ reset_property(property: Gtk.AccessibleProperty): void;
106
+ reset_relation(relation: Gtk.AccessibleRelation): void;
107
+ reset_state(state: Gtk.AccessibleState): void;
108
+ set_accessible_parent(parent?: Gtk.Accessible | null, next_sibling?: Gtk.Accessible | null): void;
109
+ update_next_accessible_sibling(new_sibling?: Gtk.Accessible | null): void;
110
+ update_platform_state(state: Gtk.AccessiblePlatformState): void;
111
+ update_property(properties: Gtk.AccessibleProperty[], values: (GObject.Value | any)[]): void;
112
+ update_relation(relations: Gtk.AccessibleRelation[], values: (GObject.Value | any)[]): void;
113
+ update_state(states: Gtk.AccessibleState[], values: (GObject.Value | any)[]): void;
114
+ vfunc_get_accessible_id(): string | null;
115
+ vfunc_get_accessible_parent(): Gtk.Accessible | null;
116
+ vfunc_get_at_context(): Gtk.ATContext | null;
117
+ vfunc_get_bounds(): [boolean, number, number, number, number];
118
+ vfunc_get_first_accessible_child(): Gtk.Accessible | null;
119
+ vfunc_get_next_accessible_sibling(): Gtk.Accessible | null;
120
+ vfunc_get_platform_state(state: Gtk.AccessiblePlatformState): boolean;
121
+ get_buildable_id(): string | null;
122
+ vfunc_add_child(builder: Gtk.Builder, child: GObject.Object, type?: string | null): void;
123
+ vfunc_custom_finished(builder: Gtk.Builder, child: GObject.Object | null, tagname: string, data?: any | null): void;
124
+ vfunc_custom_tag_end(builder: Gtk.Builder, child: GObject.Object | null, tagname: string, data?: any | null): void;
125
+ vfunc_custom_tag_start(builder: Gtk.Builder, child: GObject.Object | null, tagname: string): [boolean, Gtk.BuildableParser, any];
126
+ vfunc_get_id(): string;
127
+ vfunc_get_internal_child<T = GObject.Object>(builder: Gtk.Builder, childname: string): T;
128
+ vfunc_parser_finished(builder: Gtk.Builder): void;
129
+ vfunc_set_buildable_property(builder: Gtk.Builder, name: string, value: unknown): void;
130
+ vfunc_set_id(id: string): void;
131
+ get_orientation(): Gtk.Orientation;
132
+ set_orientation(orientation: Gtk.Orientation): void;
133
+ bind_property(source_property: string, target: GObject.Object, target_property: string, flags: GObject.BindingFlags): GObject.Binding;
134
+ bind_property_full(source_property: string, target: GObject.Object, target_property: string, flags: GObject.BindingFlags, transform_to?: GObject.BindingTransformFunc | null, transform_from?: GObject.BindingTransformFunc | null, notify?: GLib.DestroyNotify | null): GObject.Binding;
135
+ bind_property_full(...args: never[]): any;
136
+ force_floating(): void;
137
+ freeze_notify(): void;
138
+ get_data(key: string): any | null;
139
+ get_property(property_name: string, value: GObject.Value | any): any;
140
+ get_qdata(quark: GLib.Quark): any | null;
141
+ getv(names: string[], values: (GObject.Value | any)[]): void;
142
+ is_floating(): boolean;
143
+ notify(property_name: string): void;
144
+ notify_by_pspec(pspec: GObject.ParamSpec): void;
145
+ ref(): GObject.Object;
146
+ ref_sink(): GObject.Object;
147
+ run_dispose(): void;
148
+ set_data(key: string, data?: any | null): void;
149
+ set_property(property_name: string, value: GObject.Value | any): void;
150
+ steal_data(key: string): any | null;
151
+ steal_qdata(quark: GLib.Quark): any | null;
152
+ thaw_notify(): void;
153
+ unref(): void;
154
+ watch_closure(closure: GObject.Closure): void;
155
+ vfunc_constructed(): void;
156
+ vfunc_dispatch_properties_changed(n_pspecs: number, pspecs: GObject.ParamSpec): void;
157
+ vfunc_dispose(): void;
158
+ vfunc_finalize(): void;
159
+ vfunc_get_property(property_id: number, value: unknown, pspec: GObject.ParamSpec): void;
160
+ vfunc_notify(pspec: GObject.ParamSpec): void;
161
+ vfunc_set_property(property_id: number, value: unknown, pspec: GObject.ParamSpec): void;
162
+ disconnect(id: number): void;
163
+ set(properties: {
164
+ [key: string]: any;
165
+ }): void;
166
+ block_signal_handler(id: number): void;
167
+ unblock_signal_handler(id: number): void;
168
+ stop_emission_by_name(detailedName: string): void;
169
+ get can_focus(): boolean;
170
+ set can_focus(val: boolean);
171
+ get canFocus(): boolean;
172
+ set canFocus(val: boolean);
173
+ get can_target(): boolean;
174
+ set can_target(val: boolean);
175
+ get canTarget(): boolean;
176
+ set canTarget(val: boolean);
177
+ get css_classes(): string[];
178
+ set css_classes(val: string[]);
179
+ get cssClasses(): string[];
180
+ set cssClasses(val: string[]);
181
+ get css_name(): string;
182
+ get cssName(): string;
183
+ get cursor(): import("@girs/gdk-4.0").default.Cursor;
184
+ set cursor(val: import("@girs/gdk-4.0").default.Cursor);
185
+ get focus_on_click(): boolean;
186
+ set focus_on_click(val: boolean);
187
+ get focusOnClick(): boolean;
188
+ set focusOnClick(val: boolean);
189
+ get focusable(): boolean;
190
+ set focusable(val: boolean);
191
+ get halign(): Gtk.Align;
192
+ set halign(val: Gtk.Align);
193
+ get has_default(): boolean;
194
+ get hasDefault(): boolean;
195
+ get has_focus(): boolean;
196
+ get hasFocus(): boolean;
197
+ get has_tooltip(): boolean;
198
+ set has_tooltip(val: boolean);
199
+ get hasTooltip(): boolean;
200
+ set hasTooltip(val: boolean);
201
+ get height_request(): number;
202
+ set height_request(val: number);
203
+ get heightRequest(): number;
204
+ set heightRequest(val: number);
205
+ get hexpand(): boolean;
206
+ set hexpand(val: boolean);
207
+ get hexpand_set(): boolean;
208
+ set hexpand_set(val: boolean);
209
+ get hexpandSet(): boolean;
210
+ set hexpandSet(val: boolean);
211
+ get layout_manager(): Gtk.LayoutManager;
212
+ set layout_manager(val: Gtk.LayoutManager);
213
+ get layoutManager(): Gtk.LayoutManager;
214
+ set layoutManager(val: Gtk.LayoutManager);
215
+ get limit_events(): boolean;
216
+ set limit_events(val: boolean);
217
+ get limitEvents(): boolean;
218
+ set limitEvents(val: boolean);
219
+ get margin_bottom(): number;
220
+ set margin_bottom(val: number);
221
+ get marginBottom(): number;
222
+ set marginBottom(val: number);
223
+ get margin_end(): number;
224
+ set margin_end(val: number);
225
+ get marginEnd(): number;
226
+ set marginEnd(val: number);
227
+ get margin_start(): number;
228
+ set margin_start(val: number);
229
+ get marginStart(): number;
230
+ set marginStart(val: number);
231
+ get margin_top(): number;
232
+ set margin_top(val: number);
233
+ get marginTop(): number;
234
+ set marginTop(val: number);
235
+ get name(): string;
236
+ set name(val: string);
237
+ get opacity(): number;
238
+ set opacity(val: number);
239
+ get overflow(): Gtk.Overflow;
240
+ set overflow(val: Gtk.Overflow);
241
+ get parent(): Gtk.Widget;
242
+ get receives_default(): boolean;
243
+ set receives_default(val: boolean);
244
+ get receivesDefault(): boolean;
245
+ set receivesDefault(val: boolean);
246
+ get root(): Gtk.Root;
247
+ get scale_factor(): number;
248
+ get scaleFactor(): number;
249
+ get sensitive(): boolean;
250
+ set sensitive(val: boolean);
251
+ get tooltip_markup(): string;
252
+ set tooltip_markup(val: string);
253
+ get tooltipMarkup(): string;
254
+ set tooltipMarkup(val: string);
255
+ get tooltip_text(): string;
256
+ set tooltip_text(val: string);
257
+ get tooltipText(): string;
258
+ set tooltipText(val: string);
259
+ get valign(): Gtk.Align;
260
+ set valign(val: Gtk.Align);
261
+ get vexpand(): boolean;
262
+ set vexpand(val: boolean);
263
+ get vexpand_set(): boolean;
264
+ set vexpand_set(val: boolean);
265
+ get vexpandSet(): boolean;
266
+ set vexpandSet(val: boolean);
267
+ get visible(): boolean;
268
+ set visible(val: boolean);
269
+ get width_request(): number;
270
+ set width_request(val: number);
271
+ get widthRequest(): number;
272
+ set widthRequest(val: number);
273
+ vfunc_compute_expand(hexpand_p: boolean, vexpand_p: boolean): void;
274
+ vfunc_contains(x: number, y: number): boolean;
275
+ vfunc_css_changed(change: Gtk.CssStyleChange): void;
276
+ vfunc_direction_changed(previous_direction: Gtk.TextDirection): void;
277
+ vfunc_focus(direction: Gtk.DirectionType): boolean;
278
+ vfunc_get_request_mode(): Gtk.SizeRequestMode;
279
+ vfunc_grab_focus(): boolean;
280
+ vfunc_hide(): void;
281
+ vfunc_keynav_failed(direction: Gtk.DirectionType): boolean;
282
+ vfunc_map(): void;
283
+ vfunc_measure(orientation: Gtk.Orientation, for_size: number): [number, number, number, number];
284
+ vfunc_mnemonic_activate(group_cycling: boolean): boolean;
285
+ vfunc_move_focus(direction: Gtk.DirectionType): void;
286
+ vfunc_query_tooltip(x: number, y: number, keyboard_tooltip: boolean, tooltip: Gtk.Tooltip): boolean;
287
+ vfunc_realize(): void;
288
+ vfunc_root(): void;
289
+ vfunc_set_focus_child(child?: Gtk.Widget | null): void;
290
+ vfunc_show(): void;
291
+ vfunc_size_allocate(width: number, height: number, baseline: number): void;
292
+ vfunc_snapshot(snapshot: Gtk.Snapshot): void;
293
+ vfunc_state_flags_changed(previous_state_flags: Gtk.StateFlags): void;
294
+ vfunc_system_setting_changed(settings: Gtk.SystemSetting): void;
295
+ vfunc_unmap(): void;
296
+ vfunc_unrealize(): void;
297
+ vfunc_unroot(): void;
298
+ action_set_enabled(action_name: string, enabled: boolean): void;
299
+ activate(): boolean;
300
+ activate_action(name: string, args?: GLib.Variant | null): boolean;
301
+ activate_default(): void;
302
+ add_controller(controller: Gtk.EventController): void;
303
+ add_css_class(css_class: string): void;
304
+ add_mnemonic_label(label: Gtk.Widget): void;
305
+ add_tick_callback(callback: Gtk.TickCallback): number;
306
+ allocate(width: number, height: number, baseline: number, transform?: import("@girs/gsk-4.0").default.Transform | null): void;
307
+ child_focus(direction: Gtk.DirectionType): boolean;
308
+ compute_bounds(target: Gtk.Widget): [boolean, import("@girs/graphene-1.0").default.Rect];
309
+ compute_expand(orientation: Gtk.Orientation): boolean;
310
+ compute_point(target: Gtk.Widget, point: import("@girs/graphene-1.0").default.Point): [boolean, import("@girs/graphene-1.0").default.Point];
311
+ compute_transform(target: Gtk.Widget): [boolean, import("@girs/graphene-1.0").default.Matrix];
312
+ contains(x: number, y: number): boolean;
313
+ create_pango_context(): import("@girs/pango-1.0").default.Context;
314
+ create_pango_layout(text?: string | null): import("@girs/pango-1.0").default.Layout;
315
+ dispose_template(widget_type: GObject.GType): void;
316
+ drag_check_threshold(start_x: number, start_y: number, current_x: number, current_y: number): boolean;
317
+ error_bell(): void;
318
+ get_allocated_baseline(): number;
319
+ get_allocated_height(): number;
320
+ get_allocated_width(): number;
321
+ get_allocation(): Gtk.Allocation;
322
+ get_ancestor(widget_type: GObject.GType): Gtk.Widget | null;
323
+ get_baseline(): number;
324
+ get_can_focus(): boolean;
325
+ get_can_target(): boolean;
326
+ get_child_visible(): boolean;
327
+ get_clipboard(): import("@girs/gdk-4.0").default.Clipboard;
328
+ get_color(): import("@girs/gdk-4.0").default.RGBA;
329
+ get_css_classes(): string[];
330
+ get_css_name(): string;
331
+ get_cursor(): import("@girs/gdk-4.0").default.Cursor | null;
332
+ get_direction(): Gtk.TextDirection;
333
+ get_display(): import("@girs/gdk-4.0").default.Display;
334
+ get_first_child(): Gtk.Widget | null;
335
+ get_focus_child(): Gtk.Widget | null;
336
+ get_focus_on_click(): boolean;
337
+ get_focusable(): boolean;
338
+ get_font_map(): import("@girs/pango-1.0").default.FontMap | null;
339
+ get_font_options(): import("@girs/gjs/cairo").default.FontOptions | null;
340
+ get_frame_clock(): import("@girs/gdk-4.0").default.FrameClock | null;
341
+ get_halign(): Gtk.Align;
342
+ get_has_tooltip(): boolean;
343
+ get_height(): number;
344
+ get_hexpand(): boolean;
345
+ get_hexpand_set(): boolean;
346
+ get_last_child(): Gtk.Widget | null;
347
+ get_layout_manager(): Gtk.LayoutManager | null;
348
+ get_limit_events(): boolean;
349
+ get_mapped(): boolean;
350
+ get_margin_bottom(): number;
351
+ get_margin_end(): number;
352
+ get_margin_start(): number;
353
+ get_margin_top(): number;
354
+ get_name(): string;
355
+ get_native(): Gtk.Native | null;
356
+ get_next_sibling(): Gtk.Widget | null;
357
+ get_opacity(): number;
358
+ get_overflow(): Gtk.Overflow;
359
+ get_pango_context(): import("@girs/pango-1.0").default.Context;
360
+ get_parent(): Gtk.Widget | null;
361
+ get_preferred_size(): [Gtk.Requisition | null, Gtk.Requisition | null];
362
+ get_prev_sibling(): Gtk.Widget | null;
363
+ get_primary_clipboard(): import("@girs/gdk-4.0").default.Clipboard;
364
+ get_realized(): boolean;
365
+ get_receives_default(): boolean;
366
+ get_request_mode(): Gtk.SizeRequestMode;
367
+ get_root(): Gtk.Root | null;
368
+ get_scale_factor(): number;
369
+ get_sensitive(): boolean;
370
+ get_settings(): Gtk.Settings;
371
+ get_size(orientation: Gtk.Orientation): number;
372
+ get_size_request(): [number, number];
373
+ get_state_flags(): Gtk.StateFlags;
374
+ get_style_context(): Gtk.StyleContext;
375
+ get_template_child<T = GObject.Object>(widget_type: GObject.GType, name: string): T;
376
+ get_tooltip_markup(): string | null;
377
+ get_tooltip_text(): string | null;
378
+ get_valign(): Gtk.Align;
379
+ get_vexpand(): boolean;
380
+ get_vexpand_set(): boolean;
381
+ get_visible(): boolean;
382
+ get_width(): number;
383
+ grab_focus(): boolean;
384
+ has_css_class(css_class: string): boolean;
385
+ has_visible_focus(): boolean;
386
+ hide(): void;
387
+ in_destruction(): boolean;
388
+ init_template(): void;
389
+ insert_action_group(name: string, group?: import("@girs/gio-2.0").default.ActionGroup | null): void;
390
+ insert_after(parent: Gtk.Widget, previous_sibling?: Gtk.Widget | null): void;
391
+ insert_before(parent: Gtk.Widget, next_sibling?: Gtk.Widget | null): void;
392
+ is_ancestor(ancestor: Gtk.Widget): boolean;
393
+ is_drawable(): boolean;
394
+ is_focus(): boolean;
395
+ is_sensitive(): boolean;
396
+ is_visible(): boolean;
397
+ keynav_failed(direction: Gtk.DirectionType): boolean;
398
+ list_mnemonic_labels(): Gtk.Widget[];
399
+ map(): void;
400
+ measure(orientation: Gtk.Orientation, for_size: number): [number, number, number, number];
401
+ mnemonic_activate(group_cycling: boolean): boolean;
402
+ observe_children(): import("@girs/gio-2.0").default.ListModel;
403
+ observe_controllers(): import("@girs/gio-2.0").default.ListModel;
404
+ pick(x: number, y: number, flags: Gtk.PickFlags): Gtk.Widget | null;
405
+ queue_allocate(): void;
406
+ queue_draw(): void;
407
+ queue_resize(): void;
408
+ realize(): void;
409
+ remove_controller(controller: Gtk.EventController): void;
410
+ remove_css_class(css_class: string): void;
411
+ remove_mnemonic_label(label: Gtk.Widget): void;
412
+ remove_tick_callback(id: number): void;
413
+ set_can_focus(can_focus: boolean): void;
414
+ set_can_target(can_target: boolean): void;
415
+ set_child_visible(child_visible: boolean): void;
416
+ set_css_classes(classes: string[]): void;
417
+ set_cursor(cursor?: import("@girs/gdk-4.0").default.Cursor | null): void;
418
+ set_cursor_from_name(name?: string | null): void;
419
+ set_direction(dir: Gtk.TextDirection): void;
420
+ set_focus_child(child?: Gtk.Widget | null): void;
421
+ set_focus_on_click(focus_on_click: boolean): void;
422
+ set_focusable(focusable: boolean): void;
423
+ set_font_map(font_map?: import("@girs/pango-1.0").default.FontMap | null): void;
424
+ set_font_options(options?: import("@girs/gjs/cairo").default.FontOptions | null): void;
425
+ set_halign(align: Gtk.Align): void;
426
+ set_has_tooltip(has_tooltip: boolean): void;
427
+ set_hexpand(expand: boolean): void;
428
+ set_hexpand_set(set: boolean): void;
429
+ set_layout_manager(layout_manager?: Gtk.LayoutManager | null): void;
430
+ set_limit_events(limit_events: boolean): void;
431
+ set_margin_bottom(margin: number): void;
432
+ set_margin_end(margin: number): void;
433
+ set_margin_start(margin: number): void;
434
+ set_margin_top(margin: number): void;
435
+ set_name(name: string): void;
436
+ set_opacity(opacity: number): void;
437
+ set_overflow(overflow: Gtk.Overflow): void;
438
+ set_parent(parent: Gtk.Widget): void;
439
+ set_receives_default(receives_default: boolean): void;
440
+ set_sensitive(sensitive: boolean): void;
441
+ set_size_request(width: number, height: number): void;
442
+ set_state_flags(flags: Gtk.StateFlags, clear: boolean): void;
443
+ set_tooltip_markup(markup?: string | null): void;
444
+ set_tooltip_text(text?: string | null): void;
445
+ set_valign(align: Gtk.Align): void;
446
+ set_vexpand(expand: boolean): void;
447
+ set_vexpand_set(set: boolean): void;
448
+ set_visible(visible: boolean): void;
449
+ should_layout(): boolean;
450
+ show(): void;
451
+ size_allocate(allocation: Gtk.Allocation, baseline: number): void;
452
+ snapshot_child(child: Gtk.Widget, snapshot: Gtk.Snapshot): void;
453
+ translate_coordinates(dest_widget: Gtk.Widget, src_x: number, src_y: number): [boolean, number, number];
454
+ trigger_tooltip_query(): void;
455
+ unmap(): void;
456
+ unparent(): void;
457
+ unrealize(): void;
458
+ unset_state_flags(flags: Gtk.StateFlags): void;
459
+ [Symbol.iterator]: () => IterableIterator<Gtk.Widget>;
460
+ };
461
+ $gtype: GObject.GType<Gtk.Box>;
462
+ "new"(orientation: Gtk.Orientation, spacing: number): Gtk.Box;
463
+ get_default_direction(): Gtk.TextDirection;
464
+ set_default_direction(dir: Gtk.TextDirection): void;
465
+ add_shortcut(shortcut: Gtk.Shortcut): void;
466
+ bind_template_callback_full(callback_name: string, callback_symbol: GObject.Callback): void;
467
+ bind_template_child_full(name: string, internal_child: boolean, struct_offset: bigint | number): void;
468
+ get_accessible_role(): Gtk.AccessibleRole;
469
+ get_activate_signal(): number;
470
+ get_css_name(): string;
471
+ get_layout_manager_type(): GObject.GType;
472
+ install_action(action_name: string, parameter_type: string | null, activate: Gtk.WidgetActionActivateFunc): void;
473
+ install_property_action(action_name: string, property_name: string): void;
474
+ query_action(index_: number): [boolean, GObject.GType, string, GLib.VariantType | null, string];
475
+ set_accessible_role(accessible_role: Gtk.AccessibleRole): void;
476
+ set_activate_signal(signal_id: number): void;
477
+ set_activate_signal_from_name(signal_name: string): void;
478
+ set_css_name(name: string): void;
479
+ set_layout_manager_type(type: GObject.GType): void;
480
+ set_template(template_bytes: GLib.Bytes | Uint8Array): void;
481
+ set_template_from_resource(resource_name: string): void;
482
+ set_template_scope(scope: Gtk.BuilderScope): void;
483
+ newv(object_type: GObject.GType, parameters: GObject.Parameter[]): GObject.Object;
484
+ compat_control(what: bigint | number, data?: any | null): number;
485
+ interface_find_property(g_iface: GObject.TypeInterface, property_name: string): GObject.ParamSpec;
486
+ interface_install_property(g_iface: GObject.TypeInterface, pspec: GObject.ParamSpec): void;
487
+ interface_list_properties(g_iface: GObject.TypeInterface): GObject.ParamSpec[];
488
+ find_property(property_name: string): GObject.ParamSpec;
489
+ install_properties(pspecs: GObject.ParamSpec[]): void;
490
+ install_property(property_id: number, pspec: GObject.ParamSpec): void;
491
+ list_properties(): GObject.ParamSpec[];
492
+ override_property(property_id: number, name: string): void;
493
+ _classInit(klass: any): any;
494
+ };
495
+ export type VideoBridge = InstanceType<typeof VideoBridge>;
496
+ export {};
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@gjsify/video",
3
+ "version": "0.1.15",
4
+ "description": "VideoBridge — GTK container for HTMLVideoElement backed by GStreamer gtk4paintablesink",
5
+ "type": "module",
6
+ "module": "lib/esm/index.js",
7
+ "types": "lib/types/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./lib/types/index.d.ts",
11
+ "default": "./lib/esm/index.js"
12
+ }
13
+ },
14
+ "scripts": {
15
+ "clear": "rm -rf lib tmp tsconfig.tsbuildinfo || exit 0",
16
+ "check": "tsc --noEmit",
17
+ "build": "yarn build:gjsify && yarn build:types",
18
+ "build:gjsify": "gjsify build --library 'src/**/*.{ts,js}' --exclude 'src/**/*.spec.{mts,ts}' 'src/test.{mts,ts}'",
19
+ "build:types": "tsc"
20
+ },
21
+ "keywords": [
22
+ "gjs",
23
+ "gtk",
24
+ "video",
25
+ "gstreamer",
26
+ "bridge"
27
+ ],
28
+ "dependencies": {
29
+ "@girs/gdk-4.0": "^4.0.0-4.0.0-rc.3",
30
+ "@girs/gjs": "^4.0.0-rc.3",
31
+ "@girs/glib-2.0": "^2.88.0-4.0.0-rc.3",
32
+ "@girs/gobject-2.0": "^2.88.0-4.0.0-rc.3",
33
+ "@girs/gst-1.0": "^1.28.1-4.0.0-rc.3",
34
+ "@girs/gtk-4.0": "^4.23.0-4.0.0-rc.3",
35
+ "@gjsify/bridge-types": "^0.1.15",
36
+ "@gjsify/dom-elements": "^0.1.15",
37
+ "@gjsify/dom-events": "^0.1.15",
38
+ "@gjsify/event-bridge": "^0.1.15"
39
+ },
40
+ "devDependencies": {
41
+ "@gjsify/cli": "^0.1.15",
42
+ "@types/node": "^25.6.0",
43
+ "typescript": "^6.0.2"
44
+ }
45
+ }
@@ -0,0 +1,41 @@
1
+ // Lazy GStreamer initialization for the Video bridge.
2
+ //
3
+ // gtk4paintablesink ships with GStreamer's gst-plugins-rs (Rust plugins).
4
+ // On Fedora: gstreamer1-plugin-gtk4
5
+ // On Ubuntu/Debian: gstreamer1.0-gtk4
6
+ //
7
+ // This module is GJS-only — the Node alias layer routes it to @gjsify/empty.
8
+
9
+ import Gst from 'gi://Gst?version=1.0';
10
+
11
+ let initialized = false;
12
+
13
+ export function ensureGstInit(): void {
14
+ if (initialized) return;
15
+ Gst.init(null as any);
16
+ initialized = true;
17
+ }
18
+
19
+ /** Throws if the gtk4paintablesink element is not registered. */
20
+ export function ensurePaintableSinkAvailable(): void {
21
+ ensureGstInit();
22
+ const factory = Gst.ElementFactory.find('gtk4paintablesink');
23
+ if (!factory) {
24
+ throwNotSupported(
25
+ 'GStreamer element "gtk4paintablesink" not available. Install gst-plugins-rs:\n' +
26
+ ' Fedora: dnf install gstreamer1-plugin-gtk4\n' +
27
+ ' Ubuntu/Debian: apt install gstreamer1.0-gtk4\n' +
28
+ ' Verify with: gst-inspect-1.0 gtk4paintablesink',
29
+ );
30
+ }
31
+ }
32
+
33
+ function throwNotSupported(message: string): never {
34
+ const DOMExceptionCtor: typeof DOMException | undefined = (globalThis as any).DOMException;
35
+ if (DOMExceptionCtor) {
36
+ throw new DOMExceptionCtor(message, 'NotSupportedError');
37
+ }
38
+ throw new Error(message);
39
+ }
40
+
41
+ export { Gst };
package/src/index.ts ADDED
@@ -0,0 +1,15 @@
1
+ // Video bridge for GJS — Gtk.Picture container backed by GStreamer gtk4paintablesink.
2
+ // Reimplemented for GJS using GStreamer + GTK4.
3
+
4
+ export { VideoBridge } from './video-bridge.js';
5
+ export { buildMediaStreamPipeline, buildUriPipeline, createPaintableSink } from './pipeline-builder.js';
6
+
7
+ // Side-effect: register so that document.createElement('video') works
8
+ // (already built into @gjsify/dom-elements, but register the global constructor)
9
+ import { HTMLVideoElement } from '@gjsify/dom-elements';
10
+
11
+ Object.defineProperty(globalThis, 'HTMLVideoElement', {
12
+ value: HTMLVideoElement,
13
+ writable: true,
14
+ configurable: true,
15
+ });