You are on page 1of 13

Programación GNOME en Linux usando GTK

+
Por Subhasísh Ghosh
Traducción al español por Fernando Frias el día 30 de Junio 2002, para La Gaceta de Linux Revisado y corregido por David Sánchez el 4 de Enero de 2003 para Linux-España

Este artículo proporciona una visión general de la programación GNOME en Linux usando el toolkit GTK+. Nota Importante: se asume que el lector tiene el conocimiento básico para moverse dentro de Linux, sabe como usar el escritorio GNOME y posee el nivel y experiencia requeridos de programación C y/o C++. El código fuente incluido junto con el texto, ha sido probado en una computadora con la siguiente configuración: Compaq Presario 4010 Series system, 15.5 GB de espacio en disco duro, 96 MB RAM, procesador Intel Celeron a 400 MHz, Red Hat Linux 7.1 kernel: 2.4.2-2 Este artículo ha sido dividido en las siguientes secciones para un fácil entendimiento: 1. ¿Que es GNOME? una introduccion.. 2. La arquitectura GNOME. 3. GTK+ - una introducción. 4. Un programa básico. 5. Señales y Callbacks 6. Contenedores. 7. Botones. 8. Widgets de entrada. 9. Listas y Combos 10. menús y barras de herramientas. 11. Cajas de diálogo. 12. Conclusiones y enlaces para estudio posterior.

1. ¿Que es GNOME? Introducción.
Antes de entrar en el excitante mundo de la programación GNOME en Linux, intentemos entender a que se refiere GNOME. GNOME es el acrónimo para "GNU's Not Unix Network Object Model Environment ". Aunque esto suena un poco complicado, GNOME es un proyecto de software con un objetivo simple: proveer a todos los usuarios de Linux, un extremadamente amigable, no obstante poderoso y completo ambiente de programación. GNOME es actualmente el escritorio por defecto instalado en las últimas versiones de las distribuciones Linux Red Hat y Debian.

Fue originalmente escrito para usarse en GIMP (GNU Image Manipulation Program). Richard Stallman. es lo que proporciona a GNOME su estupenda funcionalidad. La extremadamente poderosa. el ambiente GNOME provee abundantes herramientas que hacen que el trabajo de administración sea muy simple. 2. noticias y también descargas de archivos binarios así como código fuente de GNOME compatible con la mayoría de los sistemas Linux. provee a los programadores GUI Linux una enorme funcionalidad a tal grado que pueden diseñar programas basados en Linux. asegúrate de revisar el proyecto GNOME en la página http://www. que es ante todo. fue por su soporte a muchos lenguajes de programación incluidos C. sin embargo. Spencer Kimball. Ahora echemos un vistazo mas de cerca a la funcionalidad de Gnome. la razón por la que GNOME es casi indispensable para todos los desarrolladores Linux/Unix.Para información mas específica sobre GNOME y sus varias maravillosas características. el programador GNOME tiene la responsabilidad de continuar abasteciendo esas facilidades diseñando programas aún mejores. de tal forma que aquí estaríamos tratando con C únicamente. Python. La adecuada comprensión de GTK+ es extremadamente necesaria para la asimilación de la programación GNOME. Sin embargo. La arquitectura GNOME. es que GNOME provee a esos desarrolladores. Inc. los toolkits como GTK o Qt(el ambiente KDE esta basado . La pregunta básica que viene a la mente es: ¿piensan y sienten lo mismo cuando hablan acerca de GNOME?. como se menciono antes. PERL. C++. Otra pregunta que debe surgir en la mente del lector es: ¿que es lo que contienen esas cosas llamadas "Toolkits"?. hace bastante difícil el responder a esta pregunta. De tal forma que. un entorno integrado el cual fue específicamente diseñado para construir aplicaciones de código abierto(open source) con una consistente interfaz gráfica de usuario. Peter Mattis. están en una perfecta armonía el uno con el otro al grado de que sus respectivas labores se afectan entre sí. Entonces. Ahora miremos a GNOME desde "el punto de vista del programador". ADA etc. así como desde "el punto de vista del administrador del sistema”. El proyecto GNOME comenzó en agosto de 1997. lo cual. Entonces la pregunta que viene es: ¿por que fue GTK+ elegido como el conjunto de herramientas(toolkit) para GNOME?. fue escrito usando C. GTK+ es un conjunto de herramientas orientadas a objetos. entre otros. la mayoría de los administradores Linux. flexible arquitectura de GNOME. El conjunto de herramientas base en GNOME es llamado GTK+(the GIMP toolkit).gnome. GNOME es realmente una capa de programación que esta situada entre el sistema X Window(o X) y el software manejador de ventanas. la respuesta es simple. Para la mayoría de los administradores de sistemas Linux. al igual que GTK+. Pero lo mas significante de todo. Algunos de los fundadores incluidos. Por lo pronto. esto no es fácil de responder.org/ la cual proporciona a los lectores abundante información sobre GNOME. usada para crear aplicaciones independientes de GNOME. es útil siempre tener en cuenta que GNOME. son o han sido programadores Linux en el pasado. de plataforma cruzada y lenguaje neutral. y Erik Troan y Mark Ewing de Red Hat. incluyendo documentación en línea.

