gtk4

package module
v0.1.0 Latest Latest
Warning

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

Go to latest
Published: Aug 31, 2026 License: BSD-3-Clause Imports: 4 Imported by: 0

README

gtk4

Drive GTK4 from pure Go with CGO_ENABLED=0 — windows, the common controls, GObject signals and the GLib main loop — over ebitengine/purego.

It is the Linux sibling of go-macos/objc: the shared native-toolkit bridge a go-widgets host backend embeds real controls through, so a pixel-drawn app can inlay a real GtkEntry, GtkButton or secure field over its own rendering.

ok, err := gtk4.Init()
// win := gtk4.WindowNew(); win.SetTitle("…"); win.SetDefaultSize(360, 200)
// fixed := gtk4.FixedNew()          // the overlay container
// e := gtk4.EntryNew(); e.SetVisibility(false) // a password field
// b := gtk4.ButtonNewWithLabel("OK")
// b.Connect("clicked", func() { … }) // a GObject signal, as a Go closure
// fixed.Put(e, 10, 10); fixed.Put(b, 10, 44); win.SetChild(fixed); win.Present()

No cgo

libgtk-4, libgobject-2.0 and libglib-2.0 are dlopen'd by soname and every entry point is resolved with purego.RegisterLibFunc. A GObject signal reaches Go through a purego.NewCallback, retained for the process life (GTK holds the C pointer). The package links with no cgo and cross-compiles like any other Go code.

What it binds

Init · WindowNew (+ SetTitle/SetDefaultSize/SetChild/Present) · FixedNew (+ Put/Move — absolute overlay positioning) · ButtonNewWithLabel (+ SetLabel) · EntryNew (+ SetVisibility for a secure field) · CheckButtonNewWithLabel (+ Active/SetActive; grouped check buttons are GTK radios) · LabelNew · Text/SetText (GtkEditable) · SetSizeRequest · SetVisible · Unparent · Connect (signals) · MainLoop (Run/Quit) · IdleAdd (marshal onto the GTK thread).

Platform

Linux only — this is the GTK path; a go-widgets host uses AppKit/Win32 on macOS/Windows. Off Linux the package still compiles (a consumer cross-compiles without a build tag) and every constructor's Init returns ErrUnsupported, so nothing is a build-time surprise. It needs only the runtime libgtk-4 (libgtk-4-1 on Debian/Ubuntu) — no -dev package.

Testing

CI builds it on every platform and runs a live test against real GTK4 under a headless X server (Xvfb) — creating a window, entry, secure field, button and check button, round-tripping their values, and proving a changed signal reaches Go through the main loop.

License

BSD-3-Clause. See LICENSE.

Documentation

Index

Constants

This section is empty.

Variables

View Source
var ErrUnsupported = errors.New("gtk4: only available on Linux")

ErrUnsupported is returned by Init on any platform without GTK4 (everything but Linux). It is defined on every platform so a portable consumer can test for it with errors.Is.

Functions

func IdleAdd

func IdleAdd(func())

func Init

func Init() (bool, error)

Init reports ErrUnsupported off Linux.

Types

type MainLoop

type MainLoop uintptr

MainLoop is a GLib main loop. Off Linux it does nothing.

func MainLoopNew

func MainLoopNew() MainLoop

func (MainLoop) Quit

func (l MainLoop) Quit()

func (MainLoop) Run

func (l MainLoop) Run()

type Widget

type Widget uintptr

Widget is a GTK widget. Off Linux no real one is ever created.

func ButtonNewWithLabel

func ButtonNewWithLabel(string) Widget

func CheckButtonNewWithLabel

func CheckButtonNewWithLabel(string) Widget

func EntryNew

func EntryNew() Widget

func FixedNew

func FixedNew() Widget

func LabelNew

func LabelNew(string) Widget

func WindowNew

func WindowNew() Widget

The constructors return the null widget off Linux; the methods are no-ops or zero, so consumer code that names them still compiles.

func (Widget) Active

func (w Widget) Active() bool

func (Widget) Connect

func (w Widget) Connect(string, func()) uint64

func (Widget) Move

func (f Widget) Move(Widget, float64, float64)

func (Widget) Present

func (w Widget) Present()

func (Widget) Put

func (f Widget) Put(Widget, float64, float64)

func (Widget) SetActive

func (w Widget) SetActive(bool)

func (Widget) SetChild

func (w Widget) SetChild(Widget)

func (Widget) SetDefaultSize

func (w Widget) SetDefaultSize(int, int)

func (Widget) SetLabel

func (w Widget) SetLabel(string)

func (Widget) SetSizeRequest

func (w Widget) SetSizeRequest(int, int)

func (Widget) SetText

func (w Widget) SetText(string)

func (Widget) SetTitle

func (w Widget) SetTitle(string)

func (Widget) SetVisibility

func (w Widget) SetVisibility(bool)

func (Widget) SetVisible

func (w Widget) SetVisible(bool)

func (Widget) Text

func (w Widget) Text() string

func (Widget) Unparent

func (w Widget) Unparent()

Jump to

Keyboard shortcuts

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