Gnome: Desasrrollo de aplicaciones. La aplicación
Iniciando nuestra primera aplicación.
Gnome: Desarrollo de aplicaciones. Estructura de ficherosVamos a comenzar a construir el core de esta aplicación y al final de este artículo deberíamos poder compilar y ejecutar nuestra aplicación que nos debería mostrar una ventana con un mensaje de texto.
No hay un orden especifico para configurar los ficheros, si has usado Builder de Gnome le habrás dado un nombre al proyecto y un id y te habrá generado todos estos ficheros. Cada fichero tiene su funcion dentro de la estructura de la aplicación.
Los ids de aplicaciones para Gnome llevan un formato de dominio invertido. Esto es para poder identificar de forma univoca la app. En nuestro caso vamos a usar io.github.agustingv.example. (Si se tiene alojado el código en github y se quiere usar el dominio de github como parte del id de la aplicación hay que usar io e vez de com para que flatpak no lo rechaze)
meson.build
Nuestro principal fichero de construcción en el vamos a definir como se va a compilar el projecto, los argumentos de compilación y los subdirectorios que tiene que mirar. En cada subdirectorio que definamos debería existir otro fichero meson.build que defina las reglas, como las posibles dependencias, que necesita para realizar la construcción de la aplicación.
En este ejemplo solo accedemos a una propiedad definida en project que es meson.project_name()
project('example', 'vala', 'c',
version: '1.0',
meson_version: '>= 0.59.0',
default_options: [
'buildtype=debug',
'warning_level=2',
'default_library=static'
],
)
gnome = import('gnome')
i18n = import('i18n')
example_name = meson.project_name()
add_project_arguments(
['-DGETTEXT_PACKAGE="' + example_name + '"',
'-DHANDY_USE_UNSTABLE_API',
'-w'],
language: 'c',
)
subdir('data')
if find_program('msgfmt', required: false).found()
subdir('po')
endif
subdir('src')src/config.vala.in
Como ya hemos comentado en una artículo anterior, Vala genera código C que luego se compila y para las constantes de configuración vala necesita generar las instrucciones de preprocesador de C. Hay dos formas de realizar esto. Creando un VAPI o creando un namespace en Vala e indicando en el meson.build la definición de las constantes. En este caso, para simplificar las cosas vamos a usar el namespace.
namespace Config {
public const string GETTEXT_PACKAGE = "@GETTEXT_PACKAGE@";
public const string LOCALE_DIR = "@LOCALE_DIR@";
}data/ui/main-window.ui
Los ficheros ui contienen el xml que define la interfaz de usuario, en los xml se hace referencia a los objectos definios por Gtk o propios de la aplicación.
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<object class="GtkApplicationWindow" id="app_window">
<property name="title" translatable="yes">Example Application</property>
<property name="default-width">600</property>
<property name="default-height">400</property>
<child>
<object class="GtkBox" id="content_box">
<property name="orientation">vertical</property>
<child>
<object class="GtkStack" id="stack"/>
</child>
</object>
</child>
</object>
</interface>data/src/example.gresource.xml
Este fichero registra los recursos de ui de la aplicación. En este caso solo tenemos dara/ui/main-window.ui.
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
<gresource prefix="/com/example">
<file preprocess="xml-stripblanks">ui/main-window.ui</file>
</gresource>
</gresources>src/main.vala
Archivo principal que se encarga de iniciar la aplicación. Se puede usar cualquier nombre de fichero para esto ya que es el propio codigo el se define como main (Recordemos que esto se ejecuta como código C y en C la función main es la inicia el programa)
int main (string[] args) {
GLib.Intl.setlocale (LocaleCategory.ALL, "");
GLib.Intl.bindtextdomain (Config.GETTEXT_PACKAGE, Config.LOCALE_DIR);
GLib.Intl.bind_textdomain_codeset (Config.GETTEXT_PACKAGE, "UTF-8");
GLib.Intl.textdomain (Config.GETTEXT_PACKAGE);
var app = new Example.Application ();
return app.run (args);
}src/application.vala
Este va a ser nuestro archivo principal donde se define el comportamiento de nuestra aplicación y su ciclo de vida.
| Ciclo | Descripción |
|---|---|
| startup | Se ejecuta al arrancar la Adw.Application llama automáticamente a adw_init() en esta fase. Carga las hojas de estilos CSS personalizadas y define los atajos globales. |
| activate | Se dispara cuando la aplicación es lanzada o se invoca una nueva instancia sin argumentos principales. Es el momento adecuado para crear la ventana principal, asignarle contenido y llamar al método para mostrarla. |
| open | Se ejecuta si la aplicación se invoca desde la línea de comandos pasando archivos o parámetros para abrir directamente. |
| shutdown | Ocurre cuando la última ventana se cierra y la aplicación se dispone a salir del bucle principal. Momento para liberar recursos o guardar estados persistentes si no se hizo de forma automática. |
namespace Example
{
public class Application : Adw.Application
{
private Preferences prefs;
private ExtensionManager ext_manager;
public Application ()
{
Object (
application_id: "io.github.agustingv.example",
flags: ApplicationFlags.DEFAULT_FLAGS
);
}
construct
{
}
protected override void activate ()
{
var win = this.active_window;
if (win == null) {
win = new Example.MainWindow (this);
}
win.present ();
}
}
}src/main-window.vala
Definición de la ventana principal
namespace Example {
[GtkTemplate (ui = "/io/github/agustingv/example/ui/main-window.ui")]
public class MainWindow : Adw.ApplicationWindow {
public MainWindow (Gtk.Application app) {
Object (application: appr);
}
construct
{
}
}
}Artículos recientes
Noticia
Proton 11.0-1
02/08/2026
Noticia
PHP 8.5
02/08/2026
Artículo
Gnome: Desarrollo de aplicaciones. Estructura de ficheros
31/07/2026
Artículo
Gnome: Desarrollo de aplicaciones. El punto de partida
31/07/2026
Artículo
Cambiar tipo de datos en campos de Drupal (Drupal 7)
14/11/2025
Artículo
Kotlin: Flow
17/02/2023