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.
type CharEvent ¶
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 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 ¶
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 ¶
IsModifier indica si la tecla es un modificador. Los modificadores no disparan atajos por sí solos.
type KeyEvent ¶
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.
Modificadores. Super es la tecla Windows o Command.
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 ¶
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 ¶
ResizeEvent se emite cuando cambia el tamaño del área de cliente o el factor de escala del monitor.
type ScrollEvent ¶
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.