import time import queue import _thread import urllib.request, urllib.parse, urllib.error import gi from gi.repository import Gdk from gi.repository import Gtk from gi.repository import GLib try: gi.require_version('WebKit', '3.0') from gi.repository import WebKit have_webkit = True except: have_webkit = False class UseWebKit: pass use = UseWebKit class WebKitMethods(object): @staticmethod def create_browser(): return WebKit.WebView() @staticmethod def inject_javascript(browser, script): browser.execute_script(script) @staticmethod def connect_title_changed(browser, callback): def callback_wrapper(widget, frame, title): callback(title) browser.connect('title-changed', callback_wrapper) @staticmethod def open_uri(browser, html): browser.load_html_string(html, 'file:///usr/share/mageiawelcome/') if use is UseWebKit: implementation = WebKitMethods def asynchronous_gtk_message(fun): def worker(wargs): (function, args, kwargs) = wargs function(*args, **kwargs) def fun2(*args, **kwargs): GLib.idle_add(worker, (fun, args, kwargs)) return fun2 def synchronous_gtk_message(fun): class NoResult: pass def worker(wargs): (R, function, args, kwargs) = wargs R.result = function(*args, **kwargs) def fun2(*args, **kwargs): class R: result = NoResult GLib.idle_add(worker, (R, fun, args, kwargs)) while R.result is NoResult: time.sleep(0.01) return R.result return fun2 def launch_browser(html, quit_function=None, echo=True): window = Gtk.Window() browser = implementation.create_browser() settings = browser.get_settings() settings.set_property('enable-default-context-menu', False) box = Gtk.VBox(homogeneous=False, spacing=0) window.add(box) if quit_function is not None: window.connect('destroy', quit_function) box.pack_start(browser, expand=True, fill=True, padding=0) window.set_icon_name('preferences-desktop-personal') window.set_title(_('Welcome to Mageia!')) window.set_position(Gtk.WindowPosition.CENTER) window.set_default_size(800, 500) window.set_size_request(800, 500) window.set_resizable(False) window.show_all() message_queue = queue.Queue() def title_changed(title): if title != 'null': message_queue.put(title) implementation.connect_title_changed(browser, title_changed) implementation.open_uri(browser, html) def web_recv(): if message_queue.empty(): return None else: msg = message_queue.get() if echo: print('>>>', msg) return msg def web_send(msg): if echo: print('<<<', msg) asynchronous_gtk_message(implementation.inject_javascript)(browser, msg) return browser, web_recv, web_send def start_gtk_thread(): # Start GTK in its own thread: Gdk.threads_init() Gdk.threads_enter() _thread.start_new_thread(Gtk.main, ()) def kill_gtk_thread(): asynchronous_gtk_message(Gtk.main_quit)()