Hi, often the question comes up, how to show html within an app.... like in automating screenshots of sites. Thanks to Gtk2::WebKit ,( which requires WebKit ), now you can have almost the full power of modern browser's right in your own program.

The webkit c libs, come with a few examples.... one was called GtkLauncher.... which is a rudimentary browser reminiscent of the old Netscape 3. So, I converted the c code, to a Perl version.

I'm sure it's not perfect, but it works pretty good, and ought to get you started on use in your own programs.

Most of the perldocs are in longish named strings, like Gtk2::WebKit::WebSettings, so check out the man3 pages that come with the perl module, for access to the docs.

#!/usr/bin/perl use strict; use warnings; use Gtk2 -init; use Gtk2::WebKit; use Glib qw(TRUE FALSE); # by zentara.... a free Perl adaptation of WebKit's GtkLauncher my $win = Gtk2::Window->new; $win->set_default_size(800, 600); $win->signal_connect(destroy => sub { Gtk2->main_quit }); #globals my ($toolbarbox,$viewbox,$statusbox,$entry,$view,$statusbar, $title, $load_progress, $status_context_id); $title = 'Perl_Browser'; $win->set_title($title); my $vbox = Gtk2::VBox->new( FALSE, 2 ); $vbox->set_border_width(2); $win->add($vbox); $vbox->set_border_width(2); foreach my $box ( $toolbarbox, $viewbox, $statusbox){ $box = Gtk2::VBox->new( FALSE, 0 ); $box->set_border_width(0); $vbox->pack_start($box,1,1,1); } create_toolbar($toolbarbox); create_browser($viewbox); create_status($statusbox); $win->show_all; $view->grab_focus; #if you want to open a default file or uri #$view->open( $ARGV[0] || 'file://z.html' ); #$view->open( $ARGV[0] || 'http://perlmonks.org' ); Gtk2->main; sub create_toolbar{ my $box = $_[0]; my $toolbar = Gtk2::Toolbar->new; $toolbar->set_icon_size ('large-toolbar'); $toolbar->set_show_arrow (FALSE); $toolbar->set_orientation ('GTK_ORIENTATION_HORIZONTAL'); #make the toolbar buttons, etc my $button = Gtk2::ToolButton->new_from_stock('gtk-go-back'); $button->signal_connect( "clicked" => \&go_back, undef ); $toolbar->insert($button, -1); $toolbar->insert(Gtk2::SeparatorToolItem->new ,-1 ); $button = Gtk2::ToolButton->new_from_stock('gtk-go-forward'); $button->signal_connect( "clicked" => \&go_forward, undef ); $toolbar->insert($button, -1); $toolbar->insert(Gtk2::SeparatorToolItem->new ,-1 ); # make entry for URI's my $entbox = Gtk2::ToolItem->new(); $entbox->set_expand(1); $entry = Gtk2::Entry->new(); $entbox->add($entry); $entry->signal_connect( "activate" => \&activate_uri_entry, und +ef ); $toolbar->insert($entbox, -1); $button = Gtk2::ToolButton->new_from_stock('gtk-ok'); $button->signal_connect( "clicked" => \&activate_uri_entry, und +ef ); $toolbar->insert($button, -1); $button = Gtk2::ToolButton->new(undef,'Screenshot'); $button->signal_connect( "clicked" => \&screenshot, undef ); $toolbar->insert($button, -1); $box->pack_start($toolbar,FALSE,FALSE,0); } sub create_browser{ my $box = $_[0]; my $sw = Gtk2::ScrolledWindow->new; $sw->set_policy ('automatic', 'automatic'); $sw->set_size_request (500, 500); # hack to set initial empty +browser size $view = Gtk2::WebKit::WebView->new; $view->signal_connect( 'notify::title' => \&notify_title, unde +f ); $view->signal_connect( 'notify::load-status' => \&notify_load_ +status, undef ); $view->signal_connect( 'notify::progress' => \&notify_progress +, undef ); $view->signal_connect( 'hovering-over-link' => \&hovering_over +_link, undef ); $sw->add($view); $box->pack_start($sw,1,1,0); } sub create_status{ my $box = $_[0]; $statusbar = Gtk2::Statusbar->new; $status_context_id = $statusbar->get_context_id('Link Hover'); $box->pack_start($statusbar,FALSE,FALSE,0); } sub go_back{ $view->go_back } sub go_forward{ $view->go_forward } sub activate_uri_entry{ my $uri = $entry->get_text; $uri ||= 'http://google.com'; $view->load_uri($uri); } sub notify_title{ my $vtitle = $view->get_title(); if ($vtitle){ $win->set_title( $vtitle ) }; } sub notify_load_status{ if( $view->get('load_status') eq 'WEBKIT_LOAD_COMMITTED'){ my $frame = $view->get_main_frame(); my $uri = $view->frame_get_uri($frame); if( $uri ){ $entry->set_text($uri) } } } sub notify_progress{ $load_progress = $view->get('progress'); my $title = sprintf ("Progress: %2d%%", 100 * $load_progress); $win->set_title($title); } sub hovering_over_link{ my ($hash, undef, $link) = @_; if(defined $link){ #print "$status_context_id\t$link \n"; $statusbar->pop($status_context_id); $statusbar->push($status_context_id, $link); } } sub update_title{ $win->set_title($load_progress) } sub screenshot{ # we are going to save the visible browser view window # this DOES NOT save the entire html, only what is visible my ($width, $height) = $view->window->get_size; # create blank pixbuf to hold the image my $gdkpixbuf = Gtk2::Gdk::Pixbuf->new ('rgb', 0, 8, $width, $height); $gdkpixbuf->get_from_drawable ($view->window, undef, 0, 0, 0, 0, $width, $height); #only jpeg and png is supported !!!! it's 'jpeg', not 'jpg' $gdkpixbuf->save ("$0.jpg", 'jpeg', quality => 100); return FALSE; }


I'm not really a human, but I play one on earth.
Old Perl Programmer Haiku

In reply to Perl Web Browser using Gtk2 and WebKit by zentara

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.