gelm

package module
v0.0.0-...-5632c62 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 11, 2026 License: MIT Imports: 0 Imported by: 0

README

gelm

A pure-Go (no cgo) widget toolkit for Wayland, built as a feature-complete counterpart of relm4: a component framework with typed messages, a retained widget tree with GTK4/libadwaita-class widgets, xdg-shell and layer-shell windows, a GTK-flavored CSS engine over a typed palette, the desktop's portals and protocols, and an event loop that idles at 0% CPU.

Status

gelm runs on sway and Hyprland, and both are required CI gates: the compositor-in-the-loop suite runs against a private headless sway (just headless) and against Hyprland in a private NixOS VM (just hyprland-vm). docs/completeness.md maps every capability against relm4, GTK4 and libadwaita.

Install

go get github.com/stubbedev/gelm@latest

Packages

Apps import the public packages; everything under internal/ is implementation.

Package Contents
component the component framework: components, controllers, factories, workers, commands
component/componenttest a loop that runs components in tests without a compositor
ui typed view builders, one per widget
app the session, windows and layer surfaces, the loop, dialogs, popovers, desktop services
widget the widget tree, theme, CSS, actions, bindings
widget/css libadwaita's style classes and named colors as constants
render the premultiplied canvas, shaped text, icons
anim tweens, easing, springs and timelines
appearance the desktop's color scheme, accent and contrast preferences
i18n gettext catalogs (.mo, .po)
highlight syntax highlighters for the code view
media video and sound playback
pdf PDF writing
transfer the shared shape of clipboard and drag-and-drop content
dmabuf dma-buf frame descriptions
capture screen and window capture
vinput virtual pointer and keyboard injection
wlr generated Wayland protocol bindings

A minimal app

package main

import (
	"log"
	"strconv"

	"github.com/stubbedev/gelm/app"
	"github.com/stubbedev/gelm/component"
	"github.com/stubbedev/gelm/ui"
	"github.com/stubbedev/gelm/widget"
)

type Msg int

const (
	Increment Msg = iota
	Decrement
)

type Counter struct {
	env ui.Env
	n   int
}

func (c *Counter) Init(cx *component.Context[Msg, int]) widget.Widget {
	return ui.Mount(cx, c.env, ui.Row(
		ui.Button(ui.Label("-"), 8, 6).OnClick(func() { cx.Input(Decrement) }),
		ui.Expand(ui.Label("").WatchText(func() string { return strconv.Itoa(c.n) })),
		ui.Button(ui.Label("+"), 8, 6).OnClick(func() { cx.Input(Increment) }),
	).Spacing(6))
}

func (c *Counter) Update(cx *component.Context[Msg, int], msg Msg) {
	switch msg {
	case Increment:
		c.n++
	case Decrement:
		c.n--
	}
	cx.Output(c.n)
}

func main() {
	err := component.Run(app.WindowConfig{Title: "counter", AppID: "dev.example.counter"},
		func(a *app.Application) (*Counter, error) {
			face, err := app.Font("sans-serif", 15)
			if err != nil {
				return nil, err
			}
			if err := a.AddAccel("Escape", widget.NewAction("quit", a.Quit)); err != nil {
				return nil, err
			}
			return &Counter{env: ui.Env{Face: face, Size: 15}}, nil
		})
	if err != nil {
		log.Fatal(err)
	}
}

This program is kept compiling as ExampleRun in component/example_test.go. docs/components.md walks through components, the typed builders, factories, workers and actions. app.NewApplication and NewWindow are the lower-level path for apps that want the widget tree without components (ExampleApplication in app/example_test.go).

Development

devenv shell       # pinned Go, gopls, golangci-lint, just, sway; CGO_ENABLED=0
just demo          # the gelm-hello showcase

The gates, all required in CI:

just check         # go vet, golangci-lint, go test, build
just fmt-check     # gofumpt and gci formatting
just headless      # the compositor-in-the-loop suite on a private headless sway
just hyprland-vm   # the same suite against Hyprland in a private NixOS VM (needs KVM)
just atspi         # the AT-SPI bridge on a private accessibility bus
just atspi-verify  # the bridge against real at-spi2-core

just bench runs the benchmarks; CI archives the numbers without gating on them (bench/baseline.md holds the method and the allocation budgets the tests enforce). just goldens regenerates the golden-image snapshots after a deliberate visual change.

nix build .#gelm builds the module and every demo with the pinned toolchain. Pushing a v* tag releases gelm-hello, gelm-bar and gelm-panel (linux/amd64 and arm64) through goreleaser.

Documentation

Document Contents
docs/completeness.md the capability map against relm4/GTK/libadwaita, and the known gaps
docs/architecture.md the layers, the invariants that keep them correct, theming, non-goals
docs/application-model.md windows, layer surfaces, disconnects, single instance, file dialogs, data transfer, chrome
docs/components.md the component framework: components, typed view builders, tracking, controllers, children, testing
docs/threading.md the loop goroutine, Invoke/Every, the off-loop guard, the typed messaging layer
docs/input-model.md routing, implicit grab, click/drag, drag and drop, keyboard, IME, touch, tablets
docs/css.md the CSS layer: selectors, values, properties, cascade, lifecycle
docs/appearance.md following the desktop's color scheme, accent and contrast
docs/icons.md icon-theme lookup and symbolic recoloring
docs/a11y.md semantic roles, the keyboard-first guarantee, the AT-SPI bridge
docs/inspector.md the live widget inspector, tree dump, and doctor block

