( endi123 | 2020. 02. 16., v – 17:06 )

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()