import
sys, os
from
gi.repository
import
WebKit, Gtk, Gio, Gdk
APP_NAME
=
"wkitx"
class
WebKitWindow(Gtk.Window):
def
__init__(
self
):
Gtk.Window.__init__(
self
)
self
.resize(
640
,
480
)
self
.set_title(APP_NAME)
self
.connect(
"delete-event"
,
self
.on_delete)
self
.uimanager
=
Gtk.UIManager()
accelgroup
=
self
.uimanager.get_accel_group()
self
.add_accel_group(accelgroup)
self
.actiongroup
=
Gtk.ActionGroup(
"seeme_menu"
)
self
.ac
=
[ (
"forward"
, Gtk.STOCK_GO_FORWARD,
"_Forward"
,
"<Alt>Right"
,
"Forward"
,
self
.on_forward),
(
"back"
, Gtk.STOCK_GO_BACK,
"_Back"
,
"<Alt>Left"
,
"Back"
,
self
.on_back),
(
"reload"
, Gtk.STOCK_REFRESH,
"_Reload"
,
"F5"
,
"Reload"
,
self
.on_reload),
(
"quit"
, Gtk.STOCK_QUIT,
"_Quit"
,
"<Control>Q"
,
"Quit"
,
self
.on_quit),
(
"file"
,
None
,
"_File"
) ]
self
.actiongroup.add_actions(
self
.ac)
self
.uimanager.insert_action_group(
self
.actiongroup,
0
)
self
.uimanager.add_ui_from_string(menu_xml)
menubar
=
self
.uimanager.get_widget(
"/MenuBar"
)
self
.entry
=
Gtk.Entry()
self
.entry.connect(
"activate"
,
self
.on_entry_activate)
toolbar
=
Gtk.HBox()
toolbar.set_border_width(
3
)
back
=
FlatImageButton(Gtk.Image.new_from_stock(Gtk.STOCK_GO_BACK, Gtk.IconSize.BUTTON))
back.connect(
"clicked"
,
self
.on_back)
forward
=
FlatImageButton(Gtk.Image.new_from_stock(Gtk.STOCK_GO_FORWARD, Gtk.IconSize.BUTTON))
forward.connect(
"clicked"
,
self
.on_forward)
home
=
FlatImageButton(Gtk.Image.new_from_stock(Gtk.STOCK_HOME, Gtk.IconSize.BUTTON))
home.connect(
"clicked"
,
self
.on_home)
toolbar.pack_start(back,
False
,
False
,
0
)
toolbar.pack_start(forward,
False
,
False
,
0
)
toolbar.pack_end(home,
False
,
False
,
0
)
toolbar.pack_start(
self
.entry,
True
,
True
,
0
)
self
.webview
=
WebKit.WebView()
self
.webview.connect(
"load-started"
,
self
.on_load_started)
self
.webview.connect(
"load-finished"
,
self
.on_load_finished)
self
.webview.connect(
"title-changed"
,
self
.on_title_changed)
self
.webview.connect(
"hovering-over-link"
,
self
.on_hovering_over_link)
sw
=
Gtk.ScrolledWindow()
sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
sw.add(
self
.webview)
self
.statusbar
=
Gtk.Statusbar()
setting
=
self
.webview.get_settings()
setting.set_property(
"enable-file-access-from-file-uris"
,
True
)
vbox
=
Gtk.VBox()
vbox.pack_start(menubar,
False
,
True
,
0
)
vbox.pack_start(toolbar,
False
,
True
,
0
)
vbox.pack_start(sw,
True
,
True
,
0
)
vbox.pack_start(
self
.statusbar,
False
,
True
,
0
)
self
.add(vbox)
self
.show_all()
self
.set_focus(
self
.webview)
if
len
(sys.argv) >
1
:
self
.webview.load_uri(
"file://"
+
os.path.abspath(sys.argv[
1
]))
else
:
self
.webview.load_uri(HOME_URI)
def
on_delete(
self
, widget, data
=
None
):
pass
def
on_load_started(
self
, webview, frame):
self
.statusbar.push(
0
,
"Loading..."
)
def
on_load_finished(
self
, webview, frame):
self
.statusbar.push(
0
, "")
def
on_title_changed(
self
, webview, frame, title):
self
.set_title(
"{0} - {1}"
.
format
(title, APP_NAME))
self
.entry.set_text(webview.get_uri())
def
on_hovering_over_link(
self
, webview, title, uri):
if
uri:
self
.statusbar.push(
0
, uri)
else
:
self
.statusbar.push(
0
, "")
def
on_entry_activate(
self
, entry):
self
.webview.load_uri(entry.get_text())
def
on_back(
self
, widget, data
=
None
):
if
self
.webview.can_go_back():
self
.webview.go_back()
def
on_forward(
self
, widget, data
=
None
):
if
self
.webview.can_go_forward():
self
.webview.go_forward()
def
on_reload(
self
, widget, data
=
None
):
self
.webview.
reload
()
def
on_home(
self
, widget, data
=
None
):
self
.webview.load_uri(HOME_URI)
def
on_quit(
self
, widget, data
=
None
):
app
=
self
.get_application()
app.remove_window(
self
)
self
.on_delete(widget)
class
App(Gtk.Application):
def
__init__(
self
):
Gtk.Application.__init__(
self
,
application_id
=
"apps.wkitx.webkit"
,
flags
=
Gio.ApplicationFlags.FLAGS_NONE)
self
.connect(
"activate"
,
self
.on_activate)
def
on_activate(
self
, app):
l
=
self
.get_windows()
if
l:
return
w
=
WebKitWindow()
w.set_application(
self
)
class
FlatImageButton(Gtk.Button):
def
__init__(
self
, image, label
=
None
, stock
=
None
, use_underline
=
True
):
Gtk.Button.__init__(
self
, label, stock, use_underline)
self
.set_relief(Gtk.ReliefStyle.NONE)
self
.set_can_focus(
False
)
if
image:
self
.set_image(image)
def
messagebox(parent, text, icon
=
Gtk.MessageType.WARNING, button
=
Gtk.ButtonsType.OK):
dlg
=
Gtk.MessageDialog(
parent,
Gtk.DialogFlags.MODAL,
icon,
button,
text)
dlg.set_title(APP_NAME)
r
=
dlg.run()
dlg.destroy()
return
r
menu_xml
=
if
__name__
=
=
"__main__"
:
app
=
App()
app.run(
None
)