#!/bin/sh # \ exec wish8.0 $0 $@ # NAME # W3cat - GUI wrapper for w3cat to download files from the Web # # SYNOPSIS # W3cat [file]... # # REQUIRES # # DESCRIPTION # # CONFIG # # OPTIONS # # BUGS # # SEE ALSO # # AUTHOR # John Chambers set myname [wm title .] set me [lindex $myname 0] set URL {} set FIL {} wm title . "Copy URL to file" if [info exists env(D_$me)] {set D $env(D_$me)} else {set D 1} if [info exists env(B_$me)] {set B $env(B_$me)} else {set B 0} if [info exists env(R_$me)] {set R $env(R_$me)} else {set R ridge} if [info exists env(EDITOR)] {set E $env(EDITOR)} else {set E vi} if [info exists env(TMPDIR)] {set Tmpdir $env(TMPDIR)} else {set Tmpdir /tmp} if [info exists env(IMGDIR)] {set Imgdir $env(IMGDIR)} else {set Imgdir /tmp} if {$argc > 0} { set URL [lindex $argv 0] } if {$argc > 1} { set FIL [lindex $argv end] } set BB {-padx 3 -pady 0 -highlightthickness 0 -bd 2 -relief ridge} set EB {-highlightthickness 0 -bd $B -relief $R} set FB {-bd $B -relief ridge} set IB {-bd $B -relief ridge} # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # # Load in some useful packages. We can't use Source until we've loaded it, # # so the first line here is a bit complicated. Then Loadfile takes care of it # # for us. # # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # foreach d [split $env(PATH) :] {if [file exists $d/Source.tcl] {source $d/Source.tcl;break}} Source Help.w Source Dbg.w Source H_wait set cmdFil {} set cmdPid {} set message {Edit the URL and file name, and press Load or Return:} set reading 0 set sizFil - # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # proc getURL {} { global D me cmdFil cmdPid message URL FIL reading if {$D>1} {puts "$me/getURL URL=\"$URL\" FIL=\"$FIL\""} set cmd "w3cat -O$FIL $URL" if {$D>1} {puts "$me/getURL cmd=\"$cmd\""} # if [catch {exec touch $FIL} x] { # set msg "Can't touch \"$FIL\" ($x)" # return # } if [catch {open "| $cmd" r} f] { set message "Error: $f" return } set reading 1 Waiting set cmdPid [pid $f] set message "Press the spinning line to stop the transfer ..." fileevent [set cmdFil $f] readable "CmdRdr $f" after 1000 FileSize } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # proc CloseFil {f c} { global D me message reading if [catch {close $f} x] {set message "\"close $f\" gave \"$x\""} set message Done. set reading 0 WaitDone $c } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # proc CmdRdr {f} { global D me message if [eof $f] { set msg "Done ..." CloseFil $f * return } if {[gets $f line] < 0} { set message "EOF from $f" CloseFil $f + return } set message $line } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # proc FileSize {} { global D me FIL sizFil reading if [file exists $FIL] { if {[set n [file size $FIL]] != $sizFil} { if {$reading} Tick set sizFil $n } } else { set sizFil {} } if {$reading} {after 100 FileSize} } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # # Create the "Cmds" menu widget. proc menuCmds {w X Y} { global D me if {$D>1} {puts "$me/menuCmds X=$X Y=$Y ..."} if [winfo exists .b.bCmds.menu] {destroy .b.bCmds.menu} menu .b.bCmds.menu .b.bCmds.menu add command -label Load -command getURL .b.bCmds.menu add command -label Quit -command exit if {$X && $Y} {tk_popup .b.bCmds.menu $X $Y} } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # proc Stop {} { global D me message cmdPid cmdFil set message "Stop ..." update idletasks if [catch {exec kill -TERM $cmdPid} x] { set message "\"exec kill -TERM $cmdPid\" gave $x" return } set message "Stopped." } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # # Now we fill our window with widgets: frame .b -bd 2 -relief ridge ;# Holds folder selection menus/buttons pack .b -side top -fill x eval menubutton .b.bCmds -text Cmds -menu .b.bCmds.menu -padx 0 -pady 0 $BB bind .b.bCmds {menuCmds .t.txt %X %Y} pack .b.bCmds -in .b -side left menuCmds .t.txt 0 0 eval frame .b.re -bd 1 -relief $R eval button .b.re.bWheel $BB -relief raised -textvariable waitchr -command Stop eval button .b.re.bAgain $BB -relief raised -text Load -command getURL pack .b.re.bWheel .b.re.bAgain -in .b.re -side left pack .b.re -in .b -side left Dbg .b -padx 0 -pady 0 -highlightthickness 0 eval button .b.quit -text Quit -bd 2 -command exit -highlightthickness 0 pack .b.quit -in .b -side right entry .m -textvariable message -width 0 -bg black -fg yellow pack .m -side top -expand 1 -fill x frame .u -bd 2 -relief ridge pack .u -side top -expand 1 -fill x label .u.lbl -text URL: pack .u.lbl -in .u -side left entry .u.url -textvariable URL -width 0 pack .u.url -in .u -side left -expand 1 -fill x frame .f -bd 2 -relief ridge pack .f -side top -expand 1 -fill x label .f.lbl -text File pack .f.lbl -in .f -side left entry .f.fil -textvariable FIL -width 0 pack .f.fil -in .f -side left -expand 1 -fill x bind .f.fil getURL frame .b.s -bd 2 -relief ridge pack .b.s -in .b -side left label .b.s.lbl -text Size pack .b.s.lbl -in .b.s -side left label .b.s.siz -textvariable sizFil -width 0 pack .b.s.siz -in .b.s -side left bind .b.s.siz getURL if {$FIL == {}} { if ![regexp {(.*)/(.*)$} $URL {} foo fil] {set fil {}} set FIL [pwd]/$fil }