gitk: Fix various bugs in the view support

- don't re-read refs when switching views, it's too slow; just do
  it if the user did File->Update
- make the view menu use the uifont
- if we have a graph line selected, unselect it before changing the view
- if a row is selected and appears in the new view, but we have to
  read in the new view, select that row when we come across it
- if no row was previously selected, or if we don't find the previously
  selected row in the new view, select the first row

Signed-off-by: Paul Mackerras <paulus@samba.org>
diff --git a/gitk b/gitk
index cfd0a3a..093213f 100755
--- a/gitk
+++ b/gitk
@@ -223,6 +223,7 @@
     set curview -1
     catch {unset viewdata($n)}
     parse_args $revtreeargs
+    readrefs
     showview $n
 }
 
@@ -351,7 +352,8 @@
 }
 
 proc makewindow {} {
-    global canv canv2 canv3 linespc charspc ctext cflist textfont mainfont uifont
+    global canv canv2 canv3 linespc charspc ctext cflist
+    global textfont mainfont uifont
     global findtype findtypemenu findloc findstring fstring geometry
     global entries sha1entry sha1string sha1but
     global maincursor textcursor curtextcursor
@@ -369,7 +371,7 @@
     .bar add cascade -label "Edit" -menu .bar.edit
     .bar.edit add command -label "Preferences" -command doprefs
     .bar.edit configure -font $uifont
-    menu .bar.view
+    menu .bar.view -font $uifont
     .bar add cascade -label "View" -menu .bar.view
     .bar.view add command -label "New view..." -command newview
     .bar.view add command -label "Delete view" -command delview -state disabled
@@ -907,6 +909,7 @@
 	}
     }
     unselectline
+    normalline
     stopfindproc
     if {$curview >= 0 && $phase eq {} && ![info exists viewdata($curview)]} {
 	set viewdata($curview) \
@@ -916,7 +919,6 @@
     catch {unset matchinglines}
     catch {unset treediffs}
     clear_display
-    readrefs
 
     set curview $n
     .bar.view entryconf 2 -state [expr {$n == 0? "disabled": "normal"}]
@@ -1159,7 +1161,7 @@
 }
 
 proc showstuff {canshow} {
-    global numcommits commitrow pending_select
+    global numcommits commitrow pending_select selectedline
     global linesegends idrowranges idrangedrawn
 
     if {$numcommits == 0} {
@@ -1201,6 +1203,9 @@
 	$commitrow($pending_select) < $numcommits} {
 	selectline $commitrow($pending_select) 1
     }
+    if {![info exists selectedline] && ![info exists pending_select]} {
+	selectline 0 1
+    }
 }
 
 proc layoutrows {row endrow last} {
@@ -1989,7 +1994,7 @@
 proc finishcommits {} {
     global commitidx phase
     global canv mainfont ctext maincursor textcursor
-    global findinprogress
+    global findinprogress pending_select
 
     if {$commitidx > 0} {
 	drawrest
@@ -2003,6 +2008,7 @@
 	settextcursor $textcursor
     }
     set phase {}
+    catch {unset pending_select}
 }
 
 # Don't change the text pane cursor if it is currently the hand cursor,
@@ -2021,12 +2027,16 @@
     global startmsecs
     global canvy0 numcommits linespc
     global rowlaidout commitidx
+    global pending_select
 
     set row $rowlaidout
     layoutrows $rowlaidout $commitidx 1
     layouttail
     optimize_rows $row 0 $commitidx
     showstuff $commitidx
+    if {[info exists pending_select]} {
+	selectline 0 1
+    }
 
     set drawmsecs [expr {[clock clicks -milliseconds] - $startmsecs}]
     #puts "overall $drawmsecs ms for $numcommits commits"