Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env perl
- #
- # Instalar Gtk3 y Gtk3::WebKit por CPAN,para funcionar correctamente
- # Programa de prueba para Tiempo de Tux <http://www.itimetux.com>
- # Por Demianx864
- # Eres libre de estudiar modificar y añadir nuevas cosas a el programa,que te diviertas :D
- # Simple PerlBrowser 4.1.1
- # Gracias al modulo WebKit <http://webkitgtk.org/>
- #
- use strict;
- use feature ':5.14';
- use Glib qw/TRUE FALSE/;
- use Gtk3 -init;
- binmode STDOUT, ":utf8";
- use utf8;
- use JSON;
- my $json; # Definimos variable json
- &json; # Llamamos rutina json
- my $confP = decode_json($json); # Definimos variable que llama json
- # Variables que definen ajustes
- my $iniP = $confP->{'pantalla'}->{'inicio'}->[0];
- my $unscreen = $confP->{'pantalla'}->{'inicio'}->[1]; # Arrays
- my $sview = $confP->{'pantalla'}->{'inicio'}->[2];
- use Gtk3::WebKit; # Llamamos a webkit
- # Usar logo.xpm
- my $ventana = Gtk3::Window->new('toplevel'); # Definimos ventana principal
- my $icono = 'icon.xpm'; # Definimos icono
- if ( -e $icono ) { # Vemos si existe el icono
- $ventana->set_icon_from_file($icono); # Si es asi,se lo colomos a la ventana
- }
- # Parametros de la ventana
- my $titulo = "Simple Perl Browser"; # Titulo de la ventana
- $ventana->set_default_size(800, 600); # Tamaño por defecto
- $ventana->maximize(TRUE); # Maximizar al abrir
- $ventana->set_title($titulo); # Colocamos titulo
- $ventana->set_border_width(5); # Añadimos bordes
- $ventana->$unscreen(); # No fullscreen por defecto
- $ventana->signal_connect(delete_event => \&salir); # Si recibe señal de X i a &salir
- my $inicio; # Ventana de configuracion de inicio
- # Opciones
- my $table = Gtk3::Grid->new; # Creamos tabla con Grid
- # Opciones nulas
- # Arrays multidimensionales
- my @entries = (
- [ "Opciones", undef, "_Opciones" ],
- ["Acerca de", undef, "_Acerca de", undef, "Acerca de", \&activate_action ],
- ["Inicio", undef, "_Inicio", undef, "Inicio", \&activate_action ],
- ["Salir", undef, "_Salir", undef, "Salir", \&activate_action ]
- );
- # Opciones cambiantes
- # Arrays multidimensionales
- my @toggle_entries = (
- ["Completa",undef, "_Pantalla Completa", undef,
- "Pantalla completa", \&activate_action, FALSE ],
- ["HideTitlebar", undef, "_Hide Titlebar", undef,
- "Hide Titlebar", \&activate_action,FALSE]
- );
- # Las metemos en un grupo
- my $action_group = Gtk3::ActionGroup->new('AppWindowActions');
- $action_group->add_actions( \@entries, undef );
- $action_group->add_toggle_actions( \@toggle_entries, undef );
- # Creamos un UIManager y insertamos el grupo
- my $ui = Gtk3::UIManager->new();
- $ui->insert_action_group( $action_group, 0 );
- my $ui_info = get_ui();
- $ui->add_ui_from_string( $ui_info, length($ui_info) );
- $table->attach( $ui->get_widget('/MenuBar'), 0, 0, 1, 1 );
- # Webkit
- my $uri = shift @ARGV || $iniP ; # Definimos url de variable $iniP
- my $ver = Gtk3::WebKit::WebView->new(); # Creamos WebView
- # Cargamos url
- &web();
- # Añadimos url a scrolls
- my $scrolls = Gtk3::ScrolledWindow->new(); # Creamos scrolled window
- $scrolls->set_policy ('automatic', 'automatic');
- $scrolls->add($ver); # Añadimos Webview
- # Entrada
- my $entry = Gtk3::Entry->new; # Entrada de url
- $entry->signal_connect( "activate" => \&entrada, undef ); # Desviamos entrada a &entrada
- my $entrycio = Gtk3::Entry->new; # Entrada de pagina de inicio
- $entrycio->signal_connect( "activate" => \&confinicio, undef );
- # Botones
- # Creamos y labels
- my $brg = Gtk3::ToolButton->new_from_stock('gtk-quit');
- my $go = Gtk3::ToolButton->new_from_stock('gtk-find');
- my $fresh = Gtk3::ToolButton->new_from_stock('gtk-refresh');
- my $frenar = Gtk3::ToolButton->new_from_stock('gtk-stop');
- my $batras = Gtk3::ToolButton->new_from_stock('gtk-go-back');
- my $belante = Gtk3::ToolButton->new_from_stock('gtk-go-forward');
- my $vermenos = Gtk3::ToolButton->new_from_stock('gtk-zoom-in');
- my $vermas = Gtk3::ToolButton->new_from_stock('gtk-zoom-out');
- my $label = Gtk3::Label->new("");
- # Desviamos señales de botones a subrutinas
- $go->signal_connect ( "clicked" => \&entrada, undef );
- $fresh->signal_connect ( "clicked" => \&recargar, undef );
- $frenar->signal_connect ( "clicked" => \¶r );
- $batras->signal_connect( "clicked" => \&atras );
- $belante->signal_connect ( "clicked" => \&adelante );
- $vermenos->signal_connect ( "clicked" => \&zomin );
- $vermas->signal_connect ( "clicked" => \&zomout);
- # Frenar y recargar unificados
- my $botones = Gtk3::Notebook->new(); # Creamos Notebook
- $botones->set_show_tabs(FALSE);
- $botones->set_show_border(FALSE); # No mostramos bordes
- $botones->append_page($fresh); # Añadimos botones
- $botones->append_page($frenar);
- # Unimos todo
- # Caja horizontal
- my $hbox = Gtk3::Box->new("horizontal", 0);
- $hbox->pack_start($entry, TRUE,TRUE , 0);
- $hbox->pack_start($go, FALSE,FALSE , 0);
- $hbox->pack_start($label, FALSE,FALSE , 0);
- $hbox->pack_start($botones, FALSE,FALSE , 0);
- $hbox->pack_start($vermas, FALSE,FALSE , 0);
- $hbox->pack_start($vermenos, FALSE,FALSE , 0);
- $hbox->pack_start($batras, FALSE, FALSE, 0);
- $hbox->pack_start($belante, FALSE, FALSE, 0);
- $hbox->pack_start($table,FALSE, FALSE, 0);
- # Caja Vertical
- my $vbox = Gtk3::Box->new("vertical", 0);
- $vbox->pack_start($hbox, FALSE, FALSE, 0);
- $vbox->pack_start($scrolls, TRUE, TRUE, 0);
- # Añadimos cajas a ventana
- $ventana->add($vbox);
- # Lo mostramos
- $ventana->show_all();
- Gtk3->main();
- ### Funciones :) ###
- # Salir
- sub salir {
- Gtk3->main_quit; # Cerramos ventana
- &opensettings(1,"unfullscreen"); # Cambiamos valores de conf.json
- }
- # Adelante
- sub adelante{
- $ver->go_forward; # Vamos para adelante
- &cargar(); # Cambiamos Notebook
- }
- # Atras
- sub atras{
- $ver->go_back; # Vamos para atras
- &cargar();
- }
- # Entrada URL
- sub entrada{
- &cargar();
- my $uri = $entry->get_text; # Llamamos el texto ingresado en entry
- if (substr($uri,0,7) eq "http://") { # Vemos si tiene http://
- $uri = $uri; # Si es asi,no cambiamos su valor
- }
- elsif(substr($uri,0,5) eq "https") { # Vemos si tiene https
- $uri = $uri; # Si es así no cambiamos su valor
- }
- elsif($uri =~ /\s/) { # Vemos si tiene espacios
- $uri = "http://www.google.com/search?q=" . $uri; # Si es asi,buscamos en google lo ingresado
- }
- elsif($uri =~ /[.]/) { # Vemos si tiene puntos sin espacios
- $uri = "http://" . $uri; # Si es asi,le añadimos http://
- }
- else { # Si es otra cosa,lo buscamos en google
- $uri = "http://www.google.com/search?q=" . $uri;
- }
- $ver->load_uri($uri); # Cargamos el url
- $botones->set_current_page(1); # Cambiamos el boton de recargar
- }
- # Aumentar disminuir ZOOM
- sub zomin { $ver->zoom_in } # Aumentamos el zoom
- sub zomout { $ver->zoom_out } # Disminuimos el zoom
- # Progreso
- sub progreso{
- &cargar();
- my $ctitulo;
- my $carga = $ver->get('progress'); # Llamos el progreso
- my $url_sitio = $ver->get_uri(); # Llamamos el nombre de la url
- $entry->set_text("$url_sitio"); # Le ponemos el nombre de la url al entry
- # Creamos bucle de verificacion
- for ( $ctitulo < 100 ) { # Si aun no llega a 100 la carga,entramos al bucle
- my $ctitul = sprintf ("%2d%%", 100 * $carga); # Recortamos la carga
- $ctitulo = chop($ctitul); # Recortamos mas
- $label->set_markup("$ctitul%"); # Lo mostramos en un label
- if ($ctitul == 100) { # Si ya llego a 100
- $botones->set_current_page(0); # Cambiamos el notebook
- }
- }
- }
- # Titulo
- sub titulo {
- my $titul2 = $ver->get_title(); # Llamos el titulo de la web
- if ($titul2){ # Si hay tal
- $ventana->set_title( $titul2 );} # Se lo ponemos de nombre a la ventana
- }
- # Recargar
- sub recargar {
- &cargar();
- $ver->reload; # Recargamos webview
- }
- # Detener
- sub parar {
- $ver->stop_loading; # Detenemos carga de webview
- $botones->set_current_page(0);
- }
- # Cargar
- sub cargar { $botones->set_current_page(1); } # Cambiamos notebook
- # Acerca de
- sub acerca_de {
- # Creamos Texto
- my $texto =<<EOF;
- SimplePerlBrowser
- Navegador Web escrito en Perl
- Por: Tiempo de Tux
- Version: 4.1
- EOF
- # Lo mostramos en dialogo
- my $dialog = Gtk3::MessageDialog->new(
- $ventana,'destroy-with-parent', 'info', 'close', $texto);
- $dialog->signal_connect( response => sub { $dialog->destroy } );
- $dialog->show();
- }
- # Cargar pagina en webview
- sub web {
- $ver->load_uri( $uri ); # Cargamos url
- $ver->signal_connect( 'notify::progress' => \&progreso, undef ); # Mandamos señales
- $ver->signal_connect( 'notify::title' => \&titulo, undef ); # A subrutinas
- }
- # Activate acion (opciones)
- sub activate_action {
- my $action = shift;
- my $name = $action->get_name; # Llamos el nombre de lo cliqueado
- # Con estructiras selectivas,decidimos que hacer con ellos
- if ( $name eq 'Completa' ) {
- &pantallacompleta;
- }elsif ( $name eq 'HideTitlebar'){
- my $value = $ventana->get_hide_titlebar_when_maximized();
- if ( $value == 0 ) { $ventana->set_hide_titlebar_when_maximized (TRUE);}
- else{ $ventana->set_hide_titlebar_when_maximized (FALSE); }
- }
- elsif ( $name eq 'Acerca de'){ &acerca_de(); }
- elsif ( $name eq 'Inicio'){ &inicioconf(); }
- elsif ( $name eq 'Salir'){ &salir(); }
- }
- # Ventana de configurar pagina de inicio
- sub inicioconf {
- $inicio = Gtk3::Window->new('toplevel'); # Igual que la grande
- $inicio->set_default_size(270, 100);
- $inicio->set_title("Pagina de inicio");
- $inicio->set_resizable(FALSE);
- $inicio->set_border_width(5);
- $inicio->set_position("center");
- $inicio->signal_connect (delete_event => sub {$inicio->destroy });
- my $acinicio = Gtk3::ToolButton->new_from_stock('gtk-apply');
- $acinicio->signal_connect ( "clicked" => \&confinicio, undef );
- my $labl = Gtk3::Label->new("http://");
- my $vcio = Gtk3::Box->new("horizontal", 0);
- $vcio->pack_start($labl, FALSE, FALSE, 0);
- $vcio->pack_start($entrycio, FALSE, FALSE, 0);
- $vcio->pack_start($acinicio, FALSE, FALSE, 0);
- $inicio->add($vcio);
- # Lo mostramos
- $inicio->show_all();
- }
- # Menu
- sub get_ui { # Creamos menu
- return "<ui>
- <menubar name='MenuBar'>
- <menu action='Opciones'>
- <menuitem action='Completa'/>
- <menuitem action='HideTitlebar'/>
- <menuitem action='Inicio'/>
- <menuitem action='Acerca de'/>
- <menuitem action='Salir'/>
- </menu>
- </menubar>
- </ui>";
- }
- # Configuracion de pagina de inicio
- sub confinicio {
- my $paginicio = $entrycio->get_text; # Llamos texto ingresado
- if ($paginicio ne "" ) { # Vemos si se ha ingresado,algo
- # Si no esta vacio
- &opensettings(0,"http://" . $paginicio);
- # Mandamos esta configuracion a JSON ^
- }
- $inicio->destroy; # Destrimos ventana
- }
- # Pantalla completa
- sub pantallacompleta {
- my $fuu = substr($unscreen,0,2); # Recortamos variable
- if ($fuu eq "un") { # vemos si en conf.json esta unfull la pantalla
- &opensettings(1,"fullscreen"); # si es asi lo cambiamos
- }
- elsif ( $fuu eq "fu") { # vemos si en conf.json esta full la pantalla
- &opensettings(1,"unfullscreen"); # si es asi lo cambiamos
- }
- else {
- say "No tienes configurado\nconf.json\n"; # Si no hay archivo,o esta mal configurado
- }
- $ventana->$unscreen(); # Cargamos ajustes
- }
- # JSON
- sub json {
- {
- local $/; # Para usar archivos locales
- open my $cf, "<", "conf.json"; # Abrimos la configuracion
- $json = <$cf>; # Definimos $json con el filehandle
- close $cf; # Cerramos conf.json
- }
- }
- # Sub rutina de ajustes
- sub opensettings {
- my ($number,$setting) = @_; # Pasamos lo valores pasados del código principal
- # Y otras sub rutinas a variables locales
- $unscreen = $confP->{'pantalla'}->{'inicio'}->[$number] = "$setting";
- # Configuramos según las variables locales ^
- open my $cfn, ">", "conf.json"; # Abrimos conf.json
- print $cfn encode_json($confP); # Escribimos configuracion
- close $cfn; # Cerramos
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement