magic/tcltk/console.tcl

136 lines
4.5 KiB
Tcl
Raw Normal View History

# console.tcl:
#
# Defines Procedures which should be defined within the console
# (master) interpreter (i.e., tkcon, if it is executed as a separate
# interpreter). Note that this can always be worked around via the
# "tkcon master" or "tkcon slave" commands, but this method organizes
# things in a more natural way.
wm geometry . 120x16+150-50
proc gettext {{prompt {}} {response {}}} {
# Differentiate between console command-line and button execution
# (Determines whether to prompt before or after execution)
if {[.text index output] == [.text index end]} {
::tkcon::Prompt
set mode 1
} else {
set mode 0
}
replaceprompt "?"
if {$prompt != {}} {
.text insert end $prompt {stdout}
}
if {$response != {}} {
set result [tkcon congets $response]
} else {
set result [tkcon congets]
}
tkcon set ::tkcon::OPT(prompt1) "% "
if {$mode == 0} {
::tkcon::Prompt
} else {
.text mark set output end
tkcon console see output ;# adjust view to encompass newline
update idletasks
}
return $result
}
slave alias magic::dialog gettext
slave alias magic::consolegeometry wm geometry .
slave alias magic::consolefocus focus -force .text
slave alias magic::suspendout rename temp_puts puts
slave alias magic::resumeout rename puts temp_puts
# Ensure that destroying the console window queries for saving
# modified layouts rather than forcing an immediate exit.
wm protocol . WM_DELETE_WINDOW {tkcon slave slave magic::quit}
proc temp_puts { args } {
# null procedure; output is suspended.
}
proc magiccolor { ch } {
tkcon slave slave magic::magiccolor $ch
}
proc replaceprompt { ch } {
tkcon set ::tkcon::OPT(prompt1) "$ch "
.text delete prompt.last-2c
.text insert [.text index prompt.last-1c] $ch {prompt}
.text mark set output [.text index output-1c]
}
# This procedure repaints the magic console to match the magic colormap.
# It's only called if magic is run in 8-bit (PseudoColor) visual mode.
# This is called from inside magic (graphics/grTk1.c).
proc repaintconsole {} {
puts stdout "Repainting console in magic layout window colors"
# Because the console invokes a slave interpreter, we have to evaluate
# magic command "magiccolor" in the slave interpreter. Note that all of
# these colors are short names from the ".dstyle6" file. Long names are
# also acceptable.
::set yellow [interp eval $::tkcon::OPT(exec) magiccolor yellow2]
::set black [interp eval $::tkcon::OPT(exec) magiccolor black]
::set gray [interp eval $::tkcon::OPT(exec) magiccolor gray2]
::set green [interp eval $::tkcon::OPT(exec) magiccolor green3]
::set purple [interp eval $::tkcon::OPT(exec) magiccolor purple1]
::set border [interp eval $::tkcon::OPT(exec) magiccolor window_border]
::set blue [interp eval $::tkcon::OPT(exec) magiccolor blue2]
::set red [interp eval $::tkcon::OPT(exec) magiccolor red3]
::set bgcolor [interp eval $::tkcon::OPT(exec) magiccolor no_color_at_all]
tkcon set ::tkcon::COLOR(bg) $bgcolor
tkcon set ::tkcon::COLOR(blink) $yellow
tkcon set ::tkcon::COLOR(cursor) $black
tkcon set ::tkcon::COLOR(disabled) $gray
tkcon set ::tkcon::COLOR(proc) $green
tkcon set ::tkcon::COLOR(var) $purple
tkcon set ::tkcon::COLOR(prompt) $border
tkcon set ::tkcon::COLOR(stdin) $black
tkcon set ::tkcon::COLOR(stdout) $blue
tkcon set ::tkcon::COLOR(stderr) $red
.text configure -background $bgcolor
.text configure -foreground $black
.text configure -insertbackground $black
.text tag configure var -background $bgcolor
.text tag configure blink -background $bgcolor
.text tag configure find -background $bgcolor
.text tag configure stdout -background $bgcolor
.text tag configure stderr -background $bgcolor
.text tag configure proc -background $bgcolor
.text tag configure prompt -background $bgcolor
.text tag configure var -foreground $purple
.text tag configure blink -foreground $yellow
.text tag configure find -foreground $yellow
.text tag configure stdout -foreground $blue
.text tag configure stderr -foreground $red
.text tag configure proc -foreground $green
.text tag configure prompt -foreground $border
.sy configure -background $bgcolor
}
# Rewrite the ::tkcon::New procedure so that it does not attempt to
# load a second version of magic into the interpreter, which is fatal.
rename ::tkcon::New ::tkcon::NewConsole
proc ::tkcon::New {} {
global argv0 argc argv
set argc 1
list set argv $argv0
::tkcon::NewConsole
}