Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Escritorios GNU/Linux
Escritorio GNOME
Escritorio KDE
Indice
1.- Programacin C en Linux. Particularidades. 2.- Bibliotecas bsicas en GNOME 3.- Biblioteca Glib: objetos y seales 4.- Biblioteca GTK+: widgets, seales, y contenedores 5.- Herramientas para desarrollo 6.- Bindings 7.- Ejemplos
Estructura de un programa
#include <ficheros_de_cabecera> ...declaracion de variables globales; ...declaracion de funciones int main (int argc, char* argv[]) { ...declaracion de variables locales; ...instruccion; }
Tipos de datos portables entre sistemas operativos y arquitecturas. glib ofrece tipos de datos propios que permiten programar sin tener en cuenta la diferencia de tamao entre arquitecturas. Gestin de memoria: ofrece funciones equivalentes a las funciones de asignacin de memoria de la biblioteca libc que ofrecen un control ms exhaustivo de lo que se hace con la memoria.
Estructuras de datos: proporciona funciones para tratar con listas enlazadas (simple y doblemente enlazadas), arrays dinmicos, tablas de "hash", etc. Bucle de ejecucin: glib proporciona un bucle de ejecucin (GMainLoop) que permite convertir en asncrona la ejecucin del programa, permaneciendo a la escucha de eventos, actuando cuando stos se reciben. De aplicacin en interfaces grficas y otros como alarmas, I/O, etc. Sistema de objetos: permite usar programacin orientada a objetos en C, proporcionando herencia de clases, polimorfismo, etc.
Biblioteca para el desarrollo de interfaces grficas, que define los widgets y su funcionamiento. Forman parte de GTK+:
GDK implementa el nivel ms bajo de la arquitectura, forma una capa sobre la implementacin grfica real (p.ej. X Window), y se reescribe para cada plataforma. gdk-pixbuf permite el tratamiento de imgenes grficas. Pango permite la representacin de caracteres en distintos alfabetos (occidental, cirilico, rabe, chino, etc). Todas las aplicaciones GNOME van a hacen uso de Pango para la representacin de texto en pantalla.
ATK es una librera de clases abstractas cuyo objetivo es servir de base para el desarrollo de aplicaciones accesibles para personas con deficiencias fsicas. gnome-libs constituye una capa sobre todos los servicios ofrecidos por GNOME (acceso a la configuracin, el panel, componentes, etc) Gconf permite el manejo de ficheros de configuracin, totalmente transparente a la red, ideal para compartir los datos entre distintas aplicaciones y distintas mquinas.
gnome-vfs ofrece un sistema de ficheros virtual, con acceso a ficheros convencionales, mquinas remotas o protocolos de red como HTTP, FTP, etc. libxml/libxslt manejo de datos XML y XSLT. libglade carga de interfaces grficas generadas por Glade.
Tipos estndar C. unsigned char unsigned int unsigned short unsigned long
Alternativa a printf: void g_print (const gchar *format, ...); Depuracin con g_assert(): Esta funcin recibe como parmetro un enunciado lgico y comprueba su validez. g_assert (cadena != NULL); g_print ("%s\n", cadena);
Aplicando al sistema de objetos de GLib (GObject) las caractersticas del lenguaje C, se implementa una POO casi total. GObject es una clase abstracta, de la que no se pueden crear instancias directamente, aunque s contiene alguna implementacin, como es toda la gestin del control de vida del objeto, de sus seales y manejadores, etc.
Herencia: la creacin de clases que heredan la funcionalidad de otras clases ya existentes. Esto permite crear clases con la funcionalidad bsica y, basadas en dicha clase, crear otras que aadan una funcionalidad ms especfica. Polimorfismo, que permite tratar a un mismo objeto bajo distintas personalidades. Interfaces, que permite la definicin de interfaces (clases abstractas) y su posterior implementacin en clases.
GTK+ es la biblioteca grfica sobre la que se sustenta todo el interfaz grfico de GNOME. Es una librera que contiene todo lo necesario para el desarrollo de interfaces grficas, permitiendo la posibilidad de crear todo tipo de widgets, desde los ms bsicos, como botones, etiquetas, cajas de texto, hasta cosas ms complejas como selectores de ficheros, colores, fuentes, cajas de texto multilnea con soporte para todo tipo de efectos sobre el texto, etc.
Un widget es personalizable.
un
componente
software
visible
Los widgets se combinan para construir los interfaces grficos de usuario. El programador los adapta segn sus necesidades sin tener que escribir ms cdigo que el necesario para definir los nuevos valores de las propiedades de los widgets.
La librera GTK+ sigue el modelo de programacin orientado a objetos. La jerarqua de objetos comienza en GObject de la librera Glib del que hereda GtkObject. Todos los widgets heredan de la clase de objetos GtkWidget, que a su vez hereda directamente de GtkObject. La clase GtkWidget contiene las propiedades comunes a todos los widgets; cada widget particular le aade sus propias propiedades.
Los widgets se definen mediante punteros a una estructura GtkWidget. El proceso de creaccin de un widget consta de dos pasos: el de creacin propiamente dicho y el de visualizacin. gtk_nombre_new() gtk_widget_show()
La funcin de creacin de un widget gtk_nombre_new devuelve un puntero a un objeto de tipo GtkWidget y no un puntero a un widget del tipo creado. Por ejemplo, la funcin gtk_button_new devuelve un puntero a un objeto de GtkWidget y no una referencia a un botn. Esta referencia puede convertirse a una referencia a un objeto GtkButton mediante la macro GTK_BUTTON, si se desea utilizar en lugares donde se requieran objetos botones.
Aunque sera posible pasar en esos casos la referencia genrica, el compilador se quejar si se hace as posibilitando un control de tipos de objetos. Todo widget tiene una macro de conversin de una referencia genrica a una referencia al tipo propio.
GTK+ usa el modelo de programacin por eventos. Este modelo consiste en la asociacin de determinadas acciones ("eventos") a determinadas operaciones ("funciones"). Los eventos en GTK son seales especificadas en la definicin de las clases de los distintos widgets. As, por ejemplo, el widget GtkButton tiene definida una seal llamada "clicked" que es emitida cuando el botn en cuestin es pulsado por el usuario. La aplicacin se "conecta" a dicha seal para ser informada por GTK+ cada vez que dicho botn es pulsado.
Eventos y seales
signal clicked GtkWidget button signal b ACTION callback
signal a
El bucle de eventos es un bucle interno de GTK+, que comprueba permanentemente los estados de cada uno de los elementos de la aplicacin, e informando de dichos cambios. void gtk_main (void); void gtk_main_quit (void);
void callback_func ( GtkWidget *widget, ... /* other signal arguments */ gpointer callback_data ); G_OBJECT y G_CALLBACK son macros que permiten realizar la conversin y comprobacin de tipos de forma sencilla, adems de facilitar la legibilidad del cdigo.
Eventos delete_event y destroy: delete_event es emitido cuando usamos el gestor de ventanas para cerrar la ventana, o cuando usamos la llamada gtk_widget_destroy() pasando el widget de la ventana como el objeto a destruir. destroy es emitido cuando, en el "delete_event", devolvemos el valor FALSE. manejador
El gestor de ventanas emite el evento "delete_event" a la aplicacin y en ese momento se llamar a la funcin que hemos definido con el nombre "delete_event" . Ahora podemos reaccionar de varias formas dentro de la funcin: podemos ignorar el evento, procesarlo o simplemente cerrar la aplicacin. El valor que devuelva esta funcin de conexin le permite a GTK conocer qu accin debe llevar a cabo.
Si devolvemos TRUE, estamos indicando que no queremos que se emita la seal "destroy", lo que permitir que nuestra aplicacin siga ejecutndose. Si devolvemos FALSE, indicaremos que se emita la seal "destroy", evento que ser recogido por nuestra funcin de conexin "destroy".
g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL); g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy), NULL); g_signal_connect_swapped (G_OBJECT (button), "clicked", G_CALLBACK (gtk_widget_destroy), G_OBJECT (window));
GTK+ usa el modelo de contenedores, donde no es necesario el uso de coordenadas. Se crean distintos tipos de contenedores, cada uno de los cuales coloca los widgets dentro de s mismo de una forma determinada. El propio contenedor se encarga de controlar dichos widgets cuando la ventana contenedora cambie de tamao.
GtkHBox y GtkVBox son cajas invisibles que sirven para empaquetar los widgets que se vayan a colocar dentro de una ventana u otro contenedor. Cuando se empaquetan widgets en una caja horizontal (GtkHBox) se insertan horizontalmente de izquierda a derecha o de derecha a izquierda. En una caja vertical (GtkVBox) se insertan de arriba a abajo.
Para crear una caja horizontal se hace una llamada a la funcin gtk_hbox_new(), y para cajas verticales, gtk_vbox_new(). GtkWidget * gtk_hbox_new (gboolean homogenous, gint spacing); GtkWidget * gtk_vbox_new (gboolean homogenous, gint spacing);
El argumento homogeneous controla si cada botn dentro de la caja tiene el mismo tamao (la misma anchura en una hbox y la misma altura en una vbox). Si este argumento est a TRUE, las funciones de gtk_box_pack() funcionan como si el argumento expand estuviera siempre a TRUE. El argumento spacing controla el espacio aadido entre los botones. La figura anterior muestra el resultado y la diferencia con el argumento padding de las funciones gtk_box_pack().
Las funciones gtk_box_pack_start() y gtk_box_pack_end se usan para colocar los widgets dentro de las cajas creadas. La funcin gtk_box_pack_start coloca los widgets de arriba a abajo en una caja vertical y de izquierda a derecha en una horizontal. gtk_box_pack_end() hace lo contrario, que es colocar los widgets de abajo a arriba en una caja vertical y de derecha a izquierda en una horizontal.
void gtk_box_pack_start (GtkBox *box, GtkWidget *child, gboolean expand, gboolean fill, guint padding);
void gtk_box_pack_end (GtkBox *box, GtkWidget *child, gboolean expand, gboolean fill, guint padding);
El argumento expand controla que los botones se extiendan hasta rellenar todo el espacio dentro de la caja (TRUE), o que la caja se ajuste al tamao de los botones (FALSE). Con expand a FALSE se pueden alinear los botones a la izquierda o a la derecha. El argumento fill de las funciones gtk_box_pack controla si el espacio extra se coloca en los botones (TRUE), o como espacio extra entre cada botn (FALSE). Esto slo tiene validez si el argumento expand est a TRUE. El argumento padding controla el espacio aadido a cada lado del botn.
GtkTable GtkButtonBox GtkNotebook GtkFrame GtkFixed, que permite colocar los widgets en una posicin fija dentro de la ventana, relativa a la esquina superior izquierda de la misma (coordenadas relativas).
Las ventanas derivan de la clase GtkWindow, que a su vez deriva de GtkContainer. GtkWindow es el objeto ventana de nivel ms alto, y puede contener a otros widgets. gtk_window_new() crea un nuevo objeto GtkWindow, que normalmente ser una ventana del nivel ms alto (el tipo de la ventana debera de ser GTK_WINDOW_TOPLEVEL).
Los dilogos son ventanas temporales, que se usan para obtener o mostrar determinada informacin del/al usuario. GtkWidget* gtk_dialog_new_with_buttons ( const gchar *title, GtkWindow *parent, GtkDialogFlags flags, const gchar *first_button_text, ...);
dialog = gtk_dialog_new_with_buttons ( "Ttulo del dilogo", parent_window, 0, "Cerrar", GTK_RESPONSE_CLOSE, NULL); El ltimo parmetro debe ser siempre NULL, que marca el fin de la lista de botones.
GtkMessageDialog muestra un dilogo con una imagen que representa el tipo de mensaje (Error, Pregunta, etc.) adems de algn texto aclaratorio. Es un caso particular de GtkMessageDialog.
dialog = gtk_message_dialog_new( main_application_window, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "Error loading file 's': s", filename, g_strerror (errno));
Las etiquetas son widgets que nos permiten mostrar informacin (texto). GtkWidget* gtk_label_new (const char *str);
El widget GtkEntry permite mostrar e introducir texto en una lnea de un cuadro de dilogo.
GtkWidget *gtk_entry_new( void ); gchar *gtk_entry_get_text( GtkEntry *entry ); void gtk_entry_set_text( GtkEntry *entry, const gchar *text );
GtkImage muestra una imagen por pantalla. GtkWidget *image; image = gtk_image_new_from_file ("myfile.png");
GtkAccelLabel: Los widgets GtkAccelLabel principalmente en la construccin de mens. H/V Scrollbar GtkScrolledWindow Barras de progreso (GtkProgressBar) Barras de estado (GtkStatusBar) GtkToggleButton
se
usan
GtkCheckButton GtkRadioButton GtkMenu GtkToolbar GtkCombo Ventanas de seleccin (GtkFileChooser, GtkColorSelection, GtkFontSelection): GtkTreeView: rboles y listas en GTK+ (diseo MVC)
Widget Gallery
Anjuta: entorno IDE Glade: diseo interfaces gedit, vim y gcc en lnea de comandos Bibliografa:
http://developer.gnome.org/doc/API/ http://www.es.gnome.org/Documentacion
Compilacin: se pasa como parmetro la biblioteca gtk+-2.0 gcc `pkg-config --cflags --libs gtk+-2.0` hello-world.c -o hello-world
EJEMPLOS
GRACIAS