7. menús. cajas de diálogo y otros como los objetos relacionados a funciones generales. 4. Un requerimiento vital para la adecuada comprensión de GTK+. Esto puede ser comparado con la Active Template Library (ATL 3. GLIB define su propio conjunto de datos básicos. La mayoría son equivalentes a los datos estándar en C. Eso no es todo. 6. 5. El conjunto de librerías usadas por GTK+: GLIB(libreria GIMP) y GDK(GIMP Drawing toolkit). necesitan únicamente ser implementados una vez.0) sobre la plataforma Microsoft. GTK+ . GDK es la plataforma dependiente del estrato que esta presente entre la API de gráficos nativa y GTK+. pertenecen a una herencia. 2. Además de la funcionalidad de GTK+. EXE's y ActiveX DLL's). Ahora demos un vistazo más de cerca a algunas de las características de GTK+: 1. Datos tipo GLIB Datos tipo C gchar gshort glong gint gboolean gpointer char short long int boolean void* 8. 3.Introducción. GLIB define tipos de datos y suministra funciones que tratan con el manejo de errores y rutinas de memoria. son colecciones de widgets. es el concepto de "herencia de widgets". Lo cual nos trae la pregunta ¿que son los "Widgets"? Los Widgets son controles GUI como botones. 3. . permitiendo que la comunicación de los objetos de software sea fácil y efectiva. GNOME agrega funcionalidad adicional al GTK+ añadiendo un estrato separado de widgets y librerías específicas de GNOME.en Qt). GNOME viene con una arquitectura habilitada con un amplio conjunto de widgets orientados a objetos y llenos de características. De este modo. así que las funciones que son comunes a un conjunto de widgets. también tenemos los beneficios agregados de una implementación del sistema COBRA llamada ORBit en la arquitectura GNOME. Los widgets en GTK+. la cual proporciona a los desarrolladores COM(Component Onject Model) con un armazón listo y hecho para crear objetos y componentes COM(ActiveX.

ahora miremos un pequeño programa para entender mejor el tema. 4. 2001 */ . Y es en este aspecto de la "herencia de widgets" en el que se incorpora la funcionalidad derivada en GTK+. cambia a gnome usando el comando "switchdesk gnome". Arranca tu sistema en Linux. entonces tenemos que usar una macro para realizar el enlace de desde el tipo GtkWidget a el tipo GnomeApp. gnome_app_new(). esta función. ghosh = gnome_app_new(………). el cual en sí mismo ha sido derivado del de mayor nivel GtkBin y así sucesivamente. Para que estas funciones operen correctamente. así que. hazlo antes de intentar compilar cualquier código fuente. miremos de cerca a esta particular herencia de objetos: GtkObject --> GtkWidget --> GtkContainer --> GtkBin --> GtkWindow --> GnomeApp Así. Demos ahora una breve mirada a las funciones de creación de widgets. la función gtk_widget_show. solo las características únicas de este widget deberán ser escritas por el programador. esto nos trae a la memoria el concepto de "Herencia". esta dirigida a la eliminación de código duplicado. Una vez dentro del ambiente GNOME. primero debemos asegurarnos de tener todas las librerías GTK+ y GNOME instaladas correctamente. ¿no es así?. Primero consideremos la función de creación de un widget. si estas en el modo CLI(interfaz de linea de comandos). como se muestra. Por ejemplo. Los nuevos widgets son derivados de los widgets existentes de mayor nivel. La mejor forma de aprender la programación Linux es entender el trabajo interno del kernel y haciendo programas por tí mismo.Por ejemplo. el cual es un widget genérico. otra cosa importante a tomar en cuenta es que la ruta de las librerías debe de ser correcta. Si tomamos en cuenta las características esenciales de la programación en lenguaje C++. lo cual solo es posible ya que GnomeApp es derivada de GtkWidget (observa la herencia mostrada anteriormente). de este modo. abre una terminal GNOME. crea un archivo llamado myapp. seguramente lo es.c usando el editor vi y teclea lo siguiente: /* A sample GNOME program Created By: Subhasísh Ghosh Date: 8th August. Esto posiblemente se muestra como: GtkWidget *ghosh. regresa un puntero a GtkWidget. y el comando "startx" para arrancar en el sistema GUI X window. si miras cuidadosamente. Un programa básico. de modo que conduce a un mejor y mas rápido desarrollo de programas. Debemos notar que esto significa que si queremos llamar a una función especifica de GnomeApp como gnome_app_set_menús(). puedes ver que el widget GnomeApp es derivado del de mayor nivel GtkWindow.

h> int main(int argc. "Sample" es el nombre de la aplicacion y "My Window" es el titulo de la ventana. asegúrate de teclear bien (toma en cuenta las comillas simples): # gcc myapp. crea una ventana top-level. La función gnome_init es entonces llamada. Luego viene la función gnome_app_new(). su creador y la fecha de creación.#include <gnome. la cual hace visible nuestra ventana. gtk_widget_show(ghosh).1". es una buena práctica de programación incluir comentarios a cada programa. Al principio. como se muestra en el código: "sample" y "My Window". ejecuta el programa usando el comando: # . que cuando es ejecutada. . ya que asegura que funciónes GNOME como son los eventos y pulsaciones de botones sean ejecutados mediante el paso de funcionalidad a GNOME./myapp & y presiona enter. argc. el número de versión es "0. La identificación que se le pasa a la función gnome_init es "sample". esta inicializa librerías y es usada para un correcto manejo de sesión. gnome_init("sample". Después. que es un puntero a GtkWidget. incluimos el archivo de cabecera gnome.1" y la usual línea de argumentos de la función main. describiendo el programa. este es el trabajo interno de nuestro primer programa GNOME. la cual puedes mover. la cual es una función muy importante. ghosh = gnome_app_new("sample". char *argv[ ]) { GtkWidget *ghosh. argv). "My Window"). eso es todo. crea nuestra ventana. para compilar el programa myapp. ajustar el tamaño. que se encarga de todas las librerías GTK+ y GNOME así como de las funciónes y definiciones necesarias. Pero hay que notar que: aunque el nombre de esta función es gnome_app_new().h. estos son necesarios para el trabajo interno de GNOME. así como cerrar. Una ventana vacía aparecerá en la pantalla. La siguiente función llamada es gtk_widget_show(). De esta forma. } Ahora.c. luego viene "gosh". este apuntara a nuestro nuevo objeto ventana. esta NO crea ningún tipo de nueva aplicación o algo así. return 0. Una vez compilado. gtk_main(). Ahora miremos detenidamente el código. esta toma dos argumentos. "0. Luego viene gtk_main(). aunque no es necesario. introducimos algunas líneas de comentarios.c -o myapp `gnome-config --cflags --libs gnomeui` GNOME viene con un shell script llamado gnome-config que proporciona al compilador los argumentos correctos para la compilación.

las aplicaciones necesitan conectar esos eventos para tomar ciertas acciones. una señal (signal) es enviada a la aplicación. ¿Que son y para que se usan?. GtkSignalFunc func -.botón liberado. 3.5. examinemos los parámetros de estas dos funciones: 1. spacing : tipo --> gint : Determina el espacio entre widgets adyacentes. lo que significa que tenemos un contenedor padre dentro del cual tenemos que ubicar nuestros widgets.El widget al cual un callback es asociado.La función que es llamada cuando la señal es enviada. const gchar *name -. entra y sale de widgets. o activados y acciones como estas son realizadas. 2. Esta señal puede ser pasada a una función callback. Contenedores. Por ahora. . Ahora demos un profundo vistazo dentro del ambiente de programación GNOME: "Señales" y "Callbacks". Las señales de los botones son: 1. enter -. debido a que GTK+ es realmente un conjunto de herramientas basado en contenedores. GTK+ utiliza una gran cantidad de contenedores. 2. released -. 6. 2. A continuación. De esta forma. aunque no siempre. 4. veremos otro componente vital de la programación GNOME: contenedores. ¿realmente los necesitamos?.Movimiento del ratón fuera del área del botón. cuando botones son pulsados. leave -. De tal manera que. La función gtk_signal_connect tiene los siguientes 4 parámetros: 1. Señales y Callbacks.botón pulsado (pulsado y liberado). en las aplicaciones que crearemos mas tarde. homogeneous : tipo --> gboolean : Obliga a todos los widgets en la caja a ocupar la misma area de acuerdo al widget mas grande en la caja. Las ventanas son simples contenedores de widgets. 5. Pronto veremos que estas funciones en acción. gpointer data -. Estas "cajas empaquetadas" son de dos tipos: horizontales y verticales. llamamos la una función gtk_signal_connect para conectar señales y manejar funciones.Movimiento del ratón dentro del área del botón. 4. el punto importante a tomar en cuenta es que GTK+ utiliza "cajas empaquetadas" invisibles las cuales pueden contener múltiples widgets para crear diseños de ventana. 3. clicked -. En GTK+/GNOME. GtkObject *object -. Se debe notar que distintos tipos de widgets emiten señales diferentes. Examinaremos que las Señales y Callbacks juegan un rol vital en las aplicaciones que desarrollaremos mas tarde. cada vez que el ratón se mueve. creadas usando la funcionalidad de las funciónes gtk_hbox_new y gtk_vbox_new. pressed -.La señal a ser tratada.Cualquier dato arbitrario que es dado a la función que maneja la señal. respectivamente.botón presionado hacia abajo por el ratón.

padding : tipo --> gint : Determina el ancho de un marco que rodea a un widget. consulta GTK+ Reference Documentation disponible en: http://www. botones simples --> Para realizar una acción al hacer click. nota: Para mas información sobre funciones especificas. Crear botones de selección es muy similar a las casillas de verificación. 4. la señal activa ocurre. expand : tipo --> gboolean : Permite que la caja empaquetada se expanda para llenar el espacio restante. 2. Ahora viene otro componente vital: botones. Los widgets de entrada son principalmente usados para introducir pequeñas cantidades de información. botones Toggle --> Con un estado particular activado/desactivado Casillas de verificacion --> Con un estado particular activado/desactivado. 5. char *string = gtk_entry_get_text(GTK_ENTRY(text_entry)).gtk. botones de selección --> Para marcar solo una opción de entre un grupo de varias. Botones. Los botones de selección son derivados de los botones de verificación. 3. fill : tipo --> gboolean : Permite que un widget en particular se expanda para ocupar el espacio restante. los cuales son derivados de los botones toggle. g_print(string).3. August 8. cuando el botón ha sido pulsado. que son comúnmente llamados "widgets de entrada". GTK+ proporciona 4 diferentes tipos de botones: 1. Miremos ahora un programa que crea una "ventana de acceso". Teclea lo siguiente y ejecuta el programa como ha sido explicado. 2001 */ #include <gnome. 7. gpointer data) { GtkWidget *text_entry = data. } . y lo que necesitamos hacer extra es especificar un grupo de botones de selección al que pertenece. utilizamos una función llamada gtk_entry_new(). y despliega el campo password.h> static void enter_pressed(GtkWidget *button. 4. lo cual significa que tenemos el mismo conjunto de funciones para leer y modificar su estado y también usan los mismos eventos. Para crear widgets de texto de una sola línea. Widgets de entrada.org/ 8. /* Creating a Login GNOME-style using GTK+ Toolkit: Created By: Subhasísh Ghosh Date: Wednesday.

Lista y combos. gtk_widget_show_all(app). gtk_box_pack_start(GTK_BOX(hbox). gtk_signal_connect(GTK_OBJECT(app). gchar *text. presiona enter y observa que es los que sucede. FALSE. gtk_entry_set_visibility(GTK_ENTRY(text_entry). "activate".0). FALSE. 0). Los widgets lista agrupan una lista de cadenas de caracteres que permiten a los usuarios seleccionar una o mas entradas. FALSE. gnome_app_set_contents(GNOME_APP(app). gtk_container_border_width(GTK_CONTAINER(app). label. "entry widget"). GtkWidget *label. son simples widgets que no proveen alguna funcionalidad extraordinaria. app = gnome_app_new("example". Las listas son widgets de entrada con un menú emergente agregado que permite a los usuarios seleccionar las opciones disponibles. char *argv[]) { GtkWidget *app. Teclea cualquier texto (asumiendo que es un password). } Cuando este programa es ejecutado. 0. Las listas y combos juegan el mismo papel que desempeñan en la plataforma Microsoft.1". GTK_SIGNAL_FUNC(enter_pressed). 5). GtkWidget *text_entry. gtk_signal_connect(GTK_OBJECT(text_entry). GtkWidget *hbox. FALSE). menús y barras de herramientas. /* we now create a Label: */ label = gtk_label_new("Password: "). una ventana de acceso debe de aparecer en la pantalla. los widgets son así configurados. gnome_init("example". hbox = gtk_hbox_new(FALSE. Los varios widgets con los que nos hemos encontrado hasta ahora. NULL). text_entry. gtk_main( ). 10. text_entry = gtk_entry_new(). involucrados en esto. GTK_SIGNAL_FUNC(gtk_main_quit). 0). 0). FALSE. argc. hbox). "0.int main(int argc. Ahora veremos algunas librerías . 9. return 0. "delete_event". argv). gtk_misc_set_alignment(GTK_MISC(label). 1. gtk_box_pack_start(GTK_BOX(hbox). text_entry).

pero usando simple y plano código GTK+. string. lo estábamos haciendo bastante bien con código ordinario y todas esas cosas con las que tratamos anteriormente.. GNOME nos permite crear menús y barras de herramientas para nuestros widgets GnomeApp que pueden ser conectados y desconectados de la ventana. ¿Cual es el uso de eso llamado "librerías especificas de programación GNOME"?. haciendo que toda la programación se infle. a menudo conduce a mucho más código.especificas de programación GNOME que ofrecen widgets mas complicados con una rica funcionalidad. Revisemos algunas de las macros mas utilizadas. Los menús y barras de herramientas tienen cada uno sus propiedades definidas en arreglos. repetición y bloques ineficientes entre otras cosas. usamos las librerías especificas de programación GNOME que proveen una gran cantidad de funcionalidades extras y un mucho menor costo de programación. Ahora. Así. Las macros asocian pequeñas imágenes (pixmaps) y combinaciones de teclas . etc. para prevenir que esto suceda. En primer lugar tu llenas arreglos con la información necesaria. y podemos usar una o un conjunto de macros suministradas por GNOME que creara la estructura por nosotros. hablemos entonces de "menús" y "Barras de herramientas". Solo espera un segundo. ¿son de verdad útiles? o ¿estas solo incluyéndolas aquí para hacer tu artículo mas grande?" Bien. esta es la razón para considerar las librerías específicas de programación GNOME. menú File Edit View Settings Macro GNOMEUIINFO_menú_FILE_TREE(tree) GNOMEUIINFO_menú_EDIT_TREE(tree) GNOMEUIINFO_menú_VIEW_TREE(tree) GNOMEUIINFO_menú_SETTINGS_TREE(tree) Windows GNOMEUIINFO_menú_WINDOWS_TREE(tree) Help Game GNOMEUIINFO_menú_HELP_TREE(tree) GNOMEUIINFO_menú_GAME_TREE(tree) Dentro de los menús de nivel superior existen más de treinta macros para crear menús comunes. alguien puede preguntar: "Hey. y lo cual usualmente se haría usando las librerías especificas de programación GNOME. entonces llamas a nome_app_create_menús o gnome_app_create_toolbar. callback ponter. Con código plano de GTK+. aunque aproximadamente todo puede ser hecho. La mayor parte del tiempo las entradas a los menús son bastante simples. Algunas de estas propiedades incluyen tipo. NOTA: estas macros son las que crean menús de nivel superior cuando un arreglo es transmitido conteniendo algunas o todas las siguientes estructuras GnomeUIInfo.

para cada opción del menú. GnomeUIInfo menúbar[ ] = { GNOMEUIINFO_menú_FILE_TREE (file_menú).h> static void callback (GtkWidget *button. y observa como trabajan los arreglos y macros en realidad. data) Open --> GNOMEUIINFO_menú_OPEN_ITEM (cb. las barras de herramientas requieren de un arreglo usando la macro GNOMEUIINFO_ITEM_STOCK (label. Veamos este sencillo ejemplo. data) Settings -->> Preferences --> GNOMEUIINFO_menú_PREFERENCES_ITEM (cb. . cb. tooltip. data) Help -->> About --> GNOMEUIINFO_menú_ABOUT_ITEM (cb. data) Print --> GNOMEUIINFO_menú_PRINT_ITEM (cb. data) Al igual que los menús. callback). "This is the Status bar info". Aquí. NULL). data) Exit --> GNOMEUIINFO_menú_EXIT_ITEM (cb. File -->> New --> GNOMEUIINFO_menú_NEW_ITEM (label. hint. GNOMEUIINFO_menú_EXIT_ITEM (gtk_main_quit. GNOMEUIINFO_END }. stock_id). GNOMEUIINFO_END }. Una función Callback es requerida para ser llamada cuando la opción es seleccionada y un apuntador de datos es pasado a la función. data) Paste --> GNOMEUIINFO_menú_PASTE_ITEM (cb. Miremos algunas de estas opciones comunes y sus respectivas macros. callback. gpointer data) { g_print("Item Selected"). "stock_id" es le identificador de un icono predefinido utilizado para esta opción. data) Edit -->> Cut --> GNOMEUIINFO_menú_CUT_ITEM (cb. data) Save --> GNOMEUIINFO_menú_SAVE_ITEM (cb. data) Copy --> GNOMEUIINFO_menú_COPY_ITEM (cb. } GnomeUIInfo file_menú[ ] = { GNOMEUIINFO_ITEM_NONE ("A menú item". #include <gnome.

static void messagebox_clicked(GnomeDialog *dlg. Cuando necesitamos crear cajas de diálogo. argv). gtk_main_quit. char *argv[ ]) { GtkWidget *app.GnomeUIInfo toolbar[ ] = { GNOMEUIINFO_ITEM_STOCK ("Print". menúbar). agrega tres botones y responde a el código del usuario. "0. el cual crea una simple caja de diálogo. y los botones que queremos sobre ella. fijarlo. } Este programa crea una pequeña ventana con un menú empotrado y una barra de herramientas. llamamos a la función gtk_widget_show para desplegar una caja no modal. toolbar). Todo esto es indicado en una lista terminada en NULL. gnome_init ("example". nos estamos refiriendo a la caja de diálogo. Puedes hacerle click. gnome_app_create_menús (GNOME_APP (app). llamamos a la función gnome_message_box_new y le pasamos el mensaje. int main (int argc.1". gnome_app_create_toolbar (GNOME_APP (app). Si. gtk_widget_show_all (app). app = gnome_app_new ("example". GNOMEUIINFO_END }. argc. 11. GNOMEUIINFO_ ITEM_STOCK ("Exit". "Exit the application". gtk_main(). Cajas de diálogo. Finalmente. liberarlo y arrastrarlo por la pantalla. también le indicamos el tipo de caja de diálogo que necesitamos. Ahora veamos el widget que despliega información textual a el usuario en el ambiente GNOME. callback. gpointer data) { switch (button) { . gint button. GNOME_STOCK_PIXMAP_EXIT). return 0. "This is another tooltip". GNOME_STOCK_PIXMAP_PRINT). "A Sample Toolbar and menú"). Entonces ligamos el "click" de la señal del widget de diálogo que hemos creado para manejar la función que es transmitida a el botón que el usuario ha pulsado como un entero. Veamos este extracto de código de un programa..

NOTA: la programación GNOME no es en absoluto difícil.com/howto/programming/gtk_examples/index. Esto resume nuestro viaje en el excitante mundo de la programación GNOME usando el conjunto de herramientas GTK+. puede ser definitivamente dominado. } } GtkWidget *dlg. "clicked". es realmente sencilla de comprender. pal. GNOME_STOCK_BUTTON_OK. case 0: /* user pressed ok */ case 2: /* user pressed close */ gnome_dialog_close(dlg). 12.org/pub/Linux/docs/HOWTO/mini/otherformats/html_single/Programming-Languages. GNOME_STOCK_BUTTON_CLOSE. Aun hay mucho más por aprender después de este artículo.html http://wolfpack.html http://linuxheadquarters.shtml http://www. NULL).linuxheadquarters. Una vez que tienes un poco de conocimiento.shtml http://developer. GTK_SIGNAL_FUNC(messagebox_clicked). gtk_widget_show (dlg).com/howto/programming/gtk_examples/window/window.net/docs/gtkdnd/index. how are you doing??? I am fine!".twu. Conclusiones y enlaces para estudio posterior. NULL).org/doc/GGAD/ggad. GNOME_STOCK_BUTTON_APPLY. pero terminado diligentemente. revisa las siguientes direcciones: http://www.gnome. gtk_signal_connect (GTK_OBJECT(dlg).html . GNOME_MESSAGE_BOX_QUESTION.ibiblio. Para más información y cobertura detallada de este tópico.case 1: /* user pressed apply */ return. dlg = gnome_message_box_new("Hi.

COM. Perl. C++. soy profesional certificado Microsoft (MCP). . VC++. ATL 3.0.Subhasísh Ghosh Tengo 20 años. DCOM. MFC. Python y programación Linux usando GTK+. He estado trabajando con Linux por mucho tiempo. VB. Actualmente aprendiendo la arquitectura del kernel Linux a detalle y haciendo programación Linux kernel. MCP certificado en NT 4.0 recientemente complete la certificación en ingeniería red hat linux (RHCE). MSCD. he programado usando C. actualmente estudiante de ingeniería en sistemas computacionales en la India.