天狗 (Tengu)

Aprendo, aprendo, aprendo

  • Increase font size
  • Default font size
  • Decrease font size

GtkStatusIcon, un trayicon en GTK

E-mail Imprimir

Tags: GTK | GTKStatusIcon | traycon

GtkStatusIcon

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
 
Comentarios (1)
Un comentario sin malicia
1 Martes, 17 de Junio de 2008 01:40
Aarón
Veamos como funciona esto de los comentarios. Cool

Agrega tu comentario

SmileCoolCrying or Very SadEmbarrassedA Smoker/Foot in mouthSadUser is an angel (at heart, at least)A Kiss/Lips Are SealedLaughingBiting one's tongue/Put Your Money Where Your Mouth IsBeen Smacked In The Mouth/Wears A Brace/My lips are sealeSurprisedSticking Out TongueConfusedWinkYelling
Tu nombre:
Tu sitio web:
Título:
Comentario:

Publicidad