Silniki renderujące HTML dla GTK
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.
- #include <gtkmozembed.h>
- #include <gtk/gtk.h>
- int quit(GtkWidget *window, gpointer data) {
- gtk_main_quit();
- }
- int main(int argc, char *argv[]) {
- GtkWidget *window;
- GtkWidget *mozembed;
- gtk_init(&argc, &argv);
- window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- g_signal_connect(window, "destroy", (GCallback)quit, NULL);
- mozembed = gtk_moz_embed_new();
- gtk_moz_embed_load_url((GtkMozEmbed *)mozembed, "http://google.com/");
- gtk_container_add((GtkContainer *)window, mozembed);
- gtk_widget_show_all(window);
- gtk_main();
- return 0;
- }
Podobnie wygląda to w Ruby i Pythonie(ten ostatni nie przetestowany)
- require 'gtkmozembed'
- window = Gtk::Window.new
- window << (mozembed = Gtk::MozEmbed.new)
- mozembed.location = "http://google.com"
- window.signal_connect(:destroy) { Gtk.main_quit }
- window.show_all
- Gtk.main
- import pygtk
- pygtk.require('2.0')
- import gtk
- window = gtk.Window(gtk.WINDOW_TOPLEVEL)
- window.connect("delete_event", lambda widget: gtk.main_quit())
- win.add(moz = gtkmozembed.MozEmbed())
- win.show_all()
- moz.load_url('http://google.com')
- 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.
- #include <gtkhtml/gtkhtml.h>
- #include <string.h>
- int quit(GtkWidget *widget, gpointer data) {
- gtk_main_quit();
- }
- void load(GtkHTML *html, gchar *url) {
- gtk_html_begin(html);
- gchar *page = "<html><body><p>Test</p></body></html>";
- gtk_html_load_from_string(html, page, strlen(page));
- }
- int main(int argc, char *argv[]) {
- GtkWidget *window;
- GtkWidget *gtkhtml;
- gtk_init(&argc, &argv);
- window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- g_signal_connect(window, "destroy", (GCallback)quit, NULL);
- gtkhtml = gtk_html_new();
- load((GtkHTML *)gtkhtml, "http://google.com");
- gtk_container_add((GtkContainer *)window, gtkhtml);
- gtk_widget_show_all(window);
- gtk_main();
- return 0;
- }
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).
- #include <webi.h>
- #include <gtk/gtk.h>
- int quit(GtkWidget *window, gpointer data) {
- gtk_main_quit();
- }
- int main(int argc, char *argv[]) {
- GtkWidget *window;
- GtkWidget *webi;
- gtk_init(&argc, &argv);
- window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- g_signal_connect(window, "destroy", (GCallback)quit, NULL);
- webi = webi_new();
- webi_load_url((Webi *)webi, "http://google.com/");
- gtk_container_add((GtkContainer *)window, webi);
- gtk_widget_show_all(window);
- gtk_main();
- return 0;
- }
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