Skip to content

DOM & Graphics

DOM elements and graphics APIs for GJS, bridging the gap between web and GTK.

PackageGNOME LibsImplements
dom-elementsGdkPixbuf, @gjsify/canvas2d-coreNode, Element, HTMLElement, HTMLCanvasElement (auto-registers '2d' context factory), HTMLImageElement, HTMLMediaElement, HTMLVideoElement, Document, MutationObserver, ResizeObserver, IntersectionObserver
canvas2d-coreCairo, PangoCairoHeadless CanvasRenderingContext2D, CanvasGradient, CanvasPattern, Path2D, ImageData — no GTK dependency
canvas2d@gjsify/canvas2d-core, Cairo, PangoCairo, Gtk 4Re-exports canvas2d-core + FontFace + Canvas2DBridge → Gtk.DrawingArea
webglGtk 4.0, GObject, libepoxyWebGL 1.0/2.0 via Vala native extension
event-bridgeGtk 4.0, Gdk 4.0GTK→DOM event mapping (mouse, pointer, keyboard, wheel, focus)
iframeWebKit 6.0HTMLIFrameElement, IFrameBridge → WebKit.WebView, postMessage bridge
videoGst 1.0, Gtk 4.0HTMLVideoElement, VideoBridge → Gtk.Picture (gtk4paintablesink). srcObject (MediaStream from getUserMedia/WebRTC) + src (URI via playbin)
bridge-typesDOMBridgeContainer interface, BridgeEnvironment, BridgeWindow

Each visual DOM element is backed by a GTK widget:

DOM ElementWidgetBacking Library
HTMLCanvasElement (2d)Canvas2DBridgeGtk.DrawingAreaCairo + PangoCairo
HTMLCanvasElement (webgl/webgl2)WebGLBridgeGtk.GLAreaOpenGL ES / libepoxy via gwebgl Vala
HTMLIFrameElementIFrameBridgeWebKit.WebViewWebKit 6.0
HTMLVideoElementVideoBridgeGtk.Picturegtk4paintablesink (GStreamer)
HTMLImageElementGdkPixbuf
import { Canvas2DBridge } from '@gjsify/canvas2d';
const widget = new Canvas2DBridge();
widget.installGlobals();
widget.onReady((canvas, ctx) => {
ctx.fillStyle = '#3584e4';
ctx.fillRect(10, 10, 200, 100);
ctx.font = '24px sans-serif';
ctx.fillText('Hello GNOME!', 30, 70);
});
window.set_child(widget);
import { WebGLBridge } from '@gjsify/webgl';
const widget = new WebGLBridge();
widget.installGlobals();
widget.onReady((canvas, gl) => {
gl.clearColor(0.2, 0.3, 0.8, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
});
window.set_child(widget);