tkgoodstuff/tcl/tkSteal.tcl

451 lines
16 KiB
Tcl
Raw Permalink Normal View History

#
# 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 <Map> "
tkSteal_start $pathName"
bind $pathName.cbl <Destroy> "
tkSteal_stop $pathName"
bind $pathName.cbl <Expose> "
$pathName redisplay"
bind $pathName.cbl <Configure> "
$pathName redisplay"
bind $pathName.cbl <Leave> "
$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