Demos

Command What it shows
cmd/gelm-hello the showcase as a component: core widgets, a context menu on typed actions, tooltips, Tab focus, drag-to-move
cmd/gelm-bar a layer-shell top bar repainting only what changed each second
cmd/gelm-panel a right-anchored layer-shell panel with live widgets
cmd/gelm-launcher a launcher: a keyboard-exclusive overlay, a filtered app grid, live toplevel thumbnails through capture
cmd/gelm-osd an OSD: a transient layer-shell volume/brightness popup over the overlay layer
cmd/gelm-lock a lock screen: one ext-session-lock surface per output with an auth entry
cmd/gelm-multi one loop: per-output layer bars, on-demand windows, close-request veto
cmd/gelm-invoke a lifetime-bound spawned command and Every feeding a component
cmd/gelm-messages the typed messaging layer and single-instance forwarding
cmd/gelm-settings a settings app: PreferencesView rows, the adaptive shell, typed persisted settings
cmd/gelm-columns ten thousand sorted, filtered rows; the tree view; drag-to-reorder
cmd/gelm-dialogs every dialog constructor: message, prompt, color, font, calendar, file, adaptive, about
cmd/gelm-dnd cross-window drag-and-drop: swatches that drag and drop between two toplevels
cmd/gelm-draw custom painting: a DrawingArea animating straight onto the Canvas
cmd/gelm-ime IME composition: preedit and commit mirrored from an entry and a text area
cmd/gelm-a11y a labeled form served over AT-SPI; builds with -tags atspi to force the bridge on
cmd/gelm-capture the capture consumer: list, screenshot, and monitor outputs and windows to PNG
cmd/gelm-gpu a GPUArea paced by its own frame callbacks, with gelm drawing over it
cmd/gelm-video a video with its controls: a file through ffmpeg, or a generated clip decoded in pure Go
cmd/gelm-i18n a gettext .po catalog (plurals included) localizing built-in and app strings
cmd/gelm-states the window-state client the headless suite drives: xdg state chords, mirrored from what the compositor confirms
cmd/gelm-multilist the multi-select client the headless suite drives: a multiple-selection list with keyboard and rubber-band selection
cmd/gelm-popover the popover client the headless suite drives: popup grabs, live repaints, nested menus
cmd/wlpointer, cmd/zz-vpclick synthetic input for the headless suite

Dependencies

All pure Go: neurlang/wayland (patched copy in third_party/), godbus/dbus, go-text/typesetting, rivo/uniseg, golang.org/x/image, golang.org/x/text, golang.org/x/sys, srwiley/oksvg + rasterx, kettek/apng, yalue/native_endian, unxed/xkb-go, and jfreymuth/pulse (the PulseAudio protocol, which pipewire-pulse also serves). media.OpenFile runs ffmpeg and ffprobe from PATH when an app plays a file; nothing else needs them.

License

MIT

Documentation

Overview

Package gelm is a pure-Go (no cgo) widget toolkit for Wayland and a counterpart of relm4: a component framework with typed messages, a retained widget tree with GTK4/libadwaita-class widgets, xdg-shell windows and layer-shell surfaces, a CSS engine over a typed palette, the desktop's portals and protocols, and one event loop that idles at 0% CPU.

Applications import the public packages:

component  the component framework: components, controllers,
           factories, workers, commands (headless tests in
           component/componenttest)
ui         typed view builders, one per widget
app        the session, windows and layer surfaces, the loop,
           dialogs, popovers, desktop services
widget     the widget tree, theme, CSS, actions, bindings
           (libadwaita style classes in widget/css)
render     the premultiplied canvas, shaped text, icons
anim       tweens, easing, springs and timelines
appearance the desktop's color scheme, accent and contrast
i18n       gettext catalogs
highlight  syntax highlighters for the code view
media      video and sound playback
pdf        PDF writing
transfer   clipboard and drag-and-drop content
dmabuf     dma-buf frame descriptions
capture    screen and window capture
vinput     virtual pointer and keyboard injection
wlr        generated Wayland protocol bindings

Everything under internal/ is implementation. The docs/ directory holds the reference: architecture, components, the application, input and threading models, CSS, appearance, icons, accessibility, the inspector, and the capability map in docs/completeness.md.

Directories

