gelm

package module
v0.0.0-...-2f6e621 Latest Latest
Warning

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

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

README

gelm

A retained-mode widget kit for Wayland, written in pure Go (no cgo). Logical-coordinate widget space, damage-tracked repaint, a parked event loop that idles at 0% CPU, and a renderer built on premultiplied-alpha ARGB — designed to carry a future Go wayle; see stubbedev/wayle#19 for the full plan and the completeness ladder.

Status

The toolkit core works end to end on real compositors (verified on Hyprland and headless sway): toplevel and layer-shell windows, the full widget set below, keyboard and pointer input with a defined input model, the clipboard, drag and drop, IME composition, fractional scaling with live rescale, and an animation clock. Theming is a composable palette value (widget.SetTheme, widget.DarkTheme().WithAccentHex("#a6e3a1").WithPadding(8)-style chaining, dark and light presets); state shades derive from the palette, and a GTK-flavored CSS subset layers on top as an override — widget.LoadStylesheetFile("theme.css") with element/class/id/state selectors, hot reload on file change, and classes/ids per widget (b.AddClass("destructive"), b.SetID("save-button")); see docs/css.md. The system's dark/light preference is available as a signal, not an automatic switch: internal/appearance watches xdg-desktop-portal's color-scheme (pure Go, no cgo) and the app wires it to SetTheme — see docs/appearance.md.

The compositor-in-the-loop gate runs the same input suite on both compositors: sway is the primary required gate (just headless), and Hyprland runs the identical suite inside a private NixOS VM with its own DRM node (just hyprland-vm, tests/hyprland-vm.nix) — currently allow-failure while stability settles, promoted to blocking once it has been green for a sustained window. Verified per compositor: the full synthetic-seat suite (clicks, keys, drag, tooltip dwell, list multi-select, dialog modality, window states, clipboard roundtrip, compositor-kill disconnect) runs unchanged on both; only the pinning recipe differs (sway for_window rules vs Hyprland windowrules).

Feature matrix

A capability-by-capability audit against relm4/GTK — including the deliberate non-goals and the honest, deferred gaps — lives in docs/completeness.md.

