gitk: Make downward-pointing arrows end in vertical line segment

It seems Tk 8.4 can't draw arrows on diagonal line segments.  This
adds code to the optimizer to make the last bit of a line go vertically
before being terminated with an arrow pointing downwards, so that
it will be drawn correctly by Tk 8.4.

Signed-off-by: Paul Mackerras <paulus@samba.org>
diff --git a/gitk b/gitk
index 34f55bc..69d67ee 100755
--- a/gitk
+++ b/gitk
@@ -952,8 +952,9 @@
 			set offs [lreplace $offs $x $x]
 			set offs [incrange $offs $x 1]
 			set idinlist($i) 0
-			lappend linesegends($row) $i
-			lappend idrowranges($i) [expr {$row-1}]
+			set rm1 [expr {$row - 1}]
+			lappend linesegends($rm1) $i
+			lappend idrowranges($i) $rm1
 			if {[incr nev -1] <= 0} break
 			continue
 		    }
@@ -982,7 +983,6 @@
 	    unset idinlist($id)
 	}
 	if {[info exists idrowranges($id)]} {
-	    lappend linesegends($row) $id
 	    lappend idrowranges($id) $row
 	}
 	incr row
@@ -1038,7 +1038,7 @@
 
 proc layouttail {} {
     global rowidlist rowoffsets idinlist commitidx
-    global idrowranges linesegends
+    global idrowranges
 
     set row $commitidx
     set idlist [lindex $rowidlist $row]
@@ -1047,7 +1047,6 @@
 	set id [lindex $idlist $col]
 	addextraid $id $row
 	unset idinlist($id)
-	lappend linesegends($row) $id
 	lappend idrowranges($id) $row
 	incr row
 	set offs [ntimes $col 0]
@@ -1061,7 +1060,6 @@
 	lset rowidlist $row [list $id]
 	lset rowoffsets $row 0
 	makeuparrow $id 0 $row 0
-	lappend linesegends($row) $id
 	lappend idrowranges($id) $row
 	incr row
 	lappend rowidlist {}
@@ -1079,12 +1077,23 @@
 }
 
 proc optimize_rows {row col endrow} {
-    global rowidlist rowoffsets idrowranges
+    global rowidlist rowoffsets idrowranges linesegends displayorder
 
     for {} {$row < $endrow} {incr row} {
 	set idlist [lindex $rowidlist $row]
 	set offs [lindex $rowoffsets $row]
 	set haspad 0
+	set downarrowcols {}
+	if {[info exists linesegends($row)]} {
+	    set downarrowcols $linesegends($row)
+	    if {$col > 0} {
+		while {$downarrowcols ne {}} {
+		    set i [lsearch -exact $idlist [lindex $downarrowcols 0]]
+		    if {$i < 0 || $i >= $col} break
+		    set downarrowcols [lrange $downarrowcols 1 end]
+		}
+	    }
+	}
 	for {} {$col < [llength $offs]} {incr col} {
 	    if {[lindex $idlist $col] eq {}} {
 		set haspad 1
@@ -1102,6 +1111,10 @@
 		    $y0 > [lindex $idrowranges($id) 0]} {
 		    set isarrow 1
 		}
+	    } elseif {$downarrowcols ne {} &&
+		      [lindex $idlist $col] eq [lindex $downarrowcols 0]} {
+		set downarrowcols [lrange $downarrowcols 1 end]
+		set isarrow 1
 	    }
 	    if {$z < -1 || ($z < 0 && $isarrow)} {
 		set npad [expr {-1 - $z + $isarrow}]
@@ -1660,7 +1673,7 @@
     showstuff $commitidx
 
     set drawmsecs [expr {[clock clicks -milliseconds] - $startmsecs}]
-    puts "overall $drawmsecs ms for $numcommits commits"
+    #puts "overall $drawmsecs ms for $numcommits commits"
 }
 
 proc findmatches {f} {