Отправляет email-рассылки с помощью сервиса Sendsay

Практические советы по GTK+

  Все выпуски  

Практические советы по GTK+ (Иконка в System tray)


Иконка в System tray

 Когда-то я хотел разобраться как делать апплеты для панелей GNOME и KDE, но меня удручало то, что они пишутся по разному, теперь, начиная с GTK 2.10 есть возможность создать иконку сразу для обоих панелей, и даже для Windows (в области уведомлений панели задач). И всё это без изменений исходного кода.

Правда для Windows иконка всегда будет размером 16x16 пикселей, но так устроена эта система.

 

Рассмотрим как это можно сделать, хотя всё предельно просто. Кстати, System tray я буду называть панелью задач.

 

Создать иконку для панели задач из ресурсов GTK:

GtkStatusIcon *tray_icon = gtk_status_icon_new();

gtk_status_icon_set_from_stock(tray_icon,GTK_STOCK_HARDDISK);

или сразу:

tray_icon = gtk_status_icon_new_from_stock(GTK_STOCK_HARDDISK);

 

Отобразить иконку на панели задач:

gtk_status_icon_set_visible (tray_icon, TRUE);

 

Удалить из панели задач:

gtk_status_icon_set_visible (tray_icon, FALSE);// скрыть иконку

g_object_unref (tray_icon);

 

Вот и все основные операции, проще некуда. Теперь рассмотрим важные дополнения.

 

Картинку для иконки можно брать не только из ресурсов, но и из других источников.

Вот неполный список источников для иконки в панель задач:

gtk_status_icon_new_from_stock(GtkStatusIcon *tray_icon, gchar *stock_id);

gtk_status_icon_set_from_file(GtkStatusIcon *tray_icon, gchar *filename);

gtk_status_icon_set_from_pixbuf(GtkStatusIcon *tray_icon, GdkPixbuf *pixbuf);

gtk_status_icon_set_from_gicon(GtkStatusIcon *tray_icon, GIcon *icon);

Для создания эффекта анимации картинки для иконки можно постоянно менять, например по таймеру.

 

Создать/поменять всплывающую подсказку:

gtk_status_icon_set_tooltip_text(tray_icon,"Этот текст появится во всплывающей подсказке к иконке");

До GTK 2.16 вместо этой функции использовалась: gtk_status_icon_set_tooltip(tray_icon,"Текст во всплывающей подсказке");

 

 

Заставить иконку мигать:

gtk_status_icon_set_blinking(tray_icon,TRUE);

Отключить мигание иконки:

gtk_status_icon_set_blinking(tray_icon,FALSE);

 

Рассмотрим обработку двух важных нестандартных событий:

"activate" - сигнал, который появляется при активации иконки. Этот сигнал платформо-зависимый, но обычно он появляется при двойном клике левой кнопкой мыши.

Подключение обработчика:

g_signal_connect (tray_icon,"activate",G_CALLBACK(tray_icon_activated), NULL);

Обработчик:

static void tray_icon_activated (GtkStatusIcon *icon, gpointer user_data)

{

       ;// здесь будет обработка полученного сигнала

}

 

"popup-menu" - сигнал, при котором должно появиться всплывающее меню. Этот сигнал также платформо-зависимый, но обычно он появляется при одиночном клике правой кнопкой мыши.

Подключение обработчика:

g_signal_connect (tray_icon,"popup-menu",G_CALLBACK(tray_icon_popup_menu), NULL);

Обработчик:

static void tray_icon_popup_menu(GtkStatusIcon *icon, guint button, guint32 activate_time, gpointer user_data)

{

       GtkWidget *menu, *menuitem;

       // создать всплывающее меню

       menu = gtk_menu_new();

       // создать первый элемент меню

       menuitem = gtk_check_menu_item_new_with_label("About");

       // вставить элемент меню во всплывающее меню

       gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);

       // создать второй элемент меню

       menuitem = gtk_menu_item_new_with_label("Quit");

       // вставить элемент меню во всплывающее меню

       gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);

 

       // показать всплывающее меню

       gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,button, activate_time);

}

 Все выпуски, включая этот, Вы можно найти в одном файле gtk_book.chm

 


В избранное