123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612 |
- # -*- mode: TCL; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
- #
- # $Id: Console.tcl,v 1.5 2008/02/27 22:17:28 hobbs Exp $
- #
- # Console.tcl --
- #
- # This code constructs the console window for an application.
- # It can be used by non-unix systems that do not have built-in
- # support for shells.
- #
- # This file was distributed as a part of Tk 4.1 by Sun
- # Microsystems, Inc. and subsequently modified by Expert
- # Interface Techonoligies and included as a part of Tix.
- #
- # Some of the functions in this file have been renamed from
- # using a "tk" prefix to a "tix" prefix to avoid namespace
- # conflict with the original file.
- #
- # Copyright (c) 1995-1996 Sun Microsystems, Inc.
- # Copyright (c) 1993-1999 Ioi Kim Lam.
- # Copyright (c) 2000-2001 Tix Project Group.
- #
- # See the file "docs/license.tcltk" for information on usage and
- # redistribution of the original file "console.tcl". These license
- # terms do NOT apply to other files in the Tix distribution.
- #
- # See the file "license.terms" for information on usage and
- # redistribution * of this file, and for a DISCLAIMER OF ALL
- # WARRANTIES.
- # tixConsoleInit --
- # This procedure constructs and configures the console windows.
- #
- # Arguments:
- # None.
- 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
- }
- # tixConsoleInvoke --
- # Processes the command line input. If the command is complete it
- # is evaled in the main interpreter. Otherwise, the continuation
- # prompt is added and more input may be added.
- #
- # Arguments:
- # None.
- 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
- }
- }
- # tixConsoleHistory --
- # This procedure implements command line history for the
- # console. In general is evals the history command in the
- # main interpreter to obtain the history. The global variable
- # histNum is used to store the current location in the history.
- #
- # Arguments:
- # cmd - Which action to take: prev, next, reset.
- 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
- }
- }
- }
- # tixConsolePrompt --
- # This procedure draws the prompt. If tcl_prompt1 or tcl_prompt2
- # exists in the main interpreter it will be called to generate the
- # prompt. Otherwise, a hard coded default prompt is printed.
- #
- # Arguments:
- # partial - Flag to specify which prompt to print.
- 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
- }
- # tixConsoleBind --
- # This procedure first ensures that the default bindings for the Text
- # class have been defined. Then certain bindings are overridden for
- # the class.
- #
- # Arguments:
- # None.
- proc tixConsoleBind {win} {
- if ![winfo exists .console] tixConsoleInit
- bindtags $win "$win Text . all"
- # Ignore all Alt, Meta, and Control keypresses unless explicitly bound.
- # Otherwise, if a widget binding for one of these is defined, the
- # <KeyPress> class binding will also fire and insert the character,
- # which is wrong. Ditto for <Escape>.
- 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
- }
- }
- }
- # tixConsoleInsert --
- # Insert a string into a text at the point of the insertion cursor.
- # If there is a selection in the text, and it covers the point of the
- # insertion cursor, then delete the selection before inserting. Insertion
- # is restricted to the prompt area.
- #
- # Arguments:
- # w - The text window in which to insert the string
- # s - The string to insert (usually just a single character)
- 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
- }
- }
- # tixConsoleOutput --
- #
- # This routine is called directly by ConsolePutsCmd to cause a string
- # to be displayed in the console.
- #
- # Arguments:
- # dest - The output tag to be used: either "stderr" or "stdout".
- # string - The string to be displayed.
- 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
- }
- }
- # tixConsoleExit --
- #
- # This routine is called by ConsoleEventProc when the main window of
- # the application is destroyed.
- #
- # Arguments:
- # None.
- proc tixConsoleExit {} {
- if ![winfo exists .console] tixConsoleInit
- exit
- }
- # Configure the default Tk console
- proc tixConsoleEvalAppend {inter} {
- global tixOption
- # A slave like the console interp has no global variables set!
-
- if {!$inter} {
- console hide
- # Change the menubar to Close the console instead of exiting
- # Your code must provide a way for the user to do a "console show"
- 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\""
- }
- }
- }
- }
|