|
|
|
|
|
exec wish8.6 "$0" ${1+"$@"} |
|
|
|
|
|
|
|
|
|
|
|
|
|
package require Tk |
|
|
|
wm title . "Tk Remote Controller" |
|
wm iconname . "Tk Remote" |
|
wm minsize . 1 1 |
|
|
|
|
|
|
|
|
|
|
|
set app "local" |
|
|
|
|
|
|
|
|
|
set executing 0 |
|
|
|
|
|
|
|
|
|
set lastCommand "" |
|
|
|
|
|
|
|
|
|
. configure -menu [menu .menu] |
|
menu .menu.file |
|
menu .menu.file.apps -postcommand fillAppsMenu |
|
.menu add cascade -label "File" -underline 0 -menu .menu.file |
|
.menu.file add cascade -label "Select Application" -underline 0 \ |
|
-menu .menu.file.apps |
|
.menu.file add command -label "Quit" -command "destroy ." -underline 0 |
|
|
|
|
|
|
|
text .t -yscrollcommand ".s set" -setgrid true |
|
scrollbar .s -command ".t yview" |
|
grid .t .s -sticky nsew |
|
grid rowconfigure . 0 -weight 1 |
|
grid columnconfigure . 0 -weight 1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
bindtags .t {.t Text . all} |
|
bind .t <Return> { |
|
.t mark set insert {end - 1c} |
|
.t insert insert \n |
|
invoke |
|
break |
|
} |
|
bind .t <Delete> { |
|
catch {.t tag remove sel sel.first promptEnd} |
|
if {[.t tag nextrange sel 1.0 end] eq ""} { |
|
if {[.t compare insert < promptEnd]} { |
|
break |
|
} |
|
} |
|
} |
|
bind .t <BackSpace> { |
|
catch {.t tag remove sel sel.first promptEnd} |
|
if {[.t tag nextrange sel 1.0 end] eq ""} { |
|
if {[.t compare insert <= promptEnd]} { |
|
break |
|
} |
|
} |
|
} |
|
bind .t <Control-d> { |
|
if {[.t compare insert < promptEnd]} { |
|
break |
|
} |
|
} |
|
bind .t <Control-k> { |
|
if {[.t compare insert < promptEnd]} { |
|
.t mark set insert promptEnd |
|
} |
|
} |
|
bind .t <Control-t> { |
|
if {[.t compare insert < promptEnd]} { |
|
break |
|
} |
|
} |
|
bind .t <Meta-d> { |
|
if {[.t compare insert < promptEnd]} { |
|
break |
|
} |
|
} |
|
bind .t <Meta-BackSpace> { |
|
if {[.t compare insert <= promptEnd]} { |
|
break |
|
} |
|
} |
|
bind .t <Control-h> { |
|
if {[.t compare insert <= promptEnd]} { |
|
break |
|
} |
|
} |
|
|
|
auto_load tk::TextInsert |
|
proc tk::TextInsert {w s} { |
|
if {$s eq ""} { |
|
return |
|
} |
|
catch { |
|
if { |
|
[$w compare sel.first <= insert] && [$w compare sel.last >= insert] |
|
} then { |
|
$w tag remove sel sel.first promptEnd |
|
$w delete sel.first sel.last |
|
} |
|
} |
|
$w insert insert $s |
|
$w see insert |
|
} |
|
|
|
.t configure -font {Courier 12} |
|
.t tag configure bold -font {Courier 12 bold} |
|
|
|
|
|
|
|
|
|
|
|
proc prompt {} { |
|
global app |
|
.t insert insert "$app: " |
|
.t mark set promptEnd {insert} |
|
.t mark gravity promptEnd left |
|
.t tag add bold {promptEnd linestart} promptEnd |
|
} |
|
|
|
|
|
|
|
|
|
|
|
proc invoke {} { |
|
global app executing lastCommand |
|
set cmd [.t get promptEnd insert] |
|
incr executing 1 |
|
if {[info complete $cmd]} { |
|
if {$cmd eq "!!\n"} { |
|
set cmd $lastCommand |
|
} else { |
|
set lastCommand $cmd |
|
} |
|
if {$app eq "local"} { |
|
set result [catch [list uplevel |
|
} else { |
|
set result [catch [list send $app $cmd] msg] |
|
} |
|
if {$result != 0} { |
|
.t insert insert "Error: $msg\n" |
|
} elseif {$msg ne ""} { |
|
.t insert insert $msg\n |
|
} |
|
prompt |
|
.t mark set promptEnd insert |
|
} |
|
incr executing -1 |
|
.t yview -pickplace insert |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc newApp appName { |
|
global app executing |
|
set app $appName |
|
if {!$executing} { |
|
.t mark gravity promptEnd right |
|
.t delete "promptEnd linestart" promptEnd |
|
.t insert promptEnd "$appName: " |
|
.t tag add bold "promptEnd linestart" promptEnd |
|
.t mark gravity promptEnd left |
|
} |
|
return |
|
} |
|
|
|
|
|
|
|
|
|
proc fillAppsMenu {} { |
|
set m .menu.file.apps |
|
catch {$m delete 0 last} |
|
foreach i [lsort [winfo interps]] { |
|
$m add command -label $i -command [list newApp $i] |
|
} |
|
$m add command -label local -command {newApp local} |
|
} |
|
|
|
set app [winfo name .] |
|
prompt |
|
focus .t |
|
|
|
|
|
|
|
|
|
|