73 lines
2.6 KiB
Python
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()
|