GUI (Gnome, KDE, Gtk...), Programowanie (PHP, Java...), Sieć (IP, TCP, ...), Technologie W3C (XHTML, CSS...)

Silniki renderujące HTML dla GTK

27 lipca, 2007 o 16:12:21 Dodaj komentarz Poziom: 0 Permalink

Sprawdziłem jak umieścić 3 najpopularniejsze(właściwie to chyba jedyne) silniki w aplikacji. Aplikacja ma bardzo proste zadanie - wyświetlić stronę Google. Na pierwszy ogień najbardziej popularny silnik czyli Gecko.

Sprawa we wszystkich językach wygląda podobnie - GtkMozEmbed jest zwykłym widgetem Gtk.

  1. #include <gtkmozembed.h>
  2. #include <gtk/gtk.h>
  3.  
  4. int quit(GtkWidget *window, gpointer data) {
  5.         gtk_main_quit();
  6. }
  7.  
  8. int main(int argc, char *argv[]) {
  9.         GtkWidget *window;
  10.         GtkWidget *mozembed;
  11.  
  12.         gtk_init(&argc, &argv);
  13.  
  14.         window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  15.         g_signal_connect(window, "destroy", (GCallback)quit, NULL);
  16.        
  17.         mozembed = gtk_moz_embed_new();
  18.         gtk_moz_embed_load_url((GtkMozEmbed *)mozembed, "http://google.com/");
  19.        
  20.         gtk_container_add((GtkContainer *)window, mozembed);
  21.         gtk_widget_show_all(window);
  22.  
  23.         gtk_main();
  24.  
  25.         return 0;
  26. }

Podobnie wygląda to w Ruby i Pythonie(ten ostatni nie przetestowany)

  1. require 'gtkmozembed'
  2.  
  3. window = Gtk::Window.new
  4. window << (mozembed = Gtk::MozEmbed.new)
  5. mozembed.location = "http://google.com"
  6. window.signal_connect(:destroy) { Gtk.main_quit }
  7. window.show_all
  8.  
  9. Gtk.main
  1. import pygtk
  2. pygtk.require('2.0')
  3. import gtk
  4.  
  5. window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  6. window.connect("delete_event", lambda widget: gtk.main_quit())
  7. win.add(moz = gtkmozembed.MozEmbed())
  8. win.show_all()
  9. moz.load_url('http://google.com')
  10.  
  11. gtk.main()

Innym, już nie tak popularnym silnikiem, jest GtkHTML. Jego API jest dość... spartańskie w porównaniu do konkurencji. Nie ma chyba nawet funkcji do ładowania stron (albo takową przegapiłem z powodu braku dokumentacji) - ponieważ tekst ten jest o silnikach a nie o libcurl to pozwoliłem sobie zrezygnować z tego zadania.

  1. #include <gtkhtml/gtkhtml.h>
  2. #include <string.h>
  3.  
  4. int quit(GtkWidget *widget, gpointer data) {
  5.         gtk_main_quit();
  6. }
  7.  
  8. void load(GtkHTML *html, gchar *url) {
  9.         gtk_html_begin(html);
  10.         gchar *page = "<html><body><p>Test</p></body></html>";
  11.         gtk_html_load_from_string(html, page, strlen(page));
  12. }
  13.  
  14. int main(int argc, char *argv[]) {
  15.         GtkWidget *window;
  16.         GtkWidget *gtkhtml;
  17.  
  18.         gtk_init(&argc, &argv);
  19.  
  20.         window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  21.         g_signal_connect(window, "destroy", (GCallback)quit, NULL);
  22.         gtkhtml = gtk_html_new();
  23.         load((GtkHTML *)gtkhtml, "http://google.com");
  24.         gtk_container_add((GtkContainer *)window, gtkhtml);
  25.         gtk_widget_show_all(window);
  26.  
  27.         gtk_main();
  28.  
  29.         return 0;
  30. }

Ostatnią z opisywanych bibliotek jest Gtk - Web Core. Dokumentacja jest IMHO najlepsza, gdyż jest napisawa w nagłówku a nie, jak zazwyczaj robią to aplikacje Gtk, w pliku źródłowym. Interfejs jest prawie identyczny - przynajmniej jeśli chodzi o podstawowe operacje - z GtkMozEmbed przynajmniej jeśli chodzi o podstawowe funkcje. Niestety silnik jeszcze nie jest 'produkcyjny'.

PS. Kod poniżej nie działa - ktoś wie dlaczego? Przy debugowaniu wykrywam, że wysyła sygnał "load-start", ale okienko jest białe. Korzystam z wersji z SVN (co może być przyczyną problemu).

  1. #include <webi.h>
  2. #include <gtk/gtk.h>
  3.  
  4. int quit(GtkWidget *window, gpointer data) {
  5.     gtk_main_quit();
  6. }
  7.  
  8. int main(int argc, char *argv[]) {
  9.     GtkWidget *window;
  10.     GtkWidget *webi;
  11.  
  12.     gtk_init(&argc, &argv);
  13.    
  14.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  15.         g_signal_connect(window, "destroy", (GCallback)quit, NULL);
  16.        
  17.         webi = webi_new();
  18.         webi_load_url((Webi *)webi, "http://google.com/");
  19.        
  20.         gtk_container_add((GtkContainer *)window, webi);
  21.         gtk_widget_show_all(window);
  22.  
  23.         gtk_main();
  24.  
  25.         return 0;
  26. }

Zastanawia mnie, czy i jeśli zostanie napisana biblioteka do obsługi zarówno GtkMozEmbed jak i WebCore.

Komentarze do wpisu

Możesz śledzić odpowiedzi poprzez kanał RSS. Możesz dodać komentarz lub zostawić ślad (trackback) ze swojego bloga.

#

Uzytkownik

PS. Ktoś ma pomysł na lepszy tytuł?

27 lipca 2007, 16:14:01

#

Livio

GTK-WebCore od Nokii nie będzie użyty w Epiphany, np. – biorą oficjalny WebKit-GDK, co mnie nieco dziwi…

Moje projekt Nokii był niedoskonały :| .

29 sierpnia 2007, 11:58:20

Dodaj komentarz

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