"""Controlled 2K rubber-band workload, with sequence numbers in each paint.""" import json import time import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, Gdk window = Gtk.Window(title='Ubuntu drag rendering probe') area = Gtk.DrawingArea() window.add(area) area.set_events(Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.BUTTON_RELEASE_MASK) sequence, held, draws = 0, False, 0 target = (800, 700) received = 0.0 def log(**kw): print(json.dumps(dict(t=time.monotonic(), **kw)), flush=True) def motion(widget, event): global sequence, target, received if held: sequence = max(0, min(300, round((event.x_root - 800) / 4))) target = (event.x_root, event.y_root) received = time.monotonic() log(event='motion', seq=sequence, x=target[0], y=target[1]) area.queue_draw() return False def button(widget, event): global held, sequence, received if event.type not in (Gdk.EventType.BUTTON_PRESS, Gdk.EventType.BUTTON_RELEASE): return False held = event.type == Gdk.EventType.BUTTON_PRESS if held: sequence = 0 received = time.monotonic() log(event='press' if held else 'release', seq=sequence, x=event.x_root, y=event.y_root) area.queue_draw() return False def draw(widget, cr): global draws draws += 1 cr.set_source_rgb(.94, .96, .98) cr.paint() cr.set_source_rgb(.1, .15, .2) cr.select_font_face('sans') cr.set_font_size(26) cr.move_to(60, 70) cr.show_text('Ubuntu 2560 x 1440: held-button selection / video response probe') cr.set_font_size(18) cr.move_to(60, 110) cr.show_text('Temporary test window. The mouse pointer is separate from the rendered selection.') if held: cr.set_source_rgba(.1, .4, .9, .22) cr.rectangle(500, 350, max(1, target[0]-500), max(1, target[1]-350)) cr.fill_preserve() cr.set_source_rgb(.1, .4, .9) cr.set_line_width(2) cr.stroke() for i in range(16): v = float(bool(sequence & (1 << i))) cr.set_source_rgb(v, v, v) cr.rectangle(40+i*40, 1350, 40, 70) cr.fill() v = float(held) cr.set_source_rgb(v, v, v) cr.rectangle(720, 1350, 40, 70) cr.fill() for i in range(8): v = float(bool(0xa5 & (1 << i))) cr.set_source_rgb(v, v, v) cr.rectangle(800+i*40, 1350, 40, 70) cr.fill() log(event='paint', seq=sequence, held=held, draw=draws, event_to_paint_ms=(time.monotonic()-received)*1000 if received else None) return False area.connect('motion-notify-event', motion) area.connect('button-press-event', button) area.connect('button-release-event', button) area.connect('draw', draw) window.connect('destroy', Gtk.main_quit) window.fullscreen() window.show_all() window.present() log(event='ready') Gtk.main()