diff options
Diffstat (limited to 'usr/lib/mageiawelcome/webgui.py')
-rw-r--r-- | usr/lib/mageiawelcome/webgui.py | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/usr/lib/mageiawelcome/webgui.py b/usr/lib/mageiawelcome/webgui.py new file mode 100644 index 0000000..20e05ca --- /dev/null +++ b/usr/lib/mageiawelcome/webgui.py @@ -0,0 +1,124 @@ +import time +import Queue +import thread +import urllib + +import gtk +import gobject + +try: + 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/lib/mageiawelcome/') + + +if use is UseWebKit: + implementation = WebKitMethods + + +def asynchronous_gtk_message(fun): + + def worker((function, args, kwargs)): + apply(function, args, kwargs) + + def fun2(*args, **kwargs): + gobject.idle_add(worker, (fun, args, kwargs)) + + return fun2 + + +def synchronous_gtk_message(fun): + + class NoResult: pass + + def worker((R, function, args, kwargs)): + R.result = apply(function, args, kwargs) + + def fun2(*args, **kwargs): + class R: result = NoResult + gobject.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('tools-wizard') + window.set_title(_('Welcome to Mageia!')) + window.set_position(gtk.WIN_POS_CENTER) + window.set_default_size(800, 600) + window.set_size_request(800, 600) + 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: + gtk.gdk.threads_init() + thread.start_new_thread(gtk.main, ()) + +def kill_gtk_thread(): + asynchronous_gtk_message(gtk.main_quit)()
\ No newline at end of file |