Hex Artifact Content
Not logged in

Artifact 4cd95e6bb9d81ef3d5cde7e1cc8b48a605ddad0c:


0000: 23 20 53 69 6d 70 6c 65 20 56 4e 43 20 76 69 65  # Simple VNC vie
0010: 77 65 72 20 75 73 69 6e 67 20 74 68 65 20 74 6b  wer using the tk
0020: 76 6e 63 20 77 69 64 67 65 74 20 66 72 6f 6d 20  vnc widget from 
0030: 68 74 74 70 3a 2f 2f 77 77 77 2e 63 68 2d 77 65  http://www.ch-we
0040: 72 6e 65 72 2e 64 65 2f 74 6b 76 6e 63 0a 23 23  rner.de/tkvnc.##
0050: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0060: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0070: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0080: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0090: 23 23 23 23 23 23 23 23 23 23 23 0a 23 0a 23 20  ###########.#.# 
00a0: 54 6f 20 73 63 72 6f 6c 6c 20 74 68 65 20 56 4e  To scroll the VN
00b0: 43 20 77 69 64 67 65 74 20 75 73 65 20 74 68 72  C widget use thr
00c0: 65 65 20 66 69 6e 67 65 72 20 77 69 70 65 2e 20  ee finger wipe. 
00d0: 54 6f 20 7a 6f 6f 6d 20 74 68 65 20 56 4e 43 20  To zoom the VNC 
00e0: 77 69 64 67 65 74 0a 23 20 75 73 65 20 74 77 6f  widget.# use two
00f0: 20 66 69 6e 67 65 72 20 70 69 6e 63 68 20 67 65   finger pinch ge
0100: 73 74 75 72 65 2e 20 54 6f 20 62 72 69 6e 67 20  sture. To bring 
0110: 75 70 20 74 68 65 20 6f 6e 2d 73 63 72 65 65 6e  up the on-screen
0120: 20 6b 65 79 62 6f 61 72 64 20 74 61 70 0a 23 20   keyboard tap.# 
0130: 77 69 74 68 20 74 77 6f 20 66 69 6e 67 65 72 73  with two fingers
0140: 20 69 6e 20 74 68 65 20 61 72 65 61 20 77 68 65   in the area whe
0150: 72 65 20 79 6f 75 20 77 61 6e 74 20 74 6f 20 74  re you want to t
0160: 79 70 65 20 69 6e 2e 0a 23 0a 23 20 54 68 65 20  ype in..#.# The 
0170: 22 42 61 63 6b 22 20 6b 65 79 20 62 72 69 6e 67  "Back" key bring
0180: 73 20 75 70 20 74 68 65 20 6f 70 74 69 6f 6e 20  s up the option 
0190: 64 69 61 6c 6f 67 20 77 69 74 68 20 65 6e 74 72  dialog with entr
01a0: 69 65 73 20 66 6f 72 20 68 6f 73 74 2c 0a 23 20  ies for host,.# 
01b0: 70 61 73 73 77 6f 72 64 20 65 74 63 2e 20 61 6e  password etc. an
01c0: 64 20 62 75 74 74 6f 6e 73 20 74 6f 20 65 78 69  d buttons to exi
01d0: 74 20 61 6e 64 20 63 6f 6e 6e 65 63 74 2f 64 69  t and connect/di
01e0: 73 63 6f 6e 6e 65 63 74 2e 0a 0a 70 61 63 6b 61  sconnect...packa
01f0: 67 65 20 72 65 71 75 69 72 65 20 76 6e 63 0a 77  ge require vnc.w
0200: 6d 20 61 74 74 72 69 62 75 74 65 73 20 2e 20 2d  m attributes . -
0210: 66 75 6c 6c 73 63 72 65 65 6e 20 31 0a 2e 20 63  fullscreen 1.. c
0220: 6f 6e 66 69 67 75 72 65 20 2d 62 67 20 62 6c 61  onfigure -bg bla
0230: 63 6b 0a 73 64 6c 74 6b 20 74 6f 75 63 68 74 72  ck.sdltk touchtr
0240: 61 6e 73 6c 61 74 65 20 31 33 20 3b 23 20 52 4d  anslate 13 ;# RM
0250: 42 2c 20 70 61 6e 2f 7a 6f 6f 6d 2c 20 66 69 6e  B, pan/zoom, fin
0260: 67 65 72 73 20 74 72 61 6e 73 6c 61 74 65 64 0a  gers translated.
0270: 0a 63 61 74 63 68 20 7b 62 6f 72 67 20 73 63 72  .catch {borg scr
0280: 65 65 6e 6f 72 69 65 6e 74 61 74 69 6f 6e 20 6c  eenorientation l
0290: 61 6e 64 73 63 61 70 65 7d 0a 0a 61 72 72 61 79  andscape}..array
02a0: 20 73 65 74 20 56 4e 43 45 56 20 7b 66 62 69 74   set VNCEV {fbit
02b0: 73 20 30 20 74 72 69 67 67 65 72 20 30 7d 0a 61  s 0 trigger 0}.a
02c0: 72 72 61 79 20 73 65 74 20 56 4e 43 53 45 54 20  rray set VNCSET 
02d0: 7b 68 6f 73 74 20 7b 7d 20 70 77 64 20 7b 7d 20  {host {} pwd {} 
02e0: 73 68 61 72 65 64 20 30 20 76 69 65 77 6f 6e 6c  shared 0 viewonl
02f0: 79 20 30 20 6c 69 66 65 63 79 63 6c 65 20 30 7d  y 0 lifecycle 0}
0300: 0a 61 72 72 61 79 20 73 65 74 20 56 4e 43 20 7b  .array set VNC {
0310: 68 6f 73 74 20 7b 7d 20 6c 61 73 74 63 6f 6e 6e  host {} lastconn
0320: 65 63 74 20 31 7d 0a 0a 23 20 63 61 6c 6c 62 61  ect 1}..# callba
0330: 63 6b 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e  ck on connection
0340: 20 73 74 61 74 75 73 20 63 68 61 6e 67 65 20 66   status change f
0350: 72 6f 6d 20 56 4e 43 20 77 69 64 67 65 74 0a 0a  rom VNC widget..
0360: 70 72 6f 63 20 76 6e 63 5f 69 6e 66 6f 20 7b 64  proc vnc_info {d
0370: 61 74 61 7d 20 7b 0a 20 20 20 20 67 6c 6f 62 61  ata} {.    globa
0380: 6c 20 56 4e 43 53 45 54 20 56 4e 43 0a 20 20 20  l VNCSET VNC.   
0390: 20 69 66 20 7b 24 56 4e 43 53 45 54 28 6c 69 66   if {$VNCSET(lif
03a0: 65 63 79 63 6c 65 29 7d 20 7b 0a 09 72 65 74 75  ecycle)} {..retu
03b0: 72 6e 0a 20 20 20 20 7d 0a 20 20 20 20 61 72 72  rn.    }.    arr
03c0: 61 79 20 73 65 74 20 56 4e 43 20 24 64 61 74 61  ay set VNC $data
03d0: 0a 20 20 20 20 69 66 20 7b 24 56 4e 43 28 6c 61  .    if {$VNC(la
03e0: 73 74 63 6f 6e 6e 65 63 74 29 20 26 26 20 21 24  stconnect) && !$
03f0: 56 4e 43 28 63 6f 6e 6e 65 63 74 65 64 29 7d 20  VNC(connected)} 
0400: 7b 0a 09 76 6e 63 5f 73 65 74 74 69 6e 67 73 0a  {..vnc_settings.
0410: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 21 24      } elseif {!$
0420: 56 4e 43 28 6c 61 73 74 63 6f 6e 6e 65 63 74 29  VNC(lastconnect)
0430: 20 26 26 20 24 56 4e 43 28 63 6f 6e 6e 65 63 74   && $VNC(connect
0440: 65 64 29 7d 20 7b 0a 09 69 66 20 7b 5b 63 61 74  ed)} {..if {[cat
0450: 63 68 20 7b 73 64 6c 74 6b 20 72 6f 6f 74 20 24  ch {sdltk root $
0460: 56 4e 43 28 77 69 64 74 68 29 20 24 56 4e 43 28  VNC(width) $VNC(
0470: 68 65 69 67 68 74 29 7d 5d 7d 20 7b 0a 09 20 20  height)}]} {..  
0480: 20 20 2e 76 6e 63 20 64 69 73 63 6f 6e 6e 65 63    .vnc disconnec
0490: 74 0a 09 20 20 20 20 72 65 74 75 72 6e 0a 09 7d  t..    return..}
04a0: 0a 09 73 65 74 20 56 4e 43 53 45 54 28 68 6f 73  ..set VNCSET(hos
04b0: 74 29 20 24 56 4e 43 28 68 6f 73 74 29 0a 09 73  t) $VNC(host)..s
04c0: 65 74 20 56 4e 43 53 45 54 28 73 68 61 72 65 64  et VNCSET(shared
04d0: 29 20 24 56 4e 43 28 73 68 61 72 65 64 29 0a 09  ) $VNC(shared)..
04e0: 73 65 74 20 56 4e 43 53 45 54 28 76 69 65 77 6f  set VNCSET(viewo
04f0: 6e 6c 79 29 20 24 56 4e 43 28 76 69 65 77 6f 6e  nly) $VNC(viewon
0500: 6c 79 29 0a 09 69 66 20 7b 21 5b 63 61 74 63 68  ly)..if {![catch
0510: 20 7b 6f 70 65 6e 20 7e 2f 76 6e 63 2e 73 65 74   {open ~/vnc.set
0520: 20 77 7d 20 66 5d 7d 20 7b 0a 09 20 20 20 20 70   w} f]} {..    p
0530: 75 74 73 20 24 66 20 5b 61 72 72 61 79 20 67 65  uts $f [array ge
0540: 74 20 56 4e 43 53 45 54 5d 0a 09 20 20 20 20 63  t VNCSET]..    c
0550: 6c 6f 73 65 20 24 66 0a 09 7d 0a 20 20 20 20 7d  lose $f..}.    }
0560: 0a 20 20 20 20 73 65 74 20 56 4e 43 28 6c 61 73  .    set VNC(las
0570: 74 63 6f 6e 6e 65 63 74 29 20 24 56 4e 43 28 63  tconnect) $VNC(c
0580: 6f 6e 6e 65 63 74 65 64 29 0a 7d 0a 0a 23 20 73  onnected).}..# s
0590: 65 74 74 69 6e 67 73 20 64 69 61 6c 6f 67 0a 0a  ettings dialog..
05a0: 70 72 6f 63 20 76 6e 63 5f 73 65 74 74 69 6e 67  proc vnc_setting
05b0: 73 20 7b 7d 20 7b 0a 20 20 20 20 67 6c 6f 62 61  s {} {.    globa
05c0: 6c 20 56 4e 43 53 45 54 20 56 4e 43 0a 20 20 20  l VNCSET VNC.   
05d0: 20 73 65 74 20 77 20 2e 73 65 74 74 69 6e 67 73   set w .settings
05e0: 0a 20 20 20 20 69 66 20 7b 5b 77 69 6e 66 6f 20  .    if {[winfo 
05f0: 65 78 69 73 74 73 20 24 77 5d 7d 20 7b 0a 09 69  exists $w]} {..i
0600: 66 20 7b 24 56 4e 43 28 63 6f 6e 6e 65 63 74 65  f {$VNC(connecte
0610: 64 29 7d 20 7b 0a 09 20 20 20 20 24 77 2e 62 75  d)} {..    $w.bu
0620: 74 74 6f 6e 73 2e 61 20 63 6f 6e 66 69 67 75 72  ttons.a configur
0630: 65 20 2d 74 65 78 74 20 22 44 69 73 63 6f 6e 6e  e -text "Disconn
0640: 65 63 74 22 20 5c 0a 09 09 2d 63 6f 6d 6d 61 6e  ect" \...-comman
0650: 64 20 5b 6c 69 73 74 20 76 6e 63 5f 63 6f 6d 6d  d [list vnc_comm
0660: 61 6e 64 20 24 77 20 64 69 73 63 5d 0a 09 7d 20  and $w disc]..} 
0670: 65 6c 73 65 20 7b 0a 09 20 20 20 20 24 77 2e 62  else {..    $w.b
0680: 75 74 74 6f 6e 73 2e 61 20 63 6f 6e 66 69 67 75  uttons.a configu
0690: 72 65 20 2d 74 65 78 74 20 22 43 6f 6e 6e 65 63  re -text "Connec
06a0: 74 22 20 5c 0a 09 09 2d 63 6f 6d 6d 61 6e 64 20  t" \...-command 
06b0: 5b 6c 69 73 74 20 76 6e 63 5f 63 6f 6d 6d 61 6e  [list vnc_comman
06c0: 64 20 24 77 20 63 6f 6e 6e 5d 0a 09 7d 0a 09 72  d $w conn]..}..r
06d0: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 20 20 20 20  eturn.    }.    
06e0: 74 6f 70 6c 65 76 65 6c 20 24 77 0a 20 20 20 20  toplevel $w.    
06f0: 77 6d 20 74 69 74 6c 65 20 24 77 20 22 56 4e 43  wm title $w "VNC
0700: 20 4f 70 74 69 6f 6e 73 22 0a 20 20 20 20 77 6d   Options".    wm
0710: 20 70 72 6f 74 6f 63 6f 6c 20 24 77 20 57 4d 5f   protocol $w WM_
0720: 44 45 4c 45 54 45 5f 57 49 4e 44 4f 57 20 5b 6c  DELETE_WINDOW [l
0730: 69 73 74 20 24 77 2e 62 75 74 74 6f 6e 73 2e 63  ist $w.buttons.c
0740: 20 69 6e 76 6f 6b 65 5d 0a 20 20 20 20 77 6d 20   invoke].    wm 
0750: 74 72 61 6e 73 69 65 6e 74 20 24 77 20 2e 0a 20  transient $w .. 
0760: 20 20 20 74 74 6b 3a 3a 6c 61 62 65 6c 20 24 77     ttk::label $w
0770: 2e 6c 68 20 2d 74 65 78 74 20 22 48 6f 73 74 3a  .lh -text "Host:
0780: 22 0a 20 20 20 20 67 72 69 64 20 24 77 2e 6c 68  ".    grid $w.lh
0790: 20 2d 72 6f 77 20 30 20 2d 63 6f 6c 75 6d 6e 20   -row 0 -column 
07a0: 30 20 2d 73 74 69 63 6b 79 20 65 20 2d 70 61 64  0 -sticky e -pad
07b0: 78 20 35 20 2d 70 61 64 79 20 35 0a 20 20 20 20  x 5 -pady 5.    
07c0: 74 74 6b 3a 3a 65 6e 74 72 79 20 24 77 2e 68 6f  ttk::entry $w.ho
07d0: 73 74 20 2d 74 65 78 74 76 61 72 69 61 62 6c 65  st -textvariable
07e0: 20 56 4e 43 53 45 54 28 68 6f 73 74 29 0a 20 20   VNCSET(host).  
07f0: 20 20 67 72 69 64 20 24 77 2e 68 6f 73 74 20 2d    grid $w.host -
0800: 72 6f 77 20 30 20 2d 63 6f 6c 75 6d 6e 20 31 20  row 0 -column 1 
0810: 2d 73 74 69 63 6b 79 20 65 77 20 2d 70 61 64 78  -sticky ew -padx
0820: 20 35 20 2d 70 61 64 79 20 35 0a 20 20 20 20 74   5 -pady 5.    t
0830: 74 6b 3a 3a 6c 61 62 65 6c 20 24 77 2e 6c 70 20  tk::label $w.lp 
0840: 2d 74 65 78 74 20 22 50 61 73 73 77 6f 72 64 3a  -text "Password:
0850: 22 0a 20 20 20 20 67 72 69 64 20 24 77 2e 6c 70  ".    grid $w.lp
0860: 20 2d 72 6f 77 20 31 20 2d 63 6f 6c 75 6d 6e 20   -row 1 -column 
0870: 30 20 2d 73 74 69 63 6b 79 20 65 20 2d 70 61 64  0 -sticky e -pad
0880: 78 20 35 20 2d 70 61 64 79 20 35 0a 20 20 20 20  x 5 -pady 5.    
0890: 74 74 6b 3a 3a 65 6e 74 72 79 20 24 77 2e 70 77  ttk::entry $w.pw
08a0: 64 20 2d 74 65 78 74 76 61 72 69 61 62 6c 65 20  d -textvariable 
08b0: 56 4e 43 53 45 54 28 70 77 64 29 20 2d 73 68 6f  VNCSET(pwd) -sho
08c0: 77 20 22 2a 22 0a 20 20 20 20 67 72 69 64 20 24  w "*".    grid $
08d0: 77 2e 70 77 64 20 2d 72 6f 77 20 31 20 2d 63 6f  w.pwd -row 1 -co
08e0: 6c 75 6d 6e 20 31 20 2d 73 74 69 63 6b 79 20 65  lumn 1 -sticky e
08f0: 77 20 2d 70 61 64 78 20 35 20 2d 70 61 64 79 20  w -padx 5 -pady 
0900: 35 0a 20 20 20 20 74 74 6b 3a 3a 63 68 65 63 6b  5.    ttk::check
0910: 62 75 74 74 6f 6e 20 24 77 2e 73 68 61 72 65 64  button $w.shared
0920: 20 2d 76 61 72 69 61 62 6c 65 20 56 4e 43 53 45   -variable VNCSE
0930: 54 28 73 68 61 72 65 64 29 20 2d 74 65 78 74 20  T(shared) -text 
0940: 22 53 68 61 72 65 64 22 0a 20 20 20 20 67 72 69  "Shared".    gri
0950: 64 20 24 77 2e 73 68 61 72 65 64 20 2d 72 6f 77  d $w.shared -row
0960: 20 32 20 2d 63 6f 6c 75 6d 6e 20 31 20 2d 73 74   2 -column 1 -st
0970: 69 63 6b 79 20 77 20 2d 70 61 64 78 20 35 20 2d  icky w -padx 5 -
0980: 70 61 64 79 20 35 0a 20 20 20 20 74 74 6b 3a 3a  pady 5.    ttk::
0990: 63 68 65 63 6b 62 75 74 74 6f 6e 20 24 77 2e 76  checkbutton $w.v
09a0: 6f 6e 6c 79 20 2d 76 61 72 69 61 62 6c 65 20 56  only -variable V
09b0: 4e 43 53 45 54 28 76 69 65 77 6f 6e 6c 79 29 20  NCSET(viewonly) 
09c0: 2d 74 65 78 74 20 22 56 69 65 77 20 4f 6e 6c 79  -text "View Only
09d0: 22 0a 20 20 20 20 67 72 69 64 20 24 77 2e 76 6f  ".    grid $w.vo
09e0: 6e 6c 79 20 2d 72 6f 77 20 33 20 2d 63 6f 6c 75  nly -row 3 -colu
09f0: 6d 6e 20 31 20 2d 73 74 69 63 6b 79 20 77 20 2d  mn 1 -sticky w -
0a00: 70 61 64 78 20 35 20 2d 70 61 64 79 20 35 0a 20  padx 5 -pady 5. 
0a10: 20 20 20 74 74 6b 3a 3a 66 72 61 6d 65 20 24 77     ttk::frame $w
0a20: 2e 62 75 74 74 6f 6e 73 0a 20 20 20 20 67 72 69  .buttons.    gri
0a30: 64 20 24 77 2e 62 75 74 74 6f 6e 73 20 2d 72 6f  d $w.buttons -ro
0a40: 77 20 34 20 2d 63 6f 6c 75 6d 6e 20 30 20 2d 63  w 4 -column 0 -c
0a50: 6f 6c 75 6d 6e 73 70 61 6e 20 32 20 2d 73 74 69  olumnspan 2 -sti
0a60: 63 6b 79 20 65 77 20 2d 70 61 64 78 20 35 20 2d  cky ew -padx 5 -
0a70: 70 61 64 79 20 35 0a 20 20 20 20 69 66 20 7b 24  pady 5.    if {$
0a80: 56 4e 43 28 63 6f 6e 6e 65 63 74 65 64 29 7d 20  VNC(connected)} 
0a90: 7b 0a 09 74 74 6b 3a 3a 62 75 74 74 6f 6e 20 24  {..ttk::button $
0aa0: 77 2e 62 75 74 74 6f 6e 73 2e 61 20 2d 74 65 78  w.buttons.a -tex
0ab0: 74 20 22 44 69 73 63 6f 6e 6e 65 63 74 22 20 2d  t "Disconnect" -
0ac0: 77 69 64 74 68 20 31 32 20 5c 0a 09 20 20 20 20  width 12 \..    
0ad0: 2d 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 76  -command [list v
0ae0: 6e 63 5f 63 6f 6d 6d 61 6e 64 20 24 77 20 64 69  nc_command $w di
0af0: 73 63 5d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  sc].    } else {
0b00: 0a 09 69 66 20 7b 21 5b 63 61 74 63 68 20 7b 6f  ..if {![catch {o
0b10: 70 65 6e 20 7e 2f 76 6e 63 2e 73 65 74 7d 20 66  pen ~/vnc.set} f
0b20: 5d 7d 20 7b 0a 09 20 20 20 20 63 61 74 63 68 20  ]} {..    catch 
0b30: 7b 61 72 72 61 79 20 73 65 74 20 56 4e 43 53 45  {array set VNCSE
0b40: 54 20 5b 72 65 61 64 20 24 66 20 31 30 32 34 5d  T [read $f 1024]
0b50: 7d 0a 09 20 20 20 20 63 6c 6f 73 65 20 24 66 0a  }..    close $f.
0b60: 09 7d 0a 09 74 74 6b 3a 3a 62 75 74 74 6f 6e 20  .}..ttk::button 
0b70: 24 77 2e 62 75 74 74 6f 6e 73 2e 61 20 2d 74 65  $w.buttons.a -te
0b80: 78 74 20 22 43 6f 6e 6e 65 63 74 22 20 2d 77 69  xt "Connect" -wi
0b90: 64 74 68 20 31 32 20 5c 0a 09 20 20 20 20 2d 63  dth 12 \..    -c
0ba0: 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 76 6e 63  ommand [list vnc
0bb0: 5f 63 6f 6d 6d 61 6e 64 20 24 77 20 63 6f 6e 6e  _command $w conn
0bc0: 5d 0a 20 20 20 20 7d 0a 20 20 20 20 74 74 6b 3a  ].    }.    ttk:
0bd0: 3a 62 75 74 74 6f 6e 20 24 77 2e 62 75 74 74 6f  :button $w.butto
0be0: 6e 73 2e 78 20 2d 74 65 78 74 20 22 45 78 69 74  ns.x -text "Exit
0bf0: 22 20 2d 77 69 64 74 68 20 31 32 20 2d 63 6f 6d  " -width 12 -com
0c00: 6d 61 6e 64 20 7b 65 78 69 74 20 30 7d 0a 20 20  mand {exit 0}.  
0c10: 20 20 74 74 6b 3a 3a 62 75 74 74 6f 6e 20 24 77    ttk::button $w
0c20: 2e 62 75 74 74 6f 6e 73 2e 63 20 2d 74 65 78 74  .buttons.c -text
0c30: 20 22 43 61 6e 63 65 6c 22 20 2d 77 69 64 74 68   "Cancel" -width
0c40: 20 31 32 20 5c 0a 09 2d 63 6f 6d 6d 61 6e 64 20   12 \..-command 
0c50: 5b 73 75 62 73 74 20 7b 0a 09 20 20 20 20 67 72  [subst {..    gr
0c60: 61 62 20 72 65 6c 65 61 73 65 20 24 77 0a 09 20  ab release $w.. 
0c70: 20 20 20 66 6f 63 75 73 20 2e 76 6e 63 0a 09 20     focus .vnc.. 
0c80: 20 20 20 64 65 73 74 72 6f 79 20 24 77 0a 09 7d     destroy $w..}
0c90: 5d 0a 20 20 20 20 70 61 63 6b 20 24 77 2e 62 75  ].    pack $w.bu
0ca0: 74 74 6f 6e 73 2e 61 20 24 77 2e 62 75 74 74 6f  ttons.a $w.butto
0cb0: 6e 73 2e 78 20 24 77 2e 62 75 74 74 6f 6e 73 2e  ns.x $w.buttons.
0cc0: 63 20 2d 73 69 64 65 20 6c 65 66 74 20 2d 65 78  c -side left -ex
0cd0: 70 61 6e 64 20 31 20 2d 70 61 64 78 20 35 0a 20  pand 1 -padx 5. 
0ce0: 20 20 20 62 69 6e 64 20 24 77 20 3c 42 72 65 61     bind $w <Brea
0cf0: 6b 3e 20 5b 6c 69 73 74 20 24 77 2e 62 75 74 74  k> [list $w.butt
0d00: 6f 6e 73 2e 63 20 69 6e 76 6f 6b 65 5d 0a 20 20  ons.c invoke].  
0d10: 20 20 3a 3a 74 6b 3a 3a 50 6c 61 63 65 57 69 6e    ::tk::PlaceWin
0d20: 64 6f 77 20 24 77 0a 20 20 20 20 67 72 61 62 20  dow $w.    grab 
0d30: 24 77 0a 7d 0a 0a 23 20 70 65 72 66 6f 72 6d 20  $w.}..# perform 
0d40: 63 6f 6e 6e 65 63 74 20 74 6f 20 56 4e 43 20 73  connect to VNC s
0d50: 65 72 76 65 72 0a 0a 70 72 6f 63 20 76 6e 63 5f  erver..proc vnc_
0d60: 63 6f 6e 6e 65 63 74 20 7b 7d 20 7b 0a 20 20 20  connect {} {.   
0d70: 20 67 6c 6f 62 61 6c 20 56 4e 43 53 45 54 0a 20   global VNCSET. 
0d80: 20 20 20 73 65 74 20 61 72 67 73 20 24 56 4e 43     set args $VNC
0d90: 53 45 54 28 68 6f 73 74 29 0a 20 20 20 20 6c 61  SET(host).    la
0da0: 70 70 65 6e 64 20 61 72 67 73 20 24 56 4e 43 53  ppend args $VNCS
0db0: 45 54 28 70 77 64 29 0a 20 20 20 20 69 66 20 7b  ET(pwd).    if {
0dc0: 24 56 4e 43 53 45 54 28 73 68 61 72 65 64 29 7d  $VNCSET(shared)}
0dd0: 20 7b 0a 09 6c 61 70 70 65 6e 64 20 61 72 67 73   {..lappend args
0de0: 20 22 2d 73 68 61 72 65 64 22 0a 20 20 20 20 7d   "-shared".    }
0df0: 0a 20 20 20 20 69 66 20 7b 24 56 4e 43 53 45 54  .    if {$VNCSET
0e00: 28 76 69 65 77 6f 6e 6c 79 29 7d 20 7b 0a 09 6c  (viewonly)} {..l
0e10: 61 70 70 65 6e 64 20 61 72 67 73 20 22 2d 76 69  append args "-vi
0e20: 65 77 6f 6e 6c 79 22 0a 20 20 20 20 7d 0a 20 20  ewonly".    }.  
0e30: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 2e 76    if {[catch {.v
0e40: 6e 63 20 63 6f 6e 6e 65 63 74 20 7b 2a 7d 24 61  nc connect {*}$a
0e50: 72 67 73 7d 20 65 72 72 5d 7d 20 7b 0a 09 74 6b  rgs} err]} {..tk
0e60: 5f 6d 65 73 73 61 67 65 42 6f 78 20 2d 74 69 74  _messageBox -tit
0e70: 6c 65 20 22 45 72 72 6f 72 22 20 2d 6d 65 73 73  le "Error" -mess
0e80: 61 67 65 20 24 65 72 72 20 5c 0a 09 20 20 20 20  age $err \..    
0e90: 2d 74 79 70 65 20 6f 6b 20 2d 69 63 6f 6e 20 65  -type ok -icon e
0ea0: 72 72 6f 72 0a 09 61 66 74 65 72 20 69 64 6c 65  rror..after idle
0eb0: 20 76 6e 63 5f 73 65 74 74 69 6e 67 73 0a 20 20   vnc_settings.  
0ec0: 20 20 7d 0a 7d 0a 0a 23 20 65 78 65 63 75 74 65    }.}..# execute
0ed0: 20 63 6f 6e 6e 65 63 74 20 6f 72 20 64 69 73 63   connect or disc
0ee0: 6f 6e 6e 65 63 74 20 74 6f 2f 66 72 6f 6d 20 56  onnect to/from V
0ef0: 4e 43 20 73 65 72 76 65 72 0a 0a 70 72 6f 63 20  NC server..proc 
0f00: 76 6e 63 5f 63 6f 6d 6d 61 6e 64 20 7b 77 20 77  vnc_command {w w
0f10: 68 61 74 7d 20 7b 0a 20 20 20 20 73 77 69 74 63  hat} {.    switc
0f20: 68 20 2d 67 6c 6f 62 20 2d 2d 20 24 77 68 61 74  h -glob -- $what
0f30: 20 7b 0a 09 64 69 73 63 2a 20 7b 0a 09 20 20 20   {..disc* {..   
0f40: 20 61 66 74 65 72 20 69 64 6c 65 20 7b 0a 09 09   after idle {...
0f50: 63 61 74 63 68 20 7b 2e 76 6e 63 20 64 69 73 63  catch {.vnc disc
0f60: 6f 6e 6e 65 63 74 7d 0a 09 20 20 20 20 7d 0a 09  onnect}..    }..
0f70: 7d 0a 09 63 6f 6e 6e 2a 20 7b 0a 09 20 20 20 20  }..conn* {..    
0f80: 61 66 74 65 72 20 69 64 6c 65 20 76 6e 63 5f 63  after idle vnc_c
0f90: 6f 6e 6e 65 63 74 0a 09 7d 0a 20 20 20 20 7d 0a  onnect..}.    }.
0fa0: 20 20 20 20 67 72 61 62 20 72 65 6c 65 61 73 65      grab release
0fb0: 20 24 77 0a 20 20 20 20 66 6f 63 75 73 20 2e 76   $w.    focus .v
0fc0: 6e 63 0a 20 20 20 20 64 65 73 74 72 6f 79 20 24  nc.    destroy $
0fd0: 77 0a 7d 0a 0a 23 20 68 61 6e 64 6c 65 20 66 69  w.}..# handle fi
0fe0: 6e 67 65 72 20 65 76 65 6e 74 73 20 61 6e 64 20  nger events and 
0ff0: 76 69 65 77 70 6f 72 74 20 63 68 61 6e 67 65 73  viewport changes
1000: 0a 0a 70 72 6f 63 20 76 6e 63 5f 76 70 5f 66 69  ..proc vnc_vp_fi
1010: 6e 67 65 72 20 7b 77 20 6f 70 20 72 6f 6f 74 78  nger {w op rootx
1020: 20 72 6f 6f 74 79 20 64 78 20 64 79 20 73 74 61   rooty dx dy sta
1030: 74 65 7d 20 7b 0a 20 20 20 20 67 6c 6f 62 61 6c  te} {.    global
1040: 20 56 4e 43 45 56 0a 20 20 20 20 73 77 69 74 63   VNCEV.    switc
1050: 68 20 24 6f 70 20 7b 0a 09 76 20 7b 0a 09 20 20  h $op {..v {..  
1060: 20 20 23 20 76 69 65 77 70 6f 72 74 20 63 68 61    # viewport cha
1070: 6e 67 65 64 2c 20 77 69 74 68 64 72 61 77 20 74  nged, withdraw t
1080: 72 69 67 67 65 72 0a 09 20 20 20 20 73 65 74 20  rigger..    set 
1090: 56 4e 43 45 56 28 74 72 69 67 67 65 72 29 20 30  VNCEV(trigger) 0
10a0: 0a 09 7d 0a 09 64 20 7b 0a 09 20 20 20 20 73 65  ..}..d {..    se
10b0: 74 20 56 4e 43 45 56 28 78 24 73 74 61 74 65 29  t VNCEV(x$state)
10c0: 20 5c 0a 09 09 5b 65 78 70 72 20 72 6f 75 6e 64   \...[expr round
10d0: 28 28 24 72 6f 6f 74 78 20 2a 20 5b 77 69 6e 66  (($rootx * [winf
10e0: 6f 20 73 63 72 65 65 6e 77 69 64 74 68 20 2e 5d  o screenwidth .]
10f0: 29 20 2f 20 31 30 30 30 30 29 5d 0a 09 20 20 20  ) / 10000)]..   
1100: 20 73 65 74 20 56 4e 43 45 56 28 79 24 73 74 61   set VNCEV(y$sta
1110: 74 65 29 20 5c 0a 09 09 5b 65 78 70 72 20 72 6f  te) \...[expr ro
1120: 75 6e 64 28 28 24 72 6f 6f 74 79 20 2a 20 5b 77  und(($rooty * [w
1130: 69 6e 66 6f 20 73 63 72 65 65 6e 68 65 69 67 68  info screenheigh
1140: 74 20 2e 5d 29 20 2f 20 31 30 30 30 30 29 5d 0a  t .]) / 10000)].
1150: 09 20 20 20 20 73 65 74 20 56 4e 43 45 56 28 66  .    set VNCEV(f
1160: 62 69 74 73 29 20 5b 65 78 70 72 20 24 56 4e 43  bits) [expr $VNC
1170: 45 56 28 66 62 69 74 73 29 20 7c 20 28 31 20 3c  EV(fbits) | (1 <
1180: 3c 20 24 73 74 61 74 65 29 5d 0a 09 20 20 20 20  < $state)]..    
1190: 69 66 20 7b 28 24 56 4e 43 45 56 28 66 62 69 74  if {($VNCEV(fbit
11a0: 73 29 20 26 20 36 29 20 3d 3d 20 36 7d 20 7b 0a  s) & 6) == 6} {.
11b0: 09 09 73 65 74 20 56 4e 43 45 56 28 74 72 69 67  ..set VNCEV(trig
11c0: 67 65 72 29 20 31 0a 09 20 20 20 20 7d 0a 09 7d  ger) 1..    }..}
11d0: 0a 09 6d 20 7b 0a 09 20 20 20 20 69 66 20 7b 28  ..m {..    if {(
11e0: 24 64 78 20 3c 20 2d 31 35 29 20 7c 7c 20 28 24  $dx < -15) || ($
11f0: 64 78 20 3e 20 31 35 29 20 7c 7c 20 28 24 64 79  dx > 15) || ($dy
1200: 20 3c 20 2d 31 35 29 20 7c 7c 20 28 24 64 79 20   < -15) || ($dy 
1210: 3e 20 31 35 29 7d 20 7b 0a 09 09 23 20 6d 6f 74  > 15)} {...# mot
1220: 69 6f 6e 20 64 65 6c 74 61 2c 20 77 69 74 68 64  ion delta, withd
1230: 72 61 77 20 74 72 69 67 67 65 72 0a 09 09 73 65  raw trigger...se
1240: 74 20 56 4e 43 45 56 28 74 72 69 67 67 65 72 29  t VNCEV(trigger)
1250: 20 30 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 75 20   0..    }..}..u 
1260: 7b 0a 09 20 20 20 20 73 65 74 20 56 4e 43 45 56  {..    set VNCEV
1270: 28 78 24 73 74 61 74 65 29 20 5c 0a 09 09 5b 65  (x$state) \...[e
1280: 78 70 72 20 72 6f 75 6e 64 28 28 24 72 6f 6f 74  xpr round(($root
1290: 78 20 2a 20 5b 77 69 6e 66 6f 20 73 63 72 65 65  x * [winfo scree
12a0: 6e 77 69 64 74 68 20 2e 5d 29 20 2f 20 31 30 30  nwidth .]) / 100
12b0: 30 30 29 5d 0a 09 20 20 20 20 73 65 74 20 56 4e  00)]..    set VN
12c0: 43 45 56 28 79 24 73 74 61 74 65 29 20 5c 0a 09  CEV(y$state) \..
12d0: 09 5b 65 78 70 72 20 72 6f 75 6e 64 28 28 24 72  .[expr round(($r
12e0: 6f 6f 74 79 20 2a 20 5b 77 69 6e 66 6f 20 73 63  ooty * [winfo sc
12f0: 72 65 65 6e 68 65 69 67 68 74 20 2e 5d 29 20 2f  reenheight .]) /
1300: 20 31 30 30 30 30 29 5d 0a 09 20 20 20 20 73 65   10000)]..    se
1310: 74 20 56 4e 43 45 56 28 66 62 69 74 73 29 20 5b  t VNCEV(fbits) [
1320: 65 78 70 72 20 24 56 4e 43 45 56 28 66 62 69 74  expr $VNCEV(fbit
1330: 73 29 20 26 20 7e 28 31 20 3c 3c 20 24 73 74 61  s) & ~(1 << $sta
1340: 74 65 29 5d 0a 09 20 20 20 20 73 65 74 20 64 6f  te)]..    set do
1350: 69 74 20 30 0a 09 20 20 20 20 69 66 20 7b 24 56  it 0..    if {$V
1360: 4e 43 45 56 28 66 62 69 74 73 29 20 3d 3d 20 30  NCEV(fbits) == 0
1370: 7d 20 7b 0a 09 09 69 66 20 7b 24 56 4e 43 45 56  } {...if {$VNCEV
1380: 28 74 72 69 67 67 65 72 29 7d 20 7b 0a 09 09 20  (trigger)} {... 
1390: 20 20 20 73 65 74 20 64 6f 69 74 20 31 0a 09 09     set doit 1...
13a0: 7d 0a 09 09 73 65 74 20 56 4e 43 45 56 28 74 72  }...set VNCEV(tr
13b0: 69 67 67 65 72 29 20 30 0a 09 20 20 20 20 7d 0a  igger) 0..    }.
13c0: 09 20 20 20 20 69 66 20 7b 24 64 6f 69 74 7d 20  .    if {$doit} 
13d0: 7b 0a 09 09 73 65 74 20 64 78 20 5b 65 78 70 72  {...set dx [expr
13e0: 20 7b 24 56 4e 43 45 56 28 78 32 29 20 2d 20 24   {$VNCEV(x2) - $
13f0: 56 4e 43 45 56 28 78 31 29 7d 5d 0a 09 09 73 65  VNCEV(x1)}]...se
1400: 74 20 64 79 20 5b 65 78 70 72 20 7b 24 56 4e 43  t dy [expr {$VNC
1410: 45 56 28 79 32 29 20 2d 20 24 56 4e 43 45 56 28  EV(y2) - $VNCEV(
1420: 79 31 29 7d 5d 0a 09 09 73 65 74 20 70 78 20 5b  y1)}]...set px [
1430: 65 78 70 72 20 7b 24 56 4e 43 45 56 28 78 31 29  expr {$VNCEV(x1)
1440: 20 2b 20 24 64 78 20 2f 20 32 7d 5d 0a 09 09 73   + $dx / 2}]...s
1450: 65 74 20 70 79 20 5b 65 78 70 72 20 7b 24 56 4e  et py [expr {$VN
1460: 43 45 56 28 79 31 29 20 2b 20 24 64 79 20 2f 20  CEV(y1) + $dy / 
1470: 32 7d 5d 0a 09 09 73 64 6c 74 6b 20 74 65 78 74  2}]...sdltk text
1480: 69 6e 70 75 74 20 31 20 24 70 78 20 24 70 79 0a  input 1 $px $py.
1490: 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a  .    }..}.    }.
14a0: 7d 0a 0a 23 20 68 61 6e 64 6c 65 20 61 70 70 20  }..# handle app 
14b0: 6c 69 66 65 63 79 63 6c 65 20 65 76 65 6e 74 73  lifecycle events
14c0: 0a 0a 70 72 6f 63 20 76 6e 63 5f 6c 69 66 65 63  ..proc vnc_lifec
14d0: 79 63 6c 65 20 7b 73 75 73 70 65 6e 64 7d 20 7b  ycle {suspend} {
14e0: 0a 20 20 20 20 67 6c 6f 62 61 6c 20 56 4e 43 53  .    global VNCS
14f0: 45 54 20 56 4e 43 45 56 0a 20 20 20 20 69 66 20  ET VNCEV.    if 
1500: 7b 24 73 75 73 70 65 6e 64 7d 20 7b 0a 09 73 65  {$suspend} {..se
1510: 74 20 56 4e 43 45 56 28 66 62 69 74 73 29 20 30  t VNCEV(fbits) 0
1520: 0a 09 73 65 74 20 56 4e 43 45 56 28 74 72 69 67  ..set VNCEV(trig
1530: 67 65 72 29 20 30 0a 09 73 65 74 20 56 4e 43 53  ger) 0..set VNCS
1540: 45 54 28 6c 61 73 74 69 6e 66 6f 29 20 5b 2e 76  ET(lastinfo) [.v
1550: 6e 63 20 69 6e 66 6f 5d 0a 09 73 65 74 20 56 4e  nc info]..set VN
1560: 43 53 45 54 28 6c 69 66 65 63 79 63 6c 65 29 20  CSET(lifecycle) 
1570: 31 0a 09 63 61 74 63 68 20 7b 2e 76 6e 63 20 64  1..catch {.vnc d
1580: 69 73 63 6f 6e 6e 65 63 74 7d 0a 20 20 20 20 7d  isconnect}.    }
1590: 20 65 6c 73 65 20 7b 0a 09 73 65 74 20 56 4e 43   else {..set VNC
15a0: 53 45 54 28 6c 69 66 65 63 79 63 6c 65 29 20 30  SET(lifecycle) 0
15b0: 0a 09 61 72 72 61 79 20 73 65 74 20 69 6e 66 6f  ..array set info
15c0: 20 24 56 4e 43 53 45 54 28 6c 61 73 74 69 6e 66   $VNCSET(lastinf
15d0: 6f 29 0a 09 69 66 20 7b 24 69 6e 66 6f 28 63 6f  o)..if {$info(co
15e0: 6e 6e 65 63 74 65 64 29 7d 20 7b 0a 09 20 20 20  nnected)} {..   
15f0: 20 73 65 74 20 61 72 67 73 20 24 69 6e 66 6f 28   set args $info(
1600: 68 6f 73 74 29 0a 09 20 20 20 20 6c 61 70 70 65  host)..    lappe
1610: 6e 64 20 61 72 67 73 20 24 56 4e 43 53 45 54 28  nd args $VNCSET(
1620: 70 77 64 29 0a 09 20 20 20 20 69 66 20 7b 24 69  pwd)..    if {$i
1630: 6e 66 6f 28 73 68 61 72 65 64 29 7d 20 7b 0a 09  nfo(shared)} {..
1640: 09 6c 61 70 70 65 6e 64 20 61 72 67 73 20 22 2d  .lappend args "-
1650: 73 68 61 72 65 64 22 0a 09 20 20 20 20 7d 0a 09  shared"..    }..
1660: 20 20 20 20 69 66 20 7b 24 69 6e 66 6f 28 76 69      if {$info(vi
1670: 65 77 6f 6e 6c 79 29 7d 20 7b 0a 09 09 6c 61 70  ewonly)} {...lap
1680: 70 65 6e 64 20 61 72 67 73 20 22 2d 76 69 65 77  pend args "-view
1690: 6f 6e 6c 79 22 0a 09 20 20 20 20 7d 0a 09 20 20  only"..    }..  
16a0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 2e 76    if {[catch {.v
16b0: 6e 63 20 63 6f 6e 6e 65 63 74 20 7b 2a 7d 24 61  nc connect {*}$a
16c0: 72 67 73 7d 20 65 72 72 5d 7d 20 7b 0a 09 09 61  rgs} err]} {...a
16d0: 66 74 65 72 20 69 64 6c 65 20 76 6e 63 5f 73 65  fter idle vnc_se
16e0: 74 74 69 6e 67 73 0a 09 20 20 20 20 7d 0a 09 7d  ttings..    }..}
16f0: 0a 20 20 20 20 7d 0a 7d 0a 0a 76 6e 63 20 2e 76  .    }.}..vnc .v
1700: 6e 63 20 2d 62 64 20 30 20 2d 72 65 6c 69 65 66  nc -bd 0 -relief
1710: 20 66 6c 61 74 20 2d 68 69 67 68 6c 69 67 68 74   flat -highlight
1720: 74 68 69 63 6b 6e 65 73 73 20 30 20 2d 62 67 20  thickness 0 -bg 
1730: 62 6c 61 63 6b 20 5c 0a 20 20 20 20 2d 69 6e 66  black \.    -inf
1740: 6f 63 6f 6d 6d 61 6e 64 20 76 6e 63 5f 69 6e 66  ocommand vnc_inf
1750: 6f 0a 70 61 63 6b 20 2e 76 6e 63 20 2d 73 69 64  o.pack .vnc -sid
1760: 65 20 74 6f 70 20 2d 66 69 6c 6c 20 62 6f 74 68  e top -fill both
1770: 20 2d 65 78 70 61 6e 64 20 31 0a 66 6f 63 75 73   -expand 1.focus
1780: 20 2e 76 6e 63 0a 0a 77 6d 20 77 69 74 68 64 72   .vnc..wm withdr
1790: 61 77 20 2e 0a 0a 62 69 6e 64 20 2e 20 3c 3c 57  aw ...bind . <<W
17a0: 69 6c 6c 45 6e 74 65 72 42 61 63 6b 67 72 6f 75  illEnterBackgrou
17b0: 6e 64 3e 3e 20 7b 76 6e 63 5f 6c 69 66 65 63 79  nd>> {vnc_lifecy
17c0: 63 6c 65 20 31 7d 0a 62 69 6e 64 20 2e 20 3c 3c  cle 1}.bind . <<
17d0: 57 69 6c 6c 45 6e 74 65 72 46 6f 72 65 67 72 6f  WillEnterForegro
17e0: 75 6e 64 3e 3e 20 7b 76 6e 63 5f 6c 69 66 65 63  und>> {vnc_lifec
17f0: 79 63 6c 65 20 30 7d 0a 62 69 6e 64 20 2e 20 3c  ycle 0}.bind . <
1800: 3c 56 69 65 77 70 6f 72 74 55 70 64 61 74 65 3e  <ViewportUpdate>
1810: 3e 20 7b 76 6e 63 5f 76 70 5f 66 69 6e 67 65 72  > {vnc_vp_finger
1820: 20 25 57 20 76 20 25 78 20 25 79 20 25 58 20 25   %W v %x %y %X %
1830: 59 20 25 73 7d 0a 62 69 6e 64 20 2e 20 3c 3c 46  Y %s}.bind . <<F
1840: 69 6e 67 65 72 44 6f 77 6e 3e 3e 20 7b 76 6e 63  ingerDown>> {vnc
1850: 5f 76 70 5f 66 69 6e 67 65 72 20 25 57 20 64 20  _vp_finger %W d 
1860: 25 78 20 25 79 20 25 58 20 25 59 20 25 73 7d 0a  %x %y %X %Y %s}.
1870: 62 69 6e 64 20 2e 20 3c 3c 46 69 6e 67 65 72 4d  bind . <<FingerM
1880: 6f 74 69 6f 6e 3e 3e 20 7b 76 6e 63 5f 76 70 5f  otion>> {vnc_vp_
1890: 66 69 6e 67 65 72 20 25 57 20 6d 20 25 78 20 25  finger %W m %x %
18a0: 79 20 25 58 20 25 59 20 25 73 7d 0a 62 69 6e 64  y %X %Y %s}.bind
18b0: 20 2e 20 3c 3c 46 69 6e 67 65 72 55 70 3e 3e 20   . <<FingerUp>> 
18c0: 7b 76 6e 63 5f 76 70 5f 66 69 6e 67 65 72 20 25  {vnc_vp_finger %
18d0: 57 20 75 20 25 78 20 25 79 20 25 58 20 25 59 20  W u %x %y %X %Y 
18e0: 25 73 7d 0a 0a 62 69 6e 64 20 56 4e 43 20 3c 43  %s}..bind VNC <C
18f0: 6f 6e 74 72 6f 6c 2d 54 61 62 3e 20 7b 7d 0a 62  ontrol-Tab> {}.b
1900: 69 6e 64 20 56 4e 43 20 3c 42 72 65 61 6b 3e 20  ind VNC <Break> 
1910: 7b 76 6e 63 5f 73 65 74 74 69 6e 67 73 20 3b 20  {vnc_settings ; 
1920: 62 72 65 61 6b 7d 0a 0a 23 20 69 6e 69 74 69 61  break}..# initia
1930: 6c 6c 79 20 62 72 69 6e 67 20 75 70 20 73 65 74  lly bring up set
1940: 74 69 6e 67 73 20 64 69 61 6c 6f 67 0a 0a 61 66  tings dialog..af
1950: 74 65 72 20 69 64 6c 65 20 7b 0a 20 20 20 20 77  ter idle {.    w
1960: 6d 20 64 65 69 63 6f 6e 69 66 79 20 2e 0a 20 20  m deiconify ..  
1970: 20 20 65 76 65 6e 74 20 67 65 6e 65 72 61 74 65    event generate
1980: 20 2e 76 6e 63 20 3c 4b 65 79 2d 42 72 65 61 6b   .vnc <Key-Break
1990: 3e 0a 7d 0a                                      >.}.