#!/usr/bin/python import sys import gi from gi.repository import GObject, GLib, Gdk, GdkX11 import cairo GObject.threads_init() GLib.threads_init() class CairoLeak: def __init__( self ): window_attrs = Gdk.WindowAttr() window_attrs.title = "Leak" window_attrs.event_mask = Gdk.EventMask.EXPOSURE_MASK window_attrs.width = 400 window_attrs.height = 300 window_attrs.wclass = Gdk.WindowWindowClass.INPUT_OUTPUT window_attrs.window_type = Gdk.WindowType.TOPLEVEL window_attrs.visual = Gdk.Screen.get_default().get_rgba_visual() self.window = Gdk.Window( None, window_attrs, Gdk.WindowAttributesType.TITLE | Gdk.WindowAttributesType.VISUAL ) self.letterbox_colour = [ 255, 0, 0, 255 ] Gdk.Event.handler_set( self.__gdkEventHandler, None ) self.window.show() def __gdkEventHandler( self, event, data ): self.draw() def draw( self ): cr = self.window.cairo_create() cr.set_operator( cairo.OPERATOR_SOURCE ) cr.set_source_rgba( self.letterbox_colour[0] / 255.0, self.letterbox_colour[1] / 255.0, self.letterbox_colour[2] / 255.0, self.letterbox_colour[3] / 255.0 ) cr.paint() Gdk.flush() self.letterbox_colour = [self.letterbox_colour[2], self.letterbox_colour[0], self.letterbox_colour[1], self.letterbox_colour[3]] def triggerLeak( leaker ): leaker.draw() global repeat_count repeat_count -= 1 if repeat_count <= 0: global main_loop main_loop.quit() return repeat_count > 0 def main( argv ): global repeat_count repeat_count = int( sys.argv[1] ) global main_loop main_loop = GLib.MainLoop() leaker = CairoLeak() GLib.timeout_add_seconds( 1, triggerLeak, leaker ) main_loop.run() if __name__ == '__main__': sys.exit( main( sys.argv ) )