天狗 (Tengu)

...siempre aprendiendo

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

GtkStatusIcon, un trayicon en GTK

E-mail Imprimir
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
 

Caracteres ruby

E-mail Imprimir

Los caracteres ruby son pequeñas anotaciones colocadas encima o al lado de un carácter cuando se escriben lenguajes ideogramáticos como el japonés o el chino. Su uso más común es servir como guía de pronunciación para ideogramas poco conocidos.

Ejemplos:

La mejor forma de ver su uso es con ejemplos

Ruby simple:

Aquí veremos como poner una anotación sobre un acrónimo:

En caracteres ruby: WWWWorld Wide Web Y en imagen:

Este es el código introducido:

<ruby><rb>WWW</rb><rt>World Wide Web</rt></ruby>

En el caso más simple, las marcas ruby definen un elemento ruby qeu contiene un elemento rb para el texto base y un elemento rt para el texto ruby.

Ruby simple con paréntesis:

En el siguiente ejemplo vemos como se mostrar caracteres ruby japoneses (llamados furigana) sobre el kanji de la palabra Tengu con ruby simple:

En caracteres ruby: てん Y en imagen:

Este es el código introducido:

<ruby><rb></rb><rp>(</rp><rt>てん</rt><rp>)</rp></ruby>
<ruby><rb></rb><rp>(</rp><rt></rt><rp>)</rp></ruby>

El elmento rp significa ruby paréntesis. El elemento rp y los paréntesis (u otros caracteres) dentro de ellos se utiliza para mostrar el texto anterior de esta forma en un navegador no preparado para ver ruby: 天(てん)狗(ぐ).

Ruby complejo:

Un ejemplo de una fecha adornada con ruby complejo:

En caracteres ruby: 05Abril1955DíaMesAñoAkira Toriyama Y en imagen:

Este es el código introducido

<ruby>
  <rbc>
    <rb>05</rb>
    <rb>Abril</rb>
    <rb>1955</rb>
  </rbc>
  <rtc>
    <rt>Día</rt>
    <rt>Mes</rt>
    <rt>Año</rt>
  </rtc>
  <rtc>
    <rt rbspan="3">Akira Toriyama</rt>
  </rtc>
</ruby>

Esta especificación define contenedores de elementos. El contenedor rbc será el de elementos rb. Puede haber uno o dos contenedores de texto ruby, rtc, que contienen elementos rt. Esto permite asociar dos contenedores de texto ruby con el mismo texto base. Con el ruby complejo también es posible asociar partes del texto base con partes del texto ruby usando varios elementos rb que se correspondan con varios elementos rt. Además, el elemento rt puede usar el atributo rbspan para indicar que se asocia a varios elementos rb. Es similar al atributo colspan y los elementos tr y td en las tablas.

Compatibilidad con navegadores

Actualmente el uso de estas etiquetas pertencientes a la especificación de XHTML 1.1 no está muy extendida, pero navegadores como Firefox con la extensión XHTML Ruby Support podemos obtener el beneficio que estas etiquetas aportan.

Compatibilidad mediante CSS

Otra forma de proporcionar a nuestros lectores el beneficio de estas etiquetas antes de que los navegadores estén preparados de forma nativa es el uso de CSS en nuestras páginas web. Añadiendo las siguientes líneas al CSS de nuestras webs podremos conseguir un efecto similar y más compatible.

 
/* ruby support */
ruby
{
  display: inline-table;
  text-align: center;
  white-space: nowrap;
  text-indent: 0;
  margin: 0;
  vertical-align: -20%;
}
 
/* ルビベース */
ruby > rb, ruby > rbc
{
  display: table-row-group;
  line-height: 90%;
}
 
/* 前側ルビテキスト */
ruby > rt, ruby > rbc + rtc
{
  display: table-header-group;
  font-size: 60%;
  line-height: 40%;
  letter-spacing: 0;
}
 
/* 後側ルビテキスト */
ruby > rbc + rtc + rtc
{
  display: table-footer-group;
  font-size: 60%;
  line-height: 40%;
  letter-spacing: 0;
}
 
/* 複雑ルビテキスト */
rbc > rb, rtc > rt
{
  display: table-cell;
  letter-spacing: 0;
}
 
/* rt[rbspan] should be transformed into td[colspan] but that requires xslt */
rtc > rt[rbspan] { display: table-caption; }
 
/* ルビ括弧 */
rp { display: none; }
 

Créditos

Origen del archivo CSS:

  • http://web.nickshanks.com/stylesheets/ruby.css
  • Fuentes:

  • http://es.wikipedia.org/wiki/Carácter_ruby
  • http://www.w3.org/TR/ruby/
  •  

    Twitter

      Licencia

      Creative Commons License
      Esta obra está bajo una licencia de Creative Commons.

      Código QR

      Código QR Más sobre códigos QR.

      Publicidad