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.
| Lenguaje | C |
|---|---|
| Lineas de codigo | ~7,300 |
| Funciones HB_FUNC | ~132 |
| API Nativa | GTK3 (GtkWidget, GtkFixed) |
| Dibujo | Cairo / Pango |
| Scintilla | 5.6.1 (biblioteca compartida) |
| Distribuciones Soportadas | Ubuntu, 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 HarbourBuilder | Widget GTK3 |
|---|---|
| Button | gtk_button_new_with_label() |
| Label | gtk_label_new() |
| Edit | gtk_entry_new() |
| Memo | gtk_text_view_new() (en GtkScrolledWindow) |
| CheckBox | gtk_check_button_new_with_label() |
| ComboBox | gtk_combo_box_text_new() |
| ListBox | gtk_list_box_new() (en GtkScrolledWindow) |
| GroupBox | gtk_frame_new() |
| ProgressBar | gtk_progress_bar_new() |
| Slider/TrackBar | gtk_scale_new_with_range() |
| Image | gtk_image_new_from_file() |
| TabControl | gtk_notebook_new() |
| TreeView | gtk_tree_view_new() (en GtkScrolledWindow) |
| Timer | g_timeout_add() |
| StatusBar | gtk_statusbar_new() |
| ToolBar | gtk_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:
gtk-application-prefer-dark-theme— El backend establece esta propiedad GTK aTRUEcuando el sistema esta en modo oscuro. Los temas GTK3 (como Adwaita-dark) responden proporcionando esquemas de color oscuros para todos los widgets.- Daemon de configuraciones GTK — En entornos de escritorio que lo soportan (GNOME, XFCE), GTK3 lee la preferencia del tema del sistema desde el daemon de configuraciones automaticamente.
- Sobreescritura manual — Los usuarios pueden forzar el modo oscuro estableciendo la variable de entorno:
export GTK_THEME=Adwaita:dark
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:
| Archivo | Tipo | Proposito |
|---|---|---|
libscintilla.so | Biblioteca compartida | Componente principal de edicion Scintilla |
liblexilla.so | Biblioteca compartida | Biblioteca de lexer |
Scintilla se carga con dlopen() y dlsym() en tiempo de ejecucion.
Proceso de Construccion
Requisitos Previos
- Compilador GCC:
sudo apt install gcc g++
- Bibliotecas de desarrollo GTK3:
sudo apt install libgtk-3-dev
- 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:
- Verificar requisitos previos — Verifica que GCC y las cabeceras GTK3 esten disponibles.
- Construir Scintilla — Compila las bibliotecas compartidas de Scintilla y Lexilla desde el codigo fuente.
- Compilar codigo fuente Harbour — Ejecuta el compilador Harbour en los archivos fuente del IDE.
- Compilar el backend — Compila
gtk3_backend.ccon GCC. - 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
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
| Caracteristica | Implementacion en Linux |
|---|---|
| Dialogos de archivo | gtk_file_chooser_dialog_new() con GtkFileChooserNative |
| Selector de fuente | GtkFontChooserDialog |
| Selector de color | GtkColorChooserDialog |
| Dialogos de mensaje | GtkMessageDialog |
| Portapapeles | gtk_clipboard_get() / gtk_clipboard_set_text() |
| Arrastrar y soltar | API de arrastrar y soltar GTK (gtk_drag_dest_set()) |
| Bandeja del sistema | GtkStatusIcon / AppIndicator (dependiendo del DE) |
| Modo oscuro | Configuracion GTK gtk-application-prefer-dark-theme |
| Integracion de escritorio | Archivo .desktop, tipos MIME, temas de iconos |
| Impresion | GtkPrintOperation |
Limitaciones Conocidas
- Varianza del entorno de escritorio — Los widgets GTK3 se ven diferentes en GNOME, XFCE, KDE, etc. El backend apunta al tema Adwaita predeterminado. Otros temas pueden producir apariencias ligeramente diferentes.
- Diseno GtkFixed — El backend usa
GtkFixedpara posicionamiento absoluto (coincidiendo con el modelo de Windows/macOS). Esto significa que los controles no se redimensionan o reflujo automaticamente cuando cambia el tamano de la ventana. Usa el eventoOnResizepara diseno dinamico. - Biblioteca compartida Scintilla —
libscintilla.sodebe estar en la ruta de busqueda de bibliotecas (LD_LIBRARY_PATHo/usr/local/lib). Ejecutasudo ldconfigdespues de instalar. - Wayland — GTK3 soporta Wayland, pero algunas caracteristicas (bandeja del sistema, menus globales) pueden no funcionar bajo sesiones Wayland puras. X11 esta totalmente soportado.
Dependencias
| Paquete/Biblioteca | Proposito |
|---|---|
libgtk-3-dev | Cabeceras y bibliotecas GTK3 (widgets, ventanas, eventos) |
libcairo2-dev | Biblioteca de graficos 2D Cairo (dibujo personalizado) |
libpango1.0-dev | Diseno y renderizado de texto Pango |
libglib2.0-dev | Funciones utilitarias GLib (temporizadores, senales, memoria) |
libgdk-pixbuf2.0-dev | Carga y manipulacion de imagenes |
libscintilla.so | Componente de edicion de codigo (biblioteca compartida) |
liblexilla.so | Componente de lexer (biblioteca compartida) |
libharbour | Runtime de Harbour |
-ldl | Carga dinamica (dlopen/dlsym para Scintilla) |
-lm | Biblioteca matematica |