bug #533493: support trace under all comms types for scalar and array vars. r5_1_6p9
authorPat Thoyts <patthoyts@users.sourceforge.net>
Wed, 9 Oct 2002 00:32:54 +0000 (00:32 +0000)
committerPat Thoyts <patthoyts@users.sourceforge.net>
Wed, 9 Oct 2002 00:32:54 +0000 (00:32 +0000)
ChangeLog
globals_list.tcl
tkinspect.tcl

index 3d93ec9785c96da320e653cd890657a2b8816e0f..03f00c052da58766d8447e55ca3c681cd9b47ca4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Wed Oct 09 01:27:43 2002  Pat Thoyts <patthoyts@users.sourceforge.net>
+
+       * tkinspect.tcl:
+       * globals_list.tcl: Implemented trace for all the supported 'send'
+       varieties. This fixes bug #533493.
+       
 Sat Apr 20 01:27:46 2002  Pat Thoyts <patthoyts@users.sourceforge.net>
 
        * windows_list.tcl: Fixed bug #546259: erroneous use of 'config'
index 4dd0603cd512b44fd1e32d4b01d4b6239fb51a51..a8b1c5d49c2447c189ba951b552a870ffcf8c542 100644 (file)
@@ -30,16 +30,18 @@ dialog variable_trace {
        text $self.t -yscroll "$self.sb set" -setgrid 1
        pack $self.sb -side right -fill y
        pack $self.t -side right -fill both -expand 1
+        set where [set ::[subst $slot(main)](target,self)]
        if {![send $slot(target) array exists $slot(variable)]} {
-           set slot(trace_cmd) "send [winfo name .] $self update_scalar"
+           set slot(trace_cmd) "send $where $self update_scalar"
            $self update_scalar "" "" w
            set slot(is_array) 0
            set title "Trace Scalar"
        } else {
-           set slot(trace_cmd) "send [winfo name .] $self update_array"
+           set slot(trace_cmd) "send $where $self update_array"
            set slot(is_array) 1
            set title "Trace Array"
        }
+        $self check_remote_send
        send $slot(target) \
            [list trace variable $slot(variable) wu $slot(trace_cmd)]
        wm title $self "$title: $slot(target)/$slot(variable)"
@@ -102,6 +104,56 @@ dialog variable_trace {
        close $fp
        $slot(main) status "Trace saved to \"$file\"."
     }
+    method check_remote_send {} {
+        # ensure that the current target has a valid send command
+        # This is commonly not the case under Windows.
+        set cmd [send $slot(target) [list info commands ::send]]
+        set type [set ::[subst $slot(main)](target,type)]
+
+        # If we called in using 'comm' then even if we do have a built
+        # in send we need to also support using comm.
+        if {[string match $type "comm"]} {
+            set script {
+                if [string match ::send [info command ::send]] {
+                    rename ::send ::tk_send
+                }
+                proc send {app args} {
+                    if [string match {[0-9]*} $app] {
+                        eval ::comm::comm send [list $app] $args
+                    } else {
+                        eval ::tk_send [list $app] $args
+                    }
+                }
+            }
+            set cmd [send $slot(target) $script]
+            $slot(main) status "comm: $cmd"
+        }
+
+        if {$cmd == {}} {
+            switch -exact -- $type {
+                winsend {
+                    set script {
+                        proc ::send {app args} {
+                            eval winsend send [list $app] $args
+                        }
+                    }
+                    send $slot(target) $script
+                }
+                dde {
+                    set script {
+                        proc send {app args} {
+                            eval dde eval [list $app] $args
+                        }
+                    }
+                    send $slot(target) $script
+                }
+                default {
+                    $slot(main) status "Target requires \"send\" command."
+                }
+            }
+        }
+        return $cmd
+    }
 }
 
 proc create_variable_trace {main target var} {
index 814e2ef903e4076846ad14c0f746ae9b5e9c33b8..51af45b83955531ed87805bdc476a86b3a37423a 100644 (file)
@@ -227,9 +227,15 @@ dialog tkinspect_main {
     method close {} {
        after 0 destroy $self
     }
-    method set_target {target} {
+    method set_target {target {type send}} {
         global tkinspect
        set slot(target) $target
+        set slot(target,type) $type
+        if {$type == "comm"} {
+            set slot(target,self) [comm::comm self]
+        } else {
+            set slot(target,self) [winfo name .]
+        }
        $self update_lists
        foreach cmdline $slot(cmdlines) {
            $cmdline set_target $target
@@ -271,7 +277,7 @@ dialog tkinspect_main {
             set winsend 1
             foreach interp [winsend interps] {
                 $m add command -label $interp \
-                    -command [list $self set_target $interp]
+                    -command [list $self set_target $interp winsend]
             }
         }
         if {[package provide dde] != {}} {
@@ -284,7 +290,7 @@ dialog tkinspect_main {
                     set app $label
                 }
                 $m add command -label $label \
-                    -command [list $self set_target $app]
+                    -command [list $self set_target $app dde]
             }
         } else {
             foreach interp [winfo interps] {
@@ -303,7 +309,7 @@ dialog tkinspect_main {
                set label "$interp ([file tail [send $interp set argv0]])"
            }
            $m add command -label $label \
-               -command [list $self set_target $interp]
+               -command [list $self set_target $interp comm]
        }
     }
     method status {msg} {
@@ -446,7 +452,7 @@ dialog connect_interp {
        if ![string match {[0-9]*} $text] return
        comm::comm connect $text
        wm withdraw $self
-       $slot(value) set_target $text
+       $slot(value) set_target $text comm
     }
 }