StatusIcon w kilkunastu linijkach
Chciałem zobaczyć jak teraz robi się tzw. tray icon. Okazało się że w około 15 linijkach pythona mozna to zrobić(razem z 'Quit'):
- import pygtk
- pygtk.require('2.0')
- import gtk
- menu = gtk.Menu()
- quit = gtk.MenuItem("Quit")
- quit.connect("activate", lambda mi: gtk.main_quit())
- menu.append(quit)
- menu.show_all()
- si = gtk.StatusIcon()
- si.set_from_file("/usr/share/pixmaps/ooo-writer.png")
- si.connect("popup-menu", lambda si,b,at: menu.popup(None, None, None, b, at))
- gtk.main()
W podobny sposób można napisać także w C:
- #include <gtk/gtk.h>
- void popup(GtkStatusIcon *si, guint button, guint activ, GtkMenu *menu) {
- gtk_menu_popup(menu, NULL, NULL, NULL, NULL, button, activ);
- }
- void quit(GtkMenuItem *menuitem, gpointer user_data) {
- gtk_main_quit();
- }
- int main(int argc, char **argv) {
- GtkStatusIcon *si;
- GtkMenu *menu;
- GtkMenuItem *menu_item;
- gtk_init(&argc, &argv);
- menu = GTK_MENU(gtk_menu_new());
- menu_item = GTK_MENU_ITEM(gtk_menu_item_new_with_label("Quit"));
- gtk_menu_append(menu, (GtkWidget *)menu_item);
- gtk_widget_show_all((GtkWidget *)menu);
- g_signal_connect(menu_item, "activate", (GCallback)quit, NULL);
- si = gtk_status_icon_new_from_file("/usr/share/pixmaps/ooo-writer.png");
- g_signal_connect(si, "popup-menu", (GCallback)popup, menu);
- gtk_main();
- }
Z dawnym Egg mamy coś w tym rodzaju(40 linii):
- #include <gtk/gtk.h>
- #include "eggtrayicon.h"
- gboolean popup(GtkWidget *widget, GdkEventButton *ev, GtkMenu *menu) {
- if(ev->button != 3)
- return FALSE;
- gtk_menu_popup(menu, NULL, NULL, NULL, NULL, ev->button, ev->time);
- return TRUE;
- }
- void quit(GtkMenuItem *menuitem, gpointer user_data) {
- gtk_main_quit();
- }
- int main(int argc, char **argv) {
- EggTrayIcon *ti;
- GtkEventBox *eb;
- GtkImage *im;
- GtkMenu *menu;
- GtkMenuItem *menu_item;
- gtk_init(&argc, &argv);
- menu = GTK_MENU(gtk_menu_new());
- menu_item = GTK_MENU_ITEM(gtk_menu_item_new_with_label("Quit"));
- g_signal_connect(menu_item, "activate", (GCallback)quit, NULL);
- gtk_menu_append(menu, (GtkWidget *)menu_item);
- gtk_widget_show_all((GtkWidget *)menu);
- ti = egg_tray_icon_new("Test");
- eb = (GtkEventBox *)gtk_event_box_new();
- im = (GtkImage *)gtk_image_new_from_file("/usr/share/pixmaps/ooo-writer.png");
- gtk_container_add((GtkContainer *)eb, (GtkWidget *)im);
- g_signal_connect(eb, "button-press-event", (GCallback)popup, menu);
- gtk_container_add((GtkContainer *)ti, (GtkWidget *)eb);
- gtk_widget_show_all((GtkWidget *)ti);
- gtk_main();
- }
Kod libegg jest dłuższy (o 10 linii) ale jak widać można kontrolować niskopoziomowe detale. Nie umiem także wyskalować ikony - ale to IMHO szczegół. Libegg jest także nieprzenośny - pewien system operacyjny nie obsługuje zbyt zaawansowanych funkcji na pasku zadań.
Komentarze do wpisu
Możesz śledzić odpowiedzi poprzez kanał RSS. Możesz dodać komentarz lub zostawić ślad (trackback) ze swojego bloga.
GDR!
O, ciekawe rzeczy na tym blogu piszesz :) W końcu ktoś kto nie ogranicza się do webdev.
22 lipca 2007, 23:46:11
Uzytkownik
Miło to słyszeć :)
25 lipca 2007, 18:28:12
Dodaj komentarz