Path Synopsis
Package anim declares time-based animations: tweens with easing curves, combined into timelines with Sequence, Parallel and Delay, and launched with Play.
Package anim declares time-based animations: tweens with easing curves, combined into timelines with Sequence, Parallel and Delay, and launched with Play.
Package app owns the shared event loop: buffer pooling, input routing into the widget tree, frame-callback pacing, and idle dispatch.
Package app owns the shared event loop: buffer pooling, input routing into the widget tree, frame-callback pacing, and idle dispatch.
Package appearance holds the desktop's presentation preferences as xdg-desktop-portal publishes them: the color scheme, the accent color and the contrast level.
Package appearance holds the desktop's presentation preferences as xdg-desktop-portal publishes them: the color scheme, the accent color and the contrast level.
Package capture copies screen contents out of the compositor: whole outputs and output regions through wlr-screencopy, single windows through ext-image-copy-capture (with the ext-foreign-toplevel-list enumeration and its capture sources) or Hyprland's toplevel-export, and continuous damage-driven output capture through an ext-image-copy-capture session (Stream).
Package capture copies screen contents out of the compositor: whole outputs and output regions through wlr-screencopy, single windows through ext-image-copy-capture (with the ext-foreign-toplevel-list enumeration and its capture sources) or Hyprland's toplevel-export, and continuous damage-driven output capture through an ext-image-copy-capture session (Stream).
cmd
gelm-a11y command
Command gelm-a11y is the accessibility demo target: a small form whose every control carries a semantic role and label, served to screen readers through the in-process AT-SPI bridge.
Command gelm-a11y is the accessibility demo target: a small form whose every control carries a semantic role and label, served to screen readers through the in-process AT-SPI bridge.
gelm-bar command
Command gelm-bar is a layer-shell top bar component: a logo pill, the clock, and a seconds gauge, ticked once a second by Application.Every.
Command gelm-bar is a layer-shell top bar component: a logo pill, the clock, and a seconds gauge, ticked once a second by Application.Every.
gelm-capture command
Command gelm-capture is the capture package's consumer: it lists the compositor's outputs and toplevels, screenshots any of them to a PNG (whole outputs through wlr-screencopy or ext-image-copy-capture, single windows through the foreign toplevel capture), and follows one output continuously with the damage-driven Stream, writing a numbered PNG per changed frame.
Command gelm-capture is the capture package's consumer: it lists the compositor's outputs and toplevels, screenshots any of them to a PNG (whole outputs through wlr-screencopy or ext-image-copy-capture, single windows through the foreign toplevel capture), and follows one output continuously with the damage-driven Stream, writing a numbered PNG per changed frame.
gelm-columns command
Command gelm-columns is the tabular/tree view demo (#90): ten thousand rows sorted and filtered through the header and the search entry (both instant - the view is virtualized), a tree tab with the expander column and indent guides, and a drag-to-reorder tab.
Command gelm-columns is the tabular/tree view demo (#90): ten thousand rows sorted and filtered through the header and the search entry (both instant - the view is virtualized), a tree tab with the expander column and indent guides, and a drag-to-reorder tab.
gelm-dialogs command
Command gelm-dialogs is the dialogs showcase: one window of buttons opening every preset dialog constructor - MessageBox, PromptDialog, ColorChooserDialog, FontChooserDialog, CalendarDialog - plus the file dialogs, the adaptive dialog, and the about dialog, all parented to the window so modality and Escape behavior can be compared side by side.
Command gelm-dialogs is the dialogs showcase: one window of buttons opening every preset dialog constructor - MessageBox, PromptDialog, ColorChooserDialog, FontChooserDialog, CalendarDialog - plus the file dialogs, the adaptive dialog, and the about dialog, all parented to the window so modality and Escape behavior can be compared side by side.
gelm-dnd command
Command gelm-dnd is the cross-window drag-and-drop demo: two toplevel windows, each holding color swatches that are both drag sources and drop targets.
Command gelm-dnd is the cross-window drag-and-drop demo: two toplevel windows, each holding color swatches that are both drag sources and drop targets.
gelm-draw command
Command gelm-draw is the custom-drawing demo, the relm4 drawing example's analog: a widget.DrawingArea whose OnDraw paints straight onto the Canvas - a polar rose sampled per point, a sweep hand, and axis lines - with QueueDraw on a timer animating it, damage tracking repainting only the area.
Command gelm-draw is the custom-drawing demo, the relm4 drawing example's analog: a widget.DrawingArea whose OnDraw paints straight onto the Canvas - a polar rose sampled per point, a sweep hand, and axis lines - with QueueDraw on a timer animating it, damage tracking repainting only the area.
gelm-gpu command
Command gelm-gpu shows a GPUArea: the area's surface sits below the window and the application paces its own frames through OnFrame.
Command gelm-gpu shows a GPUArea: the area's surface sits below the window and the application paces its own frames through OnFrame.
gelm-hello command
Command gelm-hello is the showcase demo, built the way an app outside this module builds one: a component whose view is declared with the typed ui builders, hosted in one toplevel window.
Command gelm-hello is the showcase demo, built the way an app outside this module builds one: a component whose view is declared with the typed ui builders, hosted in one toplevel window.
gelm-i18n command
Command gelm-i18n localizes one app with a real gettext catalog: the Norwegian .po embedded under locale/ is loaded through package i18n, and every string - gelm's built-in chrome (dialog buttons, the file picker's places) and the demo's own, a plural included - flows through widget.Tr and TrN. It starts in the environment's language when a catalog exists for it; the button toggles.
Command gelm-i18n localizes one app with a real gettext catalog: the Norwegian .po embedded under locale/ is loaded through package i18n, and every string - gelm's built-in chrome (dialog buttons, the file picker's places) and the demo's own, a plural included - flows through widget.Tr and TrN. It starts in the environment's language when a catalog exists for it; the button toggles.
gelm-ime command
Command gelm-ime is the IME composition demo: an entry and a text area driven by whatever input method the desktop runs, with a status line mirroring each field's composing state and contents - the preedit an IME shows at the caret, and the commit that lands when composition finishes.
Command gelm-ime is the IME composition demo: an entry and a text area driven by whatever input method the desktop runs, with a status line mirroring each field's composing state and contents - the preedit an IME shows at the caret, and the commit that lands when composition finishes.
gelm-invoke command
Command gelm-invoke demonstrates the threading model.
Command gelm-invoke demonstrates the threading model.
gelm-launcher command
Command gelm-launcher is the M5 launcher app: a keyboard-exclusive layer-shell overlay holding a search entry that filters a grid of apps, and live thumbnails of the compositor's open toplevels captured through the capture package on a private connection.
Command gelm-launcher is the M5 launcher app: a keyboard-exclusive layer-shell overlay holding a search entry that filters a grid of apps, and live thumbnails of the compositor's open toplevels captured through the capture package on a private connection.
gelm-lock command
Command gelm-lock is the M5 lock screen: one ext-session-lock-v1 surface per output with a centered auth entry, built through app.LockSession.
Command gelm-lock is the M5 lock screen: one ext-session-lock-v1 surface per output with a centered auth entry, built through app.LockSession.
gelm-messages command
Command gelm-messages demonstrates the typed messaging layer (app/message.go) and single-instance activation (app/instance.go): one SharedState counter shared across two windows - either window's buttons move both labels - and one Stream broker that any depth of code can reach without threading senders: both windows subscribe, a button publishes, every window toasts.
Command gelm-messages demonstrates the typed messaging layer (app/message.go) and single-instance activation (app/instance.go): one SharedState counter shared across two windows - either window's buttons move both labels - and one Stream broker that any depth of code can reach without threading senders: both windows subscribe, a button publishes, every window toasts.
gelm-multi command
Command gelm-multi exercises the application model: one process running a declarative layer-shell bar on every output plus toplevel windows created on demand, with a close-request veto.
Command gelm-multi exercises the application model: one process running a declarative layer-shell bar on every output plus toplevel windows created on demand, with a close-request veto.
gelm-multilist command
Command gelm-multilist is the multi-select list client the headless input suite (internal/headlesstest) drives: one window holding a multiple-selection widget.List whose selection and activation land in the trace log, so synthetic keyboard and pointer gestures can be asserted end to end through the compositor.
Command gelm-multilist is the multi-select list client the headless input suite (internal/headlesstest) drives: one window holding a multiple-selection widget.List whose selection and activation land in the trace log, so synthetic keyboard and pointer gestures can be asserted end to end through the compositor.
gelm-osd command
Command gelm-osd is the M5 OSD app: a transient layer-shell popup anchored top-center over the overlay layer - the volume or brightness notification media keys produce.
Command gelm-osd is the M5 OSD app: a transient layer-shell popup anchored top-center over the overlay layer - the volume or brightness notification media keys produce.
gelm-panel command
Command gelm-panel is the layer-shell demo: a right-anchored panel component with a slider, progress bar, switch, checkbox, text entry, notes area and a scrollable list, live through the pointer and keyboard input stack.
Command gelm-panel is the layer-shell demo: a right-anchored panel component with a slider, progress bar, switch, checkbox, text entry, notes area and a scrollable list, live through the pointer and keyboard input stack.
gelm-popover command
Command gelm-popover is the popover client the headless input suite (internal/headlesstest) drives: one window whose button opens a popover holding a focused Entry and a label a timer keeps changing, so typing through the popup grab and loop-driven repaints of an open popover can be asserted end to end through the compositor.
Command gelm-popover is the popover client the headless input suite (internal/headlesstest) drives: one window whose button opens a popover holding a focused Entry and a label a timer keeps changing, so typing through the popup grab and loop-driven repaints of an open popover can be asserted end to end through the compositor.
gelm-settings command
Command gelm-settings is the M5 settings app: typed persisted keys (app/settings.go) behind PreferencesView rows - the adaptive shell of pages, view switcher, and built-in search - so every edit writes through to <config>/dev.stubbe.gelm.settings/settings.json and every restart comes back exactly where it left off.
Command gelm-settings is the M5 settings app: typed persisted keys (app/settings.go) behind PreferencesView rows - the adaptive shell of pages, view switcher, and built-in search - so every edit writes through to <config>/dev.stubbe.gelm.settings/settings.json and every restart comes back exactly where it left off.
gelm-states command
Command gelm-states is the window-state client the headless state suite (internal/headlesstest) drives: one toplevel whose keyboard chords issue the xdg_toplevel state requests - m maximize, n unmaximize, f fullscreen, g unfullscreen, i minimize, p poll the reported state, Escape close - while a status label mirrors only what the compositor CONFIRMS.
Command gelm-states is the window-state client the headless state suite (internal/headlesstest) drives: one toplevel whose keyboard chords issue the xdg_toplevel state requests - m maximize, n unmaximize, f fullscreen, g unfullscreen, i minimize, p poll the reported state, Escape close - while a status label mirrors only what the compositor CONFIRMS.
gelm-video command
Command gelm-video plays a video: a file through ffmpeg (picture and sound) when one is named, otherwise a generated YUV4MPEG2 clip of moving bars decoded in pure Go.
Command gelm-video plays a video: a file through ffmpeg (picture and sound) when one is named, otherwise a generated YUV4MPEG2 clip of moving bars decoded in pure Go.
wlpointer command
Command wlpointer drives a zwlr_virtual_pointer_v1 device against a Wayland compositor: synthetic pointer input for interactive testing.
Command wlpointer drives a zwlr_virtual_pointer_v1 device against a Wayland compositor: synthetic pointer input for interactive testing.
zz-vpclick command
The harness clicker: pointer clicks, wheel, keys, and text on $WAYLAND_DISPLAY through the headless suite's virtual pointer — the manual companion to internal/headlesstest's in-process driving, used to walk a live surface (the settings app on a nested sway) while its trace log runs.
The harness clicker: pointer clicks, wheel, keys, and text on $WAYLAND_DISPLAY through the headless suite's virtual pointer — the manual companion to internal/headlesstest's in-process driving, used to walk a live surface (the settings app on a nested sway) while its trace log runs.
Package component is gelm's component framework, the counterpart of relm4's Component: a model with typed input and output messages, an Init that builds its view, an Update that runs on the loop goroutine for every input, and controllers that own a component's lifetime and forward its outputs.
Package component is gelm's component framework, the counterpart of relm4's Component: a model with typed input and output messages, an Init that builds its view, an Update that runs on the loop goroutine for every input, and controllers that own a component's lifetime and forward its outputs.
componenttest
Package componenttest runs components without a compositor: a Loop that queues invoked work until the test drives it.
Package componenttest runs components without a compositor: a Loop that queues invoked work until the test drives it.
Package dmabuf describes Linux dma-buf frames: GPU (or udmabuf) memory handed to the compositor by file descriptor through zwp_linux_dmabuf_v1, with no copy.
Package dmabuf describes Linux dma-buf frames: GPU (or udmabuf) memory handed to the compositor by file descriptor through zwp_linux_dmabuf_v1, with no copy.
Package highlight holds syntax highlighters for widget.TextArea (GtkSourceView's language definitions).
Package highlight holds syntax highlighters for widget.TextArea (GtkSourceView's language definitions).
Package i18n is gettext in pure Go: GNU .mo and .po catalogs with plural forms and message contexts, locale resolution from the environment, and catalog lookup in a file system.
Package i18n is gettext in pure Go: GNU .mo and .po catalogs with plural forms and message contexts, locale resolution from the environment, and catalog lookup in a file system.
internal
animclock
Package animclock is the animation scheduler the application loop drives: launched pieces, the frame deadlines the loop wakes on, and the tick that advances them.
Package animclock is the animation scheduler the application loop drives: launched pieces, the frame deadlines the loop wakes on, and the tick that advances them.
atomicfile
Package atomicfile replaces files whole: the content goes to a uniquely named temporary file beside the target, which is synced and renamed over it, so a reader sees the old file or the new one and never a partial write, and concurrent writers never share a temporary.
Package atomicfile replaces files whole: the content goes to a uniquely named temporary file beside the target, which is synced and renamed over it, so a reader sees the old file or the new one and never a partial write, and concurrent writers never share a temporary.
atspi
Package atspi is the in-process AT-SPI bridge (#65): it serves the widget tree's accessibility semantics (widget.Describe and the semantic roles, the plain-Go model of widget/a11y.go) over D-Bus in the AT-SPI2 shape, so screen readers and tools like accerciser can walk a gelm application.
Package atspi is the in-process AT-SPI bridge (#65): it serves the widget tree's accessibility semantics (widget.Describe and the semantic roles, the plain-Go model of widget/a11y.go) over D-Bus in the AT-SPI2 shape, so screen readers and tools like accerciser can walk a gelm application.
buffer
Arena: one wl_shm pool per session.
Arena: one wl_shm pool per session.
clipboard
Package clipboard implements text copy and paste over the core wl_data_device protocol and, when the compositor offers it, the zwp_primary_selection_unstable_v1 protocol: the offer pipeline for reading a selection, and data sources for claiming either.
Package clipboard implements text copy and paste over the core wl_data_device protocol and, when the compositor offers it, the zwp_primary_selection_unstable_v1 protocol: the offer pipeline for reading a selection, and data sources for claiming either.
cmd/uigen command
Command uigen writes package ui's generated builders: go generate in ui runs it.
Command uigen writes package ui's generated builders: go generate in ui runs it.
compose
Package compose turns keysym sequences into text: pressing ' then e on a us-intl/deadkeys layout commits "é".
Package compose turns keysym sequences into text: pressing ' then e on a us-intl/deadkeys layout commits "é".
datacontrol
Package datacontrol is the clipboard-manager side of the seat's selections, over ext_data_control_v1 or, on compositors that predate it, zwlr_data_control_unstable_v1.
Package datacontrol is the clipboard-manager side of the seat's selections, over ext_data_control_v1 or, on compositors that predate it, zwlr_data_control_unstable_v1.
dbustest
Package dbustest runs private D-Bus daemons for tests: a session- style bus on a fresh unix socket, configured from a file the helper writes itself, so a test needs dbus-daemon on PATH and nothing in /etc (where a distro's session.conf may be absent - NixOS, minimal containers).
Package dbustest runs private D-Bus daemons for tests: a session- style bus on a fresh unix socket, configured from a file the helper writes itself, so a test needs dbus-daemon on PATH and nothing in /etc (where a distro's session.conf may be absent - NixOS, minimal containers).
debug
Package debug is gelm's compile-time trace facility.
Package debug is gelm's compile-time trace facility.
dmabufwl
Package dmabufwl builds zwp_linux_buffer_params_v1 objects from dmabuf descriptions, the step every linux-dmabuf import shares.
Package dmabufwl builds zwp_linux_buffer_params_v1 objects from dmabuf descriptions, the step every linux-dmabuf import shares.
dragdrop
Package dragdrop implements drag and drop over the wl_data_device protocol: the source side (data source + start_drag with an icon), the destination side (offer bookkeeping, accept/reject, payload transfer), and the routing of enter/motion/leave/drop to the target registered for the surface under the drag.
Package dragdrop implements drag and drop over the wl_data_device protocol: the source side (data source + start_drag with an icon), the destination side (offer bookkeeping, accept/reject, payload transfer), and the routing of enter/motion/leave/drop to the target registered for the surface under the drag.
emoji
Package emoji is gelm's emoji chooser data (#92): a curated table of common Unicode emoji grouped by category with search keywords, parsed once from a compact literal.
Package emoji is gelm's emoji chooser data (#92): a curated table of common Unicode emoji grouped by category with search keywords, parsed once from a compact literal.
golden
Package golden compares rendered pixels against committed PNG snapshots ("goldens"), so render-level tests can assert byte-stable output on any machine.
Package golden compares rendered pixels against committed PNG snapshots ("goldens"), so render-level tests can assert byte-stable output on any machine.
headlesstest
Compositor drivers for the harness: the suite itself is compositor-agnostic; the pieces that differ - how to close a client window through the compositor's own control channel, where the boot recipe records the pid, what it named the config and log - live behind this interface.
Compositor drivers for the harness: the suite itself is compositor-agnostic; the pieces that differ - how to close a client window through the compositor's own control channel, where the boot recipe records the pid, what it named the config and log - live behind this interface.
headlesstest/inproc
Package inproc runs gelm applications inside a test process against the headless compositor and inspects the output through screencopy: the in-process half of the compositor-in-the-loop suite, for tests that drive the app API directly instead of a demo client.
Package inproc runs gelm applications inside a test process against the headless compositor and inspects the output through screencopy: the in-process half of the compositor-in-the-loop suite, for tests that drive the app API directly instead of a demo client.
icons
Icon-theme following (#64): the cache applies live icon-theme switches delivered by the portal monitor (internal/portalsettings), which the application wires in.
Icon-theme following (#64): the cache applies live icon-theme switches delivered by the portal monitor (internal/portalsettings), which the application wires in.
imgcache
Package imgcache caches decoded raster images and the resampled rasters widget.Image paints from, under one shared LRU budget.
Package imgcache caches decoded raster images and the resampled rasters widget.Image paints from, under one shared LRU budget.
inspect
The doctor diagnostics block: one line block a bug report carries verbatim ("here is my gelm doctor output"), covering the session's bound globals and their versions, outputs and scales, the resolved cursor theme, the fonts sysfont selected, and the shm buffer format.
The doctor diagnostics block: one line block a bug report carries verbatim ("here is my gelm doctor output"), covering the session's bound globals and their versions, outputs and scales, the resolved cursor theme, the fonts sysfont selected, and the shm buffer format.
keymapfd
Package keymapfd reads the xkb keymap a wl_keyboard.keymap event carries.
Package keymapfd reads the xkb keymap a wl_keyboard.keymap event carries.
layersurface
Package layersurface maps the wlr-layer-shell role onto a wl_surface: anchor, layer, keyboard mode, the configure handshake, and the closed signal.
Package layersurface maps the wlr-layer-shell role onto a wl_surface: anchor, layer, keyboard mode, the configure handshake, and the closed signal.
logutil
Package logutil holds gelm's single injectable logger.
Package logutil holds gelm's single injectable logger.
mailbox
Package mailbox is the coalesced-wake queue every loop messenger shares: items appended from any goroutine, drained in order on the loop by one closure the first append schedules.
Package mailbox is the coalesced-wake queue every loop messenger shares: items appended from any goroutine, drained in order on the loop by one closure the first append schedules.
notify
Package notify sends desktop notifications: the xdg-desktop-portal Notification interface when a portal owns the desktop, org.freedesktop.Notifications (the GNOME spec every daemon implements) as the fallback, and nothing at all without a session bus - the appearance.md failure model, inert and logged at Debug.
Package notify sends desktop notifications: the xdg-desktop-portal Notification interface when a portal owns the desktop, org.freedesktop.Notifications (the GNOME spec every daemon implements) as the fallback, and nothing at all without a session bus - the appearance.md failure model, inert and logged at Debug.
popup
The enter/exit visual half of a popup: a slide-and-fade wrapper the coordinator drives.
The enter/exit visual half of a popup: a slide-and-fade wrapper the coordinator drives.
portalsettings
Package portalsettings follows the desktop settings xdg-desktop-portal publishes (color scheme, accent color, contrast, icon theme) over the session bus.
Package portalsettings follows the desktop settings xdg-desktop-portal publishes (color scheme, accent color, contrast, icon theme) over the session bus.
recentfiles
Package recentfiles tracks recently used files in the XDG recently-used.xbel format (TOML-free, XML as the spec says), so gelm apps share the recents list with the desktop's other citizens.
Package recentfiles tracks recently used files in the XDG recently-used.xbel format (TOML-free, XML as the spec says), so gelm apps share the recents list with the desktop's other citizens.
scale
Package scale owns one surface's buffer scaling: the integer wl_surface fallback, the optional wp_viewporter and wp_fractional_scale_v1 objects, and the output transform.
Package scale owns one surface's buffer scaling: the integer wl_surface fallback, the optional wp_viewporter and wp_fractional_scale_v1 objects, and the output transform.
sessionlock
Package sessionlock maps ext-session-lock-v1 onto gelm: the lock object's locked/finished lifecycle and the per-output lock surface role with its configure handshake.
Package sessionlock maps ext-session-lock-v1 onto gelm: the lock object's locked/finished lifecycle and the per-output lock surface role with its configure handshake.
style
Package style is gelm's CSS engine: a tokenizer and parser for the GTK-flavored subset docs/css.md scopes, the rule index, and the matcher/cascader that computes one widget's style — custom properties with var() substitution, calc(), color-mix(), and per-longhand cascade across prioritized stylesheets and per-widget inline declarations.
Package style is gelm's CSS engine: a tokenizer and parser for the GTK-flavored subset docs/css.md scopes, the rule index, and the matcher/cascader that computes one widget's style — custom properties with var() substitution, calc(), color-mix(), and per-longhand cascade across prioritized stylesheets and per-widget inline declarations.
surfx
Package surfx is the surface-animation coordinator: one state machine every transient surface (menus, tooltips, toasts, dropdown lists, dialogs, layer overlays) drives its enter and exit tweens through, instead of one ad-hoc implementation per surface kind.
Package surfx is the surface-animation coordinator: one state machine every transient surface (menus, tooltips, toasts, dropdown lists, dialogs, layer overlays) drives its enter and exit tweens through, instead of one ad-hoc implementation per surface kind.
sysfont
Package sysfont resolves system fonts through fontscan's CSS font selection rules, replacing per-app guesswork.
Package sysfont resolves system fonts through fontscan's CSS font selection rules, replacing per-app guesswork.
text
Bidirectional resolution (UAX #9) for every text path in the toolkit (#68): mixed Hebrew/Arabic + Latin lines resolve into directional runs that the shaper lays out visually correct, and the editable widgets map caret motion through.
Bidirectional resolution (UAX #9) for every text path in the toolkit (#68): mixed Hebrew/Arabic + Latin lines resolve into directional runs that the shaper lays out visually correct, and the editable widgets map caret motion through.
touchinput
Package touchinput is the session-to-widget bridge for the non-pointer devices every input surface embeds (app windows, popups): it implements wlsession.SurfaceTouchHandler, SurfaceGestureHandler and SurfaceTabletHandler over a widget.TouchTracker, the router's gestures, and its stylus samples.
Package touchinput is the session-to-widget bridge for the non-pointer devices every input surface embeds (app windows, popups): it implements wlsession.SurfaceTouchHandler, SurfaceGestureHandler and SurfaceTabletHandler over a widget.TouchTracker, the router's gestures, and its stylus samples.
udmabuf
Package udmabuf allocates linear, CPU-visible dmabufs through /dev/udmabuf: a sealed memfd wrapped as a dmabuf, so tests and demos can hand the compositor dmabufs they fill and read without a GPU library.
Package udmabuf allocates linear, CPU-visible dmabufs through /dev/udmabuf: a sealed memfd wrapped as a dmabuf, so tests and demos can hand the compositor dmabufs they fill and read without a GPU library.
uigen
Package uigen generates package ui's typed builders from package widget's source: one builder per widget type, a constructor per New* function, a chainable method per setter, adder, binder and exported field, and the props every widget shares through its embedded node.
Package uigen generates package ui's typed builders from package widget's source: one builder per widget type, a constructor per New* function, a chainable method per setter, adder, binder and exported field, and the props every widget shares through its embedded node.
window
Package window maps the xdg-shell role onto a wl_surface: real toplevel windows with titles, the configure handshake, the compositor-confirmed state set, ping/pong liveness, and the close signal.
Package window maps the xdg-shell role onto a wl_surface: real toplevel windows with titles, the configure handshake, the compositor-confirmed state set, ping/pong liveness, and the close signal.
wlnull
Package wlnull is the null object argument the generated Wayland bindings cannot send: a typed-nil proxy (a nil *xdg.Surface, a nil *wl.Output) encodes as object 0 but then panics in the wire encoder's new-id scan, which calls Id on every proxy argument.
Package wlnull is the null object argument the generated Wayland bindings cannot send: a typed-nil proxy (a nil *xdg.Surface, a nil *wl.Output) encodes as object 0 but then panics in the wire encoder's new-id scan, which calls Id on every proxy argument.
wlsession
XDG activation: optional xdg_activation_v1 support — the compositor-consented focus request.
XDG activation: optional xdg_activation_v1 support — the compositor-consented focus request.
xfer
Package xfer moves selection and drag-and-drop payloads through the pipes Wayland hands the two ends of a transfer.
Package xfer moves selection and drag-and-drop payloads through the pipes Wayland hands the two ends of a transfer.
Package media is gelm's playback framework, GTK's GtkMediaStream in pure Go: a Source decodes frames (and, when Audible, sound), and a Stream plays one on the loop with play, pause, seek, loop, volume and a clock that follows the audio when there is any.
Package media is gelm's playback framework, GTK's GtkMediaStream in pure Go: a Source decodes frames (and, when Audible, sound), and a Stream plays one on the loop with play, pause, seek, loop, volume and a clock that follows the audio when there is any.
Package pdf writes PDF documents in pure Go: pages of RGB raster images, Flate-compressed and streamed to an io.Writer as they are added.
Package pdf writes PDF documents in pure Go: pages of RGB raster images, Flate-compressed and streamed to an io.Writer as they are added.
The CSS box primitives: per-corner rounded fills, rounded border rings with per-side widths and colors, angled multi-stop linear gradients, and box shadows with offset, spread, blur, and inset — everything a CSS box paints behind its content.
The CSS box primitives: per-corner rounded fills, rounded border rings with per-side widths and colors, angled multi-stop linear gradients, and box shadows with offset, spread, blur, and inset — everything a CSS box paints behind its content.
third_party
neurlang-wayland/external/swizzle
Package swizzle provides functions for converting between RGBA pixel formats.
Package swizzle provides functions for converting between RGBA pixel formats.
neurlang-wayland/os
Package os implements an operating system routines useful for graphics
Package os implements an operating system routines useful for graphics
neurlang-wayland/unstable/text-input-v3
Package text implements the text_input_unstable_v3 protocol
Package text implements the text_input_unstable_v3 protocol
neurlang-wayland/unstable/xdg-decoration-v1
Package xdg implements the xdg_decoration_unstable_v1 protocol
Package xdg implements the xdg_decoration_unstable_v1 protocol
neurlang-wayland/wl
Package wl implements the stable Wayland protocol
Package wl implements the stable Wayland protocol
neurlang-wayland/wlclient
Package wlclient implements a wayland-client like api
Package wlclient implements a wayland-client like api
neurlang-wayland/wlcursor
Package wlcursor implements a Wayland cursor
Package wlcursor implements a Wayland cursor
neurlang-wayland/wlcursor/xcursor
Package xcursor loads and parses the X cursor
Package xcursor loads and parses the X cursor
neurlang-wayland/xdg
Package xdg implements the stable XDG Window Manager Base protocol
Package xdg implements the stable XDG Window Manager Base protocol
Package transfer is the content shape every data transfer shares: clipboard claims, the primary selection, and drag and drop all offer a payload as mime types, best first, with a writer for each, and all read one back by mime preference.
Package transfer is the content shape every data transfer shares: clipboard claims, the primary selection, and drag and drop all offer a payload as mime types, best first, with a writer for each, and all read one back by mime preference.
Package ui declares widget trees with typed builders, the counterpart of relm4's view! macro.
Package ui declares widget trees with typed builders, the counterpart of relm4's view! macro.
Package vinput injects pointer and keyboard input into the compositor through zwlr_virtual_pointer_v1 and zwp_virtual_keyboard_v1, on a private Wayland connection: the input half of a remote-desktop bridge, and of gelm's own headless test harness.
Package vinput injects pointer and keyboard input into the compositor through zwlr_virtual_pointer_v1 and zwp_virtual_keyboard_v1, on a private Wayland connection: the input half of a remote-desktop bridge, and of gelm's own headless test harness.
Accessibility semantics for the widget tree: semantic roles plus a state snapshot that assistive technology can consume.
Accessibility semantics for the widget tree: semantic roles plus a state snapshot that assistive technology can consume.
css
Package css names libadwaita's style classes and named colors - the relm4-css analog (#95) - so application code spells them as constants and stylesheets written for GTK port over verbatim:
Package css names libadwaita's style classes and named colors - the relm4-css analog (#95) - so application code spells them as constants and stylesheets written for GTK port over verbatim:
Package wlr implements the alpha_modifier_v1 protocol
Package wlr implements the alpha_modifier_v1 protocol

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL