platform

package
v0.0.0-...-4916209 Latest Latest
Warning

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

Go to latest
Published: Aug 2, 2026 License: MIT Imports: 3 Imported by: 0

Documentation

Overview

Package platform aísla todo lo que depende del sistema operativo: creación de ventana, contexto OpenGL, ciclo de eventos, teclado, ratón y DPI.

Ninguna otra capa de FlowCode importa APIs del sistema directamente. En Windows la implementación llama a user32/gdi32/opengl32 con syscall y no necesita cgo; en Linux y macOS se apoya en GLFW.

Modelo de ejecución

La ventana debe crearse y bombearse desde un único hilo del sistema operativo bloqueado con runtime.LockOSThread. Run ocupa ese hilo hasta que la ventana se cierra. Cualquier otra goroutine puede pedir un repintado con Invalidate, que es la única operación segura desde fuera del hilo de la ventana.

Damage tracking

Run no es un bucle a máxima velocidad. Solo dibuja cuando algo se ha invalidado; en reposo se bloquea esperando un evento del sistema y el proceso consume 0% de CPU. Es la diferencia entre un editor que puedes dejar abierto todo el día y uno que te vacía la batería.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Action

type Action uint8

Action distingue los tres estados en que se reporta una tecla o un botón.

const (
	Release Action = iota
	Press
	Repeat
)

Estados posibles de una tecla o botón.

func (Action) String

func (a Action) String() string

String devuelve el nombre del estado.

type CharEvent

type CharEvent struct {
	Rune rune
	Mods Mods
}

CharEvent es un carácter producido por el teclado, ya resuelto por el layout del sistema y por los métodos de entrada. Es la fuente de verdad para insertar texto.

type CloseEvent

type CloseEvent struct{}

CloseEvent se emite cuando el usuario intenta cerrar la ventana.

type DropEvent

type DropEvent struct {
	Paths []string
	Pos   geom.Point
}

DropEvent entrega los archivos soltados sobre la ventana.

type Event

type Event interface {
	// contains filtered or unexported methods
}

Event es cualquier evento entregado a Handler.Event. El conjunto es cerrado: un type switch sobre los tipos de este paquete los cubre todos.

type FocusEvent

type FocusEvent struct {
	Focused bool
}

FocusEvent indica que la ventana ha ganado o perdido el foco del teclado.

type Handler

type Handler interface {
	// Draw pinta un frame. Se llama únicamente cuando la ventana ha sido
	// invalidada, nunca en un bucle continuo. La plataforma presenta el
	// resultado en pantalla al retornar: Draw no intercambia buffers.
	Draw(w Window)

	// Event entrega un evento de entrada o de ciclo de vida.
	Event(w Window, e Event)
}

Handler recibe los eventos y las peticiones de dibujo de una ventana. Ambos métodos se invocan siempre desde el hilo de la ventana.

type Key

type Key uint16

Key identifica una tecla física, independiente del layout de teclado. La tecla marcada "A" en un teclado QWERTY y en uno AZERTY produce KeyA en ambos aunque escriba letras distintas: los atajos se definen por posición, el texto se recibe por CharEvent.

const (
	KeyUnknown Key = iota

	KeyA
	KeyB
	KeyC
	KeyD
	KeyE
	KeyF
	KeyG
	KeyH
	KeyI
	KeyJ
	KeyK
	KeyL
	KeyM
	KeyN
	KeyO
	KeyP
	KeyQ
	KeyR
	KeyS
	KeyT
	KeyU
	KeyV
	KeyW
	KeyX
	KeyY
	KeyZ

	Key0
	Key1
	Key2
	Key3
	Key4
	Key5
	Key6
	Key7
	Key8
	Key9

	KeyF1
	KeyF2
	KeyF3
	KeyF4
	KeyF5
	KeyF6
	KeyF7
	KeyF8
	KeyF9
	KeyF10
	KeyF11
	KeyF12

	KeyEscape
	KeyTab
	KeyCapsLock
	KeySpace
	KeyEnter
	KeyBackspace
	KeyDelete
	KeyInsert

	KeyLeft
	KeyRight
	KeyUp
	KeyDown
	KeyHome
	KeyEnd
	KeyPageUp
	KeyPageDown

	KeyMinus
	KeyEqual
	KeyLeftBracket
	KeyRightBracket
	KeyBackslash
	KeySemicolon
	KeyApostrophe
	KeyGrave
	KeyComma
	KeyPeriod
	KeySlash

	KeyLeftShift
	KeyRightShift
	KeyLeftCtrl
	KeyRightCtrl
	KeyLeftAlt
	KeyRightAlt
	KeyLeftSuper
	KeyRightSuper
	KeyMenu

	KeyNumpad0
	KeyNumpad1
	KeyNumpad2
	KeyNumpad3
	KeyNumpad4
	KeyNumpad5
	KeyNumpad6
	KeyNumpad7
	KeyNumpad8
	KeyNumpad9
	KeyNumpadDecimal
	KeyNumpadDivide
	KeyNumpadMultiply
	KeyNumpadSubtract
	KeyNumpadAdd
	KeyNumpadEnter

	KeyPrintScreen
	KeyScrollLock
	KeyPause
	KeyNumLock
)

Teclas reconocidas. El orden es estable y forma parte de la API: los archivos de keymap se serializan con los nombres de String, no con los números.

func ParseKey

func ParseKey(name string) (Key, bool)

ParseKey resuelve el nombre canónico de una tecla. Devuelve ok=false si el nombre no corresponde a ninguna, para que el cargador de keymaps pueda reportar la línea exacta del archivo de configuración con el error.

func (Key) IsModifier

func (k Key) IsModifier() bool

IsModifier indica si la tecla es un modificador. Los modificadores no disparan atajos por sí solos.

func (Key) String

func (k Key) String() string

String devuelve el nombre canónico de la tecla, tal y como aparece en los archivos de keymap.

type KeyEvent

type KeyEvent struct {
	Key    Key
	Action Action
	Mods   Mods
}

KeyEvent es una pulsación, repetición o liberación de una tecla física. Para entrada de texto usa CharEvent: KeyEvent describe teclas, no caracteres.

type Mods

type Mods uint8

Mods es el conjunto de modificadores activos durante un evento.

const (
	ModShift Mods = 1 << iota
	ModCtrl
	ModAlt
	ModSuper
)

Modificadores. Super es la tecla Windows o Command.

func (Mods) Has

func (m Mods) Has(x Mods) bool

Has indica si todos los modificadores dados están activos.

func (Mods) String

func (m Mods) String() string

String devuelve los modificadores en el orden canónico usado por los keymaps, por ejemplo "ctrl+shift".

type MouseButton

type MouseButton uint8

MouseButton identifica un botón del ratón.

const (
	MouseLeft MouseButton = iota
	MouseRight
	MouseMiddle
	MouseBack
	MouseForward
)

Botones del ratón reconocidos.

type MouseButtonEvent

type MouseButtonEvent struct {
	Button MouseButton
	Action Action
	Pos    geom.Point
	Mods   Mods
}

MouseButtonEvent es la pulsación o liberación de un botón del ratón.

type MouseMoveEvent

type MouseMoveEvent struct {
	Pos  geom.Point
	Mods Mods
}

MouseMoveEvent se emite al mover el puntero sobre la ventana, o en cualquier posición mientras haya un botón pulsado.

type Options

type Options struct {
	// Title es el texto de la barra de título.
	Title string

	// Width y Height son el tamaño inicial del área de cliente en píxeles
	// lógicos. Cero deja que el sistema elija un tamaño razonable.
	Width, Height int

	// VSync sincroniza el intercambio de buffers con el refresco del monitor.
	// Activado evita tearing y limita el consumo; desactivado sirve para medir
	// el coste real de un frame en los benchmarks.
	VSync bool
}

Options configura la ventana en el momento de crearla.

type ResizeEvent

type ResizeEvent struct {
	Size  geom.Size
	Scale float32
}

ResizeEvent se emite cuando cambia el tamaño del área de cliente o el factor de escala del monitor.

type ScrollEvent

type ScrollEvent struct {
	Delta geom.Point
	Pos   geom.Point
	Mods  Mods
}

ScrollEvent es un desplazamiento de rueda o de trackpad. Delta se expresa en líneas, no en píxeles: la conversión a distancia depende de la altura de línea y corresponde a la capa que hace scroll.

El signo sigue la dirección del contenido, no la del dedo: Delta.Y positivo significa avanzar hacia el final del documento, Delta.X positivo hacia la derecha. Cada plataforma normaliza su propia convención antes de emitirlo.

type Window

type Window interface {
	// Size devuelve el tamaño del área de cliente en píxeles lógicos.
	Size() geom.Size

	// Framebuffer devuelve el tamaño del área de cliente en píxeles físicos.
	// Es el tamaño que necesita la GPU; difiere de Size en pantallas HiDPI.
	Framebuffer() (w, h int)

	// Scale es la razón entre píxeles físicos y lógicos: 1.0 a 96 DPI, 1.5 a
	// 144 DPI, 2.0 en pantallas Retina.
	Scale() float32

	// SetTitle cambia el texto de la barra de título.
	SetTitle(title string)

	// Clipboard devuelve el texto del portapapeles del sistema, o cadena vacía
	// si no contiene texto o no se pudo acceder.
	Clipboard() string

	// SetClipboard copia texto al portapapeles del sistema.
	SetClipboard(s string)

	// ProcAddress resuelve una función de OpenGL por nombre. Devuelve 0 si el
	// driver no la expone. Es el puente que usa la capa gpu para cargar el
	// backend sin conocer el sistema operativo.
	ProcAddress(name string) uintptr

	// Invalidate marca la ventana como sucia y despierta el ciclo de eventos.
	// Es seguro llamarlo desde cualquier goroutine: es el mecanismo por el que
	// el parser, el watcher de archivos o el cliente LSP piden un repintado.
	Invalidate()

	// Close pide el cierre de la ventana. Run retorna poco después.
	Close()

	// Run ocupa el hilo actual con el ciclo de eventos hasta que la ventana se
	// cierra.
	Run(h Handler) error
}

Window es una ventana del sistema con un contexto OpenGL asociado.

func New

func New(opts Options) (Window, error)

New crea una ventana con su contexto OpenGL 3.3 core y lo deja activo en el hilo actual. Debe llamarse desde un hilo bloqueado con runtime.LockOSThread.

Jump to

Keyboard shortcuts

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