gitk: Keep the same commits visible as other commits come in
[gitweb.git] / gitk
diff --git a/gitk b/gitk
index 5022fac83c5c14ae7d27f601dc3e054deb93144b..aadc18db92e8a5f02d65bf0b332a73c5755decea 100755 (executable)
--- a/gitk
+++ b/gitk
@@ -734,9 +734,6 @@ proc rowofcommit {id} {
     global varcid varccommits varcrow curview cached_commitrow
     global varctok vtokmod
 
-    if {[info exists cached_commitrow($id)]} {
-       return $cached_commitrow($id)
-    }
     set v $curview
     if {![info exists varcid($v,$id)]} {
        puts "oops rowofcommit no arc for [shortids $id]"
@@ -746,6 +743,9 @@ proc rowofcommit {id} {
     if {[string compare [lindex $varctok($v) $a] $vtokmod($v)] >= 0} {
        update_arcrows $v
     }
+    if {[info exists cached_commitrow($id)]} {
+       return $cached_commitrow($id)
+    }
     set i [lsearch -exact $varccommits($v,$a) $id]
     if {$i < 0} {
        puts "oops didn't find commit [shortids $id] in arc $a"
@@ -1299,7 +1299,7 @@ proc confirm_popup msg {
 }
 
 proc makewindow {} {
-    global canv canv2 canv3 linespc charspc ctext cflist
+    global canv canv2 canv3 linespc charspc ctext cflist cscroll
     global tabstop
     global findtype findtypemenu findloc findstring fstring geometry
     global entries sha1entry sha1string sha1but
@@ -1774,7 +1774,7 @@ proc canvscan {op w x y} {
 
 proc scrollcanv {cscroll f0 f1} {
     $cscroll set $f0 $f1
-    drawfrac $f0 $f1
+    drawvisible
     flushhighlights
 }
 
@@ -4538,23 +4538,52 @@ proc undolayout {row} {
     }
 }
 
-proc drawfrac {f0 f1} {
-    global canv linespc
+proc drawvisible {} {
+    global canv linespc curview vrowmod selectedline targetrow targetid
+    global need_redisplay cscroll
 
+    set fs [$canv yview]
     set ymax [lindex [$canv cget -scrollregion] 3]
     if {$ymax eq {} || $ymax == 0} return
+    set f0 [lindex $fs 0]
+    set f1 [lindex $fs 1]
     set y0 [expr {int($f0 * $ymax)}]
-    set row [expr {int(($y0 - 3) / $linespc) - 1}]
     set y1 [expr {int($f1 * $ymax)}]
+
+    if {[info exists targetid]} {
+       set r [rowofcommit $targetid]
+       if {$r != $targetrow} {
+           # Fix up the scrollregion and change the scrolling position
+           # now that our target row has moved.
+           set diff [expr {($r - $targetrow) * $linespc}]
+           set targetrow $r
+           setcanvscroll
+           set ymax [lindex [$canv cget -scrollregion] 3]
+           incr y0 $diff
+           incr y1 $diff
+           set f0 [expr {$y0 / $ymax}]
+           set f1 [expr {$y1 / $ymax}]
+           allcanvs yview moveto $f0
+           $cscroll set $f0 $f1
+           set need_redisplay 1
+       }
+    }
+
+    set row [expr {int(($y0 - 3) / $linespc) - 1}]
     set endrow [expr {int(($y1 - 3) / $linespc) + 1}]
+    if {$endrow >= $vrowmod($curview)} {
+       update_arcrows $curview
+    }
+    if {[info exists selectedline] &&
+       $row <= $selectedline && $selectedline <= $endrow} {
+       set targetrow $selectedline
+    } else {
+       set targetrow [expr {int(($row + $endrow) / 2)}]
+    }
+    set targetid [commitonrow $targetrow]
     drawcommits $row $endrow
 }
 
-proc drawvisible {} {
-    global canv
-    eval drawfrac [$canv yview]
-}
-
 proc clear_display {} {
     global iddrawn linesegs need_redisplay nrows_drawn
     global vhighlights fhighlights nhighlights rhighlights