Posted to tcl by marc.ziegenhagen at Tue May 24 10:33:11 GMT 2011view raw
- package require Tk
- package require dde
- set Program(name) $argv0
- set Program(callname) {}
- set Program(debugfile) [file rootname $Program(name)].log
- set Program(DDEservices) {}
- set Options(-DDE) {}
- set Options(-Call) {}
- set Options(-CallEntry) {test.tcl}
- set Tick(begin) [clock clicks]
- set Tick(last) $Tick(begin)
- proc Debug {msg} {
- set step [clock clicks]
- set diff [expr $step - $::Tick(begin)]
- set difflast [expr $step - $::Tick(last)]
- set ::Tick(last) $step
- set fd [open $::Program(debugfile) a+]
- set line [format "%8s %12s %8d %8d %s" [pid] $step $diff $difflast $msg]
- puts $fd $line
- puts $line
- close $fd
- }
- proc Call {{prg {}} args} {
- global Program Options
- if {![string length $prg]} {
- set prg $Options(-CallEntry)
- }
- Debug "Call $prg $args"
- set name [GetUniqueName $prg]
- set Program(callname) $name
- set cmd "tclsh $prg [concat -DDE $name $args]"
- Debug "open |$cmd r"
- set Program(callfd) [open |$cmd r]
- fconfigure $Program(callfd) -blocking 0 -buffering line
- fileevent $Program(callfd) readable "Callback $Program(callfd)"
- Debug "exec done"
- }
- proc Callback {sock} {
- global Program
- #Debug "Callback $sock"
- if {[gets $sock line] < 0} {
- Debug "$sock: EOF"
- fileevent $sock readable {}
- set Program(callfd) {}
- return
- }
- #Debug "Callback $sock: $line"
- }
- proc SetUniqueName {{name {}}} {
- set serv [GetUniqueName $name]
- Debug "SetUniqueName: \[dde servername $serv]"
- dde servername $serv
- Debug "SetUniqueName: $serv"
- return $serv
- }
- proc GetUniqueName {{name {}}} {
- global Program
- if {![string length $name]} {
- set name $Program(name)
- }
- Debug "GetUniqueName: $name"
- set i 2
- set serv $name
- set new $name-$i
- Debug "GetUniqueName: \[dde eval $name {dde servername}]"
- set err [catch {dde eval $name {dde servername}} ret]
- Debug "GetUniqueName: err=$err ret=$ret"
- while { $err == 0 } {
- Debug "GetUniqueName: \[dde eval $new {dde servername}]"
- set err [catch {dde eval $new {dde servername}} ret]
- Debug "GetUniqueName: err=$err ret=$ret"
- set serv $new
- incr i
- set new $name-$i
- }
- Debug "GetUniqueName: $serv"
- return $serv
- }
- proc GetDDEservices {{topic {TclEval}} args} {
- global Program
- Debug "GetDDEServices: \[dde services $topic {}]"
- set Program(DDEservices) [dde services $topic {}]
- Debug "GetDDEServices: $Program(DDEservices)"
- }
- proc CreateGui {w} {
- if {$w != "."} {
- set w ${w}.
- }
- pack [frame .f1] -side top
- pack [label .f1.lpn -text Programmname] -side left
- pack [label .f1.epn -textvariable Program(name)] -side left
- pack [frame .f2] -side top
- pack [label .f2.lcn -text Callname] -side left
- pack [label .f2.ecn -textvariable Program(callname)] -side left
- pack [frame .f3] -side top
- pack [label .f3.lce -text "Call Programm"] -side left
- pack [entry .f3.ece -textvariable Options(-CallEntry)] -side left
- pack [button .f3.bca -text "Call" -command Call]
- pack [frame .f4] -side top
- pack [label .f4.lde -text "DDE Services"] -side left
- pack [label .f4.ede -textvariable Program(DDEservices)] -side left
- pack [button .f4.bge -text "Get" -command GetDDEservices]
- pack [button .bu -text "Ende" -command exit]
- update
- }
- # Main
- Debug "argv=$argv argc=$argc"
- if {$argc > 0} {
- catch {array set Options $argv}
- }
- CreateGui .
- GetDDEservices
- if {[string length $Options(-DDE)]} {
- Debug "SetUniqueName $Options(-DDE)"
- set Program(name) [SetUniqueName $Options(-DDE)]
- } else {
- SetUniqueName
- }
- GetDDEservices
- if {[string length $Options(-Call)]} {
- Debug "Call $Options(-Call) -Test 1"
- Call $Options(-Call) -Test 1
- }
- GetDDEservices
- vwait forever