#!/usr/bin/python import os from gi.repository import Gdk, Gtk, WebKit import ConfigParser import subprocess import sys import locale from optparse import OptionParser import gobject ''' A basic GTK widget (WebKit.WebView) which displays a slideshow in the ubiquity-slideshow format. Feel free to copy and paste this to your application and customize it as needed. ''' class SlideshowViewer(WebKit.WebView): ''' @param path Path to the slideshow, in which the slideshow.conf file is stored. @param locale Ideal locale to use for the slideshow @param rtl True if the given locale should be displayed right-to-left ''' def __init__(self, path, locale='c', rtl=False, controls=False): self.path = path config = ConfigParser.ConfigParser() config.read(os.path.join(self.path,'slideshow.conf')) self.locale = self._find_available_locale(locale) slideshow_main = 'file://' + os.path.join(self.path, 'slides', 'index.html') parameters = '' if controls: parameters += "?controls" if self.locale != 'c': #slideshow will use default automatically parameters += '?locale=' + self.locale if rtl: parameters += '?rtl' WebKit.WebView.__init__(self) self.open(slideshow_main+'#'+parameters) settings = self.get_settings() settings.set_property("enable-default-context-menu", False) #Recent webkit feature. See . settings.set_property("enable-file-access-from-file-uris", True) config_width = int(config.get('Slideshow','width')) config_height = int(config.get('Slideshow','height')) self.set_size_request(config_width,config_height) self.connect('navigation-policy-decision-requested', self._on_navigate_decision) self.connect('navigation-requested', self._on_navigate) self.connect('new-window-policy-decision-requested', self._on_new_window_decision) self.connect('create-web-view', self._on_new_window) ''' Determines the ideal locale for the slideshow, based on the given locale, or 'c' if an ideal one is not available. @param locale The full locale string, for example en_AU.UTF8 @return The available locale which best matches the input. ''' def _find_available_locale(self, locale): slides_dir = os.path.join(self.path, "slides") locale_choice = 'c' if os.path.exists( os.path.join(slides_dir, "loc."+locale) ): locale_choice = locale else: ll_cc = locale.split('.')[0] ll = ll_cc.split('_')[0] if os.path.exists('%s/loc.%s' % (slides_dir,ll_cc)): locale_choice = ll_cc elif os.path.exists('%s/loc.%s' % (slides_dir,ll)): locale_choice = ll return locale_choice def _new_browser_window(self, uri): subprocess.Popen(['xdg-open', uri], close_fds=True) def _on_navigate_decision(self, view, frame, req, action, decision): reason = action.get_reason() print(reason) if reason == "link-clicked": decision.use() return False decision.ignore() return True def _on_navigate(self, view, frame, req): uri = req.get_uri() print(uri) self._new_browser_window(uri) return True def _on_new_window_decision(self, view, frame, req, action, decision): uri = req.get_uri() decision.ignore() self._new_browser_window(uri) return True def _on_new_window(self, view, frame): return True def progress_increment(progressbar, fraction): new_fraction = progressbar.get_fraction() + fraction if new_fraction > 1: progressbar.set_fraction(1.0) install_progressbar.set_text("Finished pretending to install.") return False progressbar.set_fraction(new_fraction) install_progressbar.set_text("Pretending to install... %d%%" % (new_fraction * 100)) return True #Main program default_path = os.path.join( os.path.abspath(os.path.dirname(sys.argv[0])) , 'build', 'ubuntu' ) default_locale = locale.getlocale()[0] parser = OptionParser(usage="usage: %prog [options] [slideshow]") parser.add_option("-l", "--locale", help="LOCALE to use for the slideshow", metavar="LOCALE", default=default_locale) parser.add_option("-r", "--rtl", action="store_true", help="use output in right-to-left format") parser.add_option("-c", "--controls", action="store_true", help="Enable controls in the slideshow (you may need to resize the window)") parser.add_option("-p", "--path", help="path to the SLIDESHOW which will be presented", metavar="SLIDESHOW", default=default_path) (options, args) = parser.parse_args() options.path = os.path.abspath(options.path) if os.path.exists(options.path) == False: print("\033[91m * Please build the slideshow content first by using the make command * \033[0m") sys.exit() Gdk.threads_init() slideshow_window = Gtk.Window() slideshow_window.set_title("Ubiquity Slideshow with Webkit") slideshow_window.connect('destroy',Gtk.main_quit) slideshow_window.set_resizable(False) slideshow_container = Gtk.VBox() slideshow_window.add(slideshow_container) slideshow = SlideshowViewer(options.path, locale=options.locale, rtl=options.rtl, controls=options.controls) install_progressbar = Gtk.ProgressBar() install_progressbar.set_margin_top(8) install_progressbar.set_margin_right(8) install_progressbar.set_margin_bottom(8) install_progressbar.set_margin_left(8) install_progressbar.set_text("Pretending to install. Please wait...") install_progressbar.set_fraction(0) slideshow_container.add(slideshow) slideshow_container.add(install_progressbar) slideshow_container.set_child_packing(install_progressbar, True, False, 0, 0) slideshow_window.show_all() install_timer = gobject.timeout_add_seconds(2, progress_increment, install_progressbar, 0.01) Gtk.main()