macOS Guia da Plataforma
O backend macOS usa Cocoa/AppKit (Objective-C++) para todos os componentes nativos de UI. Ele fornece
uma experiencia Mac autentica com widgets nativos, suporte ao modo escuro via NSAppearanceNameDarkAqua,
e integracao completa com o sistema de janelas do macOS.
| Linguagem | Objective-C++ |
|---|---|
| Linhas de codigo | ~3.800 |
| Funcoes HB_FUNC | ~158 |
| API Nativa | Cocoa / AppKit (NSView, NSWindow) |
| Scintilla | 5.5.3 (biblioteca estatica) |
| SO Suportado | macOS 12 (Monterey) e posterior |
| Arquiteturas | x86_64, ARM64 (Apple Silicon) |
Visao Geral da Arquitetura
preprocessador #xcommand"] B --> C["TForm, TControl
classes OOP Harbour"] C --> D["Bridge HB_FUNC
~158 funcoes"] D --> E["Backend Cocoa
Objective-C++ / NSView"] E --> F["AppKit
NSButton, NSTextField, etc."] E --> G["Core Graphics
Desenho"] E --> H["Scintilla 5.5.3
Biblioteca estatica"] style A fill:#58a6ff,stroke:#388bfd,color:#0d1117 style B fill:#8b5cf6,stroke:#7c3aed,color:#fff style C fill:#f59e0b,stroke:#d97706,color:#0d1117 style D fill:#f59e0b,stroke:#d97706,color:#0d1117 style E fill:#555,stroke:#333,color:#fff style F fill:#555,stroke:#333,color:#fff style G fill:#555,stroke:#333,color:#fff style H fill:#555,stroke:#333,color:#fff
Criacao de Janelas Nativas
Cada formulario HarbourBuilder e um NSWindow nativo com uma visao de conteudo NSView.
Controles sao subclasses Cocoa de NSView:
// cocoa_backend.mm - Criando uma janela de formulario HB_FUNC( UI_FORMNEW ) { const char * cTitle = hb_parc( 1 ); NSInteger nWidth = hb_parni( 2 ); NSInteger nHeight = hb_parni( 3 ); NSRect frame = NSMakeRect( 0, 0, nWidth, nHeight ); NSWindowStyleMask style = NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable | NSWindowStyleMaskResizable; NSWindow * window = [[NSWindow alloc] initWithContentRect:frame styleMask:style backing:NSBackingStoreBuffered defer:NO]; [window setTitle:[NSString stringWithUTF8String:cTitle]]; [window center]; // Configurar a visao de conteudo (NSView para controles filhos) NSView * contentView = [[NSView alloc] initWithFrame:frame]; [window setContentView:contentView]; // Armazenar handle na tabela de objetos do lado Harbour hb_retnint( (NSInteger)(intptr_t) window ); }
Controles mapeiam para classes Cocoa nativas:
| Controle HarbourBuilder | Classe Cocoa |
|---|---|
| Button | NSButton (NSButtonTypeMomentaryPushIn) |
| Label | NSTextField (estilo label, nao editavel) |
| Edit | NSTextField (editavel, linha unica) |
| Memo | NSTextView (em NSScrollView) |
| CheckBox | NSButton (NSButtonTypeSwitch ou NSButtonTypeCheck) |
| ComboBox | NSComboBox |
| ListBox | NSScrollView com NSListView |
| GroupBox | NSBox (NSBoxTypeCustom) |
| ProgressBar | NSProgressIndicator (NSProgressIndicatorStyleBar) |
| Slider/TrackBar | NSSlider |
| Image | NSImageView |
| TabControl | NSTabView |
| TableView | NSTableView (em NSScrollView) |
| Timer | NSTimer |
Tratamento de Eventos
O backend macOS usa o padrao target-action do Cocoa e o sistema de notificacoes. Cada controle registra um target de acao que chama o sistema de eventos Harbour:
// cocoa_backend.mm - Vinculacao de eventos de botao 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; // Armazenar o bloco de codigo Harbour em uma tabela lateral StoreEventBlock( nHandle, nEventId, pBlock ); // Configurar o target-action Cocoa EventTarget * target = [[EventTarget alloc] initWithHandle:nHandle eventId:nEventId]; [btn setTarget:target]; [btn setAction:@selector( fire: )]; } // EventTarget aciona o bloco de codigo Harbour @implementation EventTarget - (void) fire:(id)sender { FireEvent( self.handle, self.eventId ); } @end
Modo Escuro
O modo escuro do macOS e gerenciado nativamente pelo AppKit:
NSAppearanceNameDarkAqua— O backend define a aparencia da aplicacao comoNSAppearanceNameDarkAquaquando o sistema esta em modo escuro. Todos os controles Cocoa padrao adaptam automaticamente suas cores.- Cores automaticas de controles —
NSColorfornece cores semanticas (labelColor,controlColor,windowBackgroundColor) que alternam automaticamente entre variantes claras e escuras. - Observacao do tema do sistema — O backend registra para
NSApplicationDidChangeScreenParametersNotificationpara detetar mudancas de tema em tempo de execucao.
O HarbourBuilder segue a configuracao de aparencia do macOS. Se seu Mac estiver definido para o modo Dark (Ajustes do Sistema → Aparencia), o HarbourBuilder e todos os apps criados com ele usarao automaticamente o tema escuro. Sem configuracao necessaria.
Integracao Scintilla
No macOS, Scintilla 5.5.3 e compilado como biblioteca estatica e linkado diretamente no binario do HarbourBuilder:
| Arquivo | Tipo | Proposito |
|---|---|---|
libscintilla.a | Biblioteca estatica | Componente principal de edicao Scintilla |
liblexilla.a | Biblioteca estatica | Biblioteca de lexer |
Processo de Build
Pre-requisitos
- Xcode Command Line Tools — Este e o unico pre-requisito. Instale com:
xcode-select --install
Isso fornececlang,makee os headers do SDK macOS. - Nenhuma instalacao separada do Harbour necessaria — O script de build baixa e compila o Harbour automaticamente se nao estiver presente.
Script de Build (build_mac.sh)
O script executa estas etapas:
- Verificar Harbour — Se
$HBDIRnao estiver definido ou o Harbour nao for encontrado em~/harbour, ele clona e compila o Harbour de github.com/harbour/core. - Build do Scintilla — Baixa o fonte Scintilla 5.5.3 e compila
libscintilla.aeliblexilla.acomo bibliotecas estaticas. - Compilar o IDE — Compila o fonte do HarbourBuilder usando o compilador Harbour e clang para o backend Objective-C++.
- Linkagem — Linka com os frameworks macOS:
-framework Cocoa,-framework Foundation,-framework AppKit, mais o runtime Harbour e bibliotecas estaticas Scintilla.
# build_mac.sh - Sessao de build tipica cd HarbourBuilder/samples ./build_mac.sh # Copiar para bin/ e executar cp HbBuilder ../bin/ ../bin/HbBuilder
Se voce ja tem o Harbour instalado em outro local: HBDIR=/caminho/para/harbour ./build_mac.sh
Consideracoes Apple Silicon
O build padrao tem como alvo x86_64 para compatibilidade. Em Macs Apple Silicon (M1/M2/M3/M4),
o binario roda sob traducao Rosetta 2. Para builds ARM64 nativas:
- Recompile o Harbour para
darwin/clang/arm64 - Atualize
HBDIRembuild_mac.shpara apontar para o build ARM64 do Harbour - Recompile o Scintilla com
-arch arm64 - Compile o HarbourBuilder com
clang -arch arm64
# Build para Apple Silicon (ARM64) export CFLAGS="-arch arm64" export LDFLAGS="-arch arm64" HBDIR=~/harbour_arm64 ./build_mac.sh
A traducao Rosetta 2 e muito eficiente em Apple Silicon. A maioria das aplicacoes roda com impacto de desempenho negligenciavel. No entanto, para o melhor desempenho — especialmente com operacoes intensivas de CPU como compilacao — um build ARM64 nativo e recomendado.
Criacao de Pacote .app
Para distribuir uma aplicacao HarbourBuilder como um pacote de aplicacao macOS padrao:
MyApp.app/ ├── Contents/ │ ├── Info.plist // Metadados do pacote │ ├── MacOS/ │ │ └── MyApp // O binario compilado │ ├── Resources/ │ │ ├── icon.icns // Icone da aplicacao │ │ └── MainMenu.nib // (opcional) MainMenu │ └── PkgInfo // APPL????
Recursos Especificos da Plataforma
| Recurso | Implementacao macOS |
|---|---|
| Menus nativos | NSMenu / NSMenuItem na barra de menus do sistema |
| Dialogos Abrir/Salvar | NSOpenPanel / NSSavePanel |
| Seletor de fontes | NSFontPanel |
| Seletor de cores | NSColorPanel |
| Dialogos de alerta | NSAlert |
| Notificacoes | NSUserNotificationCenter |
| Eventos de arquivo | API FSEvents |
| Pasteboard | NSPasteboard |
| Modo escuro | NSAppearanceNameDarkAqua |
| Suporte Retina | Automatico via backing:NSBackingStoreBuffered |
Limitacoes Conhecidas
- Gatekeeper — Aplicacoes nao assinadas podem ser bloqueadas pelo Gatekeeper. Clique direito → Abrir, ou remova a quarentena:
xattr -d com.apple.quarantine HbBuilder. - Notarizacao — Para distribuicao a outros Macs, o binario deve ser notariado pelo programa Developer ID da Apple.
- Versao do Scintilla — O backend macOS usa Scintilla 5.5.3 (vs 5.6.1 no Windows/Linux) devido a requisitos de compatibilidade especificos do Cocoa na versao mais recente.
- ARM64 — Builds nativas Apple Silicon exigem recompilacao manual do Harbour e Scintilla para
arm64.
Dependencias
| Framework/Biblioteca | Proposito |
|---|---|
-framework Cocoa | Framework umbrella completo Cocoa/AppKit/Foundation |
-framework AppKit | Controles de UI, janelas, visoes, eventos |
-framework Foundation | NSString, NSArray, NSDate, etc. |
libscintilla.a | Componente de edicao de codigo (estatico) |
liblexilla.a | Componente de lexer (estatico) |
libharbour.a | Runtime Harbour |