|
| 1 | +# minigui |
| 2 | + |
| 3 | +`minigui` es una biblioteca experimental para crear interfaces gráficas desde **Gleam (target Erlang)** usando un **port externo en C** (nativo). |
| 4 | + |
| 5 | +## Estado / alcance |
| 6 | + |
| 7 | +- **Windows**: backend **Win32** (ventana + label + textbox + botón). |
| 8 | +- **Linux**: backend **GTK3** (ventana + label + textbox + botón). |
| 9 | +- **macOS**: por ahora solo **modo headless** (simulado). |
| 10 | + |
| 11 | +> Nota: en Linux el binario `minigui` enlaza con GTK3, por lo que el sistema debe tener GTK3 disponible en runtime (en desktops es común; en servidores minimalistas puede requerir instalar paquetes). |
| 12 | +
|
| 13 | +El objetivo es mantener una API pequeña y estable en Gleam, y permitir backends nativos por plataforma. |
| 14 | + |
| 15 | +## Releases / publicación |
| 16 | + |
| 17 | +Ver el checklist: [`RELEASING.md`](./RELEASING.md) |
| 18 | + |
| 19 | +## Instalación (Gleam Packages) |
| 20 | + |
| 21 | +```bash |
| 22 | +gleam add minigui |
| 23 | +``` |
| 24 | + |
| 25 | +### “Sin dependencias de build” (binario precompilado) |
| 26 | + |
| 27 | +Para evitar que tus usuarios tengan que instalar un compilador C o headers (`libx11-dev`, etc.), `minigui` está pensado para usar un **ejecutable precompilado** como puente (un *port*) y descargarlo automáticamente a `priv/` en el primer uso. |
| 28 | + |
| 29 | +Por defecto construye la URL así: |
| 30 | + |
| 31 | +``` |
| 32 | +https://github.com/Aztekode/minigui/releases/download/v<version>/<asset> |
| 33 | +``` |
| 34 | + |
| 35 | +Donde `<version>` sale del `vsn` del paquete (ej. `0.1.0`) y `<asset>` depende del OS/arquitectura, por ejemplo: |
| 36 | + |
| 37 | +- `minigui.exe` (Windows x64) |
| 38 | +- `minigui` (Linux x64) |
| 39 | + |
| 40 | +Puedes sobreescribir la base de descargas con: |
| 41 | + |
| 42 | +```bash |
| 43 | +MINIGUI_RELEASE_BASE_URL="https://github.com/Aztekode/minigui/releases/download/v0.1.0" |
| 44 | +``` |
| 45 | + |
| 46 | +Si prefieres un enlace exacto tipo `.../minigui.exe`, puedes fijar la URL completa: |
| 47 | + |
| 48 | +```bash |
| 49 | +MINIGUI_PORT_URL="https://github.com/Aztekode/minigui/releases/download/v0.1.0/minigui.exe" |
| 50 | +``` |
| 51 | + |
| 52 | +Opciones de seguridad/cache: |
| 53 | + |
| 54 | +- Por defecto, `minigui` **requiere** que exista `minigui(.exe).sha256` y valida el SHA256. |
| 55 | +- `MINIGUI_REQUIRE_SHA=0`: desactiva la validación (no recomendado). |
| 56 | +- El binario se cachea por usuario (Linux: `~/.cache/minigui/<version>/`, Windows: `%LOCALAPPDATA%\\minigui\\<version>\\`). |
| 57 | + |
| 58 | +> Requisito de runtime: una instalación “completa” de Erlang/OTP que incluya las aplicaciones estándar `inets` + `ssl` (normalmente ya vienen con OTP; en algunas distros Linux pueden venir en paquetes separados). |
| 59 | +
|
| 60 | +## Protocolo (v1) |
| 61 | + |
| 62 | +El port se abre con `open_port(..., [{packet, 2}, binary, ...])`. |
| 63 | + |
| 64 | +- Handshake: |
| 65 | + - `0x00` `HELLO` + `u16 version` |
| 66 | + - `0xF0` `HELLO_ACK` + `u16 version` + `u32 capabilities` |
| 67 | + |
| 68 | +- Comandos: |
| 69 | + - `0x10` `CREATE_WINDOW` + `u32 request_id` + título UTF-8 |
| 70 | + - `0x11` `SET_LABEL` + `u32 request_id` + texto UTF-8 |
| 71 | + - `0x12` `SET_TEXT` + `u32 request_id` + texto UTF-8 |
| 72 | + - `0x13` `ADD_BUTTON` + `u32 request_id` + `u8 id` + etiqueta UTF-8 |
| 73 | + - `0x14` `RUN` + `u32 request_id` |
| 74 | + - `0x15` `QUIT` + `u32 request_id` |
| 75 | +- Respuestas: |
| 76 | + - `0x70` `OK` + `u32 request_id` |
| 77 | + - `0x71` `ERR` + `u32 request_id` + mensaje UTF-8 |
| 78 | +- Eventos: |
| 79 | + - `0x81` `BUTTON_CLICKED` + `u8 id` |
| 80 | + - `0x82` `CLOSED` |
| 81 | + - `0x83` `LOG` + texto UTF-8 |
| 82 | + - `0x84` `TEXT_CHANGED` + texto UTF-8 |
| 83 | + - `0x85` `KEY_DOWN` + `u32 keycode` |
| 84 | + - `0x86` `ERROR` + texto UTF-8 |
| 85 | + |
| 86 | +## Compilar (Linux) |
| 87 | + |
| 88 | +Requisitos: `gcc`, `make`, `pkg-config`, `libgtk-3-dev`, `Erlang/OTP`, `gleam`. |
| 89 | + |
| 90 | +> Probado con **Gleam v1.17.0**. |
| 91 | +
|
| 92 | +```bash |
| 93 | +make port |
| 94 | +gleam build |
| 95 | +make demo |
| 96 | +``` |
| 97 | + |
| 98 | +Si estás en un entorno sin servidor X (CI/headless), fuerza el modo simulado: |
| 99 | + |
| 100 | +```bash |
| 101 | +MINIGUI_HEADLESS=1 make demo |
| 102 | +``` |
| 103 | + |
| 104 | +## Compilar (Windows) |
| 105 | + |
| 106 | +1. Compila `c_src/minigui_port.c` a `priv/minigui_port.exe` (MSVC o mingw). |
| 107 | +2. Ejecuta el demo: |
| 108 | + |
| 109 | +```powershell |
| 110 | +gleam build |
| 111 | +gleam run -m demo |
| 112 | +``` |
| 113 | + |
| 114 | +> Nota: el código Win32 está dentro de `#ifdef _WIN32`. |
0 commit comments