Me costó mucho trabajo conseguir hacer un trayicon con un menú desplegable de esos que tanto me gustan en GTK, y como creo que puede ser una información útil pongo aquí como lo hice.
Lo primero es que en GTK los trayicon se llaman GtkStatusIcon, y esto fue de lo que más tiempo me llevo encontrar, y luego no hay mucha documentación salvo un tutorial bastante breve en http://live.gnome.org/GtkStatusIconTutorial y que encontré tras muchas búsquedas.
A continuación comento y adapto ese tutorial para que se entienda cada paso que se da.
#include <gtk/gtk.h> /* Definimos las variables */ static GtkWidget *my_menu = NULL; static GtkStatusIcon *status_icon = NULL; /* Callback para el menú 'salir' */ static void salir(GtkWidget *widget, gpointer data) { /* Salimos del programa */ gtk_main_quit (); } /* Callback para cualquier otro menú */ static void item_cualquiera(GtkStatusIcon *widget, gpointer data) { printf("Un item cualquiera ha sido pulsado\n"); } /* Callback para el click primario */ static void click_normal(GtkStatusIcon* status_icon, gpointer user_data) { printf("Hacemos click en el icono\n"); } /* Callback para desplegar el menú al hacer click secundario */ static void menu_popup(GtkStatusIcon *status_icon, guint button, guint activate_time, gpointer user_data) { printf("Se despliega el menú\n"); /* Creamos el menú si no existe de antes */ if (!my_menu) { /* Definimos la variable de los ítems del menú */ GtkWidget *item; /* Creamos el menú */ my_menu = gtk_menu_new(); /* Creamos una opción cualquiera*/ item = gtk_menu_item_new_with_label("Una opción cualquiera"); /* La añadimos al menú */ gtk_menu_append(my_menu, item); /* Y le asignamos el callback */ g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(item_cualquiera), GUINT_TO_POINTER(TRUE)); /* Creamos otra opción cualquiera*/ item = gtk_menu_item_new_with_label("Otra opción cualquiera"); /* La añadimos al menú */ gtk_menu_append(my_menu, item); /* Y le asignamos el callback */ g_signal_connect (G_OBJECT(item), "activate", G_CALLBACK(item_cualquiera), GUINT_TO_POINTER(FALSE)); /* Creamos la opción de salir */ item = gtk_menu_item_new_with_label("Salir"); /* La añadimos al menú */ gtk_menu_append(my_menu, item); /* Y le asignamos el callback */ g_signal_connect (G_OBJECT(item), "activate", G_CALLBACK(salir), NULL); } /* Ponemos visibles todos los elementos del menú */ gtk_widget_show_all(my_menu); /* Y lo hacemos que aparezca donde el icono */ gtk_menu_popup(GTK_MENU(my_menu), NULL, NULL, gtk_status_icon_position_menu, status_icon, button, activate_time); } /* Este es el programa principal*/ int main( int argc, char* argv[] ) { /* Inicializamos GTK */ gtk_init( &argc, &argv ); /* Creamos el icono desde los iconos en stock de GTK */ status_icon = gtk_status_icon_new_from_stock(GTK_STOCK_QUIT); /* Hacemos visible el icono */ gtk_status_icon_set_visible(status_icon, TRUE); /* Un tooltip al dejar el ratón sobre el icono */ gtk_status_icon_set_tooltip(status_icon, "Esto es una prueba"); /* Este evento es el de click con el botón secundario del ratón */ g_signal_connect (G_OBJECT (status_icon), "popup-menu", G_CALLBACK (menu_popup), NULL); /* Este evento es el de click con el botón principal del ratón */ g_signal_connect (G_OBJECT (status_icon), "activate", G_CALLBACK (click_normal), NULL); /* Arracamos GTK */ gtk_main(); return 0; }
Si quieres compilarlo este sería el código, recuerda que has de disponer de las bibliotecas adecuadas para poder compilar una aplicación con GTK
$ gcc -Wall -g `pkg-config gtk+-2.0 --cflags --libs` cosa.c -o cosa
Donde cosa.c es el archivo que quieres compilar y cosa el resultado de la compilación.
Y para ejecutarlo...
$ ./cosa








