|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
foreach fun {tkTextSetCursor} { |
|
if {![llength [info commands $fun]]} { |
|
tk::unsupported::ExposePrivateCommand $fun |
|
} |
|
} |
|
unset fun |
|
|
|
proc tixConsoleInit {} { |
|
global tcl_platform |
|
|
|
uplevel #0 set tixConsoleTextFont Courier |
|
uplevel #0 set tixConsoleTextSize 14 |
|
|
|
set f [frame .f] |
|
set fontcb [tixComboBox $f.size -label "" -command "tixConsoleSetFont" \ |
|
-variable tixConsoleTextFont \ |
|
-options { |
|
entry.width 15 |
|
listbox.height 5 |
|
}] |
|
set sizecb [tixComboBox $f.font -label "" -command "tixConsoleSetFont" \ |
|
-variable tixConsoleTextSize \ |
|
-options { |
|
entry.width 4 |
|
listbox.width 6 |
|
listbox.height 5 |
|
}] |
|
pack $fontcb $sizecb -side left |
|
pack $f -side top -fill x -padx 2 -pady 2 |
|
foreach font { |
|
"Courier New" |
|
"Courier" |
|
"Helvetica" |
|
"Lucida" |
|
"Lucida Typewriter" |
|
"MS LineDraw" |
|
"System" |
|
"Times Roman" |
|
} { |
|
$fontcb subwidget listbox insert end $font |
|
} |
|
|
|
for {set s 6} {$s < 25} {incr s} { |
|
$sizecb subwidget listbox insert end $s |
|
} |
|
|
|
bind [$fontcb subwidget entry] <Escape> "focus .console" |
|
bind [$sizecb subwidget entry] <Escape> "focus .console" |
|
|
|
text .console -yscrollcommand ".sb set" -setgrid true \ |
|
-highlightcolor [. cget -bg] -highlightbackground [. cget -bg] |
|
scrollbar .sb -command ".console yview" -highlightcolor [. cget -bg] \ |
|
-highlightbackground [. cget -bg] |
|
pack .sb -side right -fill both |
|
pack .console -fill both -expand 1 -side left |
|
|
|
tixConsoleBind .console |
|
|
|
.console tag configure stderr -foreground red |
|
.console tag configure stdin -foreground blue |
|
|
|
focus .console |
|
|
|
wm protocol . WM_DELETE_WINDOW { wm withdraw . } |
|
wm title . "Console" |
|
flush stdout |
|
.console mark set output [.console index "end - 1 char"] |
|
tkTextSetCursor .console end |
|
.console mark set promptEnd insert |
|
.console mark gravity promptEnd left |
|
|
|
tixConsoleSetFont |
|
} |
|
|
|
proc tixConsoleSetFont {args} { |
|
if ![winfo exists .console] tixConsoleInit |
|
|
|
global tixConsoleTextFont tixConsoleTextSize |
|
|
|
set font -*-$tixConsoleTextFont-medium-r-normal-*-$tixConsoleTextSize-*-*-*-*-*-*-* |
|
.console config -font $font |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc tixConsoleInvoke {args} { |
|
if ![winfo exists .console] tixConsoleInit |
|
|
|
if {[.console dlineinfo insert] != {}} { |
|
set setend 1 |
|
} else { |
|
set setend 0 |
|
} |
|
set ranges [.console tag ranges input] |
|
set cmd "" |
|
if {$ranges != ""} { |
|
set pos 0 |
|
while {[lindex $ranges $pos] != ""} { |
|
set start [lindex $ranges $pos] |
|
set end [lindex $ranges [incr pos]] |
|
append cmd [.console get $start $end] |
|
incr pos |
|
} |
|
} |
|
if {$cmd == ""} { |
|
tixConsolePrompt |
|
} elseif {[info complete $cmd]} { |
|
.console mark set output end |
|
.console tag delete input |
|
set err [catch { |
|
set result [interp record $cmd] |
|
} result] |
|
|
|
if {$result != ""} { |
|
if {$err} { |
|
.console insert insert "$result\n" stderr |
|
} else { |
|
.console insert insert "$result\n" |
|
} |
|
} |
|
tixConsoleHistory reset |
|
tixConsolePrompt |
|
} else { |
|
tixConsolePrompt partial |
|
} |
|
if {$setend} { |
|
.console yview -pickplace insert |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
set histNum 1 |
|
proc tixConsoleHistory {cmd} { |
|
if ![winfo exists .console] tixConsoleInit |
|
|
|
global histNum |
|
|
|
switch $cmd { |
|
prev { |
|
incr histNum -1 |
|
if {$histNum == 0} { |
|
set cmd {history event [expr [history nextid] -1]} |
|
} else { |
|
set cmd "history event $histNum" |
|
} |
|
if {[catch {interp eval $cmd} cmd]} { |
|
incr histNum |
|
return |
|
} |
|
.console delete promptEnd end |
|
.console insert promptEnd $cmd {input stdin} |
|
} |
|
next { |
|
incr histNum |
|
if {$histNum == 0} { |
|
set cmd {history event [expr [history nextid] -1]} |
|
} elseif {$histNum > 0} { |
|
set cmd "" |
|
set histNum 1 |
|
} else { |
|
set cmd "history event $histNum" |
|
} |
|
if {$cmd != ""} { |
|
catch {interp eval $cmd} cmd |
|
} |
|
.console delete promptEnd end |
|
.console insert promptEnd $cmd {input stdin} |
|
} |
|
reset { |
|
set histNum 1 |
|
} |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc tixConsolePrompt {{partial normal}} { |
|
if ![winfo exists .console] tixConsoleInit |
|
|
|
if {$partial == "normal"} { |
|
set temp [.console index "end - 1 char"] |
|
.console mark set output end |
|
if {[interp eval "info exists tcl_prompt1"]} { |
|
interp eval "eval \[set tcl_prompt1\]" |
|
} else { |
|
puts -nonewline "% " |
|
} |
|
} else { |
|
set temp [.console index output] |
|
.console mark set output end |
|
if {[interp eval "info exists tcl_prompt2"]} { |
|
interp eval "eval \[set tcl_prompt2\]" |
|
} else { |
|
puts -nonewline "> " |
|
} |
|
} |
|
|
|
flush stdout |
|
.console mark set output $temp |
|
tkTextSetCursor .console end |
|
.console mark set promptEnd insert |
|
.console mark gravity promptEnd left |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc tixConsoleBind {win} { |
|
if ![winfo exists .console] tixConsoleInit |
|
|
|
bindtags $win "$win Text . all" |
|
|
|
|
|
|
|
|
|
|
|
|
|
bind $win <Alt-KeyPress> {# nothing } |
|
bind $win <Meta-KeyPress> {# nothing} |
|
bind $win <Control-KeyPress> {# nothing} |
|
bind $win <Escape> {# nothing} |
|
bind $win <KP_Enter> {# nothing} |
|
|
|
bind $win <Tab> { |
|
tixConsoleInsert %W \t |
|
focus %W |
|
break |
|
} |
|
bind $win <Return> { |
|
%W mark set insert {end - 1c} |
|
tixConsoleInsert %W "\n" |
|
tixConsoleInvoke |
|
break |
|
} |
|
bind $win <Delete> { |
|
if {[%W tag nextrange sel 1.0 end] != ""} { |
|
%W tag remove sel sel.first promptEnd |
|
} else { |
|
if {[%W compare insert < promptEnd]} { |
|
break |
|
} |
|
} |
|
} |
|
bind $win <BackSpace> { |
|
if {[%W tag nextrange sel 1.0 end] != ""} { |
|
%W tag remove sel sel.first promptEnd |
|
} else { |
|
if {[%W compare insert <= promptEnd]} { |
|
break |
|
} |
|
} |
|
} |
|
foreach left {Control-a Home} { |
|
bind $win <$left> { |
|
if {[%W compare insert < promptEnd]} { |
|
tkTextSetCursor %W {insert linestart} |
|
} else { |
|
tkTextSetCursor %W promptEnd |
|
} |
|
break |
|
} |
|
} |
|
foreach right {Control-e End} { |
|
bind $win <$right> { |
|
tkTextSetCursor %W {insert lineend} |
|
break |
|
} |
|
} |
|
bind $win <Control-d> { |
|
if {[%W compare insert < promptEnd]} { |
|
break |
|
} |
|
} |
|
bind $win <Control-k> { |
|
if {[%W compare insert < promptEnd]} { |
|
%W mark set insert promptEnd |
|
} |
|
} |
|
bind $win <Control-t> { |
|
if {[%W compare insert < promptEnd]} { |
|
break |
|
} |
|
} |
|
bind $win <Meta-d> { |
|
if {[%W compare insert < promptEnd]} { |
|
break |
|
} |
|
} |
|
bind $win <Meta-BackSpace> { |
|
if {[%W compare insert <= promptEnd]} { |
|
break |
|
} |
|
} |
|
bind $win <Control-h> { |
|
if {[%W compare insert <= promptEnd]} { |
|
break |
|
} |
|
} |
|
foreach prev {Control-p Up} { |
|
bind $win <$prev> { |
|
tixConsoleHistory prev |
|
break |
|
} |
|
} |
|
foreach prev {Control-n Down} { |
|
bind $win <$prev> { |
|
tixConsoleHistory next |
|
break |
|
} |
|
} |
|
bind $win <Control-v> { |
|
if {[%W compare insert > promptEnd]} { |
|
catch { |
|
%W insert insert [selection get -displayof %W] {input stdin} |
|
%W see insert |
|
} |
|
} |
|
break |
|
} |
|
bind $win <Insert> { |
|
catch {tixConsoleInsert %W [selection get -displayof %W]} |
|
break |
|
} |
|
bind $win <KeyPress> { |
|
tixConsoleInsert %W %A |
|
break |
|
} |
|
foreach left {Control-b Left} { |
|
bind $win <$left> { |
|
if {[%W compare insert == promptEnd]} { |
|
break |
|
} |
|
tkTextSetCursor %W insert-1c |
|
break |
|
} |
|
} |
|
foreach right {Control-f Right} { |
|
bind $win <$right> { |
|
tkTextSetCursor %W insert+1c |
|
break |
|
} |
|
} |
|
bind $win <Control-Up> { |
|
%W yview scroll -1 unit |
|
break; |
|
} |
|
bind $win <Control-Down> { |
|
%W yview scroll 1 unit |
|
break; |
|
} |
|
bind $win <Prior> { |
|
%W yview scroll -1 pages |
|
} |
|
bind $win <Next> { |
|
%W yview scroll 1 pages |
|
} |
|
bind $win <F9> { |
|
eval destroy [winfo child .] |
|
source $tix_library/Console.tcl |
|
} |
|
foreach copy {F16 Meta-w Control-i} { |
|
bind $win <$copy> { |
|
if {[selection own -displayof %W] == "%W"} { |
|
clipboard clear -displayof %W |
|
catch { |
|
clipboard append -displayof %W [selection get -displayof %W] |
|
} |
|
} |
|
break |
|
} |
|
} |
|
foreach paste {F18 Control-y} { |
|
bind $win <$paste> { |
|
catch { |
|
set clip [selection get -displayof %W -selection CLIPBOARD] |
|
set list [split $clip \n\r] |
|
tixConsoleInsert %W [lindex $list 0] |
|
foreach x [lrange $list 1 end] { |
|
%W mark set insert {end - 1c} |
|
tixConsoleInsert %W "\n" |
|
tixConsoleInvoke |
|
tixConsoleInsert %W $x |
|
} |
|
} |
|
break |
|
} |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc tixConsoleInsert {w s} { |
|
if ![winfo exists .console] tixConsoleInit |
|
|
|
if {[.console dlineinfo insert] != {}} { |
|
set setend 1 |
|
} else { |
|
set setend 0 |
|
} |
|
if {$s == ""} { |
|
return |
|
} |
|
catch { |
|
if {[$w compare sel.first <= insert] |
|
&& [$w compare sel.last >= insert]} { |
|
$w tag remove sel sel.first promptEnd |
|
$w delete sel.first sel.last |
|
} |
|
} |
|
if {[$w compare insert < promptEnd]} { |
|
$w mark set insert end |
|
} |
|
$w insert insert $s {input stdin} |
|
if $setend { |
|
.console see insert |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc tixConsoleOutput {dest string} { |
|
if ![winfo exists .console] tixConsoleInit |
|
|
|
if {[.console dlineinfo insert] != {}} { |
|
set setend 1 |
|
} else { |
|
set setend 0 |
|
} |
|
.console insert output $string $dest |
|
if $setend { |
|
.console see insert |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc tixConsoleExit {} { |
|
if ![winfo exists .console] tixConsoleInit |
|
|
|
exit |
|
} |
|
|
|
|
|
proc tixConsoleEvalAppend {inter} { |
|
global tixOption |
|
|
|
|
|
if {!$inter} { |
|
console hide |
|
|
|
|
|
|
|
console eval { |
|
if {[winfo exists .menubar.file]} { |
|
.menubar.file entryconfigure "Hide Console" \ |
|
-underline 0 \ |
|
-label Close \ |
|
-command [list wm withdraw .] |
|
.menubar.file entryconfigure Exit -state disabled |
|
} |
|
} |
|
} |
|
|
|
console eval ".option configure -font \{$tixOption(fixed_font)\}" |
|
|
|
console eval { |
|
if {[winfo exists .menubar.edit]} { |
|
.menubar.edit add sep |
|
.menubar.edit add command \ |
|
-accelerator 'Ctrl+l' \ |
|
-underline 0 \ |
|
-label Clear \ |
|
-command [list .console delete 1.0 end] |
|
bind .console <Control-Key-l> [list .console delete 1.0 end] |
|
} |
|
if {![winfo exists .menubar.font]} { |
|
set m .menubar.font |
|
menu $m -tearoff 0 |
|
.menubar add cascade -menu .menubar.font \ |
|
-underline 0 -label Options |
|
|
|
global _TixConsole |
|
set font [font actual [.console cget -font]] |
|
set pos [lsearch $font -family] |
|
set _TixConsole(font) [lindex $font [incr pos]] |
|
set pos [lsearch $font -size] |
|
set _TixConsole(size) [lindex $font [incr pos]] |
|
set pos [lsearch $font -weight] |
|
set _TixConsole(weight) [lindex $font [incr pos]] |
|
|
|
set allowed {System Fixedsys Terminal {MS Serif} |
|
{MS Sans Serif} Courier {Lucida Console} Tahoma |
|
Arial {Courier New} {Times New Roman} |
|
{Arial Black} Verdana Garamond {Arial Narrow}} |
|
.menubar.font add cascade -label Font -menu $m.font |
|
menu $m.font -tearoff 0 |
|
foreach font [lsort [font families]] { |
|
if {[lsearch $allowed $font] < 0} {continue} |
|
$m.font add radiobutton -label $font \ |
|
-variable _TixConsole(font) \ |
|
-value $font \ |
|
-command \ |
|
".console configure -font \"\{$font\} \$_TixConsole(size) \$_TixConsole(weight)\"" |
|
} |
|
|
|
.menubar.font add cascade -label Size -menu $m.size |
|
menu $m.size -tearoff 0 |
|
foreach size {8 9 10 12 14 16 18} { |
|
$m.size add radiobutton -label $size \ |
|
-variable _TixConsole(size) \ |
|
-value $size \ |
|
-command \ |
|
".console configure -font \"\{\$_TixConsole(font)\} $size \$_TixConsole(weight)\"" |
|
} |
|
|
|
.menubar.font add cascade -label Weight -menu $m.weight |
|
menu $m.weight -tearoff 0 |
|
foreach weight {normal bold} { |
|
$m.weight add radiobutton -label [string totit $weight] \ |
|
-variable _TixConsole(weight) \ |
|
-value $weight \ |
|
-command \ |
|
".console configure -font \"\{\$_TixConsole(font)\} \$_TixConsole(size) $weight\"" |
|
} |
|
|
|
} |
|
} |
|
} |
|
|