GUI (Gnome, KDE, Gtk...), Programowanie (IDE, UML, Wzorce...), Programowanie (PHP, Java...), System (GNU, BSD, Windows...)

StatusIcon w kilkunastu linijkach

06 lipca, 2007 o 20:48:29 Dodaj komentarz Poziom: 0 Permalink

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'):

  1. import pygtk
  2. pygtk.require('2.0')
  3. import gtk
  4.  
  5. menu = gtk.Menu()
  6. quit = gtk.MenuItem("Quit")
  7. quit.connect("activate", lambda mi: gtk.main_quit())
  8. menu.append(quit)
  9. menu.show_all()
  10.  
  11. si = gtk.StatusIcon()
  12. si.set_from_file("/usr/share/pixmaps/ooo-writer.png")
  13. si.connect("popup-menu", lambda si,b,at: menu.popup(None, None, None, b, at))
  14.  
  15. gtk.main()

W podobny sposób można napisać także w C:

  1. #include <gtk/gtk.h>
  2.  
  3. void popup(GtkStatusIcon *si, guint button, guint activ, GtkMenu *menu) {
  4.         gtk_menu_popup(menu, NULL, NULL, NULL, NULL, button, activ);
  5. }
  6.  
  7. void quit(GtkMenuItem *menuitem, gpointer user_data) {
  8.         gtk_main_quit();
  9. }
  10.  
  11. int main(int argc, char **argv) {
  12.         GtkStatusIcon *si;
  13.         GtkMenu *menu;
  14.         GtkMenuItem *menu_item;
  15.  
  16.         gtk_init(&argc, &argv);
  17.  
  18.         menu = GTK_MENU(gtk_menu_new());
  19.         menu_item = GTK_MENU_ITEM(gtk_menu_item_new_with_label("Quit"));
  20.         gtk_menu_append(menu, (GtkWidget *)menu_item);
  21.         gtk_widget_show_all((GtkWidget *)menu);
  22.         g_signal_connect(menu_item, "activate", (GCallback)quit, NULL);
  23.  
  24.         si = gtk_status_icon_new_from_file("/usr/share/pixmaps/ooo-writer.png");
  25.         g_signal_connect(si, "popup-menu", (GCallback)popup, menu);
  26.  
  27.  
  28.         gtk_main();
  29. }

Z dawnym Egg mamy coś w tym rodzaju(40 linii):

  1. #include <gtk/gtk.h>
  2. #include "eggtrayicon.h"
  3.  
  4. gboolean popup(GtkWidget *widget, GdkEventButton *ev, GtkMenu *menu) {
  5.         if(ev->button != 3)
  6.                 return FALSE;
  7.         gtk_menu_popup(menu, NULL, NULL, NULL, NULL, ev->button, ev->time);
  8.         return TRUE;
  9. }
  10.  
  11. void quit(GtkMenuItem *menuitem, gpointer user_data) {
  12.         gtk_main_quit();
  13. }
  14.  
  15. int main(int argc, char **argv) {
  16.         EggTrayIcon *ti;
  17.         GtkEventBox *eb;
  18.         GtkImage *im;
  19.         GtkMenu *menu;
  20.         GtkMenuItem *menu_item;
  21.  
  22.         gtk_init(&argc, &argv);
  23.  
  24.         menu = GTK_MENU(gtk_menu_new());
  25.         menu_item = GTK_MENU_ITEM(gtk_menu_item_new_with_label("Quit"));
  26.         g_signal_connect(menu_item, "activate", (GCallback)quit, NULL);
  27.         gtk_menu_append(menu, (GtkWidget *)menu_item);
  28.         gtk_widget_show_all((GtkWidget *)menu);
  29.  
  30.         ti = egg_tray_icon_new("Test");
  31.         eb = (GtkEventBox *)gtk_event_box_new();
  32.         im = (GtkImage *)gtk_image_new_from_file("/usr/share/pixmaps/ooo-writer.png");
  33.         gtk_container_add((GtkContainer *)eb, (GtkWidget *)im);
  34.         g_signal_connect(eb, "button-press-event", (GCallback)popup, menu);
  35.         gtk_container_add((GtkContainer *)ti, (GtkWidget *)eb);
  36.         gtk_widget_show_all((GtkWidget *)ti);
  37.  
  38.         gtk_main();
  39. }

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

Textile Lite włączony ( szczegółowy opis znaczników ):