snit_tcl83_utils.tcl
来自「Linux下的MSN聊天程序源码」· TCL 代码 · 共 220 行
TCL
220 行
#--------------------------------------------------------------------------# TITLE:# snit_tcl83_utils.tcl## AUTHOR:# Kenneth Green, 28 Aug 2004## DESCRIPTION:# Utilities to support the back-port of snit from Tcl 8.4 to 8.3##--------------------------------------------------------------------------# Copyright## Copyright (c) 2005 Kenneth Green# Modified by Andreas Kupries.# All rights reserved. This code is licensed as described in license.txt.#--------------------------------------------------------------------------# This code is freely distributable, but is provided as-is with# no warranty expressed or implied.#--------------------------------------------------------------------------# Acknowledgements# The changes described in this file are made to the awesome 'snit'# library as provided by William H. Duquette under the terms# defined in the associated 'license.txt'.#-----------------------------------------------------------------------#-----------------------------------------------------------------------# Namespacenamespace eval ::snit83 {}#-----------------------------------------------------------------------# Some Snit83 variablesnamespace eval ::snit83 { variable cmdTraceTable array set cmdTraceTable {} namespace eval private {}}#-----------------------------------------------------------------------# Initialisation## Override Tcl functions so we can mimic some behaviours#if [info exists tk_version] { rename destroy __destroy__}rename namespace __namespace__rename rename __rename__ ;# must be last one renamed!#-----------------------------------------------------------------------# Global namespace functions# destroy -## Perform delete tracing and then invoke the actual Tk destroy commandif [info exists tk_version] { proc destroy { w } { variable ::snit83::cmdTraceTable set index "delete,$w" if [info exists cmdTraceTable($index)] { set cmd $cmdTraceTable($index) ::unset cmdTraceTable($index) ;# prevent recursive tracing if [catch {eval $cmd $oldName \"$newName\" delete} err] { error $err } } return [__destroy__ $w] }}# namespace -## Add limited support for 'namespace exists'. Must be a fully# qualified namespace name (pattern match support not provided).proc namespace { cmd args } { if {[string equal $cmd "exists"]} { set ptn [lindex $args 0] return [::snit83::private::NamespaceIsDescendantOf :: $ptn] } elseif {[string equal $cmd "delete"]} { if [namespace exists [lindex $args 0]] { return [uplevel 1 [subst {__namespace__ $cmd $args}]] } } else { return [uplevel 1 [subst {__namespace__ $cmd $args}]] }}# rename -## Perform rename tracing and then invoke the actual Tcl rename commandproc rename { oldName newName } { variable ::snit83::cmdTraceTable # Get caller's namespace since rename must be performed # in the context of the caller's namespace set callerNs "::" set callerLevel [expr {[info level] - 1}] if { $callerLevel > 0 } { set callerInfo [info level $callerLevel] set procName [lindex $callerInfo 0] set callerNs [namespace qualifiers $procName] } #puts "rename: callerNs: $callerNs" #puts "rename: '$oldName' -> '$newName'" #puts "rename: rcds - [join [array names cmdTraceTable] "\nrename: rcds - "]" set result [namespace eval $callerNs [concat __rename__ [list $oldName $newName]]] set index1 "rename,$oldName" set index2 "rename,::$oldName" foreach index [list $index1 $index2] { if [info exists cmdTraceTable($index)] { set cmd $cmdTraceTable($index) #puts "rename: '$cmd' { $oldName -> $newName }" ::unset cmdTraceTable($index) ;# prevent recursive tracing if {![string equal $newName ""]} { # Create a new trace record under the new name set cmdTraceTable(rename,$newName) $cmd } if [catch {eval $cmd $oldName \"$newName\" rename} err] { error $err } break } } return $result}#-----------------------------------------------------------------------# Private functionsproc ::snit83::private::NamespaceIsDescendantOf { parent child } { set result 0 foreach ns [__namespace__ children $parent] { if [string match $ns $child] { set result 1 break; } else { if [set result [NamespaceIsDescendantOf $ns $child]] { break } } } return $result}#-----------------------------------------------------------------------# Utility functionsproc ::snit83::traceAddCommand {name ops command} { variable cmdTraceTable #puts "::snit83::traceAddCommand n/$name/ o/$ops/ c/$command/" #puts "XX [join [array names cmdTraceTable] "\nXX "]" foreach op $ops { set index "$op,$name" #puts "::snit83::traceAddCommand: index = $index cmd = $command" set cmdTraceTable($index) $command }}proc ::snit83::traceRemoveCommand {name ops command} { variable cmdTraceTable #puts "::snit83::traceRemoveCommand n/$name/ o/$ops/ c/$command/" #puts "YY [join [array names cmdTraceTable] "\nYY "]" foreach op $ops { set index "$op,$name" #puts "::snit83::traceRemoveCommand: index = $index cmd = $command" catch { ::unset cmdTraceTable($index) } }}# Add support for 'unset -nocomplain'proc ::snit83::unset { args } { #puts "::snit83::unset - args: '$args'" set noComplain 0 if {[string equal [lindex $args 0] "-nocomplain"]} { set noComplain 1 set args [lrange $args 1 end] } if {[string equal [lindex $args 0] "--"]} { set args [lrange $args 1 end] } if [catch { uplevel 1 [linsert $args 0 ::unset] } err] { if { !$noComplain } { error $err } }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?