--- tkman-2.2.orig/prefs.tcl
+++ tkman-2.2/prefs.tcl
@@ -4,6 +4,38 @@
 #
 #--------------------------------------------------
 
+# See http://wiki.tcl.tk/17387
+proc tk_optionCascade2 {path varName value args} {
+    upvar #0 $varName v
+    if {![info exists v]} {
+	set v $value
+    }
+    set m [tk_optionMenu $path $varName $v]
+    tk_optionCascade2_menu $m $varName [linsert $args 0 $value]
+    return $m
+}
+
+proc tk_optionCascade2_menu {m varName argl} {
+    $m delete 0 end
+    set next [menu $m.n -tearoff 0]
+    $m add cascade -label "More" -menu $next
+    set index 0
+    set len [llength $argl]
+    set height [winfo screenheight $m]
+    foreach arg $argl {
+	$m insert $index radiobutton -label $arg -variable $varName
+	incr index
+	update idletasks
+	if {[winfo reqheight $m] > $height && $index < $len} {
+	    incr index -1
+	    $m delete $index
+	    tk_optionCascade2_menu $next $varName [lrange $argl $index end]
+	    return
+	}
+    }
+    $m delete end
+}
+
 proc manPreferencesMake {{w0 ""}} {
 	global prefedit manx man bozo
 # don't do global man here
@@ -44,7 +76,7 @@
 		pack $f.l -side left -fill x
 		pack $f.style -side right -padx 2
 		if {![string match diff* $var]} {
-			[eval tk_optionMenu $f.family prefedit($var-family) $manx(fontfamilies)] configure -tearoff no
+			[eval tk_optionCascade2 $f.family prefedit($var-family) $manx(fontfamilies)] configure -tearoff no
 			[eval tk_optionMenu $f.points prefedit($var-points) $manx(sizes)] configure -tearoff no
 			pack $f.points $f.family -after $f.style -side right -padx 2
 
