Linux Guia de Plataforma

El backend de Linux usa GTK3 (C) para todos los widgets nativos, con Cairo para dibujo personalizado. Esta escrito en C puro y compilado con GCC, proporcionando una experiencia Linux nativa que se integra con GNOME, XFCE, KDE y otros entornos de escritorio compatibles con GTK.

Estadisticas del Backend
LenguajeC
Lineas de codigo~7,300
Funciones HB_FUNC~132
API NativaGTK3 (GtkWidget, GtkFixed)
DibujoCairo / Pango
Scintilla5.6.1 (biblioteca compartida)
Distribuciones SoportadasUbuntu, Debian, Fedora, openSUSE, Arch, etc.

Vision General de la Arquitectura

Cada formulario de HarbourBuilder es un GtkWindow con un contenedor GtkFixed para controles hijos posicionados absolutamente. El backend crea widgets GTK y almacena sus punteros en una tabla de manejadores:

// gtk3_backend.c - Creacion de ventana de formulario
HB_FUNC( UI_FORMNEW )
{
   const char * cTitle = hb_parc( 1 );
   gint nWidth  = hb_parni( 2 );
   gint nHeight = hb_parni( 3 );

   GtkWidget * window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
   gtk_window_set_title( GTK_WINDOW( window ), cTitle );
   gtk_window_set_default_size( GTK_WINDOW( window ), nWidth, nHeight );
   gtk_window_set_position( GTK_WINDOW( window ), GTK_WIN_POS_NONE );

   // Usar GtkFixed para posicionamiento absoluto de controles hijos
   GtkWidget * fixed = gtk_fixed_new();
   gtk_container_add( GTK_CONTAINER( window ), fixed );

   // Almacenar manejador en la tabla de objetos del lado de Harbour
   hb_retnint( (gintptr) window );
}
Control HarbourBuilderWidget GTK3
Buttongtk_button_new_with_label()
Labelgtk_label_new()
Editgtk_entry_new()
Memogtk_text_view_new() (en GtkScrolledWindow)
CheckBoxgtk_check_button_new_with_label()
ComboBoxgtk_combo_box_text_new()
ListBoxgtk_list_box_new() (en GtkScrolledWindow)
GroupBoxgtk_frame_new()
ProgressBargtk_progress_bar_new()
Slider/TrackBargtk_scale_new_with_range()
Imagegtk_image_new_from_file()
TabControlgtk_notebook_new()
TreeViewgtk_tree_view_new() (en GtkScrolledWindow)
Timerg_timeout_add()
StatusBargtk_statusbar_new()
ToolBargtk_toolbar_new()

Manejo de Eventos (g_signal)

El backend GTK3 usa el sistema de senales de GObject (g_signal_connect()) para conectar eventos nativos de widgets a manejadores de eventos de Harbour:

// gtk3_backend.c - Vinculacion de eventos basada en senales
HB_FUNC( UI_ONEVENT )
{
   gint nHandle = hb_parnint( 1 );
   gint nEventId = hb_parnint( 2 );
   PHB_ITEM pBlock = hb_param( 3, HB_IT_BLOCK );

   GtkWidget * widget = GTK_WIDGET( GetHandlePtr( nHandle ) );

   // Almacenar el bloque de codigo Harbour
   StoreEventBlock( nHandle, nEventId, pBlock );

   // Conectar la senal GTK a nuestra funcion de despacho
   switch( nEventId )
   {
      case EVENT_CLICK:
         g_signal_connect( widget, "clicked",
                           G_CALLBACK( on_clicked_signal ),
                           GINT_TO_POINTER( nHandle ) );
         break;
      case EVENT_CHANGE:
         g_signal_connect( widget, "changed",
                           G_CALLBACK( on_changed_signal ),
                           GINT_TO_POINTER( nHandle ) );
         break;
      case EVENT_KEYDOWN:
         g_signal_connect( widget, "key-press-event",
                           G_CALLBACK( on_key_signal ),
                           GINT_TO_POINTER( nHandle ) );
         break;
   }
}

Modo Oscuro

El modo oscuro de GTK3 se controla mediante configuraciones de GTK:

Deteccion del tema del sistema

En GNOME, el tema del sistema se lee desde org.gnome.desktop.interface gtk-theme via gsettings. El backend verifica esto al inicio y establece gtk-application-prefer-dark-theme en consecuencia.

Integracion de Scintilla

En Linux, Scintilla 5.6.1 se construye como biblioteca compartida:

ArchivoTipoProposito
libscintilla.soBiblioteca compartidaComponente principal de edicion Scintilla
liblexilla.soBiblioteca compartidaBiblioteca de lexer

Scintilla se carga con dlopen() y dlsym() en tiempo de ejecucion.

Proceso de Construccion

Requisitos Previos

  1. Compilador GCC:
    sudo apt install gcc g++
  2. Bibliotecas de desarrollo GTK3:
    sudo apt install libgtk-3-dev
  3. WebKit2GTK (opcional, para TWebView):
    sudo apt install libwebkit2gtk-4.1-dev

    Sin este paquete, los controles TWebView muestran un placeholder. El script de construccion detecta automaticamente WebKit2GTK y lo habilita cuando esta disponible.

  4. Harbour 3.2+ — Instala desde el gestor de paquetes de tu distribucion o construye desde el codigo fuente:
    sudo apt install harbour
Paquetes por distribucion

