Programación Multiplataforma con Glade

De Wiki do Ciclo ASIR do IES de Rodeira

O entorno natural das aplicacións con GTK+ son o entorno Gnome, e polo tanto Linux, pero xa hai tempo que se atopan dispoñibles para Windows tanto GTK+ como Glade.

Para programar con GTK+ (e Glade) no entorno Windows na linguaxe C, recomendo o uso do IDE Devcpp que ten incluído o compilador MinGw que é unha versión do gcc para Windows que che permitirá facer programas tanto de consola como de modo gráfico, xa sexa mediante liberías especiais (como GTK+) ou utilizando directamente o API de Windows.

Ficheiro:CompilerOptions.JPG
DevCpp: Opcións de Compilación

Unha vez instalado o Devcpp deberás instalar a libraría GTK+ con Glade. Logo poderás traballar utilizando o IDE ou ben cun editor de texto e compilando na liña de comandos.

A principal (e case que única) diferencia coa programación en Linux atópase no xeito que ten Windows de manexar as librerías de enlace dinámico (DLLs). As funcións de tratamento de eventos necesitan enlazarse en tempo de execución (dinámicamente) e iso no entorno Windows é necesario indicalo explícitamente co seguinte prefixo na declaración da función:

 __declspec (dllexport)

O xeito de facelo para non ter que alterar o programa si compila para Windows ou para Linux pode ser o seguinte:

#ifdef __WINDOWS__
   #define EXPORT __declspec (dllexport)
#else
   #define EXPORT
#endif
Ficheiro:Includes.jpg
DevCpp: Includes

Deste xeito, bastaría con poñer EXPORT antes da declaración das funcións de manexo de eventos (tanto no prototipo como na implementación da función), e cando se compile para Windows pasarlle ó gcc o indicador -D__WINDOWS__ de xeito que marque as funcións como a exportar.

En algunhas distribucións de Linux pode ser necesario engadir o flag de compilación -export-dynamic para facer o mesmo efecto.

Outra pequena diferencia está en que é necesario indicarlle ó compilador donde estan as cabeceiras e as librarías. Esto en Linux facíase así:

 gcc programa.c -o programa `pkg-config --cflags --libs libglade-2.0` -export-dynamic

O que ocorre é que baixo Windows non existe o efecto de sustitución producido polos `acentos`, de xeito que para facelo do mesmo modo é necesario instalar un entorno compatible como MSYS.

Ficheiro:Librerias.jpg
DevCpp: Librerías

Outra posibilidade é configurar o IDE de xeito que enlace as librarías e localice as cabeceiras, ou poñendo todo nun Makefile. A información que temos que engadir a podemos obter executando:

 pkg-config --cflags --libs libglade-2.0

E editando as opcións do proxecto para poñer os includes (-Ixxx), as librarías (-lxxx) e as opciones de compilación -xxx. É necesario poñer como opcións de compilación -mms-bitfields -D__WINDOWS__

De todos modos o xeito estándar e recomendado é a creación dun ficheiro Makefile coas reglas para construir o executable, para facelo podemos redirixir a saída de pkg-config a un ficheiro que editaremos posteriormente:

 pkg-config --cflags --libs libglade-2.0 > Makefile

O seguine Makefile pode servir de patrón para outros proxectos:

FLAGS = `pkg-config --cflags --libs libglade-2.0`
FLAGSC = `pkg-config --cflags libglade-2.0`
 
programa: programa.c funcions.o
	gcc programa.c -o progrma funcions.o $(FLAGS) -export-dynamic
funcions.o: funcions.c
	gcc -c funcions.c $(FLAGSC) -export-dynamic

Un exemplo de programa multiplataforma pode ser o seguinte:

#include <gtk/gtk.h>
#include <glade/glade.h>
 
#ifdef __WINDOWS__
   #define EXPORT __declspec (dllexport)
#else
   #define EXPORT
#endif
 
// Variable para almacenar o interface gráfico
//
GladeXML *__gui;
 
// Función conectada ó sinal 'clicked' do botón de cambiar 
// mensaxe
//
EXPORT int cambia_mensaxe(GtkWidget *obj,void *param)
{
   GtkWidget *lbl;
   static int m=0;
   char *mensaxes[2]={" Hola Mundo "," Bos Dias "};
 
   lbl=glade_xml_get_widget(__gui,"label1");
   if (m==0) m=1;
   else      m=0;
   gtk_label_set_text(GTK_LABEL(lbl),mensaxes[m]);
}
 
 
// Programa principal. Únicamente carga o interface creado
// co glade e conecta as sinais.
//
int main(int argc,char *argv[])
{
   gtk_init(&argc,&argv);
 
   __gui=glade_xml_new("holamundo.glade",NULL,NULL);
   glade_xml_signal_autoconnect(__gui);
   gtk_main();
}

Aquí podes descargar unha video-demostración de desenvolvemento con glade.