vdi-cloud/docs/evidence/ubuntu-drag-20261105/drag-source.py

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()