En Fedora: sudo dnf install gtk3-devel webkit2gtk4.1-devel gcc harbour
En Arch: sudo pacman -S gtk3 webkit2gtk-4.1 harbour harbour-contrib
En openSUSE: sudo zypper install gtk3-devel webkit2gtk3-devel harbour

Script de Construccion (build_linux.sh)

El script realiza estos pasos:

  1. Verificar requisitos previos — Verifica que GCC y las cabeceras GTK3 esten disponibles.
  2. Construir Scintilla — Compila las bibliotecas compartidas de Scintilla y Lexilla desde el codigo fuente.
  3. Compilar codigo fuente Harbour — Ejecuta el compilador Harbour en los archivos fuente del IDE.
  4. Compilar el backend — Compila gtk3_backend.c con GCC.
  5. Enlazar — Enlaza todo junto con GTK3, Cairo, Pango y el runtime de Harbour.
# build_linux.sh - Sesion de construccion tipica en Ubuntu/Debian
# Instalar dependencias
sudo apt update
sudo apt install libgtk-3-dev gcc g++ harbour

# Construir
cd HarbourBuilder/samples
./build_linux.sh

# Ejecutar
../bin/hbbuilder_linux
Paquetes de distribucion

En Fedora: sudo dnf install gtk3-devel gcc harbour
En Arch: sudo pacman -S gtk3 harbour harbour-contrib
En openSUSE: sudo zypper install gtk3-devel harbour

Caracteristicas Especificas de la Plataforma

CaracteristicaImplementacion en Linux
Dialogos de archivogtk_file_chooser_dialog_new() con GtkFileChooserNative
Selector de fuenteGtkFontChooserDialog
Selector de colorGtkColorChooserDialog
Dialogos de mensajeGtkMessageDialog
Portapapelesgtk_clipboard_get() / gtk_clipboard_set_text()
Arrastrar y soltarAPI de arrastrar y soltar GTK (gtk_drag_dest_set())
Bandeja del sistemaGtkStatusIcon / AppIndicator (dependiendo del DE)
Modo oscuroConfiguracion GTK gtk-application-prefer-dark-theme
Integracion de escritorioArchivo .desktop, tipos MIME, temas de iconos
ImpresionGtkPrintOperation

Soporte WebView (WebKit2GTK)

El control TWebView proporciona un navegador web integrado usando WebKit2GTK. El script de construccion detecta automaticamente la biblioteca y la habilita en tiempo de compilacion.

Instalacion

# Ubuntu / Debian
sudo apt install libwebkit2gtk-4.1-dev

# Fedora
sudo dnf install webkit2gtk4.1-devel

# Arch Linux
sudo pacman -S webkit2gtk-4.1

Deteccion en la Compilacion

El script build_linux.sh detecta automaticamente WebKit2GTK:

Despues de instalar el paquete dev, fuerza la reconstruccion del backend GTK3:

rm -f source/gtk3_core.o
./build_linux.sh

Deberas ver:

  WebKit2GTK 4.1 detected — WebView enabled

Funciones Soportadas

Metodo / PropiedadDescripcion
cUrlObtener/establecer la URL actual (navega al asignar)
Navigate(cUrl)Cargar una URL
LoadHTML(cHtml)Cargar contenido HTML directamente
GoBack()Navegar atras en el historial
GoForward()Navegar adelante en el historial
Reload()Recargar la pagina actual
Stop()Detener la carga
GetUrl()Obtener la URL actual
EvaluateJS(cScript)Ejecutar JavaScript
CanGoBack()Retorna .T. si hay navegacion atras disponible
CanGoForward()Retorna .T. si hay navegacion adelante disponible

Ejemplo

// WebView en un formulario
@ 44, 0 WEBVIEW ::oWebView1 OF Self SIZE 800, 500 URL "https://harbour.github.io"

// Navegar programaticamente
::oWebView1:Navigate( "https://github.com" )

// Ejecutar JavaScript
::oWebView1:EvaluateJS( "document.title" )
Sin WebKit2GTK

Si el paquete dev no esta instalado, TWebView muestra un label estatico que dice "WebView (install libwebkit2gtk-4.1-dev)". Todos los metodos de navegacion se convierten en no-ops. La propiedad cUrl sigue almacenando la URL para serializacion.

Limitaciones Conocidas

Dependencias

Paquete/BibliotecaProposito
libgtk-3-devCabeceras y bibliotecas GTK3 (widgets, ventanas, eventos)
libcairo2-devBiblioteca de graficos 2D Cairo (dibujo personalizado)
libpango1.0-devDiseno y renderizado de texto Pango
libglib2.0-devFunciones utilitarias GLib (temporizadores, senales, memoria)
libgdk-pixbuf2.0-devCarga y manipulacion de imagenes
libscintilla.soComponente de edicion de codigo (biblioteca compartida)
liblexilla.soComponente de lexer (biblioteca compartida)
libharbourRuntime de Harbour
-ldlCarga dinamica (dlopen/dlsym para Scintilla)
-lmBiblioteca matematica

En Esta Página

Primeros pasos Paleta de componentes Funciones del IDE Tutoriales Referencia Plataformas Vision General de la Arquitectura Manejo de Eventos (g_signal) Modo Oscuro Integracion de Scintilla Proceso de Construccion Requisitos Previos Script de Construccion (build_linux.sh) Caracteristicas Especificas de la Plataforma Limitaciones Conocidas Dependencias