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. Harbour 3.2+ — Instala desde el gestor de paquetes de tu distribucion o construye desde el codigo fuente:
    sudo apt install 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

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