proc deletehover {canvas graphics} { global kbbitmap dirty $graphics clip [lrange $dirty 0 1] [lrange $dirty 2 3] $graphics image $kbbitmap [list 0 0] $canvas flush [lindex $dirty 0] [lindex $dirty 1] 100 100 #[lindex $dirty 0] [lindex $dirty 1] [lindex $dirty 2] [lindex $dirty 3] } proc displayletter {canvas graphics x y} { global unshifted_letters letter kbbitmap lname2char dirty lastletter foreach {l xl yl xr yr} $unshifted_letters { if { < $xl $x } { if { < $yl $y } { if { < $x $xr } { if { < $y $yr } { if { eq $lastletter $l } { break } set lastletter $l deletehover $canvas $graphics $graphics clip [list 0 0] [list 239 319] set kbitmap [lcdui.image -resource [append "keys/" $l] ] $graphics image $kbitmap [list $xl [- 185 $yr] ] set dirty [list $xl [- 185 $yr] 24 62 ] $canvas flush #[lindex $dirty 0] [lindex $dirty 1] 100 100 # special handling for special keys if { eq $letter delete } { break } elseif { eq $letter ok } { break } elseif { eq $letter upshift } { break } elseif { eq $letter downshift } { break } # look up names of punctuation if { hcontains $lname2char $l } { set letter [hget $lname2char $l] break } # not punctuation, must be a letter set letter $l break } } } } } } proc canvasEvents {canvas event} { set reason [$event cget -reason] set x [$event cget -x] set y [- [$event cget -y] 105] set graphics [$canvas graphics] if { eq $reason 2 } { displayletter $canvas $graphics $x $y } if { eq $reason 4 } { displayletter $canvas $graphics $x $y } if { eq $reason 3 } { global letter text lastletter # special handling for special keys if { eq $letter delete } { if { > [strlen $text] 0 } { set text [strrange $text 0 [- [strlen $text] 2 ] ] } } elseif { eq $letter ok } { } elseif { eq $letter upshift } { } elseif { eq $letter downshift } { } else { append $text $letter } $graphics color white $graphics frect [list 0 185] [list 239 135] $graphics color black $graphics string [list 0 220] $text deletehover $canvas $graphics $canvas flush set letter "" set lastletter "" } } set canvas [lcdui.canvas -title "Test Canvas" -eventhandler canvasEvents -suppresskeys 1] set kbbitmap [lcdui.image -resource /lowercase_keyboard.png] set graphics [$canvas graphics] $graphics image $kbbitmap [list 0 0] set unshifted_letters %%UNSHIFTEDLETTERS%% set shifted_letters %%SHIFTEDLETTERS%% set letter "" set text "" set lastletter "" set dirty [list 0 0 0 0] set lname2char [hash {exclamation ! speech "\"" pound £ dollar $ percent % caret ^ ampersand & asterisk * openbracket ( closebracket ) openangle < closeangle > semicolon ; space " " plus "+" colon : hash "\#" dot . comma , at @ apostrophe ' }] $canvas setcurrent