90 lines
2.8 KiB
Python
90 lines
2.8 KiB
Python
"""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()
|