#!/usr/bin/env ruby
=begin
The Ruby Gecko (featuring Gtk::* and Gtk::MozEmbed)
Copyright (C) 2005 Mirko Maischberger, All rights reserverd
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
=end
## The following is commented since the comp_path gets a nice
## default at compile time.
##
#unless ENV['MOZILLA_FIVE_HOME']
# $stderr.print "Please set MOZILLA_FIVE_HOME environment variable to\n"
# $stderr.print "something like /usr/lib/mozilla\n"
#end
require 'gtkmozembed'
class Browser < Gtk::Window
TITLE = "The Ruby Gecko"
attr_reader :moz
def initialize
super
self.border_width = 1
self.title = TITLE
self.resize(800, 570)
# This one is needed if GtkMozEmbed can't find the comp_path
mozhome = ENV['MOZILLA_FIVE_HOME']
if mozhome
Gtk::MozEmbed.set_comp_path(mozhome)
end
# Gtk::MozEmbed :)
Gtk::MozEmbed.set_profile_path(ENV['HOME'] + '.mozilla', 'RubyGecko')
# Let's create the MozEmbed widget.
@moz = Gtk::MozEmbed.new
@moz.chrome_mask = Gtk::MozEmbed::ALLCHROME
# A Toolbar with some stock icons and self explaining beaviour
bar = Gtk::Toolbar.new
back = bar.append(Gtk::Stock::GO_BACK) {
@moz.go_back
}
forward = bar.append(Gtk::Stock::GO_FORWARD){
@moz.go_forward
}
stop = bar.append(Gtk::Stock::STOP){
@moz.stop_load
}
refresh = bar.append(Gtk::Stock::REFRESH){
@moz.reload(Gtk::MozEmbed::RELOADBYPASSCACHE)
}
home = bar.append(Gtk::Stock::HOME) {
@moz.location="http://ruby-gnome2.sourceforge.jp/"
}
home = bar.append(Gtk::Stock::ADD) {
@moz.open_stream("http://ruby-gnome2.sourceforge.jp/", "text/html")
@moz.append_data("\n")
@moz.append_data("
\n")
@moz.append_data("Self feeded test page\n")
@moz.append_data("\n")
@moz.append_data("\n")
@moz.append_data("Method: open_stream
\n")
@moz.append_data("")
@moz.append_data("Status of Gtk::MozEmbed")
@moz.append_data("(link relative to base_uri)\n")
@moz.append_data("")
@moz.append_data("")
@moz.close_stream
# see alsa: Gtk::MozEmbed#render_data
}
# A text-entry to let the user change the location manually
entry = Gtk::Entry.new
# A Statusbar with link info and progress bar
statusbox = Gtk::HBox.new
status = Gtk::Statusbar.new
status.has_resize_grip=false
status_context = status.get_context_id("Link")
progress = Gtk::ProgressBar.new
statusbox.pack_start(status, true)
statusbox.pack_start(progress, false)
# Pack together
box= Gtk::VBox.new
box.pack_start(bar, false)
box.pack_start(entry, false)
box.pack_start(@moz)
box.pack_start(statusbox, false)
# Add to the main window
self.add(box)
# Connect some more signals
# When we press enter while the text-entry has
# the focus this tells mozilla to load the inserted url
entry.signal_connect('activate') {
@moz.location = entry.text
}
# When location changes (the user clicks on a link)
# this updates the text-entry value
@moz.signal_connect('location') { |widget|
$stderr.print "location signal\n"
entry.text = widget.location if entry.text != widget.location
}
# When the page title changes we update the window
# title as well
@moz.signal_connect('title') { |widget|
$stderr.print "title signal\n"
self.title = widget.title + ' - ' + TITLE
}
# Lots of this signals arive during the page loading
# to let us update the progress bar. It the web server
# tells mozilla the total page size we can update the
# progress bar with a percentage value, otherwise max
# will be -1 and we just pulse.
@moz.signal_connect('progress') { |widget, cur, max|
$stderr.print "progress signal\n"
if max < 1 or cur > max
progress.pulse
else
progress.fraction = cur.to_f / max.to_f
end
}
# This signal is raised when the user selects a link
# on a page. We update the statusbar as a real
# browser would do.
@moz.signal_connect('link_message') {
$stderr.print "link_message signal\n"
status.push(status_context, @moz.link_message)
}
# This signal is generated when mozilla starts to load a page
# We update the statusbar message and reset the progress.
@moz.signal_connect('net_start') {
$stderr.print "net_start signal\n"
status.push(status_context, "Loading " + @moz.link_message + "...")
progress.fraction = 0.0
}
# This signal is generated when mozilla stops to load a page
# We update the statusbar message and reset the progress.
@moz.signal_connect('net_stop') {
$stderr.print "net_stop signal\n"
status.push(status_context, "")
progress.fraction = 0.0
}
# This signal is generated when mozilla stops to load a page
# We update the statusbar message and reset the progress.
# This does not work at the moment...
@moz.on_new_window { |widget, mask|
$stderr.print "new_window\n"
Browser.new.moz
}
# The user is bored, let's quit.
self.signal_connect("destroy") {
$stderr.print "closing...\n"
Gtk.main_quit
}
self.show_all
end
end
Browser.new
Gtk.main
# Hint: If you use Mozilla 1.7.x gtkmozembd, you should remove
# libnullplugin.so if you want to get rid of "Default Plugin"
# window. The gtkmozembed from Firefox 1.0 has an improved nullplugin.
# Hint: You can switch between Mozilla and Firefox implementation by
# setting the library path appropiately. The Firefox version of
# GtkMozEmbed is better integrated in Gtk and has nicer scroll-bars
# and message boxes. (use LD_LIBRARY_PATH, see extconf.rb or do some
# googling)
# Happy coding, Mirko Maischberger