Introducciónal desarrollosobre laplataformaGNOME Lucas Di Pentima <lucas@lunix.com.ar> Santa Fe, Argentina LUNIX Soluciones LUGLi Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 Arquitectura GNOME es un conjunto de herramientas (bibliotecas) que ofrecen distintas funcionalidades: ✔ GLib: Utilidades de programación. ✔ GTK+: Controles gráficos (widgets). ✔ LibGlade: Manejo de interfaz de usuario. ✔ Pango: Internacionalización (i18n). Lucas Di Pentima <lucas@lunix.com.ar> - Santa Fe - Argentina Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 Arquitectura: GLib Utilidades de programación que hacen al C, muy amigable: ✔ Tipos de datos ✔ Mensajes de salida ✔ Cadenas ✔ Listas enlazadas Lucas Di Pentima <lucas@lunix.com.ar> - Santa Fe - Argentina Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 Arquitectura: GLib – Tipo de datos Proveen independencia con el sistema operativo, mejorando la portabilidad. ✔ ✔ ✔ ✔ ✔ ✔ ✔ gint (gint8, gint16, guint8, guint16, gint32...) gchar gdouble gshort glong gboolean (TRUE o FALSE) ... Lucas Di Pentima <lucas@lunix.com.ar> - Santa Fe - Argentina Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 Arquitectura: GLib – Mensajes de salida Se utilizan para depuración de los programas. ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ void g_print(const char *format, ...) g_assert(expresión) g_return_if_fail(expresión) g_return_val_if_fail(expresión, val) g_message(...) g_warning(...) g_critical(...) g_error(...) Lucas Di Pentima <lucas@lunix.com.ar> - Santa Fe - Argentina Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 Arquitectura: GLib – Cadenas ✔ ✔ ✔ ✔ ✔ gchar * g_strdup(const gchar * cadena) gboolean g_ascii_isalnum(gchar char) gboolean g_ascii_isalpha(gchar char) gboolean g_ascii_isdigit(gchar char) ... GString (Tipo de dato abstracto) ✔ GString * g_string_new(const gchar * cadena) ✔ GString * g_string_append(GString *gstr, gchar *str_a_agregar) ✔ void g_string_printf(GString *cadena, const gchar formato, ...) ✔ ... Lucas Di Pentima <lucas@lunix.com.ar> - Santa Fe - Argentina Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 Arquitectura: GLib – Listas enlazadas Se provee de estructuras y funciones para el manejo de listas simple y doblemente enlazadas: GSList: listas simplemente enlazadas ✔ GSList* g_slist_append (GSList *lista, gpointer dato) ✔ GSList* g_slist_insert (GSList *lista, gpointer dato, gint posicion) GList: listas doblemente enlazadas ✔ GList* g_list_prepend (GList *lista, gpointer dato) ✔ GList* g_list_insert_sorted (GList *lista, gpointer dato, GCompareFunc funcion) Lucas Di Pentima <lucas@lunix.com.ar> - Santa Fe - Argentina Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 Arquitectura: GLib – ¿Que más? Además, GLib ofrece: ✔ GObject: programación OO en C. ✔ GTimer: temporizador. ✔ GIOChannel: entrada/salida. ✔ Pilas, colas, árboles... ✔ Manejo de plug-ins. ✔ Manejo dinámico de memoria. ✔ Soporte para multi-hilos (threads). Lucas Di Pentima <lucas@lunix.com.ar> - Santa Fe - Argentina Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 Arquitectura: GTK+ GTK+ comprende el toolkit de Aplicaciones controles gráficos (widgets) y las Gtk funciones de dibujado en Gdk pantalla. Xlib Gdk provee a Gtk una capa de Hardware abstracción de manera tal que cambiando sólo Gdk a otros sistemas, las aplicaciones Lucas Di Pentima <lucas@lunix.com.ar> - Santa Fe - Argentina basadas en Gtk funcionen sin Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 Arquitectura: GTK+ - Widgets Los widgets son objetos gráficos que componen la interfaz del usuario, incluyen: ✔ Botones ✔ Entradas de menú ✔ Cajas de opciones ✔ Barras de botones ✔ Barras de desplazamiento ✔ Ventanas ✔ ... Lucas Di Pentima <lucas@lunix.com.ar> - Santa Fe - Argentina Cada widget se instancia con Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 Arquitectura: GTK+ - Eventos GTK+ posee un esquema de eventos para responder a las acciones del usuario. Bucle de eventos ✔ void gtk_main(void); ✔ void gtk_main_quit(void); Señales ✔ g_signal_connect(instancia, señal, callback, dato) Lucas Di Pentima <lucas@lunix.com.ar> - Santa Fe - Argentina Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 Arquitectura: GTK+ - Ejemplo #include <gtk/gtk.h> void hello(GtkWidget *widget, gpointer data) { g_print ("Hello World\n"); } gint delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) { g_print ("delete event occurred\n"); return TRUE; } void destroy(GtkWidget *widget, gpointer data) { gtk_main_quit(); } (...continúa...) Lucas Di Pentima <lucas@lunix.com.ar> - Santa Fe - Argentina Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 Arquitectura: GTK+ - Ejemplo (cont.) int main(int argc, char *argv[]) { GtkWidget *window, *button; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect(G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL); g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy), NULL); gtk_container_set_border_width(GTK_CONTAINER(window),10); button = gtk_button_new_with_label("Hello World"); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (hello), NULL); g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK(gtk_widget_destroy), G_OBJECT (window)); gtk_container_add(GTK_CONTAINER(window), button); gtk_widget_show(button); gtk_widget_show(window); gtk_main(); return 0; } Lucas Di Pentima <lucas@lunix.com.ar> - Santa Fe - Argentina Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 Arquitectura: GTK+ - Ejemplo compilado La compilación se hace de la siguiente manera: $ gcc -o ejem `pkg-config gtk+-2.0 --cflags –libs` ejem.c $ ./ejem ...y el resultado: Lucas Di Pentima <lucas@lunix.com.ar> - Santa Fe - Argentina Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 Arquitectura: Glade y Libglade Glade ✔ Editor de interfaces de usuario GTK. ✔ Exporta código C y C++. ✔ Agiliza enormemente el diseño de la IU. ✔ Almacena la descripción de la IU en un archivo XML. Libglade ✔ Entiende la descripción XML de la IU de Glade. ✔ Auto-conecta las señales a los callbacks. ✔ Agiliza aún más el diseño de la IU. Lucas Di Pentima <lucas@lunix.com.ar> - Santa Fe - Argentina Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 Arquitectura: Glade Lucas Di Pentima <lucas@lunix.com.ar> - Santa Fe - Argentina Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 Arquitectura: Libglade – Algunas funciones Las mas importantes son: ✔ G lad eX M L *g lad e_x m l_n ew (g ch ar *arch , g ch ar *w id g et_raiz , N U L L ); ✔ G tk W id g et *g lad e_x m l_g et_w id g et (G lad eX M L *x m l, g ch ar *n o m b re_w id g et); ✔ v o id g lad e_x m l_s ig n al_au to co n n ect (G lad eX M L Lucas Di Pentima <lucas@lunix.com.ar> - Santa Fe - Argentina Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 Arquitectura: Libglade – Ejemplo #include <gtk/gtk.h> #include <glade/glade.h> void hello(GtkWidget *widget, gpointer data) { g_print ("Hello World\n"); } gint delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) { g_print ("delete event occurred\n"); return TRUE; } void destroy(GtkWidget *widget, gpointer data) { gtk_main_quit(); } (...continúa...) Lucas Di Pentima <lucas@lunix.com.ar> - Santa Fe - Argentina Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 Arquitectura: Libglade – Ejemplo (cont.) int main(int argc, char *argv[]) { GladeXML *xml; gtk_init (&argc, &argv); xml = glade_xml_new("archivo.glade", NULL, NULL); glade_xml_signal_autoconnect(xml); gtk_main(); return 0; } (...bastante menos código, ¿no?) Lucas Di Pentima <lucas@lunix.com.ar> - Santa Fe - Argentina Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 Arquitectura: Libglade – Ejemplo compilado Esta vez la compilación se hace de esta manera: $ gcc -o ejem `pkg-config libglade-2.0 --cflags --libs` ejem.c $ ./ejem ...y el resultado es el mismo... Lucas Di Pentima <lucas@lunix.com.ar> - Santa Fe - Argentina Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 Arquitectura: Libglade – descripción XML <?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> <!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade2.0.dtd"> <glade-interface> <widget class="GtkWindow" id="window"> <property name="border_width">10</property> <property name="visible">True</property> <property name="title" translatable="yes">window1</property> <property name="type">GTK_WINDOW_TOPLEVEL</property> <property name="window_position">GTK_WIN_POS_NONE</property> <property name="modal">False</property> <property name="resizable">True</property> <property name="destroy_with_parent">False</property> <signal name="delete_event" handler="delete_event" last_modification_time="Thu, 17 Jul 2003 20:40:00 GMT"/> ... Lucas Di Pentima <lucas@lunix.com.ar> - Santa Fe - Argentina Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 Arquitectura: Pango Pango es el sistema de GNOME para el dibujado de texto en pantalla. Entre sus características se incluye: ✔ Soporte de casi todos los idiomas existentes. ✔ Independiente del sistema de ventanas. ✔ Maneja texto bidireccional y glifos complicados. ✔ Permite el uso de marcas HTML en los textos. Lucas Di Pentima <lucas@lunix.com.ar> - Santa Fe - Argentina Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 Arquitectura: Pango – Ejemplos Algunas capturas de pantalla: Lucas Di Pentima <lucas@lunix.com.ar> - Santa Fe - Argentina Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 Arquitectura: Pango – Marcas HTML Con Pango, es muy fácil darle formato a widgets como etiquetas: ✔ gtk_label_set_markup(etiqueta, "<b>Título</b>"); ✔ gtk_label_set_markup(etiqueta, "<span foreground=\"red\">Error!</span>"); Lucas Di Pentima <lucas@lunix.com.ar> - Santa Fe - Argentina Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 Arquitectura: Completando el rompecabezas Algunas piezas extra: ✔ Bonobo: sistema de componentes. ✔ GConf: almacenamiento de configuraciones. ✔ ATK: facilidades de accesibilidad. ✔ ScrollKeeper: ayuda en línea. Lucas Di Pentima <lucas@lunix.com.ar> - Santa Fe - Argentina Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 Otras herramientas útiles Las siguientes no son herramientas exclusivas de GNOME, pero de todos modos se utilizan: ✔ gettext: internacionalización. ✔ autoconf y automake: automatización de compilación. ✔ docbook: desarrollo de documentación Lucas Di Pentima <lucas@lunix.com.ar> - Santa Fe - Argentina Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 Enlaces de interés Sitio de GNOME para desarrolladores: http://developer.gnome.org GNOME Hispano: http://es.gnome.org Bindings: ● P H P : h ttp ://g tk .p h p .n et/ ● C + + : h ttp ://g tk m m .s o u rcefo rg e.n et/ ● Jav a: h ttp ://w w w .in fo rm atik .u o s .d e/elm ar/p ro jects /jav ag tk / ● Lucas Di Pentima <lucas@lunix.com.ar> - Santa Fe - Argentina Introducción al desarrollo sobre la plataforma GNOME I E nc u entro Linu x del Lito ral – S alto , U ru gu ay – Ju lio 2003 ¡Muchasgracias! Esta presentación se puede descargar de: http://www.lunix.com.ar/~ldipenti/intro-proggnome.tgz Lucas Di Pentima <lucas@lunix.com.ar>