vdi-cloud/docs/evidence/ubuntu-deep-latency-20261105/response-source.py

73 lines
2.6 KiB
Python

"""Temporary real GTK buttons and masked entry; no authentication or passwords saved."""
import json
import time
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk, GLib
w = Gtk.Window(title='VDI response probe')
overlay = Gtk.Overlay(); w.add(overlay)
area = Gtk.DrawingArea(); overlay.add(area)
fixed = Gtk.Fixed(); overlay.add_overlay(fixed)
seq = mode = 0
entry = Gtk.Entry(); entry.set_visibility(False); entry.set_size_request(600, 70)
entry.set_placeholder_text('Synthetic masked input; no real credential')
fixed.put(entry, 900, 850)
buttons = []
for i in range(2):
b = Gtk.Button(label='Application '+str(i+1))
b.set_size_request(300, 250); fixed.put(b, 600+i*1000, 450); buttons.append(b)
def log(event):
print(json.dumps(dict(t=time.monotonic(), event=event, mode=mode, seq=seq)), flush=True)
def enter(button, event):
global seq
if mode == 1:
seq += 1; area.queue_draw(); log('hover')
return False
def click(button):
global seq
if mode == 2:
seq += 1; area.queue_draw(); log('click')
def changed(widget):
global seq
if mode == 3:
seq = widget.get_text_length(); area.queue_draw(); log('masked-count')
def submit(widget):
global seq
if mode == 3:
seq = 1000 + widget.get_text_length(); area.queue_draw(); log('synthetic-submit')
def key(widget, event):
global mode, seq
if event.keyval in (Gdk.KEY_F1, Gdk.KEY_F2, Gdk.KEY_F3):
mode = 0; entry.set_text(''); mode = event.keyval-Gdk.KEY_F1+1; seq = 0
if mode == 3: entry.grab_focus()
else: area.grab_focus()
area.queue_draw(); log('mode'); return True
return False
def draw(widget, cr):
cr.set_source_rgb(.94, .96, .98); cr.paint()
cr.set_source_rgb(.1, .15, .2); cr.set_font_size(26); cr.move_to(60, 80)
cr.show_text('VDI: GTK hover / click / masked input and synthetic page response')
if seq >= 1000:
cr.move_to(60, 180); cr.show_text('Synthetic page ready (no backend authentication)')
for start, bits, val in [(40,16,seq),(800,8,0x5a),(1160,4,mode)]:
for i in range(bits):
v = float(bool(val & (1 << i))); cr.set_source_rgb(v,v,v)
cr.rectangle(start+i*40,1350,40,70); cr.fill()
return False
for b in buttons:
b.connect('enter-notify-event',enter); b.connect('clicked',click)
entry.connect('changed',changed); entry.connect('activate',submit)
area.set_can_focus(True); area.connect('draw',draw)
w.connect('key-press-event',key); w.connect('destroy',Gtk.main_quit)
GLib.timeout_add_seconds(600, lambda: (Gtk.main_quit(),False)[1])
w.fullscreen(); w.show_all(); w.present(); log('ready'); Gtk.main()