macOS Guia de Plataforma
El backend de macOS usa Cocoa/AppKit (Objective-C++) para todos los componentes de interfaz nativos. Proporciona una
experiencia Mac verdadera con widgets nativos, soporte de modo oscuro via NSAppearanceNameDarkAqua,
e integracion completa con el sistema de ventanas de macOS.
| Lenguaje | Objective-C++ |
|---|---|
| Lineas de codigo | ~3,800 |
| Funciones HB_FUNC | ~158 |
| API Nativa | Cocoa / AppKit (NSView, NSWindow) |
| Scintilla | 5.5.3 (biblioteca estatica) |
| SO Soportado | macOS 12 (Monterey) y posterior |
| Arquitecturas | x86_64, ARM64 (Apple Silicon) |
Vision General de la Arquitectura
Cada formulario de HarbourBuilder es un NSWindow nativo con una vista de contenido NSView.
Los controles son subclases Cocoa de NSView:
| Control HarbourBuilder | Clase Cocoa |
|---|---|
| Button | NSButton (NSButtonTypeMomentaryPushIn) |
| Label | NSTextField (estilo etiqueta, no editable) |
| Edit | NSTextField (editable, una sola linea) |
| Memo | NSTextView (en NSScrollView) |
| CheckBox | NSButton (NSButtonTypeSwitch o NSButtonTypeCheck) |
| ComboBox | NSComboBox |
| ListBox | NSScrollView con NSListView |
| GroupBox | NSBox (NSBoxTypeCustom) |
| ProgressBar | NSProgressIndicator (NSProgressIndicatorStyleBar) |
| Slider/TrackBar | NSSlider |
| Image | NSImageView |
| TabControl | NSTabView |
| TableView | NSTableView (en NSScrollView) |
| Timer | NSTimer |
Manejo de Eventos
El backend de macOS usa el patron target-action de Cocoa y el sistema de notificaciones. Cada control registra un target de accion que llama al sistema de eventos de Harbour:
// cocoa_backend.mm - Vinculacion de eventos de boton HB_FUNC( UI_ONEVENT ) { NSInteger nHandle = hb_parnint( 1 ); NSInteger nEventId = hb_parnint( 2 ); PHB_ITEM pBlock = hb_param( 3, HB_IT_BLOCK ); NSButton * btn = (NSButton *)(intptr_t) nHandle; // Almacenar el bloque de codigo Harbour en una tabla lateral StoreEventBlock( nHandle, nEventId, pBlock ); // Configurar el target de accion Cocoa EventTarget * target = [[EventTarget alloc] initWithHandle:nHandle eventId:nEventId]; [btn setTarget:target]; [btn setAction:@selector( fire: )]; }
Modo Oscuro
El modo oscuro de macOS es manejado nativamente por AppKit:
NSAppearanceNameDarkAqua— El backend establece la apariencia de la aplicacion aNSAppearanceNameDarkAquacuando el sistema esta en modo oscuro. Todos los controles Cocoa estandar adaptan automaticamente sus colores.- Colores automaticos de controles —
NSColorproporciona colores semanticos (labelColor,controlColor,windowBackgroundColor) que cambian automaticamente entre variantes claras y oscuras. - Observacion del tema del sistema — El backend se registra para
NSApplicationDidChangeScreenParametersNotificationpara detectar cambios de tema en tiempo de ejecucion.
HarbourBuilder sigue la configuracion de apariencia del sistema macOS. Si tu Mac esta configurada en modo Oscuro (Ajustes del Sistema → Apariencia), HarbourBuilder y todas las aplicaciones construidas con el usaran automaticamente el tema oscuro. No se necesita configuracion.
Integracion de Scintilla
En macOS, Scintilla 5.5.3 se construye como biblioteca estatica y se enlaza directamente en el binario de HarbourBuilder:
| Archivo | Tipo | Proposito |
|---|---|---|
libscintilla.a | Biblioteca estatica | Componente principal de edicion Scintilla |
liblexilla.a | Biblioteca estatica | Biblioteca de lexer |
Proceso de Construccion
Requisitos Previos
- Xcode Command Line Tools — Este es el unico requisito previo. Instala con:
xcode-select --install
Esto proporcionaclang,makey las cabeceras del SDK de macOS. - No se necesita instalacion separada de Harbour — El script de construccion descarga y compila Harbour automaticamente si no esta presente.
Script de Construccion (build_mac.sh)
El script realiza estos pasos:
- Verificar Harbour — Si
$HBDIRno esta establecido o Harbour no se encuentra en~/harbour, clona y compila Harbour desde github.com/harbour/core. - Construir Scintilla — Descarga el codigo fuente de Scintilla 5.5.3 y construye
libscintilla.ayliblexilla.acomo bibliotecas estaticas. - Compilar el IDE — Compila el codigo fuente de HarbourBuilder usando el compilador Harbour y clang para el backend Objective-C++.
- Enlazar — Enlaza contra los frameworks de macOS:
-framework Cocoa,-framework Foundation,-framework AppKit, mas el runtime de Harbour y las bibliotecas estaticas de Scintilla.
# build_mac.sh - Sesion de construccion tipica cd HarbourBuilder/samples ./build_mac.sh # Copiar a bin/ y ejecutar cp HbBuilder ../bin/ ../bin/HbBuilder
Si ya tienes Harbour instalado en otro lugar: HBDIR=/ruta/a/harbour ./build_mac.sh
Consideraciones de Apple Silicon
La construccion predeterminada apunta a x86_64 para compatibilidad. En Macs Apple Silicon (M1/M2/M3/M4),
el binario se ejecuta bajo traduccion Rosetta 2. Para construcciones ARM64 nativas:
- Recompila Harbour para
darwin/clang/arm64 - Actualiza
HBDIRenbuild_mac.shpara apuntar a la construccion ARM64 de Harbour - Reconstruye Scintilla con
-arch arm64 - Construye HarbourBuilder con
clang -arch arm64
La traduccion Rosetta 2 es muy eficiente en Apple Silicon. La mayoria de las aplicaciones se ejecutan con un impacto de rendimiento insignificante. Sin embargo, para el mejor rendimiento — especialmente con operaciones intensivas de CPU como compilar — se recomienda una construccion ARM64 nativa.
Creacion de Paquetes .app
Para distribuir una aplicacion HarbourBuilder como un paquete de aplicacion macOS estandar:
MiApp.app/ ├── Contents/ │ ├── Info.plist // Metadatos del paquete │ ├── MacOS/ │ │ └── MiApp // El binario compilado │ ├── Resources/ │ │ ├── icon.icns // Icono de la aplicacion │ │ └── MainMenu.nib // (opcional) Menu principal │ └── PkgInfo // APPL????
Limitaciones Conocidas
- Gatekeeper — Las aplicaciones sin firmar pueden ser bloqueadas por Gatekeeper. Clic derecho → Abrir, o elimina la cuarentena:
xattr -d com.apple.quarantine HbBuilder. - Notarizacion — Para distribucion a otros Macs, el binario deberia ser notariado a traves del programa Developer ID de Apple.
- Version de Scintilla — El backend de macOS usa Scintilla 5.5.3 (vs 5.6.1 en Windows/Linux) debido a requisitos de compatibilidad especificos de Cocoa en la version mas nueva.
- ARM64 — Las construcciones nativas de Apple Silicon requieren recompilacion manual de Harbour y Scintilla para
arm64.
Dependencias
| Framework/Biblioteca | Proposito |
|---|---|
-framework Cocoa | Framework paraguas completo Cocoa/AppKit/Foundation |
-framework AppKit | Controles de interfaz, ventanas, vistas, eventos |
-framework Foundation | NSString, NSArray, NSDate, etc. |
libscintilla.a | Componente de edicion de codigo (estatica) |
liblexilla.a | Componente de lexer (estatica) |
libharbour.a | Runtime de Harbour |