# # Copyright (c) 1993 by Sven Delmas # All rights reserved. # See the file COPYRIGHT for the copyright notes. global tkSteal_priv set tkSteal_priv(debug) 0 # this proc is taken from the beta code of the toolbox proc tkSteal_getarg {opts arg var} { set ind [lsearch $opts [concat $arg *]] if {$ind==-1} { error "ARG ERROR: application tried to find nonexistend arg \"$arg\"!" } # The variable named var will contain the value. upvar 1 $var varr set varr [lindex [lindex $opts $ind] 4] if {"[lindex [lindex $opts $ind] 3]" == "[lindex [lindex $opts $ind] 4]"} { return 0 } { return 1 } } # this proc is taken from the beta code of the toolbox proc tkSteal_parseargs {cmdline descr args} { if {$args!=""} {upvar 1 [lindex $args 0] changed} set changed {} for {set i 0} {$i<[llength $cmdline]} {incr i} { set name [lindex $cmdline $i] while {[llength $name]>0} { if {[llength $name]==1} { set value [lindex $cmdline [expr $i+1]] incr i } else { set value [lindex $name 1] set name [lindex $name 0] } # Find option set ind [lsearch $descr [concat $name *]] if {$ind==-1} { set ind [lsearch $descr $name] if {$ind==-1} { error "unknown option \"$name\"" } } lappend changed $name # Enter value set descr [lreplace $descr $ind $ind \ [lreplace [lindex $descr $ind] 4 4 $value]] set name [lreplace $name 0 1] } } # New optlist set new {} foreach item $descr { if {[llength $item]<=5} { lappend new $item } else { # XXX Maybe should demand the default to be in ready format... # So the exec. time might be a LITTLE faster. # # Eval the type getting actions. set act [lindex $item 5] regsub -all "%\(value\)" $act [lindex $item 3] act set item [lreplace $item 3 3 [eval $act]] set act [lindex $item 5] regsub -all "%\(value\)" $act [lindex $item 4] act lappend new [lreplace $item 4 4 [eval $act]] } } return $new } global tkSteal_ARGUMENTS set tkSteal_ARGUMENTS { {-background background Background #d9d9d9 #d9d9d9} {-borderwidth borderWidth BorderWidth 0 0} {-command command Command {} {}} {-foreground foreground Foreground black black} {-font font Font *-Courier-Medium-R-Normal-*-120-* *-Courier-Medium-R-Normal-*-120-*} {-name name Name {} {}} {-height height Height 20 20} {-relief relief Relief flat flat} {-stealwindowid stealWindowId WindowId 0 0} {-takefocus takeFocus TakeFocus 0 0} {-type type Type frame frame} {-width width Width 20 20} {-windowid windowId WindowId {} {}}} proc tkSteal {pathName args} { # CBInfo: autoload global tk_library global tkSteal_priv global tkSteal_ARGUMENTS # check if interpreter can access X catch "xaccess" result if {![string match "wrong # args*" $result]} { error "tkSteal: the command xaccess is not available" } # initialize the data set tkSteal_priv($pathName,initialized) 0 set tkSteal_priv($pathName,pid) 0 set tkSteal_priv($pathName,config) \ [tkSteal_parseargs $args $tkSteal_ARGUMENTS] # main frame frame $pathName -borderwidth 0 -class TkSteal rename $pathName $pathName-internal proc $pathName args " return \[eval tkSteal_command $pathName \$args\]" set index [lsearch $args -type] if {$index != -1 && "[lindex $args [expr $index + 1]]" == "frame"} { frame $pathName.cbl -borderwidth 0 } { label $pathName.cbl -borderwidth 0 -padx 1 -pady 1 } rename $pathName.cbl $pathName-cblinternal proc $pathName.cbl args " return \[eval tkSteal_command $pathName \$args\]" pack $pathName.cbl -side top -fill both -expand 1 bind $pathName.cbl " tkSteal_start $pathName" bind $pathName.cbl " tkSteal_stop $pathName" bind $pathName.cbl " $pathName redisplay" bind $pathName.cbl " $pathName redisplay" bind $pathName.cbl " $pathName redisplay" eval $pathName config $args } proc tkSteal_start {pathName} { global env global tkSteal_priv if {$tkSteal_priv($pathName,initialized) || "$pathName" == ""} { return } tkSteal_getarg $tkSteal_priv($pathName,config) -background background tkSteal_getarg $tkSteal_priv($pathName,config) -borderwidth borderwidth tkSteal_getarg $tkSteal_priv($pathName,config) -foreground foreground tkSteal_getarg $tkSteal_priv($pathName,config) -font font tkSteal_getarg $tkSteal_priv($pathName,config) -command command tkSteal_getarg $tkSteal_priv($pathName,config) -name name tkSteal_getarg $tkSteal_priv($pathName,config) -height height tkSteal_getarg $tkSteal_priv($pathName,config) -relief relief tkSteal_getarg $tkSteal_priv($pathName,config) -type type tkSteal_getarg $tkSteal_priv($pathName,config) -width width tkSteal_getarg $tkSteal_priv($pathName,config) -stealwindowid stealwindowid tkSteal_getarg $tkSteal_priv($pathName,config) -windowid windowid # run command if {"$command" != ""} { set newCommand $command regsub -all {\$background} $newCommand $background newCommand regsub -all {\$foreground} $newCommand $foreground newCommand regsub -all {\$font} $newCommand $font newCommand regsub -all {\$relief} $newCommand $relief newCommand regsub -all {\$width} $newCommand $width newCommand regsub -all {\$height} $newCommand $height newCommand regsub -all {\$name} $newCommand $name newCommand regsub -all {\$windowid} $newCommand $windowid newCommand regsub -all {\$stealwindowid} $newCommand [format %ld [winfo id $pathName.cbl]] newCommand regsub -all {\$\{background\}} $newCommand $background newCommand regsub -all {\$\{foreground\}} $newCommand $foreground newCommand regsub -all {\$\{font\}} $newCommand $font newCommand regsub -all {\$\{relief\}} $newCommand $relief newCommand regsub -all {\$\{width\}} $newCommand $width newCommand regsub -all {\$\{height\}} $newCommand $height newCommand regsub -all {\$\{name\}} $newCommand $name newCommand regsub -all {\$\{windowid\}} $newCommand $windowid newCommand regsub -all {\$\{stealwindowid\}} $newCommand [format %ld [winfo id $pathName.cbl]] newCommand #MDC #Added for tkgoodstuff to allow fvwm modules to be swallowed, etc. global Fvwm if {[info exists Fvwm(outid)] && [string match Fvwm* $newCommand]} { lappend finalCommand fvwm send 0 "Module $newCommand" } elseif {[string match "Tcl *" $newCommand]} { set finalCommand [string range $newCommand 4 end] } else { set finalCommand "eval exec $newCommand &" } if {[catch $finalCommand result]} { error $result } { set tkSteal_priv($pathName,pid) $result } } $pathName-internal conf -background $background $pathName-internal conf -borderwidth $borderwidth $pathName-internal conf -relief $relief $pathName-cblinternal conf -background $background if {"$type" != "frame"} { $pathName-cblinternal conf -padx 0 $pathName-cblinternal conf -pady 0 } if {"$width" != "" && $width != 0} { $pathName-cblinternal conf -width $width } if {"$height" != "" && $height != 0} { $pathName-cblinternal conf -height $height } $pathName conf -stealwindowid [format %ld [winfo id $pathName.cbl]] if {"$windowid" != ""} { if {[catch "xaccess eventreparent -parentwidget $pathName.cbl -windowid $windowid" ret]} { error "tkSteal_start: $ret" } } { if {"$name" != ""} { if {![catch "xaccess eventreparent -parentwidget $pathName.cbl -windowname \{$name\}" ret]} { $pathName conf -windowid $ret } { error "tkSteal_start: $ret" } } } set tkSteal_priv($pathName,initialized) 1 after 2000 $pathName redisplay } proc tkSteal_stop {pathName} { global tkSteal_priv catch "rename $pathName-internal \"\"" catch "rename $pathName-cblinternal \"\"" if {$tkSteal_priv($pathName,pid) != 0} { catch "exec kill $tkSteal_priv($pathName,pid)" set tkSteal_priv($pathName,pid) 0 } set tkSteal_priv($pathName,initialized) 0 return "" } proc tkSteal_command {pathName minorCommand args} { global tkSteal_priv case $minorCommand { {conf*} { if {[llength $args] == 0} { set result "" foreach element $tkSteal_priv($pathName,config) { lappend result [list [lindex $element 0] [lindex $element 1] [lindex $element 2] [lindex $element 3] [lindex $element 4]] } return $result } { if {[llength $args] == 1} { set resourceIndex [lsearch $tkSteal_priv($pathName,config) $args*] if {$resourceIndex != -1} { set element [lindex $tkSteal_priv($pathName,config) $resourceIndex] return [list [lindex $element 0] [lindex $element 1] [lindex $element 2] [lindex $element 3] [lindex $element 4]] } { error "unknown resource: $args" } } { set tkSteal_priv($pathName,config) \ [tkSteal_parseargs $args $tkSteal_priv($pathName,config)] for {set counter 0} {$counter < [llength $args]} {incr counter} { case [lindex $args $counter] { {-back*} { tkSteal_getarg $tkSteal_priv($pathName,config) \ -background background $pathName-internal conf -background $background $pathName-cblinternal conf -background $background } {-border*} { tkSteal_getarg $tkSteal_priv($pathName,config) \ -borderwidth borderwidth $pathName-internal conf -borderwidth $borderwidth } {-reli*} { tkSteal_getarg $tkSteal_priv($pathName,config) \ -relief relief $pathName-internal conf -relief $relief } {-heig*} { tkSteal_getarg $tkSteal_priv($pathName,config) \ -height height $pathName-cblinternal conf -height $height } {-widt*} { tkSteal_getarg $tkSteal_priv($pathName,config) \ -width width $pathName-cblinternal conf -width $width } } incr counter } } } } {focusin} { if {$tkSteal_priv($pathName,initialized)} { tkSteal_getarg $tkSteal_priv($pathName,config) \ -windowid windowid catch "xaccess eventfocusin \ -windowid $windowid" } } {focusout} { if {$tkSteal_priv($pathName,initialized)} { tkSteal_getarg $tkSteal_priv($pathName,config) \ -windowid windowid catch "xaccess eventfocusout \ -windowid $windowid" } } {redi*} { if {$tkSteal_priv($pathName,initialized)} { tkSteal_getarg $tkSteal_priv($pathName,config) \ -windowid windowid catch "xaccess eventconfigure \ -windowid $windowid \ -borderwidth 0 \ -x [winfo rootx [winfo toplevel $pathName]] \ -y [winfo rooty [winfo toplevel $pathName]] \ -width [winfo width $pathName.cbl] \ -height [winfo height $pathName.cbl]" } } {buttonclick} { if {[llength $args] != 1 && [llength $args] != 2} { error "wrong # of args: should be \"$pathName buttonclick button ?state?\"" } tkSteal_getarg $tkSteal_priv($pathName,config) \ -windowid windowid if {[llength $args] == 1} { catch "xaccess eventbuttonpress -windowid $windowid -button [lindex $args 0]" catch "xaccess eventbuttonrelease -windowid $windowid -button [lindex $args 0]" } { catch "xaccess eventbuttonpress -windowid $windowid -button [lindex $args 0] -state [lindex $args 1]" catch "xaccess eventbuttonrelease -windowid $windowid -button [lindex $args 0] -state [lindex $args 1]" } } {buttonpress} { if {[llength $args] != 1 && [llength $args] != 2} { error "wrong # of args: should be \"$pathName buttonpress button ?state?\"" } tkSteal_getarg $tkSteal_priv($pathName,config) \ -windowid windowid if {[llength $args] == 1} { catch "xaccess eventbuttonpress -windowid $windowid -button [lindex $args 0]" } { catch "xaccess eventbuttonpress -windowid $windowid -button [lindex $args 0] -state [lindex $args 1]" } } {buttonrelease} { if {[llength $args] != 1 && [llength $args] != 2} { error "wrong # of args: should be \"$pathName buttonpress button ?state?\"" } tkSteal_getarg $tkSteal_priv($pathName,config) \ -windowid windowid if {[llength $args] == 1} { catch "xaccess eventbuttonrelease -windowid $windowid -button [lindex $args 0]" } { catch "xaccess eventbuttonrelease -windowid $windowid -button [lindex $args 0] -state [lindex $args 1]" } } {keyclick} { if {[llength $args] != 1 && [llength $args] != 2} { error "wrong # of args: should be \"$pathName keytype keycode ?state?\"" } tkSteal_getarg $tkSteal_priv($pathName,config) \ -windowid windowid if {[llength $args] == 1} { catch "xaccess eventkeypress -windowid $windowid -keycode [lindex $args 0]" catch "xaccess eventkeyrelease -windowid $windowid -keycode [lindex $args 0]" } { catch "xaccess eventkeypress -windowid $windowid -keycode [lindex $args 0] -state [lindex $args 1]" catch "xaccess eventkeyrelease -windowid $windowid -keycode [lindex $args 0] -state [lindex $args 1]" } } {keypress} { if {[llength $args] != 1 && [llength $args] != 2} { error "wrong # of args: should be \"$pathName keypress keycode ?state?\"" } tkSteal_getarg $tkSteal_priv($pathName,config) \ -windowid windowid if {[llength $args] == 1} { catch "xaccess eventkeypress -windowid $windowid -keycode [lindex $args 0]" } { catch "xaccess eventkeypress -windowid $windowid -keycode [lindex $args 0] -state [lindex $args 1]" } } {keyrelease} { if {[llength $args] != 1 && [llength $args] != 2} { error "wrong # of args: should be \"$pathName keyrelease keycode ?state?\"" } tkSteal_getarg $tkSteal_priv($pathName,config) \ -windowid windowid if {[llength $args] == 1} { catch "xaccess eventkeyrelease -windowid $windowid -keycode [lindex $args 0]" } { catch "xaccess eventkeyrelease -windowid $windowid -keycode [lindex $args 0] -state [lindex $args 1]" } } {sendstring} { if {[llength $args] != 1 && [llength $args] != 2} { error "wrong # of args: should be \"$pathName sendstring string ?interval?\"" } tkSteal_getarg $tkSteal_priv($pathName,config) \ -windowid windowid if {[llength $args] == 1} { catch "xaccess sendstring -windowid $windowid -data \{[lindex $args 0]\}" } { catch "xaccess sendstring -windowid $windowid -data \{[lindex $args 0]\} -interval [lindex $args 1]" } } {motion} { if {[llength $args] != 1 && [llength $args] != 2} { error "wrong # of args: should be \"$pathName motion x y\"" } tkSteal_getarg $tkSteal_priv($pathName,config) \ -windowid windowid catch "xaccess eventmotion -windowid $windowid -x [lindex $args 0] -y [lindex $args 1]" } {stoptksteal} { if {[llength $args] != 0} { error "wrong # of args: should be \"$pathName stoptksteal\"" } tkSteal_stop $pathName } } return "" } proc tkSteal_redisplay {pathName} { global tkSteal_priv if {$tkSteal_priv($pathName,initialized)} { $pathName redisplay } } # eof