#!/usr/bin/perl # $Id: prontobrowser,v 1.5 2001/04/12 06:58:58 muhri Exp $ BEGIN { $libpath = $0; $libpath =~ s!/[^/]+$!!; $libpath =~ s!/bin$!/lib/pronto!; if (! -e $libpath) { die _("Can't find required files in ") . $libpath . "\n"; }; } use lib "$libpath"; use lib "$libpath/modules/lib/perl5/site_perl/5.005"; my ($HTMLWIDGET); eval 'use Csc::HTML; $HTMLWIDGET = "CscHTML";' or eval 'use Gtk::HTML; $HTMLWIDGET = "GtkHTML";'; use Gtk; init Gtk; use URI::URL; use IO::Socket; use MIME::Types; use File::Copy; require 'prontolib.pl'; Gtk::Widget->set_default_colormap(Gtk::Gdk::Rgb->get_cmap()); Gtk::Widget->set_default_visual(Gtk::Gdk::Rgb->get_visual()); if ($HTMLWIDGET eq "GtkHTML") { init Gtk::HTML; } else { init Csc::HTML; } &read_prefs; $conn=&open_db_conn; $url = $ARGV[0]; if ($url ne "") { &init_webbrowser($url); } else { &init_webbrowser } sub init_webbrowser { my ($url) = @_; my ($window, $bg, $query, $sql, @row); if (not defined $url) { $url = $prefs{'HomePage'};} $wb_win = new Gtk::Window("toplevel"); $wb_win->signal_connect('destroy' => sub { $wb_win->destroy; undef $wb_win; Gtk->exit(0);}); $wb_win->signal_connect('delete_event' => \&Gtk::false); $wb_win->set_default_size('640','480'); $wb_win->set_policy(1,1,0); $wb_win->set_title("Pronto Mini Browser"); $wb_win->{'vbox'} = new Gtk::VBox(0,0); $wb_win->{'vbox'}->show; $wb_win->show; $wb_win->add($wb_win->{'vbox'}); $window = $wb_win->window; $bg = $wb_win->style->bg('normal'); $wb_win->{'menu'} = new Gtk::MenuBar; $wb_win->{'menu'}->{'file'} = new Gtk::MenuItem("File"); $wb_win->{'menu'}->{'file'}->show; $wb_win->{'menu'}->show; $wb_win->{'menu'}->append($wb_win->{'menu'}->{'file'}); $wb_win->{'menu'}->{'view'} = new Gtk::MenuItem("View"); $wb_win->{'menu'}->{'view'}->show; $wb_win->{'menu'}->append($wb_win->{'menu'}->{'view'}); $wb_win->{'view_menu'} = new Gtk::Menu; $wb_win->{'menu'}->{'view'}->set_submenu($wb_win->{'view_menu'}); $wb_win->{'view_menu'}->{'debug'} = new Gtk::CheckMenuItem("Debug"); $wb_win->{'view_menu'}->{'debug'}->set_active(0); $wb_win->{'view_menu'}->{'debug'}->show; $wb_win->{'view_menu'}->{'debug'}->signal_connect("toggled" => \&debug); $wb_win->{'view_menu'}->append($wb_win->{'view_menu'}->{'debug'}); $wb_win->{'file_menu'} = new Gtk::Menu; $wb_win->{'menu'}->{'file'}->set_submenu($wb_win->{'file_menu'}); $wb_win->{'file_menu'}->{'new'} = new Gtk::MenuItem("New Window .."); $wb_win->{'file_menu'}->{'new'}->signal_connect("activate" => \&new_window); $wb_win->{'file_menu'}->{'new'}->show; $wb_win->{'file_menu'}->append($wb_win->{'file_menu'}->{'new'}); $wb_win->{'file_menu'}->{'home'} = new Gtk::MenuItem("Home"); $wb_win->{'file_menu'}->{'home'}->signal_connect("activate" => \&wb_view_url, $prefs{'HomePage'}); $wb_win->{'file_menu'}->{'home'}->show; $wb_win->{'file_menu'}->append($wb_win->{'file_menu'}->{'home'}); $wb_win->{'file_menu'}->{'back'} = new Gtk::MenuItem("Back"); $wb_win->{'file_menu'}->{'back'}->signal_connect("activate" => \&wb_view_url, "back"); $wb_win->{'file_menu'}->{'back'}->show; $wb_win->{'file_menu'}->append($wb_win->{'file_menu'}->{'back'}); $wb_win->{'file_menu'}->{'search'} = new Gtk::MenuItem("Search"); $wb_win->{'file_menu'}->{'search'}->show; $wb_win->{'file_menu'}->append($wb_win->{'file_menu'}->{'search'}); $wb_win->{'file_menu'}->{'close'} = new Gtk::MenuItem("Close"); $wb_win->{'file_menu'}->{'close'}->signal_connect("activate" => sub { $wb_win->destroy; undef $wb_win; Gtk->exit(0); }); $wb_win->{'file_menu'}->{'close'}->show; $wb_win->{'file_menu'}->append($wb_win->{'file_menu'}->{'close'}); $wb_win->{'file_menu'}->show; $wb_win->{'vbox'}->pack_start($wb_win->{'menu'},0,0,0); $wb_win->{'handlebox'} = new Gtk::HandleBox(); $wb_win->{'handlebox'}->show; $wb_win->{'toolbar'} = new Gtk::Toolbar('horizontal', 'both'); $wb_win->{'toolbar'}->set_button_relief('none'); $wb_win->{'toolbar'}->set_tooltips($prefs{'ToolTips'}); $wb_win->{'toolbar'}->border_width('2'); $wb_win->{'toolbar'}->show; $wb_win->{'handlebox'}->add($wb_win->{'toolbar'}); $wb_win->{'vbox'}->pack_start($wb_win->{'handlebox'},0,0,0); $wb_win->{'back_button'} = $wb_win->{'toolbar'}->append_item("Back","Click here to go back a page", "",new_pixmap("$prefs{'PixmapDir'}/back.xpm", $window, $bg)); $wb_win->{'home_button'} = $wb_win->{'toolbar'}->append_item("Home","Click here to go to your homepage", "",new_pixmap("$prefs{'PixmapDir'}/top.xpm", $window, $bg)); $wb_win->{'entry'} = new Gtk::Entry; $wb_win->{'entry'}->set_text($url); $wb_win->{'entry'}->show; $wb_win->{'toolbar'}->append_widget($wb_win->{'entry'}, "Type a URL here and press enter to go to that page", ""); $wb_win->{'entry'}->set_usize(300,25); $wb_win->{'go_button'} = new Gtk::Button; $wb_win->{'go_button'}->show; my ($pixmap,$mask)=Gtk::Gdk::Pixmap->create_from_xpm($window,$bg,"$prefs{'PixmapDir'}/go.xpm"); $wb_win->{'go_button'}->{'pixmap'} = new Gtk::Pixmap($pixmap, $mask); $wb_win->{'go_button'}->{'pixmap'}->show; $wb_win->{'go_button'}->add($wb_win->{'go_button'}->{'pixmap'}); $wb_win->{'bookmarks'}->{'button'}= new Gtk::Button("Bookmarks"); $wb_win->{'bookmarks'}->{'button'}->set_usize(75,25); $wb_win->{'bookmarks'}->{'button'}->show; $wb_win->{'toolbar'}->append_widget($wb_win->{'go_button'}, "Click here to load page", ""); $wb_win->{'toolbar'}->append_widget($wb_win->{'bookmarks'}->{'button'}, "Bookmarks", ""); $wb_win->{'toolbar'}->insert_space(2); $wb_win->{'toolbar'}->insert_space(4); $wb_win->{'toolbar'}->insert_space(6); $wb_win->{'toolbar'}->set_space_size(10); $wb_win->{'statusbar'} = new Gtk::Statusbar; $wb_win->{'statusbar'}->show; $wb_win->{'progress'}=new Gtk::ProgressBar; $wb_win->{'progress'}->set_usize(200,20); $wb_win->{'progress'}->show; $wb_win->{'popup'} = new Gtk::Menu; $wb_win->{'popup'}->{'sep'} = new Gtk::MenuItem; $wb_win->{'popup'}->show; $wb_win->{'popup'}->{'sep'}->show; $wb_win->{'popup'}->append($wb_win->{'popup'}->{'sep'}); $wb_win->{'popup'}->{'new'} = new Gtk::MenuItem("Open in a new Window..."); $wb_win->{'popup'}->{'new'}->signal_connect("activate" => \&load_new); $wb_win->{'popup'}->append($wb_win->{'popup'}->{'new'}); $wb_win->{'popup'}->{'new'}->show; $wb_win->{'popup'}->{'save'} = new Gtk::MenuItem("Save Link As..."); $wb_win->{'popup'}->{'save'}->signal_connect("activate" => \&download_url); $wb_win->{'popup'}->{'save'}->show; $wb_win->{'popup'}->append($wb_win->{'popup'}->{'save'}); $wb_win->{'bookmarks'}->{'popup'} = new Gtk::Menu; $wb_win->{'bookmarks'}->{'popup'}->{'bm_page'} = new Gtk::MenuItem("Bookmark Current Page"); $wb_win->{'bookmarks'}->{'popup'}->{'bm_page'}->signal_connect("activate" => \&add_bookmark, $wb_win); $wb_win->{'bookmarks'}->{'popup'}->{'bm_page'}->show; $wb_win->{'bookmarks'}->{'popup'}->append($wb_win->{'bookmarks'}->{'popup'}->{'bm_page'}); $wb_win->{'bookmarks'}->{'popup'}->{'sep'} = new Gtk::MenuItem; $wb_win->{'bookmarks'}->{'popup'}->{'sep'}->show; $wb_win->{'bookmarks'}->{'popup'}->append($wb_win->{'bookmarks'}->{'popup'}->{'sep'}); $sql = "select id, title, url from bookmarks order by id"; $query=$conn->prepare($sql); $query->execute(); while (@row=$query->fetchrow_array()) { $wb_win->{'bookmarks'}->{'popup'}->{$row[0]} = new Gtk::MenuItem($row[1]); $wb_win->{'bookmarks'}->{'popup'}->{$row[0]}->signal_connect("activate" => \&wb_view_url, $row[2]); $wb_win->{'bookmarks'}->{'popup'}->{$row[0]}->show; $wb_win->{'bookmarks'}->{'popup'}->append($wb_win->{'bookmarks'}->{'popup'}->{$row[0]}); } if ($HTMLWIDGET eq "GtkHTML") { $wb_win->{'html'} = new Gtk::HTML; } else { $wb_win->{'html'} = new Csc::HTML; } if ($THREADS == 1) { $wb_win->{'html'}->signal_connect('url_requested' => \&thread_lwu); } else { $wb_win->{'html'}->signal_connect('url_requested' => \&load_wb_url); } $wb_win->{'html'}->signal_connect('link_clicked' => \&wb_view_url); $wb_win->{'html'}->signal_connect('title_changed' => \&set_title); $wb_win->{'html'}->signal_connect('on_url' => \&wb_status); $wb_win->{'html'}->signal_connect('submit' => \&on_submit); $wb_win->{'html'}->signal_connect('redirect' => \&on_redirect); $wb_win->{'html'}->set_editable(0); $wb_win->{'html'}->enable_debug(0); $wb_win->{'sw'} = new Gtk::ScrolledWindow(undef, undef); $wb_win->{'sw'}->set_policy('automatic', 'automatic'); $wb_win->{'sw'}->show; $wb_win->{'sw'}->add($wb_win->{'html'}); $wb_win->{'vbox'}->pack_start($wb_win->{'sw'},1,1,0); $wb_win->{'hbox'}= new Gtk::HBox(0,0); $wb_win->{'hbox'}->show; $wb_win->{'vbox'}->pack_end($wb_win->{'hbox'},0,0,0); $wb_win->{'hbox'}->pack_start($wb_win->{'statusbar'},1,1,0); $wb_win->{'hbox'}->pack_end($wb_win->{'progress'},0,0,0); $wb_win->{'html'}->realize; $wb_win->{'html'}->show; $wb_win->{'html'}->signal_connect('button_press_event' => \&wb_mouse_click); $wb_win->{'entry'}->signal_connect("activate" => \&wb_entry_url); $wb_win->{'back_button'}->signal_connect("clicked" => \&wb_view_url, "back"); $wb_win->{'home_button'}->signal_connect("clicked" => \&wb_view_url, $prefs{'HomePage'}); $wb_win->{'go_button'}->signal_connect("clicked" => \&wb_entry_url); $wb_win->{'bookmarks'}->{'button'}->signal_connect("clicked" => sub {$wb_win->{'bookmarks'}->{'popup'}->popup(undef, undef, 0, 0);}); $wb_win->{'file_menu'}->{'search'}->signal_connect("activate" => sub { $wb_win->{'html'}->search; }); &wb_view_url(undef, $url); return 1; } sub set_title { my ($widget, $title) = @_; $wb_win->set_title($title) } sub add_bookmark { my ($widget, $wb_win) = @_; my ($sql, $query, $title, $address, $id); $title = $wb_win->{'html'}->get_title(); $address = $wb_win->{'current'}->as_string; print ("title = $title\naddress = $address\n"); $sql = "insert into bookmarks (id, title, url) values (?, ?, ?)"; $query = $conn->prepare($sql); $id = &newid('bookmarks', $conn); $query->execute($id, $title, $address); $wb_win->{'bookmarks'}->{'popup'}->{$id} = new Gtk::MenuItem($title); $wb_win->{'bookmarks'}->{'popup'}->{$id}->signal_connect("activate" => \&wb_view_url, $address); $wb_win->{'bookmarks'}->{'popup'}->{$id}->show; $wb_win->{'bookmarks'}->{'popup'}->append($wb_win->{'bookmarks'}->{'popup'}->{$id}); return 1; } sub debug { my ($widget) = @_; if ($widget->active) { $wb_win->{'html'}->enable_debug(0); } else { $wb_win->{'html'}->enable_debug(1); } } sub on_submit { my ($widget, $method, $action, $encoding) = @_; if ($method eq "GET") { $action.="?$encoding"; &wb_view_url(undef, $action); } elsif ($method eq "POST") { $wb_win->{'length'} = length($encoding); $wb_win->{'message'} = $encoding; print ("$wb_win->{'message'}\n"); if (!$action) {$action = $wb_win->{'current'}; } &wb_view_url(undef, $action); } else { print ("Unsupported Form Method: $method\nAction: $action\nEncoding: $encoding\n"); } return 1; } sub redirect_timer_event { my ($redirect_url) = @_; Gtk->timeout_remove($redirect_timerID); undef $redirect_timerID; &wb_view_url(undef, $redirect_url); } sub on_redirect { my ($widget, $url, $delay) = @_; if (not defined $redirect_timerID) { $redirect_timerID = Gtk->timeout_add($delay * 1000, \&redirect_timer_event, $url); } } sub wb_mouse_click { my ($widget, $event) = @_; if ($event->{'button'} != 3) { return 1; } if (!$wb_win->{'mouse_url'}) { return 1; } $wb_win->{'popup'}->popup(undef, undef, $event->{'button'}, $event->{'time'}); return 1; } sub gtkhtml_mouse_click { my ($widget, $popup, $url, $event) = @_; if ($event->{'button'} != 3) { return 1; } if(!defined $$url) { return 1; } if($$url =~ /^file:$prefs{'MailDir'}\/tmp\//) { $popup->popup(undef, undef, $event, $event->{'time'}); } return 1; } sub wb_status { shift; my $url = shift; if (defined $url) { my $stat = (new URI::URL $url, $wb_win->{'base'})->abs($wb_win->{'base'},1); $wb_win->{'statusbar'}->push(1,$stat); $wb_win->{'mouse_url'} = $stat; } else { $wb_win->{'statusbar'}->pop(1); $wb_win->{'mouse_url'} = ""; } return 1; } sub wb_entry_url { my ($url); $url = $wb_win->{'entry'}->get_text; if ($url !~ /^\w+:/) { $url = "http://" . $url; } &wb_view_url(undef, $url); return 1; } sub wb_view_url { my ($widget, $url) = @_; if (!$url) { return 1; } my ($request, $host, $port, $path, $type, $header, $status, $st_num, $full_url, $socket, $redirect_url, $back); $back = 0; if ($url =~ /^mailto:(.+)/) { my ($address, @fields); $address = $1; $fields[0] = $address; $fields[1] = ""; $fields[2] = ""; my $child; unless ($child = fork) { die "cannot fork: $~" unless defined $child; exec("pronto $address"); } #&init_msg_window(0, undef, \@fields); return 1; } if (not defined $wb_win) { &init_webbrowser($url); return 1; } if ($url eq "back") { if (defined @{$wb_win->{'history'}}) { my $tmp = pop @{$wb_win->{'history'}}; if ($tmp) { $url = $tmp; $back = 1;} else { return 1; } } else { return 1; } } if (defined $wb_win) { $wb_win->{'statusbar'}->pop(1); } $wb_win->{'progress'}->set_activity_mode(1); if ($url =~ /^file:(.+)/) { $full_url = $url; my $path = $1; if (-d $path) { # its a directory if ($path !~ /\/$/) { $path.="/"; } $wb_win->{'entry'}->set_text($full_url); $wb_win->{'current'} = $full_url; $wb_win->{'base'} = $full_url; $type = "text/html"; my $i = 1000; opendir DIR, $path; my @entries = grep !/^\.\.?$/, readdir DIR; closedir(DIR); open (TMP,">$prefs{'MailDir'}/temp.html"); print TMP ("