SHOW:
|
|
- or go back to the newest paste.
| 1 | import sys | |
| 2 | import cairo, gi | |
| 3 | - | gi.require_version('Gtk', '2.0')
|
| 3 | + | |
| 4 | - | gi.require_version('Gdk', '2.0')
|
| 4 | + | USE_GTK2 = True |
| 5 | - | gi.require_version('WebKit', '1.0')
|
| 5 | + | |
| 6 | if USE_GTK2: | |
| 7 | gi.require_version('Gtk', '2.0')
| |
| 8 | gi.require_version('Gdk', '2.0')
| |
| 9 | gi.require_version('WebKit', '1.0')
| |
| 10 | from gi.repository import Gtk, Gdk, WebKit | |
| 11 | ||
| 12 | DEFAULT_SIZE = 800, 480 | |
| 13 | ||
| 14 | if len(sys.argv) != 3: | |
| 15 | print 'usage: %s url filename'%sys.argv[0] | |
| 16 | sys.exit(-1) | |
| 17 | ||
| 18 | uri, filename = sys.argv[1:] | |
| 19 | ||
| 20 | - | w = Gtk.OffscreenWindow() |
| 20 | + | |
| 21 | - | w.set_default_size(800, 640) |
| 21 | + | |
| 22 | - | v = WebKit.WebView() |
| 22 | + | |
| 23 | - | w.add(v) |
| 23 | + | |
| 24 | uri = 'http://' + uri | |
| 25 | ||
| 26 | window = Gtk.OffscreenWindow() | |
| 27 | view = WebKit.WebView() | |
| 28 | settings = view.get_settings() | |
| 29 | settings.props.auto_resize_window = True | |
| 30 | settings.props.enable_plugins = False | |
| 31 | view.set_settings(settings) | |
| 32 | window.add(view) | |
| 33 | ||
| 34 | def capture_window(window): | |
| 35 | - | def progress_cb(webview, progress, window): |
| 35 | + | |
| 36 | - | if webview.get_progress() == 1.0: |
| 36 | + | if w < 50 or h < 50: |
| 37 | # window is too small. | |
| 38 | # resize window and reload | |
| 39 | - | v.connect('notify::progress', progress_cb, w)
|
| 39 | + | window.set_default_size(*DEFAULT_SIZE) |
| 40 | - | v.load_uri(uri) |
| 40 | + | view.reload() |
| 41 | - | w.show_all() |
| 41 | + | return |
| 42 | ||
| 43 | dst = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h) | |
| 44 | ctx = cairo.Context(dst) | |
| 45 | surface = Gdk.cairo_create(window.get_window()).get_target() | |
| 46 | ctx.set_source_surface(surface) | |
| 47 | ctx.paint() | |
| 48 | dst.write_to_png(filename) | |
| 49 | Gtk.main_quit() | |
| 50 | ||
| 51 | def load_cb(webview, pspec, window): | |
| 52 | if webview.get_load_status() == WebKit.LoadStatus.FINISHED: | |
| 53 | capture_window(window) | |
| 54 | ||
| 55 | view.connect('notify::load-status', load_cb, window)
| |
| 56 | view.load_uri(uri) | |
| 57 | window.show_all() | |
| 58 | ||
| 59 | Gtk.main() |