On mouse down in thumb, issue SB_THUMBTRACK with current position.
[wine] / tools / wineconf.libs / autoconf.tcl
1 # Copyright 1999 Jean-Louis Thirot
2 #
3 # This library is free software; you can redistribute it and/or
4 # modify it under the terms of the GNU Lesser General Public
5 # License as published by the Free Software Foundation; either
6 # version 2.1 of the License, or (at your option) any later version.
7 #
8 # This library is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 # Lesser General Public License for more details.
12 #
13 # You should have received a copy of the GNU Lesser General Public
14 # License along with this library; if not, write to the Free Software
15 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16 #
17
18 proc TkW:autoconf {outfile} {
19
20 # This files scans the fstab, then creates a wine.conf file
21 # parsed to wineconf for further editings....
22
23 # MS DOS drives are sorted following the rules explained in tools/wineconf
24
25         global PATH
26         global TMPLetter WINLetter SYSLetter
27
28         global OUTF
29         set OUTF [open $outfile w]
30
31         TkW:InitNewConfig
32         set err [TkW:readFStab]
33
34         TkW:SortDosDrives
35         TkW:addRootDrives
36         
37         set TMP [TkW:SearchTmp]
38         TkW:ShowDrives
39
40
41         set Windows [TkW:FindWindows]
42         set System "$Windows/system"
43         set Windows [TkW:Unix2Dos $Windows]
44         set System [TkW:Unix2Dos $System]
45         TkW:MiscEndConf $TMP 
46         puts $OUTF "\[Wine\]\nwindows=$Windows"
47         puts $OUTF "system=$System"
48         puts $OUTF "Temp=[TkW:Unix2Dos $TMP]"
49         puts $OUTF "Path= $Windows\;$System\;$PATH"
50
51         #Quick and dirty... I'm tired now!
52         #puts $OUTF "SymbolTableFile=[exec find / -name wine.sym -print]"
53         puts $OUTF "printer=on"
54         puts $OUTF ""
55
56         puts $OUTF "\[DllDefaults\]"
57         puts $OUTF "\;EXTRA_LD_LIBRARY_PATH=\$\{HOME\}/wine/cvs/lib"
58         puts $OUTF ""
59         puts $OUTF "\[DllPairs\]"
60         puts $OUTF "kernel  = kernel32"
61         puts $OUTF "gdi     = gdi32"
62         puts $OUTF "user    = user32"
63         puts $OUTF "commdlg = comdlg32"
64         puts $OUTF "commctrl= comctl32"
65         puts $OUTF "ver     = version"
66         puts $OUTF "shell   = shell32"
67         puts $OUTF "lzexpand= lz32"
68         puts $OUTF "mmsystem= winmm"
69         puts $OUTF "msvideo = msvfw32"
70         puts $OUTF "winsock = wsock32"
71         puts $OUTF ""
72
73          puts $OUTF "\[DllOverrides\]"
74         puts $OUTF "kernel32, gdi32, user32 = builtin"
75         puts $OUTF "kernel, gdi, user       = builtin"
76         puts $OUTF "toolhelp                = builtin"
77         puts $OUTF "comdlg32, commdlg       = elfdll, builtin, native"
78         puts $OUTF "version, ver            = elfdll, builtin, native"
79         puts $OUTF "shell32, shell          = builtin, native"
80         puts $OUTF "lz32, lzexpand          = builtin, native"
81         puts $OUTF "commctrl, comctl32      = builtin, native"
82         puts $OUTF "sock32, winsock        = builtin"
83         puts $OUTF "advapi32, crtdll, ntdll = builtin, native"
84         puts $OUTF "mpr, winspool           = builtin, native"
85         puts $OUTF "ddraw, dinput, dsound   = builtin, native"
86         puts $OUTF "winmm, mmsystem         = builtin"
87         puts $OUTF "msvideo, msvfw32        = builtin, native"
88         puts $OUTF "w32skrnl                = builtin"
89         puts $OUTF "wnaspi32, wow32         = builtin"
90         puts $OUTF "system, display, wprocs = builtin"
91         puts $OUTF "wineps                  = builtin"
92         puts $OUTF ""
93
94         puts $OUTF "\[options\]"
95         puts $OUTF "AllocSystemColors=100"
96         puts $OUTF ""
97
98         puts $OUTF "\[fonts\]"
99         puts $OUTF "Resolution = 96 "
100         puts $OUTF "Default = -adobe-times-"
101         puts $OUTF ""
102
103         puts $OUTF "\[serialports\]"
104         puts $OUTF "Com1=/dev/ttyS0"
105         puts $OUTF "Com2=/dev/ttyS1"
106         puts $OUTF "Com3=/dev/modem,38400"
107         puts $OUTF "Com4=/dev/modem"
108         puts $OUTF ""
109
110         puts $OUTF "\[parallelports\]"
111         puts $OUTF "Lpt1=/dev/lp0"
112         puts $OUTF ""
113
114         puts $OUTF "\[spooler\]"
115         puts $OUTF "LPT1:=|lpr"
116         puts $OUTF "LPT2:=|gs -sDEVICE=bj200 -sOutputFile=/tmp/fred -q -"
117         puts $OUTF "LPT3:=/dev/lp3"
118         puts $OUTF ""
119
120         puts $OUTF "\[ports\]"
121         puts $OUTF "\;read=0x779,0x379,0x280-0x2a0"
122         puts $OUTF "\;write=0x779,0x379,0x280-0x2a0"
123         puts $OUTF ""
124
125          puts $OUTF "\[spy\]"
126         puts $OUTF "Exclude=WM_SIZE" 
127         puts $OUTF ";WM_TIMER"
128         puts $OUTF ""
129         
130         puts $OUTF "\[Tweak.Layout\]"
131         puts $OUTF ";WineLook=xxx       (supported styles are \'Win31\'(default),"
132         puts $OUTF ";\'Win95\', \'Win98\')"
133         puts $OUTF "WineLook=Win31"
134         puts $OUTF ""
135
136         puts $OUTF "\[programs\]"
137         puts $OUTF "Default=]"
138         puts $OUTF "Startup="
139
140         close $OUTF
141 }
142
143 proc TkW:readFStab {} {
144
145         global AlternateFstab OK CANCEL
146
147         if {![file exist /etc/fstab]} {
148                 TkW:GetFileName $AlternateFstab $OK $CANCEL File
149                 TkW:FStabError 1
150                 return 1
151         } else {
152                 set FSTAB "/etc/fstab"
153         }
154         if {![file readable $FSTAB]} {TkW:FStabError 2;return 1}
155
156         set FStab [open /etc/fstab]
157         while {![eof $FStab]} {
158
159                 gets $FStab line
160                 set line [string trim $line]
161                 if {[string range $line 0 0] != "#" && $line != ""} {
162                         #we have an entry
163                         switch [lindex $line 2] {
164
165                                 swap {}
166                                 proc {}
167                                 minix {TkW:addUnixDrive $line}
168                                 ext2 {TkW:addUnixDrive $line}
169                                 xiafs {TkW:addUnixDrive $line}
170                                 vfat {TkW:addDosDrive $line}
171                                 msdos {TkW:addDosDrive msdos}
172                                 hpfs {TkW:addDosDrive $line}
173                                 iso9660 {TkW:addCdRomDrive $line}
174                                 nfs {TkW:addNetDrive $line}
175                                 auto {TkW:addAutoDrive $line}
176                                 default {TkW:unknownDeviceType $line}
177                                 
178                         }
179                 }
180         }
181 }
182
183 proc TkW:addRootDrives {} {
184
185         global RootDrives1 RootDrives2 OK CANCEL WAIT lineroot ADD REMOVE
186         global NunixDrives UnixPath UnixDevice UnixLabel UnixType UnixSerial UnixFS
187         global exclude  All
188         
189         set drivelist ""
190         set drivelist "$drivelist [glob -nocomplain /*]"
191         set List ""
192         set excludes "$exclude /boot /lost+found /lib /etc /var /sbin /initrd\
193                         /cdrom /floppy /include /man /dev /proc /bin /mnt /tmp"
194         set n 0
195         foreach i $drivelist {
196                 if {[file isdir $i]} {
197                         set skip 0
198                         
199                         foreach k $excludes {
200                                 if {$k  == $i} {
201                                         set skip 1
202                                 }
203                         }
204                          if {$skip == 0} {set List "$List$i "}
205                 }
206         }
207         set List [lsort $List]
208         set n 0
209         foreach i $List {
210                 set All($n) $i;set n [expr $n + 1]
211         }
212         set dev  [lindex $lineroot 0]
213         toplevel .rootDr -background #ffffff 
214         wm title .rootDr  "Wine Autoconfigurator"
215         label .rootDr.banner -backgr #0000ff -foregr #ffffff \
216                 -text "$RootDrives1$dev $RootDrives2" \
217                 -wraplength 300
218         pack .rootDr.banner -fill x
219         frame .rootDr.lists -backgr #ffffff
220         pack .rootDr.lists -padx 10 -pady 10
221         listbox .rootDr.lists.left -width 20 -height 10 
222         pack .rootDr.lists.left -padx 10 -pady 0  -side left
223
224         frame .rootDr.lists.buttons -backgr #ffffff
225         pack .rootDr.lists.buttons -padx 10 -pady 0  -side left
226
227         button .rootDr.lists.buttons.add -text "$ADD >>" -width 8\
228                 -command {TkW:AddRootDrInList [.rootDr.lists.left cursel]}
229         pack .rootDr.lists.buttons.add -padx 10 -pady 0  -side top
230
231         button .rootDr.lists.buttons.space -text "" -backgr #ffffff \
232                 -border 0 -highlightb  #ffffff -relief flat -width 8 -state disabled
233         pack .rootDr.lists.buttons.space -padx 10 -pady 0  -side top
234
235         button .rootDr.lists.buttons.rem -text "<< $REMOVE" -width 8\
236                 -command {TkW:RemRootDrInList [.rootDr.lists.right cursel]}
237         pack .rootDr.lists.buttons.rem -padx 10 -pady 0  -side top
238
239         listbox .rootDr.lists.right -width 20 -height 10 
240         pack .rootDr.lists.right -padx 10 -pady 0 
241
242         frame .rootDr.cmd -background #ffffff
243         pack .rootDr.cmd -side bottom -anchor c -pady 5
244         
245         button .rootDr.cmd.ok -text OK -width 8 \
246                 -command {destroy .rootDr;set WAIT 0}
247         pack .rootDr.cmd.ok -side left
248
249         foreach i $List {
250                 .rootDr.lists.left insert end $i
251         }
252
253         global ToAddList;set ToAddList ""
254
255         bind .rootDr.lists.left <Double-ButtonPress-1> {
256                 TkW:AddRootDrInList [.rootDr.lists.left nearest %y]}
257         bind .rootDr.lists.right <Double-ButtonPress-1> {
258                 TkW:RemRootDrInList [.rootDr.lists.right nearest %y]}
259         set WAIT wait
260         while {$WAIT == "wait" } {update}
261         foreach i $ToAddList {
262                 set NunixDrives [expr $NunixDrives + 1]
263                 set UnixPath($NunixDrives) $i
264                 set exclude "$exclude$UnixPath($NunixDrives) "
265                 set UnixLabel($NunixDrives) $i
266                 set UnixType($NunixDrives) hd
267                 set UnixFS($NunixDrives) win95
268         }
269 }
270
271 proc TkW:AddRootDrInList {N} {
272
273         global All ToAddList Nadd Add
274         if {![info exists All($N)]} {return}
275         foreach i $ToAddList {
276                 if {$i == $All($N)} {return}
277         }
278         set  ToAddList [lsort "$ToAddList $All($N)"]
279         .rootDr.lists.right delete 0 end
280         set Nadd 0
281         foreach i $ToAddList {
282                 .rootDr.lists.right insert end $i
283                 set Add($Nadd) $i
284                 set Nadd [expr $Nadd + 1]
285         }
286 }
287 proc TkW:RemRootDrInList {N} {
288         global All ToAddList Nadd Add
289         if {![info exists Add($N)]} {return}
290         set NewList ""
291         foreach i $ToAddList {
292                 if {$i != $Add($N)} {set NewList "$NewList$i "}
293         }
294         set ToAddList $NewList
295         set Nadd 0
296         .rootDr.lists.right delete 0 end
297         foreach i $ToAddList {
298                 .rootDr.lists.right insert end $i
299                 set Add($Nadd) $i
300                 set Nadd [expr $Nadd + 1]
301         }
302 }
303 proc TkW:addUnixDrive {line} {
304         global lineroot
305         #pre-processing for the case of the root:
306         if {![file exists [lindex $line 1]]} {return}
307         if {[lindex $line 1] != "/"} { TkW:addUnixDriveOK $line}  {set lineroot $line}
308 }
309 proc TkW:addUnixDriveOK {line} {
310
311         # for now, I'll consider any unix file as ext2... 
312         # may be this should improve a bit!
313
314         global NunixDrives UnixPath UnixDevice UnixLabel UnixType UnixSerial UnixFS
315         
316         global TMPDRIVE HOMEDRIVE exclude
317
318         set NunixDrives [expr $NunixDrives +1]
319
320         set UnixDevice($NunixDrives) [lindex $line 0]
321         set UnixType($NunixDrives) "hd"
322         set UnixPath($NunixDrives)  [lindex $line 1] 
323         set exclude "$exclude$UnixPath($NunixDrives) "
324         set  UnixLabel($NunixDrives) "UNIX $NunixDrives"
325         if {[string first "/tmp" $UnixPath($NunixDrives)] > 0 && $TMPDRIVE == 0} {
326                 set  UnixLabel($NunixDrives) "TEMP"
327         }
328         if {[string first "/home" $UnixDevice($NunixDrives)] > 0 && $HOMEDRIVE == 0} {
329                 set  UnixLabel($NunixDrives) "HOME"
330         }
331         set UnixDevice($NunixDrives) ""
332         set UnixSerial($NunixDrives) ""
333         set UnixFS($NunixDrives) "win95"
334         set UnixType($NunixDrives) "hd"
335 }
336 proc TkW:addDosDrive {line} {
337
338         # for now, I'll consider any dos file as ext2... 
339         # may be this should improve a bit!
340
341         global NdosDrives DosPath DosDevice DosLabel DosType DosSerial DosFS
342         
343         global TMPDRIVE HOMEDRIVE exclude
344
345         if {![file exists [lindex $line 1]]} {return}
346
347         if { [string first "/dev/fd" [lindex $line 0]] == 0  } {
348                 TkW:addFloppy $line
349                 return
350         }
351
352         set NdosDrives [expr $NdosDrives +1]
353
354         set DosDevice($NdosDrives) [lindex $line 0]
355         set DosPath($NdosDrives)  [lindex $line 1] 
356         set exclude "$exclude$DosPath($NdosDrives) "
357         set  DosLabel($NdosDrives) ""
358         set DosType($NdosDrives) "win95"
359         if {[lindex $line 2] == "msods"} {
360                 set DosFS($NdosDrives) 
361         } else {
362                 set DosFS($NdosDrives) "win95"
363         }
364         set DosSerial($NdosDrives) ""
365 }
366
367 proc TkW:unknownDeviceType {line} {
368
369         TkW:message "Error\n\
370 [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\
371 \n              Thank you.\
372 \n                      Jean-Louis Thirot"
373         global WAIT
374         set WAIT wait
375         while {$WAIT == "wait"} {update}
376
377 }
378
379 proc TkW:InitNewConfig {} {
380         
381         global NunixDrives UnixPath UnixDevice UnixLabel UnixType UnixSerial UnixFS
382         global NdosDrives DosPath DosDevice DosLabel DosType DosSerial DosFS
383         global Ncdroms CDPath CDDevice CDLabel CDType CDSerial CDFS
384         global Nfloppys FLOPPYPath FLOPPYDevice FLOPPYLabel FLOPPYType FLOPPYSerial FLOPPYFS
385         global NnetDrives
386         global TMPDRIVE HOMEDRIVE
387         global exclude; set exclude ""
388
389         set TMPDRIVE 0
390         set HOMEDRIVE 0
391
392         set NunixDrives 0
393         set NdosDrives 0
394         set Ncdroms 0
395         set Nfloppys 0
396         set NnetDrives 0
397 }
398
399 proc TkW:ShowDrives {} {
400
401         global NunixDrives UnixPath UnixDevice UnixLabel UnixType UnixSerial UnixFS
402         global NdosDrives DosPath DosDevice DosLabel DosType DosSerial DosFS       
403         global Ncdroms CDPath CDDevice CDLabel CDType CDSerial CDFS
404         global NnetDrives NetPath NetLabel 
405         global Nfloppys FLOPPYPath
406         global DriveRank DRIVEUNIXPATH DRIVEDOSPATH NDRIVES
407         global OUTF
408         
409         set NDRIVES 0
410         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}
411         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}
412         for  {set i 1} {$i <= $NdosDrives} {set i [expr $i + 1]} {
413                 set NDRIVES [expr $NDRIVES + 1]
414                 set rank $DriveRank($i)
415                 puts $OUTF "\[Drive [lindex $letters $i]\]"
416                 set Letter($NDRIVES)  [lindex $letters $i]
417                 set DRIVEUNIXPATH($NDRIVES) $DosPath($rank)
418                 set DRIVEDOSPATH($NDRIVES) "[lindex $letters $i]:\\"
419                 puts $OUTF "Path=$DosPath($rank)"
420                 puts $OUTF "Type=hd"
421                 puts $OUTF "Label=MS-DOS $rank"
422                 puts $OUTF "Filesystem=$DosFS($rank)"
423                 puts $OUTF ""
424         }
425         for  {set i 1} {$i <= $Nfloppys} {set i [expr $i + 1]} {
426                 if {$i > 2} {
427                         set NDRIVES [expr $NDRIVES + 1]
428                         set NLet $NDRIVES
429                         set DRIVEDOSPATH($NDRIVES) "[lindex $lettersF $NLet]:\\"
430                         set DRIVEUNIXPATH($NDRIVES) $FLOPPYPath($i)
431                 } else {
432                         set NLet $i
433                         #set DRIVEDOSPATH($i) "[lindex $lettersF $NLet]:\\"
434                         #set DRIVEUNIXPATH($i) $FLOPPYPath($i)
435                 }
436                 puts $OUTF "\[Drive [lindex $lettersF $NLet]\]"
437                 puts $OUTF "Path=$FLOPPYPath($i)"
438                 puts $OUTF "Type=floppy"
439                 puts $OUTF "Label=Floppy $i"
440                 puts $OUTF "Serial=87654321"
441                 puts $OUTF ""
442         }
443         for  {set i 1} {$i <= $Ncdroms} {set i [expr $i + 1]} {
444                 set NDRIVES [expr $NDRIVES + 1]
445                 puts $OUTF "\[Drive [lindex $letters $NDRIVES]\]"
446                 puts $OUTF "Path=$CDPath($i)"
447                 set DRIVEDOSPATH($NDRIVES) "[lindex $letters $NDRIVES]:\\"
448                 set DRIVEUNIXPATH($NDRIVES) $CDPath($i)
449                 puts $OUTF "Type=cdrom"
450                 puts $OUTF "Label=CDROM $i"
451                 puts $OUTF "Filesystem=$UnixFS($i)"
452                 if {$CDDevice($i) != ""} {puts $OUTF "Device=$CDDevice($i)"}
453                 puts $OUTF ""
454         }
455         for  {set i 1} {$i <= $NunixDrives} {set i [expr $i + 1]} {
456                 set NDRIVES [expr $NDRIVES + 1]
457                 puts $OUTF "\[Drive [lindex $letters $NDRIVES]\]"
458                 set DRIVEDOSPATH($NDRIVES) "[lindex $letters $NDRIVES]:\\"
459                 set DRIVEUNIXPATH($NDRIVES) $UnixPath($i)
460                 puts $OUTF "Path=$UnixPath($i)"
461                 puts $OUTF "Type=hd"
462                 puts $OUTF "Label=$UnixLabel($i)"
463                 puts $OUTF "Filesystem=$UnixFS($i)"
464                 puts $OUTF ""
465         }
466         for  {set i 1} {$i <= $NnetDrives} {set i [expr $i + 1]} {
467                 set NDRIVES [expr $NDRIVES + 1]
468                 puts $OUTF "\[Drive [lindex $letters $NDRIVES]\]"
469                 set DRIVEDOSPATH($NDRIVES) "[lindex $letters $NDRIVES]:\\"
470                 set DRIVEUNIXPATH($NDRIVES) $NetPath($i)
471                 puts $OUTF "Path=$NetPath($i)"
472                 puts $OUTF "Type=network"
473                 puts $OUTF "Label=$NetLabel($i)"
474                 puts $OUTF "Filesystem=win95"
475                 puts $OUTF ""
476         }
477 }
478
479 proc TkW:MiscEndConf {temp} {
480
481         #Create an acceptable PATH variable, and
482         # gets the TMP WINDOWS and SYSTEM drive letters:
483         global PATH NDRIVES Letter DRIVEPATH
484         global TMPLetter 
485         set PATH ""
486         for {set i 1} {$i<= $NDRIVES} {set i [expr $i + 1]} {
487                 if {[info exists Letter($i)]} {
488                         if {[info exists DRIVEPATH($i)]} {
489                                 if {$DRIVEPATH($i) == $temp} {
490                                         set TMPLetter $Letter($i)
491                                 }
492                                 set PATH "$PATH\;$Letter($i):\\"
493                         }
494                 }
495         }
496         return 
497 }
498
499 proc TkW:Unix2Dos {unixpath} {
500
501         global NDRIVES DRIVEDOSPATH DRIVEUNIXPATH
502
503         set dospath ""
504
505 # First, search the corresponding drive:
506
507         for {set i 1} {$i<=$NDRIVES} {set i [expr $i + 1]} {
508                 set n [string first $DRIVEUNIXPATH($i) $unixpath] 
509                 if {$n == 0} {
510                         set dospath $DRIVEDOSPATH($i)
511                         set N [expr [string length  $DRIVEUNIXPATH($i)] + 1]
512                         break
513                 }
514         }
515         
516 # Now, add the remaining part of the path
517
518         for {set i $N} {$i <= [string length $unixpath]} {set i [expr $i + 1]} {
519
520                 set newchar [string range $unixpath $i $i] 
521                 if {$newchar  != "/"} {
522                         set dospath "$dospath$newchar"
523                 } else {
524                         set dospath "$dospath\\"
525                 }
526         }
527         return $dospath
528 }
529
530 proc TkW:addCdRomDrive {line} {
531         global Ncdroms CDPath CDDevice CDLabel CDType CDSerial CDFS
532
533         global IsCDwrite YES NO WAIT
534
535         if {![file exists [lindex $line 1]]} {return}
536         set Ncdroms [expr $Ncdroms + 1]
537         set  CDFS($Ncdroms) "iso9660"
538         set CDPath($Ncdroms) [lindex $line 1]
539         set dev [lindex $line 0]
540         TkW:message2 "Device $dev $IsCDwrite" $YES $NO
541         set WAIT wait
542         while {$WAIT == "wait"} {update}
543         if {$WAIT == "opt1"} {set CDDevice($Ncdroms) $dev} {set CDDevice($Ncdroms) ""}
544         set CDLabel($Ncdroms) "CDrom"
545 }
546 proc TkW:addNetDrive {line} {
547         global NnetDrives NetPath NetLabel 
548         set NnetDrives [expr $NnetDrives + 1]
549         set NetPath($NnetDrives)  [lindex $line 1]
550         set NetLabel($NnetDrives) [file tail $NetPath($NnetDrives)]
551 }
552 proc TkW:addFloppy {line} {
553         global Nfloppys FLOPPYPath FLOPPYDevice FLOPPYLabel FLOPPYType FLOPPYSerial FLOPPYFS
554         if {![file exists [lindex $line 1]]} {return}
555         set Nfloppys [expr $Nfloppys + 1]
556         set FLOPPYPath($Nfloppys) [lindex $line 1]
557         set FLOPPYDevice($Nfloppys) [lindex $line 0]
558 }
559
560 proc TkW:SortDosDrives {} {
561         global NdosDrives DosDevice DriveRank
562
563         set devlist ""
564         for  {set i 1} {$i <= $NdosDrives} {set i [expr $i + 1]} { 
565                 set  devlist "$devlist $DosDevice($i):TKW:$i"
566         }
567         set devlist [lsort $devlist]
568
569         set i 1
570         foreach dev $devlist {
571                 set n1 [expr [string first ":TKW:" $dev] + 5]
572                 set n2 [string length $dev]
573                 set DriveRank([string range $dev $n1 $n2]) $i
574                 set i [expr $i + 1]
575         }
576 }
577
578 proc TkW:SearchTmp {} {
579         global exclude
580         global NunixDrives UnixPath UnixLabel UnixType UnixFS
581         global NdosDrives DosPath DosLabel DosType DosFS
582         global WAITfilename GetFileName NDRIVES DRIVEUNIXPATH DRIVEDOSPATH
583         global WhereTmp OK CANCEL
584
585 # Check if it /tmp is alreaddy mounted (when it has it's own partition)
586         foreach i $exclude {
587                 if {$i == "/tmp"} {return /tmp}
588         }
589 # check that we have a /tmp:
590         if {[file exists /tmp] } {
591                 set NunixDrives [expr $NunixDrives + 1]
592                 set UnixPath($NunixDrives) /tmp
593                 set exclude "$exclude$UnixPath($NunixDrives) "
594                 set UnixLabel($NunixDrives) "TEMP"
595                 set UnixType($NunixDrives) hd
596                 set UnixFS($NunixDrives) win95
597                 return /tmp
598         } else {
599 #Could add here a search for c:\TEMP or c:|windows\temp
600                 set WAITfilename wait
601                 TkW:GetFileName $WhereTmp $OK $CANCEL Folder
602
603 # check if this folder is on a drive that has an entry in
604 # wineconf (Must be a unix or dos drive)
605                 for {set i 1} {$i<=$NdosDrives} {set i [expr $i +1]} {
606                         if {[string first $DosPath($i) $GetFileName] == 0} {
607                                 return $GetFileName
608                         }
609                 }
610                 for {set i 1} {$i<=$NunixDrives} {set i [expr $i +1]} {
611                         if {[string first $UnixPath($i) $GetFileName] == 0} {
612                                 return $GetFileName
613                         }
614                 }
615 # I'll consider this new one as unix, althought if it's win fs that's ok
616                 set NunixDrives [expr $NunixDrives + 1]
617                 set UnixPath($NunixDrives) $GetFileName
618                 set exclude "$exclude$UnixPath($NunixDrives) "
619                 set UnixLabel($NunixDrives) "TEMP"
620                 set UnixType($NunixDrives) hd
621                 set UnixFS($NunixDrives) win95
622                 return $GetFileName
623         }
624 }
625
626 proc TkW:FindWindows {} {
627
628         global NdosDrives DosPath WINLetter SYSLetter Letter
629
630         #first attempt: C:\windows (would avoid to search)
631
632         if {[file exist $DosPath(1)/windows]} {
633                 return "$DosPath(1)/windows"
634         }
635         
636         for  {set i 1} {$i<=$NdosDrives} {set i [expr $i + 1]} {
637                 set searchWin [open "| find $DosPath($i) -name win.ini -print" r+]
638                 while {![eof $searchWin]} {
639                         gets $searchWin Found
640                         close $searchWin
641                         set Found [file dirname $Found]
642                         return $Found
643                 }
644         }
645         close $searchWin
646         
647 }