header.tk
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:18k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. # FILE: header.tk
  2. # This file is boilerplate TCL/TK function definitions for 'make xconfig'.
  3. #
  4. # CHANGES
  5. # =======
  6. #
  7. # 8 January 1999, Michael Elizabeth Chastain, <mec@shout.net>
  8. # - Remove unused do_cmd function (part of the 2.0 sound support).
  9. # - Arrange buttons in three columns for better screen fitting.
  10. # - Add CONSTANT_Y, CONSTANT_M, CONSTANT_N for commands like:
  11. #     dep_tristate 'foo' CONFIG_FOO m
  12. #
  13. # 23 January 1999, Michael Elizabeth Chastain, <mec@shout.net>
  14. # - Shut vfix the hell up.
  15. #
  16. # 24 January 1999, Michael Elizabeth Chastain, <mec@shout.net>
  17. # - Improve the exit message (Jeff Ronne).
  18. #
  19. # This is a handy replacement for ".widget cget" that requires neither tk4
  20. # nor additional source code uglification.
  21. #
  22. proc cget { w option } {
  23. return "[lindex [$w configure $option] 4]"
  24. }
  25. #
  26. # Function to compensate for broken config.in scripts like the sound driver,
  27. # which make dependencies on variables that are never even conditionally
  28. # defined.
  29. #
  30. proc vfix { var } {
  31. global $var
  32. if [ catch {eval concat $$var} ] {
  33. set $var 4
  34. }
  35. }
  36. #
  37. # Constant values used by certain dep_tristate commands.
  38. #
  39. set CONSTANT_Y 1
  40. set CONSTANT_M 2
  41. set CONSTANT_N 0
  42. set CONSTANT_E 4
  43. #
  44. # Create a "reference" object to steal colors from.
  45. #
  46. button .ref
  47. #
  48. # On monochrome displays, -disabledforeground is blank by default; that's
  49. # bad.  Fill it with -foreground instead.
  50. #
  51. if { [cget .ref -disabledforeground] == "" } {
  52. .ref configure -disabledforeground [cget .ref -foreground]
  53. }
  54. #
  55. # Define some macros we will need to parse the config.in file.
  56. #
  57. proc mainmenu_name { text } {
  58. wm title . "$text"
  59. }
  60. proc menu_option { w menu_num text } {
  61. global menus_per_column
  62. global processed_top_level
  63. set processed_top_level [expr $processed_top_level + 1]
  64. if { $processed_top_level <= $menus_per_column } then {
  65.     set myframe left
  66. } elseif { $processed_top_level <= [expr 2 * $menus_per_column] } then {
  67.     set myframe middle
  68. } else {
  69.     set myframe right
  70. button .f0.x$menu_num -anchor w -text "$text" 
  71.     -command "$w .$w "$text""
  72. pack .f0.x$menu_num -pady 0 -side top -fill x -in .f0.$myframe
  73. }
  74. proc load_configfile { w title func } {
  75. catch {destroy $w}
  76. toplevel $w -class Dialog
  77. global loadfile
  78. frame $w.x
  79. label $w.bm -bitmap questhead
  80. pack  $w.bm -pady 10 -side top -padx 10
  81. label $w.x.l -text "Enter filename:" -relief raised
  82. entry $w.x.x -width 35 -relief sunken -borderwidth 2 
  83. -textvariable loadfile
  84. pack $w.x.l $w.x.x -anchor w -side left
  85. pack $w.x -side top -pady 10
  86. wm title $w "$title" 
  87. set oldFocus [focus]
  88. frame $w.f
  89. button $w.f.back -text "OK" -width 20 
  90. -command "destroy $w; focus $oldFocus;$func .fileio"
  91. button $w.f.canc -text "Cancel" 
  92. -width 20 -command "destroy $w; focus $oldFocus"
  93. pack $w.f.back $w.f.canc -side left -pady 10 -padx 45
  94. pack $w.f -pady 10 -side bottom -padx 10 -anchor w
  95. focus $w
  96. global winx; global winy
  97. set winx [expr [winfo x .]+30]; set winy [expr [winfo y .]+30]
  98. wm geometry $w +$winx+$winy
  99. }
  100. bind all <Alt-q> {maybe_exit .maybe}
  101. proc maybe_exit { w } {
  102. catch {destroy $w}
  103. toplevel $w -class Dialog
  104. label $w.bm -bitmap questhead
  105. pack  $w.bm -pady 10 -side top -padx 10
  106. message $w.m -width 400 -aspect 300 
  107. -text "Changes will be lost.  Are you sure?" -relief flat
  108. pack  $w.m -pady 10 -side top -padx 10
  109. wm title $w "Are you sure?" 
  110. set oldFocus [focus]
  111. frame $w.f
  112. button $w.f.back -text "OK" -width 20 
  113. -command "exit"
  114. button $w.f.canc -text "Cancel" 
  115. -width 20 -command "destroy $w; focus $oldFocus"
  116. pack $w.f.back $w.f.canc -side left -pady 10 -padx 45
  117. pack $w.f -pady 10 -side bottom -padx 10 -anchor w
  118.    bind $w <Return> "exit"
  119.      bind $w <Escape> "destroy $w; focus $oldFocus"
  120. focus $w
  121. global winx; global winy
  122. set winx [expr [winfo x .]+30]; set winy [expr [winfo y .]+30]
  123. wm geometry $w +$winx+$winy
  124. }
  125. proc read_config_file { w } {
  126. global loadfile
  127. if { [string length $loadfile] != 0 && [file readable $loadfile] == 1 } then {
  128. read_config $loadfile
  129. } else {
  130. catch {destroy $w}
  131. toplevel $w -class Dialog
  132. message $w.m -width 400 -aspect 300 -text 
  133. "Unable to read file $loadfile" 
  134.  -relief raised 
  135. label $w.bm -bitmap error
  136. pack $w.bm $w.m -pady 10 -side top -padx 10
  137. wm title $w "Xconfig Internal Error" 
  138. set oldFocus [focus]
  139. frame $w.f
  140. button $w.f.back -text "Bummer" 
  141. -width 10 -command "destroy $w; focus $oldFocus"
  142. pack $w.f.back -side bottom -pady 10 -anchor s
  143. pack $w.f -pady 10 -side top -padx 10 -anchor s
  144. focus $w
  145. global winx; global winy
  146. set winx [expr [winfo x .]+30]; set winy [expr [winfo y .]+30]
  147. wm geometry $w +$winx+$winy
  148. }
  149. }
  150. proc write_config_file  { w } {
  151. global loadfile
  152. if { [string length $loadfile] != 0 
  153.      && ([file writable $loadfile] == 1 || ([file exists $loadfile] == 0 && [file writable [file dirname $loadfile]] == 1)) } then {
  154. writeconfig $loadfile /dev/null
  155. } else {
  156. catch {destroy $w}
  157. toplevel $w -class Dialog
  158. message $w.m -width 400 -aspect 300 -text 
  159. "Unable to write file $loadfile" 
  160.  -relief raised 
  161. label $w.bm -bitmap error
  162. pack $w.bm $w.m -pady 10 -side top -padx 10
  163. wm title $w "Xconfig Internal Error" 
  164. set oldFocus [focus]
  165. frame $w.f
  166. button $w.f.back -text "OK" 
  167. -width 10 -command "destroy $w; focus $oldFocus"
  168. pack $w.f.back -side bottom -pady 10 -anchor s
  169. pack $w.f -pady 10 -side top -padx 10 -anchor s
  170. focus $w
  171. global winx; global winy
  172. set winx [expr [winfo x .]+30]; set winy [expr [winfo y .]+30]
  173. wm geometry $w +$winx+$winy
  174. }
  175. }
  176. proc read_config { filename } {
  177. set file1 [open $filename r]
  178. clear_choices
  179. while { [gets $file1 line] >= 0} {
  180. if [regexp {([0-9A-Za-z_]+)=([ynm])} $line foo var value] {
  181. if { $value == "y" } then { set cmd "global $var; set $var 1" }
  182. if { $value == "n" } then { set cmd "global $var; set $var 0" }
  183. if { $value == "m" } then { set cmd "global $var; set $var 2" }
  184. eval $cmd
  185. }
  186. if [regexp {# ([0-9A-Za-z_]+) is not set} $line foo var] {
  187. set cmd "global $var; set $var 0"
  188. eval $cmd
  189. }
  190. if [regexp {([0-9A-Za-z_]+)=([0-9A-Fa-f]+)} $line foo var value] {
  191. set cmd "global $var; set $var $value"
  192. eval $cmd
  193. }
  194. if [regexp {([0-9A-Za-z_]+)="([^"]*)"} $line foo var value] {
  195. set cmd "global $var; set $var "$value""
  196. eval $cmd
  197. }
  198. }
  199. close $file1
  200. update_choices
  201. update_mainmenu
  202. }
  203. proc write_comment { file1 file2 text } {
  204.      puts $file1 ""
  205. puts $file1 "#"
  206. puts $file1 "# $text"
  207. puts $file1 "#"
  208. puts $file2 "/*"
  209. puts $file2 " * $text"
  210. puts $file2 " */"
  211. }
  212. proc effective_dep { deplist } {
  213. global CONFIG_MODULES
  214. set depend 1
  215. foreach i $deplist {
  216. if {$i == 0} then {set depend 0}
  217. if {$i == 2 && $depend == 1} then {set depend 2}
  218. }
  219. if {$depend == 2 && $CONFIG_MODULES == 0} then {set depend 0}
  220. return $depend
  221. }
  222. proc sync_tristate { var dep } {
  223. global CONFIG_MODULES
  224. if {$dep == 0 && ($var == 1 || $var == 2)} then {
  225. set var 0
  226. } elseif {$dep == 2 && $var == 1} then {
  227. set var 2
  228. } elseif {$var == 2 && $CONFIG_MODULES == 0} then {
  229. if {$dep == 1} then {set var 1} else {set var 0}
  230. }
  231. return $var
  232. }
  233. proc sync_bool { var dep modset } {
  234. set var [sync_tristate $var $dep]
  235. if {$dep == 2 && $var == 2} then {
  236. set var $modset
  237. }
  238. return $var
  239. }
  240. proc write_tristate { file1 file2 varname variable deplist modset } {
  241. set variable [sync_tristate $variable [effective_dep $deplist]]
  242. if { $variable == 2 } 
  243. then { set variable $modset }
  244. if { $variable == 1 } 
  245. then { puts $file1 "$varname=y"; 
  246.        puts $file2 "#define $varname 1" } 
  247. elseif { $variable == 2 } 
  248. then { puts $file1 "$varname=m"; 
  249.        puts $file2 "#undef  $varname"; 
  250.        puts $file2 "#define ${varname}_MODULE 1" } 
  251. elseif { $variable == 0 } 
  252. then { puts $file1 "# $varname is not set"; 
  253.        puts $file2 "#undef  $varname"} 
  254. else { 
  255.     puts stdout "ERROR - Attempting to write value for unconfigured variable ($varname)." 
  256. }
  257. }
  258. proc write_int { file1 file2 varname variable dep } {
  259. if { $dep == 0 } 
  260. then { puts $file1 "# $varname is not set"; 
  261.        puts $file2 "#undef  $varname"} 
  262. else {
  263. puts $file1 "$varname=$variable"; 
  264. puts $file2 "#define $varname ($variable)"; 
  265. }
  266. }
  267. proc write_hex { file1 file2 varname variable dep } {
  268. if { $dep == 0 } 
  269. then { puts $file1 "# $varname is not set"; 
  270.        puts $file2 "#undef  $varname"} 
  271. else {
  272. puts $file1 "$varname=$variable"; 
  273. puts -nonewline $file2 "#define $varname 0x"; 
  274. puts $file2 [exec echo $variable | sed s/^0[xX]//]; 
  275. }
  276. }
  277. proc write_string { file1 file2 varname variable dep } {
  278. if { $dep == 0 } 
  279. then { puts $file1 "# $varname is not set"; 
  280.        puts $file2 "#undef  $varname"} 
  281. else {
  282. puts $file1 "$varname="$variable""; 
  283. puts $file2 "#define $varname "$variable""; 
  284. }
  285. }
  286. proc option_name {w mnum line text helpidx} {
  287. button $w.x$line.l -text "$text" -relief groove -anchor w
  288. $w.x$line.l configure -activefore [cget $w.x$line.l -fg] 
  289. -activeback [cget $w.x$line.l -bg]
  290. button $w.x$line.help -text "Help" -relief raised 
  291. -command "dohelp .dohelp $helpidx .menu$mnum"
  292. pack $w.x$line.help -side right -fill y
  293. pack $w.x$line.l -side right -fill both -expand on
  294. }
  295. proc toggle_switch2 {w mnum line text variable} {
  296. frame $w.x$line -relief sunken
  297. radiobutton $w.x$line.y -text "y" -variable $variable -value 1 
  298. -relief groove -width 2 -command "update_active"
  299. radiobutton $w.x$line.m -text "-"  -variable $variable -value 2 
  300. -relief groove -width 2 -command "update_active"
  301. radiobutton $w.x$line.n -text "n"  -variable $variable -value 0 
  302. -relief groove -width 2 -command "update_active"
  303. option_name $w $mnum $line $text $variable
  304. pack $w.x$line.n $w.x$line.m $w.x$line.y -side right -fill y
  305. }
  306. proc toggle_switch3 {w mnum line text variable} {
  307. frame $w.x$line -relief sunken
  308. radiobutton $w.x$line.y -text "y" -variable $variable -value 1 
  309. -relief groove -width 2 -command "update_active"
  310. radiobutton $w.x$line.m -text "m"  -variable $variable -value 2 
  311. -relief groove -width 2 -command "update_active"
  312. radiobutton $w.x$line.n -text "n"  -variable $variable -value 0 
  313. -relief groove -width 2 -command "update_active"
  314. option_name $w $mnum $line $text $variable
  315. global CONFIG_MODULES
  316. if {($CONFIG_MODULES == 0)} then {
  317. $w.x$line.m configure -state disabled
  318. }
  319. pack $w.x$line.n $w.x$line.m $w.x$line.y -side right -fill y
  320. }
  321. proc bool {w mnum line text variable} {
  322. toggle_switch2 $w $mnum $line $text $variable
  323. $w.x$line.m configure -state disabled
  324. pack $w.x$line -anchor w -fill both -expand on
  325. }
  326. proc tristate {w mnum line text variable } {
  327. toggle_switch3 $w $mnum $line $text $variable
  328. pack $w.x$line -anchor w -fill both -expand on
  329. }
  330. proc dep_tristate {w mnum line text variable } {
  331. tristate $w $mnum $line $text $variable
  332. }
  333. proc dep_bool {w mnum line text variable } {
  334. bool $w $mnum $line $text $variable
  335. }
  336. proc int { w mnum line text variable } {
  337. frame $w.x$line
  338. entry $w.x$line.x -width 18 -relief sunken -borderwidth 2 
  339. -textvariable $variable
  340. option_name $w $mnum $line $text $variable
  341. pack $w.x$line.x -anchor w -side right -fill y
  342. pack $w.x$line -anchor w -fill both -expand on
  343. }
  344. proc hex { w mnum line text variable } {
  345. int $w $mnum $line $text $variable
  346. }
  347. proc istring { w mnum line text variable } {
  348. frame $w.x$line
  349. entry $w.x$line.x -width 18 -relief sunken -borderwidth 2 
  350. -textvariable $variable
  351. option_name $w $mnum $line $text $variable
  352. pack $w.x$line.x -anchor w -side right -fill y
  353. pack $w.x$line -anchor w -fill both -expand on
  354. }
  355. proc minimenu { w mnum line text variable helpidx } {
  356. frame $w.x$line
  357. menubutton $w.x$line.x -textvariable $variable -menu 
  358. $w.x$line.x.menu -relief raised 
  359. -anchor w
  360. option_name $w $mnum $line $text $helpidx
  361. pack $w.x$line.x -anchor w -side right -fill y
  362. pack $w.x$line -anchor w -fill both -expand on
  363. }
  364. proc menusplit {w m n} {
  365. if { $n > 2 } then {
  366. update idletasks
  367. set menuoptsize [expr [$m yposition 2] - [$m yposition 1]]   
  368. set maxsize [winfo screenheight $w]
  369. set splitpoint [expr $maxsize * 4 / 5 / $menuoptsize - 1]
  370. for {set i [expr $splitpoint + 1]} {$i <= $n} {incr i $splitpoint} {
  371. $m entryconfigure $i -columnbreak 1
  372. }
  373. }
  374. }
  375. proc menutitle {text menu w} {
  376. wm title $w "$text"
  377. }
  378. proc submenu { w mnum line text subnum } {
  379. frame $w.x$line
  380. button $w.x$line.l -text "" -width 15 -relief groove
  381. $w.x$line.l configure -activefore [cget $w.x$line.l -fg] 
  382. -activeback [cget $w.x$line.l -bg] -state disabled
  383. button $w.x$line.m -text "$text" -relief raised -anchor w 
  384. -command "catch {destroy .menu$subnum}; menu$subnum .menu$subnum "$text""
  385. pack $w.x$line.l -side left -fill both
  386. pack $w.x$line.m -anchor w -side right -fill both -expand on
  387. pack $w.x$line -anchor w -fill both -expand on
  388. }
  389. proc comment {w mnum line text } {
  390. frame $w.x$line
  391. button $w.x$line.l -text "" -width 15 -relief groove
  392. $w.x$line.l configure -activefore [cget $w.x$line.l -fg] 
  393. -activeback [cget $w.x$line.l -bg] -state disabled
  394. button $w.x$line.m -text "$text" -relief groove -anchor w
  395. $w.x$line.m configure -activefore [cget $w.x$line.m -fg] 
  396. -activeback [cget $w.x$line.m -bg]
  397. pack $w.x$line.l -side left -fill both
  398. pack $w.x$line.m -anchor w -side right -fill both -expand on
  399. pack $w.x$line -anchor w -fill both -expand on
  400. }
  401. proc dohelp {w var parent}  {
  402. catch {destroy $w}
  403. toplevel $w -class Dialog
  404. set filefound 0
  405. set found 0
  406. set lineno 0
  407. if { [file readable Documentation/Configure.help] == 1} then {
  408. set filefound 1
  409. # First escape sed regexp special characters in var:
  410. set var [exec echo "$var" | sed s/[][/.^$*]/\\&/g]
  411. # Now pick out right help text:
  412. set message [exec sed -n "
  413. /^$var[  ]*$/,${
  414. /^$var[  ]*$/c\
  415. ${var}:\
  416. /^#/b
  417. /^[^  ]/q
  418. s/^  //
  419. /<file:\([^>]*\)>/s//\1/g
  420. p
  421. }
  422. " Documentation/Configure.help]
  423. set found [expr [string length "$message"] > 0]
  424. }
  425. frame $w.f1
  426. pack $w.f1 -fill both -expand on
  427. # Do the OK button
  428. #
  429. set oldFocus [focus]
  430. frame $w.f2
  431. button $w.f2.ok -text "OK" 
  432. -width 10 -command "destroy $w; catch {focus $oldFocus}"
  433. pack $w.f2.ok -side bottom -pady 6 -anchor n
  434. pack $w.f2 -side bottom -padx 10 -anchor s
  435. scrollbar $w.f1.vscroll -command "$w.f1.canvas yview"
  436. pack $w.f1.vscroll -side right -fill y
  437. canvas $w.f1.canvas -relief flat -borderwidth 0 
  438. -yscrollcommand "$w.f1.vscroll set"
  439. frame $w.f1.f
  440. pack $w.f1.canvas -side right -fill y -expand on
  441. if { $found == 0 } then {
  442. if { $filefound == 0 } then {
  443. message $w.f1.f.m -width 750 -aspect 300 -relief flat -text 
  444. "No help available - unable to open file Documentation/Configure.help.  This file should have come with your kernel."
  445. } else {
  446. message $w.f1.f.m -width 400 -aspect 300 -relief flat -text 
  447. "No help available for $var"
  448. }
  449. label $w.f1.bm -bitmap error
  450. wm title $w "RTFM"
  451. } else {
  452. text $w.f1.f.m -width 73 -relief flat -wrap word
  453. $w.f1.f.m insert 0.0 $message
  454. $w.f1.f.m conf -state disabled -height [$w.f1.f.m index end]
  455. label $w.f1.bm -bitmap info
  456. wm title $w "Configuration help" 
  457. }
  458. pack $w.f1.f.m -side left
  459. pack $w.f1.bm $w.f1.f -side left -padx 10
  460. focus $w
  461. set winx [expr [winfo x $parent]+20]
  462. set winy [expr [winfo y $parent]+20]
  463. wm geometry $w +$winx+$winy
  464. set sizok [expr [winfo reqheight $w.f2.ok] + 12]
  465. set maxy [expr [winfo screenheight .] * 3 / 4]
  466. set canvtotal [winfo reqheight $w.f1.f.m]
  467. if [expr $sizok + $canvtotal < $maxy] {
  468. set sizy $canvtotal
  469. } else {
  470. set sizy [expr $maxy - $sizok]
  471. }
  472. $w.f1.canvas configure -height $sizy -width [winfo reqwidth $w.f1.f.m] 
  473. -scrollregion "0 0 [winfo reqwidth $w.f1.f.m] 
  474. [winfo reqheight $w.f1.f.m]"
  475. $w.f1.canvas create window 0 0 -anchor nw -window $w.f1.f
  476. update idletasks
  477. set maxy [winfo screenheight .]
  478. if [expr $sizok + $canvtotal < $maxy] {
  479. set sizy [expr $sizok + $canvtotal]
  480. } else {
  481. set sizy $maxy
  482. }
  483. wm maxsize $w [winfo width $w] $sizy
  484. }
  485. bind all <Alt-s> { catch {exec cp -f .config .config.old}; 
  486. writeconfig .config include/linux/autoconf.h; wrapup .wrap }
  487. proc wrapup {w }  {
  488. catch {destroy $w}
  489. toplevel $w -class Dialog
  490. global CONFIG_MODVERSIONS; vfix CONFIG_MODVERSIONS
  491. if { ([file exists .hdepend] != 1) || ($CONFIG_MODVERSIONS == 1) } then {
  492.     message $w.m -width 400 -aspect 300 -relief raised -text 
  493. "End of Linux kernel configuration.  Check the top-level Makefile for additional configuration.  Next, you must run 'make dep'."
  494. } else {
  495.     message $w.m -width 400 -aspect 300 -relief raised -text 
  496. "End of Linux kernel configuration.  Check the top-level Makefile for additional configuration.  Next, you may 'make bzImage', 'make bzdisk', or 'make bzlilo.'"
  497. }
  498. label $w.bm -bitmap info
  499. pack $w.bm $w.m -pady 10 -side top -padx 10
  500. wm title $w "Kernel build instructions" 
  501. set oldFocus [focus]
  502. frame $w.f
  503. button $w.f.back -text "OK" 
  504. -width 10 -command "exit"
  505. pack $w.f.back -side bottom -pady 10 -anchor s
  506. pack $w.f -pady 10 -side top -padx 10 -anchor s
  507. focus $w
  508.         bind $w <Return> "exit"
  509. global winx; global winy
  510. set winx [expr [winfo x .]+30]; set winy [expr [winfo y .]+30]
  511. wm geometry $w +$winx+$winy
  512. }
  513. proc unregister_active {num} {
  514. global active_menus
  515. set index [lsearch -exact $active_menus $num]
  516. if {$index != -1} then {set active_menus [lreplace $active_menus $index $index]}
  517. }
  518. proc update_active {} {
  519. global active_menus total_menus
  520. set max 0
  521. if {[llength $active_menus] > 0} then {
  522. set max [lindex $active_menus end]
  523. update_define [toplevel_menu [lindex $active_menus 0]] $max 0
  524. }
  525. foreach i $active_menus {
  526. if {[winfo exists .menu$i] == 0} then {
  527. unregister_active $i
  528. } else {
  529. update_menu$i
  530. }
  531. }
  532. update_define [expr $max + 1] $total_menus 1
  533. update_mainmenu
  534. }
  535. proc configure_entry {w option items} {
  536. foreach i $items {
  537. $w.$i configure -state $option
  538. }
  539. }
  540. proc validate_int {name val default} {
  541. if {([exec echo $val | sed s/^-//g | tr -d [:digit:] ] != "")} then {
  542. global $name; set $name $default
  543. }
  544. }
  545. proc validate_hex {name val default} {
  546. if {([exec echo $val | tr -d [:xdigit:] ] != "")} then {
  547. global $name; set $name $default
  548. }
  549. }
  550. proc update_define {first last allow_update} {
  551. for {set i $first} {$i <= $last} {incr i} {
  552. update_define_menu$i
  553. if {$allow_update == 1} then update
  554. }
  555. }
  556. #
  557. # Next set up the particulars for the top level menu, and define a few
  558. # buttons which we will stick down at the bottom.
  559. #
  560. frame .f0 
  561. frame .f0.left
  562. frame .f0.middle
  563. frame .f0.right
  564. set active_menus [list]
  565. set processed_top_level 0