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.

Estatisticas do Backend
LinguagemObjective-C++
Linhas de codigo~3.800
Funcoes HB_FUNC~158
API NativaCocoa / AppKit (NSView, NSWindow)
Scintilla5.5.3 (biblioteca estatica)
SO SuportadomacOS 12 (Monterey) e posterior
Arquiteturasx86_64, ARM64 (Apple Silicon)

Visao Geral da Arquitetura

graph TB A["Harbour .prg"] --> B["hbbuilder.ch
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 HarbourBuilderClasse Cocoa
ButtonNSButton (NSButtonTypeMomentaryPushIn)
LabelNSTextField (estilo label, nao editavel)
EditNSTextField (editavel, linha unica)
MemoNSTextView (em NSScrollView)
CheckBoxNSButton (NSButtonTypeSwitch ou NSButtonTypeCheck)
ComboBoxNSComboBox
ListBoxNSScrollView com NSListView
GroupBoxNSBox (NSBoxTypeCustom)
ProgressBarNSProgressIndicator (NSProgressIndicatorStyleBar)
Slider/TrackBarNSSlider
ImageNSImageView
TabControlNSTabView
TableViewNSTableView (em NSScrollView)
TimerNSTimer

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:

Tema do sistema

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:

ArquivoTipoProposito
libscintilla.aBiblioteca estaticaComponente principal de edicao Scintilla
liblexilla.aBiblioteca estaticaBiblioteca de lexer

Processo de Build

Pre-requisitos

  1. Xcode Command Line Tools — Este e o unico pre-requisito. Instale com:
    xcode-select --install
    Isso fornece clang, make e os headers do SDK macOS.
  2. 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:

  1. Verificar Harbour — Se $HBDIR nao estiver definido ou o Harbour nao for encontrado em ~/harbour, ele clona e compila o Harbour de github.com/harbour/core.
  2. Build do Scintilla — Baixa o fonte Scintilla 5.5.3 e compila libscintilla.a e liblexilla.a como bibliotecas estaticas.
  3. Compilar o IDE — Compila o fonte do HarbourBuilder usando o compilador Harbour e clang para o backend Objective-C++.
  4. 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
Caminho customizado do Harbour

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:

  1. Recompile o Harbour para darwin/clang/arm64
  2. Atualize HBDIR em build_mac.sh para apontar para o build ARM64 do Harbour
  3. Recompile o Scintilla com -arch arm64
  4. 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
Desempenho Rosetta 2

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

RecursoImplementacao macOS
Menus nativosNSMenu / NSMenuItem na barra de menus do sistema
Dialogos Abrir/SalvarNSOpenPanel / NSSavePanel
Seletor de fontesNSFontPanel
Seletor de coresNSColorPanel
Dialogos de alertaNSAlert
NotificacoesNSUserNotificationCenter
Eventos de arquivoAPI FSEvents
PasteboardNSPasteboard
Modo escuroNSAppearanceNameDarkAqua
Suporte RetinaAutomatico via backing:NSBackingStoreBuffered

Limitacoes Conhecidas

Dependencias

Framework/BibliotecaProposito
-framework CocoaFramework umbrella completo Cocoa/AppKit/Foundation
-framework AppKitControles de UI, janelas, visoes, eventos
-framework FoundationNSString, NSArray, NSDate, etc.
libscintilla.aComponente de edicao de codigo (estatico)
liblexilla.aComponente de lexer (estatico)
libharbour.aRuntime Harbour

Nesta Página

Primeiros Passos Paleta de Componentes Recursos do IDE Tutoriais Referencia Plataformas Visao Geral da Arquitetura Criacao de Janelas Nativas Tratamento de Eventos Modo Escuro Integracao Scintilla Processo de Build Pre-requisitos Script de Build (build_mac.sh) Consideracoes Apple Silicon Criacao de Pacote .app Recursos Especificos da Plataforma Limitacoes Conhecidas Dependencias