Több ablakos változat
Ablaknyitást engedélyezni a webview.get_settings().set_javascript_can_open_windows_automatically(True) -val lehet, mit az lentebb látható. Azonban az engedélyezés nem elegendő, mert a webkit ablakozó rendszer független - csak annyit tud hogy kapott egy téglalapot ahová rajzolhat. Azt nem tudja hogy lehet az adott rendszeren új ablakot nyitni, ezért az új ablak nyitási igényét "create" signal-lal jelzi. A signal-t a webkit-et használó program lekezelheti, pl. nyit egy másik ablakot, és benne egy másik webkit webview -t.
Emellett a lenti program annyit okosodott, hogy:
- a nyitott ablak title-jét és ikonját a weboldal szerint beállítja (megkülönböztethetőség végett, ha több ablak lesz)
- mindig felül és a fix elhelyezés (on_map) ki lett kapcsolva (ne egymásra tegye az ablakokat)
- a JS mégse nyithasson korlátlanul akárhány böngészőablakot, ezért alap browsers_max=3
- van minimál diagnosztikai kozol kimenet, ezt érdemes beletenni a segítségkérésbe hiba esetén.
#!/usr/bin/env python3
import sys
print("Python executable:", sys.executable)
print("Python version: ", sys.version.replace('\n', ' '))
import os
print("Python venv: ", end=' ')
try:
print(os.environ['VIRTUAL_ENV'])
except:
print("not in venv")
print("Python path: ", *sys.path, sep = '\n\t')
import gi
print("Module gi path: ", gi.__file__)
gi.require_version('Gtk', '3.0')
gi.require_version('WebKit2', '4.0')
from gi.repository import Gtk, Gdk, WebKit2
ctx = WebKit2.WebContext()
ctx.set_favicon_database_directory("/tmp/bongeszo")
browsers_max = 3
browsers = set()
class Browser(Gtk.Window):
def __init__(self, uri):
super(Browser, self).__init__()
self.webview = WebKit2.WebView.new_with_context(ctx)
self.webview.get_settings().set_javascript_can_open_windows_automatically(True)
self.webview.connect("create", self.on_create)
self.webview.connect("notify::title", self.on_title)
self.webview.connect("notify::favicon", self.on_favicon)
self.webview.load_uri(uri)
self.add(self.webview)
self.connect("destroy", self.on_destroy)
# self.connect("map", self.on_map) # uncomment if needed
self.set_size_request(800, 600) # set minimum size allowed
self.set_title("Bongeszo - " + uri)
self.set_decorated(False)
self.show_all()
# WebView events
def on_create(self, vew_view, navigation_action):
req = navigation_action.get_request()
uri = req.get_uri()
print("on_create URI=", uri)
if len(browsers) + 1 > browsers_max:
print("browsers_max count reached, refusing to open new window")
else:
browsers.add(Browser(uri))
def on_title(self, *args):
print("on_title called")
self.set_title(self.webview.get_title())
def on_favicon(self, *args):
print("on_favicon called")
favicon = self.webview.get_favicon()
if favicon:
pixbuf = Gdk.pixbuf_get_from_surface(favicon, 0, 0, favicon.get_width(), favicon.get_height())
self.set_icon(pixbuf)
# Window events
def on_map(self, *args): # to be called when the window is shown
# screen = Gdk.Screen.get_default()
screen = self.get_window().get_screen()
x = screen.get_width() - self.get_size().width
y = 0
self.move(x, y)
self.set_keep_above(True)
# self.fullscreen() # uncomment if you want fullscreen browser
# self.resize(width, height) # use resize() here if you need screen-size dependent window-size
def on_destroy(self, *args):
browsers.remove(self)
if len(browsers) == 0:
Gtk.main_quit()
if __name__ == "__main__":
Gtk.init(sys.argv)
browsers.add(Browser("https://hup.hu/comment/2440202#comment-2440202"))
Gtk.main()