Weby (vala)

środa, 18 sierpnia 2010

Ja chyba czerpię jakąś perwersyjną satysfakcję z pisania bezużytecznego kodu.

Po tym jak wczoraj opisałem minimalną przeglądarkę napisaną w oparciu o kontrolki Qt i silnik WebKit. (weby), nie dawało mi spokoju pytanie:

Jak wyglądał by odpowiednik korzystający z GTK?

Vala

Nie miałem ochoty na pisanie kodu w C. W przypadku GTK, brak składniowego wsparcia dla obiektywności i przestrzeni nazw jest bardzo szkodliwy. Dla przykładu, zamiast prostego:

window.title="tytuł"

trzeba pisać:

gtk_window_set_title(window, "tytuł");

Efektem jest rozwlekły, nieczytelny kod, od którego wzrok ucieka w poszukiwaniu czegokolwiek innego.

Wreszcie, postanowiłem przy okazji nauczyć się języka Vala. Oto pierwsze rezultaty:

veby.vala

using Gtk;
using WebKit;

public class Veby : Window {

 private WebView view;

 public Veby (string url) {

  this.destroy.connect(Gtk.main_quit);

  this.title = "Veby";
  set_default_size(800, 600);

  this.view = new WebView();
  this.view.open(url);

  add(view);
  show_all();
 }

 public static int main (string[] args) {
  Gtk.init(ref args);
  new Veby("http://blog.szsz.pl/");
  Gtk.main();
  return 0;
 }
}

Dodatkowo przyda się jeszcze Makefile

Podobieństwa do C++, Java i C#, są olbrzymie. Szybko zapomniałem o tym że piszę w obcym języku. Niestety, wkrótce napotkałem pierwszy problem. Opis języka jest całkiem dobry, ale dokumentacja API (przynajmniej WebKit) jest zbyt uboga. Zmuszało mnie to do posiłkowania się innymi źródłami. To jest duży minus.

Nie sposób porównać wydajności generowanego kodu, ponieważ głównym wołem roboczym i tak pozostaje WebKit. W obu przypadkach binarki mają bardzo zbliżone rozmiary (około 6K). Pomijając różne konwencje nazewnictwa, obie wersje są bardzo do siebie podobne, z tym że w C++ całość bezmyślnie upchnąłem w jednej funkcji, co będę musiał zmienić.

Zdarzenia

Aby nie ograniczać się do przepisywania z narzędzia A do B...

Na początek ustawianie tytułu okna. Wymaga to dodania obsługi sygnału (zdarzenia) title_changed, wysyłanego przez coś co tu nazywa się main_frame i reprezentuje załadowany dokument (diff)

this.view.get_main_frame().title_changed.connect(title_changed);
(...)
public void title_changed (string title) { this.title = title; }

Moje eksperymenty, zacząłem od pomysłu by stworzyć interfejs na użytek skryptów w shellu. Nie było by to możliwe bez śledzenia działań użytkownika:

W tym celu przydała by się obsługa sygnału url_changed... tylko... nie ma czegoś takiego. Podobny sygnał można znaleźć w dokumentacji WebKit dla Qt, na szczęście to nie jest jedyna możliwość (diff).

this.view.navigation_policy_decision_requested.connect(action);
(...)
public bool action (
 WebFrame fr, 
 NetworkRequest req,
 WebNavigationAction act,
 WebPolicyDecision dec) {
  stdout.printf("go %s\n", req.uri);
  return false;
}

... i to wszystko. W teorii ten programik mógł by już spełniać swoją rolę, chociaż wątpię by w tej postaci był wygodnym narzędziem.

Na koniec

Vala jest bardzo ciekawym i obiecującym językiem, pozwala dużo swobodniej pracować z bibliotekami Glib i GTK niż to co pamiętam z czasów gdy bawiłem się w C.

Interesujące są też rozbieżności w renderingu stron. Wersja Qt (4.6), ma bardzo uproszczoną obsługę cieni. Natomiast wersja z GTK, cienie rysuje idealnie, ale nie ładuje fontów.

Och, trudny wybór...

Etykiety: , , , , ,

Red 16:03

Komentarze

Anonymous Anonimowy
W Pythonie i tak jest ładniej :P
Zasymiluj się z Borgiem, nie bądź taki ;)
pierwszy kod we wpisie: http://www.nme.pl/2009/08/podglad-strony-do-pliku-jpg/
Blogger Red
Vala ma jedną zaletę, podobnie jak C, po skompilowaniu otrzymujesz binarny plik zależny wyłącznie od gtk i webkit.

Pomijając osobiste uprzedzenia. Pisanie tego w Pythonie mijało by się z celem, skoro to ma być GUI dla aplikacji w Shellu?

Aha, myślę że to Cię zainteresuje. Na stronach z przykładami do Qt, znajdziesz aplikację robiącą zrzuty stron. http://doc.qt.nokia.com/4.6/webkit-framecapture.html
Programik działa z linii poleceń.

Prześlij komentarz

Odnośniki

Utwórz link

Archiwum

Subskrybuj

RSS / Atom