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