Widgets
Widget Status Notes and caveats
Label done shaped text, alignment, SetText; wrap and ellipsize helpers live on the typeface
Button done any child widget; hover/pressed states; Enter + Space activate
Slider done drag or arrows/Home/End, clamped steps
Switch, CheckButton done keyboard toggles on Enter and Space
ProgressBar done animated by the app through anim tweens
Entry done single-line; selection (shift motion, drag, double-click word, select-all); clipboard; IME preedit display
SpinButton done numeric Entry: range, step, decimals; arrows/PageUp/PageDown step; Enter or blur commits (clamped, rounded, garbage reverts)
TextArea done multi-line; soft wrap on by default (logical-line editing model); plain Tab indents, ctrl/shift+Tab traverse
Scroll done both axes; draggable bars, gutter paging, auto-hide fade, fill/center stretch
List done virtualized model rows (a viewport's worth of widgets); single/browse/multiple selection modes with rubber-band drag, edge auto-scroll, and the shift/ctrl keyboard model
Notebook done tabs with close hook; ctrl+PageUp/PageDown cycles; hidden pages skipped by focus
Menu done check/radio rows, separators, nested submenus; Alt-letter mnemonics (explicit or auto-resolved, underlined) fire while the menu is open, and application accelerators fire from an open menu through the same table the main key path uses
Dropdown, DropdownOf[T] done combobox: face plus an inline themed item list (a Children child only while open, not an app.Popover); Enter/Space/Down opens, arrows navigate, Esc cancels; type-ahead jumps the open list by prefix (case-insensitive, repeated keys cycle, idle-timeout reset) and first-letter-cycles the closed face
Popover (app.Popover) done anchored to any widget, flips inside the host; works on layer surfaces too
Dialog, MessageBox (app) done parented toplevels; modality is window-level through xdg-dialog-v1 where the compositor offers it (input to the parent is compositor-blocked) with the application-level block as the floor; Esc/Enter responses
Icon done raster, theme-name, file, and embedded-SVG constructors; symbolic sources follow the accent or a pinned tint
Box, Stack, Overlay, Scroll done the containers; row/column layout with expanding children
Paned done two panes with a draggable themed divider; MinSizer-floor clamps, keyboard nudges, GTK keep-child-one resize semantics
Calendar, app.CalendarDialog done month grid with month/year navigation, today marker, single selection, keyboard motion across month boundaries, pluggable locale names
Color picker, app.ColorChooserDialog done SV square (exact premultiplied gradient composition), hue/alpha strips, hex entry, theme presets and an in-memory session palette; keyboard-operable end to end
Font chooser, app.FontChooserDialog done searchable virtualized family list (rows lazily rendered in their own face), size entry + synced slider, monospace filter, live preview through the production fallback chain
Tooltips done SetTooltip / SetTooltipMarkup on any widget, configurable dwell/offset/size; toplevel and layer hosts
Drag source / drop target done widget.DragSource + DragEnterer per widget; mime negotiation, highlight, cross-window drops
Protocols and input
Piece Status Notes and caveats
xdg-shell done toplevels: title/app-id, min/max, close-request veto, ping/pong, interactive resize edges (6 logical px), xdg_popup menus and popovers
Window icons done Application.SetIcon/SetWindowIcon through xdg-toplevel-icon-v1: square shm buffers rasterized at the compositor’s preferred sizes (fixed ladder without a preference); silent Debug no-op where the protocol is absent (icon goes to the compositor/taskbar, not a WM_HINTS analog)
wlr-layer-shell done layer, anchors, margins, exclusive zone, keyboard interactivity; popups via get_popup
Screen capture (capture) done private capture connection: wlr-screencopy (outputs, regions, cursor overlay, damage, a reused shm slot), ext-image-copy-capture (windows via ext-foreign-toplevel-list sources, one-shot outputs, the damage-driven continuous Stream), Hyprland toplevel-export, and linux-dmabuf import as a zero-copy screencopy target; frames convert to image.RGBA from the 8/10-bit packed and 24-bit formats; covered in the headless gate
xdg-decoration optional server-side decorations when the compositor decorates; silently skipped otherwise (decorated windows opt out of client resize edges)
wl_data_device done clipboard (ctrl+c/x/v) and drag and drop, including cross-window; set_actions/finish gated on data-device v3
xkb keyboard done the compositor's keymap (alt layouts, AltGr, dead keys); synthesized key repeat at the compositor's rate/delay
zwp_text_input_v3 optional IME composition into Entry and TextArea; no-op when the compositor lacks the global
wp_viewporter + wp_fractional_scale_v1 optional fractional scale (1.25 and friends) with live rescale; integer set_buffer_scale fallback
xdg_toplevel resize/min/max done interactive edges, published limits, configure relayout in the same frame
Cursors done xcursor theme loading, animated cursors, per-widget shapes, resize aliases, leave restoration
wl_shm buffers done one arena per session: a single fd and mapping, buffers as sub-allocations; busy buffers are never overwritten
Engine
Piece Status Notes and caveats
Parked event loop done blocks in one dispatch; wakes only for compositor events, frame callbacks, and timer deadlines — idle CPU 0%, even with an occluded surface
Damage-tracked repaint done per-widget invalidation, damage-union clipping, per-buffer staleness so rotated buffers stay correct; idle frames paint nothing
Measure cache done memoized per widget against its constraints; edits drop exactly the affected branch
Animation done timer-paced clock; easing curves, damped springs, Sequence/Parallel timelines, mid-flight cancel
Fractional scale done 120-based rational scales end to end; logical coordinates for input, layout, and carets; text rasterizes at device scale
Rendering done premultiplied-alpha ARGB8888, signed-distance AA (coverage scales all channels), shaped text, SVG/PNG icons
Translucent surfaces done Background alpha < 255 composites for compositor blur (Hyprland blurs translucent layer surfaces; panels keep alpha ≈ 200–235); a fully opaque background sets wl_surface.set_opaque_region automatically — see docs/architecture.md, rule 13
Accessibility done semantic roles + DescribeTree, keyboard-first guarantee pinned by tests; in-process AT-SPI bridge in every build, serving while the desktop asks for assistive technologies (Accessible/Component/Text/Action/Value/Cache, focus/caret/selection setters, character geometry, text and property events) — see docs/a11y.md
Icon themes done freedesktop icon-theme spec lookup in pure Go; follows the portal's live icon-theme setting (empty keeps the previous theme) — see docs/icons.md
System dark/light preference done internal/appearance watches xdg-desktop-portal color-scheme via godbus (pure Go); reports Dark/Light/Unknown + OnChange — the app wires it to widget.SetTheme, gelm never switches on its own — see docs/appearance.md

The rules that keep all of this correct — the parked loop, the resize-before-acquire ordering, buffer staleness, the shared line height, the implicit-grab input model — are written down with file pointers in docs/architecture.md.

Quickstart

devenv shell  # pinned go 1.27, gopls, golangci-lint, gofumpt, delve, just, sway; CGO_ENABLED=0
just demo     # the gelm-hello showcase: widgets, drag, tooltips, menu, Tab focus
just panel    # the gelm-panel layer-shell demo

Other recipes: just bar (layer-shell bar), just multi (many windows on one loop), just check (the release gates: vet, lint, test, build), just fmt (gofumpt in place; just fmt-check is the gate CI runs), just bench (benchmarks, see below). For headless runs without a desktop: just test-env starts a private sway on wlroots' headless backend, and just demo-headless, move, click, sweep, axis drive the demo through the synthetic wlpointer client.

Packaging and releases

The flake exposes the module and the demo binaries as packages, built with the same pinned Go toolchain the dev shell uses (no cgo, no network at build time — modules are vendored via buildGoModule with vendorHash pinning go.sum):

nix build .#gelm-hello   # the widget showcase binary
nix build .#gelm-bar     # the layer-shell bar
nix build .#gelm-panel   # the layer-shell panel
nix build .#gelm         # the whole module: every demo binary + wlpointer

packages.gelm.goModules carries the vendored dependency tree for other nix Go builds. Plain Go consumers don't go through nix: the toolkit ships as an ordinary Go module, and apps pin a version by semver tag — go get github.com/stubbedev/gelm@v0.1.0.

Releases are tag-driven: pushing v* runs .github/workflows/release.yml, which builds the three demo binaries (linux/amd64 + arm64, CGO off) with goreleaser and attaches archives to the GitHub release. goreleaser was chosen over a nix-based release path because release artifacts must be usable without nix, while the flake remains the primary build path; the two share the same source and the same CGO-off constraint.

Benchmarks

widget/benchmark_test.go benchmarks the three frame passes on the showcase tree: BenchmarkShowcaseMeasure (cold measure, cache defeated by alternating constraints), BenchmarkStaticTreeMeasure (warm measure: zero recursion), BenchmarkShowcaseArrange (steady layout walk), BenchmarkShowcasePaint (full-window repaint), plus the damage-tracker benchmarks BenchmarkProgressOnlyFrame / BenchmarkProgressOnlyFrames (incremental repaint). Fixed sizes, no time-dependent content. just bench runs them; CI archives the numbers as workflow artifacts for trend watching — deliberately not a gate, shared runners are too noisy.

The minimal app

gelm's session plumbing is internal/, so an app is a command inside the module (all the demos are). Add cmd/hello/main.go:

package main

import (
	"errors"
	"fmt"
	"log"

	"github.com/stubbedev/gelm/app"
	"github.com/stubbedev/gelm/internal/sysfont"
	"github.com/stubbedev/gelm/internal/window"
	"github.com/stubbedev/gelm/internal/wlsession"
	"github.com/stubbedev/gelm/widget"
)

func main() {
	sess := must(wlsession.Connect())
	defer sess.Close()
	tf := must(sysfont.Sans())
	surf := must(sess.Compositor().CreateSurface())
	win := must(window.New(sess.WmBase(), surf, window.Config{
		Title: "hello", AppID: "dev.stubbe.gelm.hello", Width: 320, Height: 120,
	}))
	die(surf.Commit())
	for range 20 { // complete the xdg configure handshake
		if win.EnsureUsable() == nil {
			break
		}
		die(sess.Roundtrip())
	}

	clicks := 0
	count := widget.NewLabel(tf, 15, "clicked 0 times", widget.Current().Text)
	button := widget.NewButton(count, 10, 8)
	button.OnClick = func() {
		clicks++
		count.SetText(fmt.Sprintf("clicked %d times", clicks))
	}
	sess.OnWmBasePing = win.Pong

	err := app.Run(app.Config{Session: sess, Host: win, Root: button, Background: widget.Current().Bg})
	if err != nil && !errors.Is(err, app.ErrClosed) {
		log.Fatal(err)
	}
}

// must unwraps a (value, error) pair or dies; die checks an error.
func must[T any](v T, err error) T {
	if err != nil {
		log.Fatal(err)
	}
	return v
}

func die(err error) {
	if err != nil {
		log.Fatal(err)
	}
}

go run ./cmd/hello maps the window; the compositor's close button ends the loop. This exact program is kept compiling (and honest) as ExampleRun in app/example_test.go, and the widget-level examples — ExampleEntry, ExampleTextArea, ExampleMenu — run under go test ./... with their output checked.

Documentation
Document Contents
docs/architecture.md session → surfaces → app loop → router → widgets, and the invariants
docs/input-model.md the input contract: routing, implicit grab, click/drag, dnd, keyboard, IME
docs/application-model.md many windows on one loop; relm4/GTK concept mapping
docs/threading.md the threading contract: app.Invoke, app.Every, goroutine rules, and the relm4 Component/Worker/Command/Factory mapping
docs/a11y.md the accessibility decision and the AT-SPI bridge
docs/appearance.md following the system dark/light preference via xdg-desktop-portal, and the wiring example
docs/icons.md icon theme lookup and symbolic recoloring
docs/completeness.md the relm4/GTK coverage map: shipped, deliberate non-goals, known gaps

Demos

Command What it shows
cmd/gelm-hello the showcase: every widget, drag-to-move, context menu, tooltips, Tab focus
cmd/gelm-multi one process, one loop: per-output layer bars, on-demand windows, close-request veto
cmd/gelm-invoke the threading model: a goroutine updates a label via app.Invoke, app.Every drives a poller, the loop parks between ticks
cmd/gelm-panel a right-anchored layer-shell panel with live widgets
cmd/gelm-bar the M0 bar: a 32px top bar; each second only the old and new notch regions repaint
cmd/wlpointer synthetic pointer for the headless test env

Roadmap

Milestones from the plan: M1 paint, M2 widgets, M3 theming (palette plus the CSS override layer), and M4 input are in; M5 apps (bar, OSD, launcher, lock screen, settings) is where the demos point. Long term: GTK-class completeness, tiers T1-T4 in the issue.

Dependencies

All pure Go, no cgo:

License

MIT

Documentation

Overview

Package gelm is a retained-mode widget kit for Wayland, written in pure Go (no cgo).

The public API lives in two packages:

app       - the parked event loop, windows (xdg toplevels and
              layer surfaces), popovers, dialogs, and input wiring
widget    - the retained widget tree: labels, buttons, entries,
              text areas, lists, notebooks, menus, icons, themes

Supporting it:

render    - premultiplied-alpha canvas, shaped text, icons
wlr       - generated Wayland protocol bindings
internal  - session, buffer arena, scale, popup, and drag-drop
            plumbing
cmd       - the demos (gelm-hello showcase, gelm-multi, panel,
              bar, gelm-invoke threading demo)

The docs/ directory carries the design contracts: architecture, input model, application model, threading model, accessibility decision, icon theming, and the debug inspector.

Directories

Path Synopsis
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 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-bar command
Command gelm-bar is the M1 paint demo: a top bar anchored across the output showing a label, a clock, and a moving second indicator, all CPU-rasterized (rounded rects, gradient, shaped text) into pooled wl_shm ARGB8888 buffers and kept current with damage-tracked repaints driven by frame callbacks.
Command gelm-bar is the M1 paint demo: a top bar anchored across the output showing a label, a clock, and a moving second indicator, all CPU-rasterized (rounded rects, gradient, shaped text) into pooled wl_shm ARGB8888 buffers and kept current with damage-tracked repaints driven by frame callbacks.
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-hello command
Command gelm-hello is the showcase demo: one xdg_toplevel window exercising every widget - labels, button, slider, progress bar, switch, checkbox, text entry, multi-line text area, a scrollable list, hover tooltips, animated tweens, the right-click context menu, Tab focus traversal with the focus ring, drag-to-move, and Escape to close.
Command gelm-hello is the showcase demo: one xdg_toplevel window exercising every widget - labels, button, slider, progress bar, switch, checkbox, text entry, multi-line text area, a scrollable list, hover tooltips, animated tweens, the right-click context menu, Tab focus traversal with the focus ring, drag-to-move, and Escape to close.
gelm-i18n command
Command gelm-i18n proves the message catalog (#89): the same app, two languages.
Command gelm-i18n proves the message catalog (#89): the same app, two languages.
gelm-invoke command
Command gelm-invoke demonstrates the threading model: a plain goroutine "polls a sensor" twice a second and pushes the reading into a label through app.Invoke, while app.Every drives a second label on the loop's own timer wakes.
Command gelm-invoke demonstrates the threading model: a plain goroutine "polls a sensor" twice a second and pushes the reading into a label through app.Invoke, while app.Every drives a second label on the loop's own timer wakes.
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-panel command
Command gelm-panel is the M2+M4 interactive demo: a right-anchored panel with a slider (drag), progress bar, switch, checkbox, text entry, and a scrollable list, all live through the pointer and keyboard input stack.
Command gelm-panel is the M2+M4 interactive demo: a right-anchored panel with a slider (drag), progress bar, switch, checkbox, text entry, and a scrollable list, all 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 settings application example: typed persisted keys (app/settings.go) bound straight to widgets through Binding connectors, 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 settings application example: typed persisted keys (app/settings.go) bound straight to widgets through Binding connectors, 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.
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 highlight holds syntax highlighters for widget.TextArea (GtkSourceView's language definitions).
Package highlight holds syntax highlighters for widget.TextArea (GtkSourceView's language definitions).
internal
anim
Package anim runs time-based animations: tweens advanced once per rendered frame, combinable into timelines (Sequence, Parallel, Delay) and cancelable mid-flight.
Package anim runs time-based animations: tweens advanced once per rendered frame, combinable into timelines (Sequence, Parallel, Delay) and cancelable mid-flight.
appearance
Package appearance follows the desktop's dark/light preference — xdg-desktop-portal's org.freedesktop.portal.Settings color-scheme key, the one place Hyprland, GNOME, KDE and friends agree to publish it — over the session bus.
Package appearance follows the desktop's dark/light preference — xdg-desktop-portal's org.freedesktop.portal.Settings color-scheme key, the one place Hyprland, GNOME, KDE and friends agree to publish it — over the session bus.
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.
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.
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.
icons
Icon-theme following (#64): the cache applies live icon-theme switches delivered by the portal monitor (internal/appearance), which the application wires in.
Icon-theme following (#64): the cache applies live icon-theme switches delivered by the portal monitor (internal/appearance), 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.
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.
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.
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.
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 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