#! /usr/bin/env perl use strict; use warnings; use YAML::Any qw/LoadFile/; use String::Format; use Glib qw/TRUE FALSE/; use Gtk2 -init; use Gtk2::WebKit; use Gtk2::Gdk::Keysyms; my %keysyms = %Gtk2::Gdk::Keysyms; my $config = LoadFile("config.yml"); my $default_mod_mask = Gtk2::Accelerator->get_default_mod_mask; my $win = Gtk2::Window->new; my $box = Gtk2::VBox->new(FALSE, FALSE); my $entry; if ($config->{interface}->{uri}) { $entry = Gtk2::Entry->new(); } my $view = Gtk2::WebKit::WebView->new; my $search = Gtk2::Entry->new(); my $status; if ($config->{interface}->{status}) { $status = Gtk2::Statusbar->new; } $win->add($box); $win->signal_connect(destroy => sub { Gtk2->main_quit }); $win->signal_connect('key-press-event', sub { my ($widget , $event) = @_; if ($event->state >= 'control-mask' && $event->keyval == $Gtk2::Gdk::Keysyms{f}) { $view->go_forward; } if ($event->state >= 'control-mask' && $event->keyval == $Gtk2::Gdk::Keysyms{b}) { $view->go_back; } if ($event->state >= 'control-mask' && $event->keyval == $Gtk2::Gdk::Keysyms{s}) { $search->grab_focus; } return 0; }, ); if ($config->{interface}->{uri}) { $box->pack_start($entry, FALSE, FALSE, FALSE); } $box->pack_start_defaults($view); $box->pack_end($search, FALSE, FALSE, FALSE); if ($config->{interface}->{status}) { $box->pack_end($status, FALSE, FALSE, FALSE); } $box->show; $entry->signal_connect('activate', sub { my ($widget, $label) = @_; my $text = $widget->get_text(); $view->open($text); }, ); $entry->set_activates_default(TRUE); my $hovering_cid; if ($config->{interface}->{status}) { $view->signal_connect('hovering-over-link', sub { my ($widget, $unknown, $link) = @_; if (defined($link)) { $status->pop($hovering_cid); my $cid = $status->get_context_id($link); $status->push($cid, $link); $hovering_cid = $cid; } else { $status->pop($hovering_cid); } }, ); } if ($config->{interface}->{uri}) { $view->signal_connect('load-finished', sub { my ($view , $frame) = @_; $entry->set_text($view->get_uri); }, ); } $view->signal_connect('download-requested', sub { my ($view , $download) = @_; my $url = $download->get_uri; my $cmd = $config->{download}; my %format = ( 'u' => $url, ); $cmd = stringf($cmd, %format); print $cmd, "\n"; system($cmd); }, ); $view->signal_connect('mime-type-policy-decision-requested', sub { my ($view, $frame, $request, $mime, $decision) = @_; if ($view->can_show_mime_type($mime)) { $decision->use; } else { $decision->download; } return TRUE; }, ); $view->open($ARGV[0] // $config->{homepage}); $search->signal_connect('activate', sub { my ($widget, $label) = @_; my $text = $widget->get_text(); if ($text) { $view->mark_text_matches($text, FALSE, 0); $view->set_highlight_text_matches(TRUE); $view->search_text($text, FALSE, FALSE, TRUE); } else { $view->unmark_text_matches(); } }, ); $search->set_activates_default(TRUE); $win->show_all; Gtk2->main;