Sweden-Number/tools/wineconf.libs/autoconf.tcl

648 lines
19 KiB
Tcl

# Copyright 1999 Jean-Louis Thirot
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
proc TkW:autoconf {outfile} {
# This files scans the fstab, then creates a wine.conf file
# parsed to wineconf for further editings....
# MS DOS drives are sorted following the rules explained in tools/wineconf
global PATH
global TMPLetter WINLetter SYSLetter
global OUTF
set OUTF [open $outfile w]
TkW:InitNewConfig
set err [TkW:readFStab]
TkW:SortDosDrives
TkW:addRootDrives
set TMP [TkW:SearchTmp]
TkW:ShowDrives
set Windows [TkW:FindWindows]
set System "$Windows/system"
set Windows [TkW:Unix2Dos $Windows]
set System [TkW:Unix2Dos $System]
TkW:MiscEndConf $TMP
puts $OUTF "\[Wine\]\nwindows=$Windows"
puts $OUTF "system=$System"
puts $OUTF "Temp=[TkW:Unix2Dos $TMP]"
puts $OUTF "Path= $Windows\;$System\;$PATH"
#Quick and dirty... I'm tired now!
#puts $OUTF "SymbolTableFile=[exec find / -name wine.sym -print]"
puts $OUTF "printer=on"
puts $OUTF ""
puts $OUTF "\[DllDefaults\]"
puts $OUTF "\;EXTRA_LD_LIBRARY_PATH=\$\{HOME\}/wine/cvs/lib"
puts $OUTF ""
puts $OUTF "\[DllPairs\]"
puts $OUTF "kernel = kernel32"
puts $OUTF "gdi = gdi32"
puts $OUTF "user = user32"
puts $OUTF "commdlg = comdlg32"
puts $OUTF "commctrl= comctl32"
puts $OUTF "ver = version"
puts $OUTF "shell = shell32"
puts $OUTF "lzexpand= lz32"
puts $OUTF "mmsystem= winmm"
puts $OUTF "msvideo = msvfw32"
puts $OUTF "winsock = wsock32"
puts $OUTF ""
puts $OUTF "\[DllOverrides\]"
puts $OUTF "kernel32, gdi32, user32 = builtin"
puts $OUTF "kernel, gdi, user = builtin"
puts $OUTF "toolhelp = builtin"
puts $OUTF "comdlg32, commdlg = elfdll, builtin, native"
puts $OUTF "version, ver = elfdll, builtin, native"
puts $OUTF "shell32, shell = builtin, native"
puts $OUTF "lz32, lzexpand = builtin, native"
puts $OUTF "commctrl, comctl32 = builtin, native"
puts $OUTF "sock32, winsock = builtin"
puts $OUTF "advapi32, crtdll, ntdll = builtin, native"
puts $OUTF "mpr, winspool = builtin, native"
puts $OUTF "ddraw, dinput, dsound = builtin, native"
puts $OUTF "winmm, mmsystem = builtin"
puts $OUTF "msvideo, msvfw32 = builtin, native"
puts $OUTF "w32skrnl = builtin"
puts $OUTF "wnaspi32, wow32 = builtin"
puts $OUTF "system, display, wprocs = builtin"
puts $OUTF "wineps = builtin"
puts $OUTF ""
puts $OUTF "\[options\]"
puts $OUTF "AllocSystemColors=100"
puts $OUTF ""
puts $OUTF "\[fonts\]"
puts $OUTF "Resolution = 96 "
puts $OUTF "Default = -adobe-times-"
puts $OUTF ""
puts $OUTF "\[serialports\]"
puts $OUTF "Com1=/dev/ttyS0"
puts $OUTF "Com2=/dev/ttyS1"
puts $OUTF "Com3=/dev/modem,38400"
puts $OUTF "Com4=/dev/modem"
puts $OUTF ""
puts $OUTF "\[parallelports\]"
puts $OUTF "Lpt1=/dev/lp0"
puts $OUTF ""
puts $OUTF "\[spooler\]"
puts $OUTF "LPT1:=|lpr"
puts $OUTF "LPT2:=|gs -sDEVICE=bj200 -sOutputFile=/tmp/fred -q -"
puts $OUTF "LPT3:=/dev/lp3"
puts $OUTF ""
puts $OUTF "\[ports\]"
puts $OUTF "\;read=0x779,0x379,0x280-0x2a0"
puts $OUTF "\;write=0x779,0x379,0x280-0x2a0"
puts $OUTF ""
puts $OUTF "\[spy\]"
puts $OUTF "Exclude=WM_SIZE"
puts $OUTF ";WM_TIMER"
puts $OUTF ""
puts $OUTF "\[Tweak.Layout\]"
puts $OUTF ";WineLook=xxx (supported styles are \'Win31\'(default),"
puts $OUTF ";\'Win95\', \'Win98\')"
puts $OUTF "WineLook=Win31"
puts $OUTF ""
puts $OUTF "\[programs\]"
puts $OUTF "Default=]"
puts $OUTF "Startup="
close $OUTF
}
proc TkW:readFStab {} {
global AlternateFstab OK CANCEL
if {![file exist /etc/fstab]} {
TkW:GetFileName $AlternateFstab $OK $CANCEL File
TkW:FStabError 1
return 1
} else {
set FSTAB "/etc/fstab"
}
if {![file readable $FSTAB]} {TkW:FStabError 2;return 1}
set FStab [open /etc/fstab]
while {![eof $FStab]} {
gets $FStab line
set line [string trim $line]
if {[string range $line 0 0] != "#" && $line != ""} {
#we have an entry
switch [lindex $line 2] {
swap {}
proc {}
minix {TkW:addUnixDrive $line}
ext2 {TkW:addUnixDrive $line}
xiafs {TkW:addUnixDrive $line}
vfat {TkW:addDosDrive $line}
msdos {TkW:addDosDrive msdos}
hpfs {TkW:addDosDrive $line}
iso9660 {TkW:addCdRomDrive $line}
nfs {TkW:addNetDrive $line}
auto {TkW:addAutoDrive $line}
default {TkW:unknownDeviceType $line}
}
}
}
}
proc TkW:addRootDrives {} {
global RootDrives1 RootDrives2 OK CANCEL WAIT lineroot ADD REMOVE
global NunixDrives UnixPath UnixDevice UnixLabel UnixType UnixSerial UnixFS
global exclude All
set drivelist ""
set drivelist "$drivelist [glob -nocomplain /*]"
set List ""
set excludes "$exclude /boot /lost+found /lib /etc /var /sbin /initrd\
/cdrom /floppy /include /man /dev /proc /bin /mnt /tmp"
set n 0
foreach i $drivelist {
if {[file isdir $i]} {
set skip 0
foreach k $excludes {
if {$k == $i} {
set skip 1
}
}
if {$skip == 0} {set List "$List$i "}
}
}
set List [lsort $List]
set n 0
foreach i $List {
set All($n) $i;set n [expr $n + 1]
}
set dev [lindex $lineroot 0]
toplevel .rootDr -background #ffffff
wm title .rootDr "Wine Autoconfigurator"
label .rootDr.banner -backgr #0000ff -foregr #ffffff \
-text "$RootDrives1$dev $RootDrives2" \
-wraplength 300
pack .rootDr.banner -fill x
frame .rootDr.lists -backgr #ffffff
pack .rootDr.lists -padx 10 -pady 10
listbox .rootDr.lists.left -width 20 -height 10
pack .rootDr.lists.left -padx 10 -pady 0 -side left
frame .rootDr.lists.buttons -backgr #ffffff
pack .rootDr.lists.buttons -padx 10 -pady 0 -side left
button .rootDr.lists.buttons.add -text "$ADD >>" -width 8\
-command {TkW:AddRootDrInList [.rootDr.lists.left cursel]}
pack .rootDr.lists.buttons.add -padx 10 -pady 0 -side top
button .rootDr.lists.buttons.space -text "" -backgr #ffffff \
-border 0 -highlightb #ffffff -relief flat -width 8 -state disabled
pack .rootDr.lists.buttons.space -padx 10 -pady 0 -side top
button .rootDr.lists.buttons.rem -text "<< $REMOVE" -width 8\
-command {TkW:RemRootDrInList [.rootDr.lists.right cursel]}
pack .rootDr.lists.buttons.rem -padx 10 -pady 0 -side top
listbox .rootDr.lists.right -width 20 -height 10
pack .rootDr.lists.right -padx 10 -pady 0
frame .rootDr.cmd -background #ffffff
pack .rootDr.cmd -side bottom -anchor c -pady 5
button .rootDr.cmd.ok -text OK -width 8 \
-command {destroy .rootDr;set WAIT 0}
pack .rootDr.cmd.ok -side left
foreach i $List {
.rootDr.lists.left insert end $i
}
global ToAddList;set ToAddList ""
bind .rootDr.lists.left <Double-ButtonPress-1> {
TkW:AddRootDrInList [.rootDr.lists.left nearest %y]}
bind .rootDr.lists.right <Double-ButtonPress-1> {
TkW:RemRootDrInList [.rootDr.lists.right nearest %y]}
set WAIT wait
while {$WAIT == "wait" } {update}
foreach i $ToAddList {
set NunixDrives [expr $NunixDrives + 1]
set UnixPath($NunixDrives) $i
set exclude "$exclude$UnixPath($NunixDrives) "
set UnixLabel($NunixDrives) $i
set UnixType($NunixDrives) hd
set UnixFS($NunixDrives) win95
}
}
proc TkW:AddRootDrInList {N} {
global All ToAddList Nadd Add
if {![info exists All($N)]} {return}
foreach i $ToAddList {
if {$i == $All($N)} {return}
}
set ToAddList [lsort "$ToAddList $All($N)"]
.rootDr.lists.right delete 0 end
set Nadd 0
foreach i $ToAddList {
.rootDr.lists.right insert end $i
set Add($Nadd) $i
set Nadd [expr $Nadd + 1]
}
}
proc TkW:RemRootDrInList {N} {
global All ToAddList Nadd Add
if {![info exists Add($N)]} {return}
set NewList ""
foreach i $ToAddList {
if {$i != $Add($N)} {set NewList "$NewList$i "}
}
set ToAddList $NewList
set Nadd 0
.rootDr.lists.right delete 0 end
foreach i $ToAddList {
.rootDr.lists.right insert end $i
set Add($Nadd) $i
set Nadd [expr $Nadd + 1]
}
}
proc TkW:addUnixDrive {line} {
global lineroot
#pre-processing for the case of the root:
if {![file exists [lindex $line 1]]} {return}
if {[lindex $line 1] != "/"} { TkW:addUnixDriveOK $line} {set lineroot $line}
}
proc TkW:addUnixDriveOK {line} {
# for now, I'll consider any unix file as ext2...
# may be this should improve a bit!
global NunixDrives UnixPath UnixDevice UnixLabel UnixType UnixSerial UnixFS
global TMPDRIVE HOMEDRIVE exclude
set NunixDrives [expr $NunixDrives +1]
set UnixDevice($NunixDrives) [lindex $line 0]
set UnixType($NunixDrives) "hd"
set UnixPath($NunixDrives) [lindex $line 1]
set exclude "$exclude$UnixPath($NunixDrives) "
set UnixLabel($NunixDrives) "UNIX $NunixDrives"
if {[string first "/tmp" $UnixPath($NunixDrives)] > 0 && $TMPDRIVE == 0} {
set UnixLabel($NunixDrives) "TEMP"
}
if {[string first "/home" $UnixDevice($NunixDrives)] > 0 && $HOMEDRIVE == 0} {
set UnixLabel($NunixDrives) "HOME"
}
set UnixDevice($NunixDrives) ""
set UnixSerial($NunixDrives) ""
set UnixFS($NunixDrives) "win95"
set UnixType($NunixDrives) "hd"
}
proc TkW:addDosDrive {line} {
# for now, I'll consider any dos file as ext2...
# may be this should improve a bit!
global NdosDrives DosPath DosDevice DosLabel DosType DosSerial DosFS
global TMPDRIVE HOMEDRIVE exclude
if {![file exists [lindex $line 1]]} {return}
if { [string first "/dev/fd" [lindex $line 0]] == 0 } {
TkW:addFloppy $line
return
}
set NdosDrives [expr $NdosDrives +1]
set DosDevice($NdosDrives) [lindex $line 0]
set DosPath($NdosDrives) [lindex $line 1]
set exclude "$exclude$DosPath($NdosDrives) "
set DosLabel($NdosDrives) ""
set DosType($NdosDrives) "win95"
if {[lindex $line 2] == "msods"} {
set DosFS($NdosDrives)
} else {
set DosFS($NdosDrives) "win95"
}
set DosSerial($NdosDrives) ""
}
proc TkW:unknownDeviceType {line} {
TkW:message "Error\n\
[lindex $line 0] (mounted on [lindex $line 1]) : Unknown device type. Please, mail thirot@univ-brest.fr for me to add this filesystem to the list of detected FS.\n\
\n Thank you.\
\n Jean-Louis Thirot"
global WAIT
set WAIT wait
while {$WAIT == "wait"} {update}
}
proc TkW:InitNewConfig {} {
global NunixDrives UnixPath UnixDevice UnixLabel UnixType UnixSerial UnixFS
global NdosDrives DosPath DosDevice DosLabel DosType DosSerial DosFS
global Ncdroms CDPath CDDevice CDLabel CDType CDSerial CDFS
global Nfloppys FLOPPYPath FLOPPYDevice FLOPPYLabel FLOPPYType FLOPPYSerial FLOPPYFS
global NnetDrives
global TMPDRIVE HOMEDRIVE
global exclude; set exclude ""
set TMPDRIVE 0
set HOMEDRIVE 0
set NunixDrives 0
set NdosDrives 0
set Ncdroms 0
set Nfloppys 0
set NnetDrives 0
}
proc TkW:ShowDrives {} {
global NunixDrives UnixPath UnixDevice UnixLabel UnixType UnixSerial UnixFS
global NdosDrives DosPath DosDevice DosLabel DosType DosSerial DosFS
global Ncdroms CDPath CDDevice CDLabel CDType CDSerial CDFS
global NnetDrives NetPath NetLabel
global Nfloppys FLOPPYPath
global DriveRank DRIVEUNIXPATH DRIVEDOSPATH NDRIVES
global OUTF
set NDRIVES 0
set letters {let: C D E F G H I J K L M N O P Q R S T U V W X Y Z}
set lettersF {let: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z}
for {set i 1} {$i <= $NdosDrives} {set i [expr $i + 1]} {
set NDRIVES [expr $NDRIVES + 1]
set rank $DriveRank($i)
puts $OUTF "\[Drive [lindex $letters $i]\]"
set Letter($NDRIVES) [lindex $letters $i]
set DRIVEUNIXPATH($NDRIVES) $DosPath($rank)
set DRIVEDOSPATH($NDRIVES) "[lindex $letters $i]:\\"
puts $OUTF "Path=$DosPath($rank)"
puts $OUTF "Type=hd"
puts $OUTF "Label=MS-DOS $rank"
puts $OUTF "Filesystem=$DosFS($rank)"
puts $OUTF ""
}
for {set i 1} {$i <= $Nfloppys} {set i [expr $i + 1]} {
if {$i > 2} {
set NDRIVES [expr $NDRIVES + 1]
set NLet $NDRIVES
set DRIVEDOSPATH($NDRIVES) "[lindex $lettersF $NLet]:\\"
set DRIVEUNIXPATH($NDRIVES) $FLOPPYPath($i)
} else {
set NLet $i
#set DRIVEDOSPATH($i) "[lindex $lettersF $NLet]:\\"
#set DRIVEUNIXPATH($i) $FLOPPYPath($i)
}
puts $OUTF "\[Drive [lindex $lettersF $NLet]\]"
puts $OUTF "Path=$FLOPPYPath($i)"
puts $OUTF "Type=floppy"
puts $OUTF "Label=Floppy $i"
puts $OUTF "Serial=87654321"
puts $OUTF ""
}
for {set i 1} {$i <= $Ncdroms} {set i [expr $i + 1]} {
set NDRIVES [expr $NDRIVES + 1]
puts $OUTF "\[Drive [lindex $letters $NDRIVES]\]"
puts $OUTF "Path=$CDPath($i)"
set DRIVEDOSPATH($NDRIVES) "[lindex $letters $NDRIVES]:\\"
set DRIVEUNIXPATH($NDRIVES) $CDPath($i)
puts $OUTF "Type=cdrom"
puts $OUTF "Label=CDROM $i"
puts $OUTF "Filesystem=$UnixFS($i)"
if {$CDDevice($i) != ""} {puts $OUTF "Device=$CDDevice($i)"}
puts $OUTF ""
}
for {set i 1} {$i <= $NunixDrives} {set i [expr $i + 1]} {
set NDRIVES [expr $NDRIVES + 1]
puts $OUTF "\[Drive [lindex $letters $NDRIVES]\]"
set DRIVEDOSPATH($NDRIVES) "[lindex $letters $NDRIVES]:\\"
set DRIVEUNIXPATH($NDRIVES) $UnixPath($i)
puts $OUTF "Path=$UnixPath($i)"
puts $OUTF "Type=hd"
puts $OUTF "Label=$UnixLabel($i)"
puts $OUTF "Filesystem=$UnixFS($i)"
puts $OUTF ""
}
for {set i 1} {$i <= $NnetDrives} {set i [expr $i + 1]} {
set NDRIVES [expr $NDRIVES + 1]
puts $OUTF "\[Drive [lindex $letters $NDRIVES]\]"
set DRIVEDOSPATH($NDRIVES) "[lindex $letters $NDRIVES]:\\"
set DRIVEUNIXPATH($NDRIVES) $NetPath($i)
puts $OUTF "Path=$NetPath($i)"
puts $OUTF "Type=network"
puts $OUTF "Label=$NetLabel($i)"
puts $OUTF "Filesystem=win95"
puts $OUTF ""
}
}
proc TkW:MiscEndConf {temp} {
#Create an acceptable PATH variable, and
# gets the TMP WINDOWS and SYSTEM drive letters:
global PATH NDRIVES Letter DRIVEPATH
global TMPLetter
set PATH ""
for {set i 1} {$i<= $NDRIVES} {set i [expr $i + 1]} {
if {[info exists Letter($i)]} {
if {[info exists DRIVEPATH($i)]} {
if {$DRIVEPATH($i) == $temp} {
set TMPLetter $Letter($i)
}
set PATH "$PATH\;$Letter($i):\\"
}
}
}
return
}
proc TkW:Unix2Dos {unixpath} {
global NDRIVES DRIVEDOSPATH DRIVEUNIXPATH
set dospath ""
# First, search the corresponding drive:
for {set i 1} {$i<=$NDRIVES} {set i [expr $i + 1]} {
set n [string first $DRIVEUNIXPATH($i) $unixpath]
if {$n == 0} {
set dospath $DRIVEDOSPATH($i)
set N [expr [string length $DRIVEUNIXPATH($i)] + 1]
break
}
}
# Now, add the remaining part of the path
for {set i $N} {$i <= [string length $unixpath]} {set i [expr $i + 1]} {
set newchar [string range $unixpath $i $i]
if {$newchar != "/"} {
set dospath "$dospath$newchar"
} else {
set dospath "$dospath\\"
}
}
return $dospath
}
proc TkW:addCdRomDrive {line} {
global Ncdroms CDPath CDDevice CDLabel CDType CDSerial CDFS
global IsCDwrite YES NO WAIT
if {![file exists [lindex $line 1]]} {return}
set Ncdroms [expr $Ncdroms + 1]
set CDFS($Ncdroms) "iso9660"
set CDPath($Ncdroms) [lindex $line 1]
set dev [lindex $line 0]
TkW:message2 "Device $dev $IsCDwrite" $YES $NO
set WAIT wait
while {$WAIT == "wait"} {update}
if {$WAIT == "opt1"} {set CDDevice($Ncdroms) $dev} {set CDDevice($Ncdroms) ""}
set CDLabel($Ncdroms) "CDrom"
}
proc TkW:addNetDrive {line} {
global NnetDrives NetPath NetLabel
set NnetDrives [expr $NnetDrives + 1]
set NetPath($NnetDrives) [lindex $line 1]
set NetLabel($NnetDrives) [file tail $NetPath($NnetDrives)]
}
proc TkW:addFloppy {line} {
global Nfloppys FLOPPYPath FLOPPYDevice FLOPPYLabel FLOPPYType FLOPPYSerial FLOPPYFS
if {![file exists [lindex $line 1]]} {return}
set Nfloppys [expr $Nfloppys + 1]
set FLOPPYPath($Nfloppys) [lindex $line 1]
set FLOPPYDevice($Nfloppys) [lindex $line 0]
}
proc TkW:SortDosDrives {} {
global NdosDrives DosDevice DriveRank
set devlist ""
for {set i 1} {$i <= $NdosDrives} {set i [expr $i + 1]} {
set devlist "$devlist $DosDevice($i):TKW:$i"
}
set devlist [lsort $devlist]
set i 1
foreach dev $devlist {
set n1 [expr [string first ":TKW:" $dev] + 5]
set n2 [string length $dev]
set DriveRank([string range $dev $n1 $n2]) $i
set i [expr $i + 1]
}
}
proc TkW:SearchTmp {} {
global exclude
global NunixDrives UnixPath UnixLabel UnixType UnixFS
global NdosDrives DosPath DosLabel DosType DosFS
global WAITfilename GetFileName NDRIVES DRIVEUNIXPATH DRIVEDOSPATH
global WhereTmp OK CANCEL
# Check if it /tmp is alreaddy mounted (when it has it's own partition)
foreach i $exclude {
if {$i == "/tmp"} {return /tmp}
}
# check that we have a /tmp:
if {[file exists /tmp] } {
set NunixDrives [expr $NunixDrives + 1]
set UnixPath($NunixDrives) /tmp
set exclude "$exclude$UnixPath($NunixDrives) "
set UnixLabel($NunixDrives) "TEMP"
set UnixType($NunixDrives) hd
set UnixFS($NunixDrives) win95
return /tmp
} else {
#Could add here a search for c:\TEMP or c:|windows\temp
set WAITfilename wait
TkW:GetFileName $WhereTmp $OK $CANCEL Folder
# check if this folder is on a drive that has an entry in
# wineconf (Must be a unix or dos drive)
for {set i 1} {$i<=$NdosDrives} {set i [expr $i +1]} {
if {[string first $DosPath($i) $GetFileName] == 0} {
return $GetFileName
}
}
for {set i 1} {$i<=$NunixDrives} {set i [expr $i +1]} {
if {[string first $UnixPath($i) $GetFileName] == 0} {
return $GetFileName
}
}
# I'll consider this new one as unix, althought if it's win fs that's ok
set NunixDrives [expr $NunixDrives + 1]
set UnixPath($NunixDrives) $GetFileName
set exclude "$exclude$UnixPath($NunixDrives) "
set UnixLabel($NunixDrives) "TEMP"
set UnixType($NunixDrives) hd
set UnixFS($NunixDrives) win95
return $GetFileName
}
}
proc TkW:FindWindows {} {
global NdosDrives DosPath WINLetter SYSLetter Letter
#first attempt: C:\windows (would avoid to search)
if {[file exist $DosPath(1)/windows]} {
return "$DosPath(1)/windows"
}
for {set i 1} {$i<=$NdosDrives} {set i [expr $i + 1]} {
set searchWin [open "| find $DosPath($i) -name win.ini -print" r+]
while {![eof $searchWin]} {
gets $searchWin Found
close $searchWin
set Found [file dirname $Found]
return $Found
}
}
close $searchWin
}