aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Mackerras <paulus@samba.org>2008-03-03 10:11:08 +1100
committerPaul Mackerras <paulus@samba.org>2008-03-03 10:11:08 +1100
commitac1276ab6eaae8e10e409263370dca21b8772359 (patch)
tree957cf207331285566b33ef59881b506e305bdcb3
parentf806f0fba8ce62f2c74f21419e2bd1e7ce9e565b (diff)
downloadgit-ac1276ab6eaae8e10e409263370dca21b8772359.tar.gz
git-ac1276ab6eaae8e10e409263370dca21b8772359.tar.xz
gitk: Fix problems with target row stuff
Occasionally the target row stuff would scroll the display to some uninteresting commit while reading. There were two problems: one was that drawvisible would set targetrow even if there was no target previously and no row selected, and the other was that it was possible for the target row to get pushed down past numcommits, if drawvisible was called after rows were added but before layoutmore got run. The first problem is fixed by just not setting targetrow/id unless there is a selected row or they were set previously. The second problem is fixed by updating numcommits immediately new rows are added. This leads to a simplification of layoutmore and chewcommits but also means that some of the things that were done in layoutmore now need to be done elsewhere, since layoutmore can no longer use numcommits to know how much it has seen previously. Hence the changes to getcommits, initlayout and setcanvscroll. Signed-off-by: Paul Mackerras <paulus@samba.org>
-rwxr-xr-xgitk105
1 files changed, 51 insertions, 54 deletions
diff --git a/gitk b/gitk
index 5925ced55..47e1a58d6 100755
--- a/gitk
+++ b/gitk
@@ -161,11 +161,12 @@ proc stop_rev_list {view} {
}
proc getcommits {} {
- global canv curview
+ global canv curview need_redisplay
initlayout
start_rev_list $curview
show_status [mc "Reading commits..."]
+ set need_redisplay 1
}
proc updatecommits {} {
@@ -1048,7 +1049,7 @@ proc getcommitlines {fd inst view updating} {
adjustprogress
}
if {$view == $curview} {
- run chewcommits $view
+ run chewcommits
}
return 0
}
@@ -1183,7 +1184,16 @@ proc getcommitlines {fd inst view updating} {
set gotsome 1
}
if {$gotsome} {
- run chewcommits $view
+ global numcommits hlview
+
+ if {$view == $curview} {
+ set numcommits $commitidx($view)
+ run chewcommits
+ }
+ if {[info exists hlview] && $view == $hlview} {
+ # we never actually get here...
+ run vhighlightmore
+ }
foreach s $scripts {
eval $s
}
@@ -1218,33 +1228,28 @@ proc getcommitlines {fd inst view updating} {
return 2
}
-proc chewcommits {view} {
+proc chewcommits {} {
global curview hlview viewcomplete
global pending_select
- if {$view == $curview} {
- layoutmore
- if {$viewcomplete($view)} {
- global commitidx varctok
- global numcommits startmsecs
- global mainheadid commitinfo nullid
-
- if {[info exists pending_select]} {
- set row [first_real_row]
- selectline $row 1
- }
- if {$commitidx($curview) > 0} {
- #set ms [expr {[clock clicks -milliseconds] - $startmsecs}]
- #puts "overall $ms ms for $numcommits commits"
- #puts "[llength $varctok($view)] arcs, $commitidx($view) commits"
- } else {
- show_status [mc "No commits selected"]
- }
- notbusy layout
+ layoutmore
+ if {$viewcomplete($curview)} {
+ global commitidx varctok
+ global numcommits startmsecs
+ global mainheadid commitinfo nullid
+
+ if {[info exists pending_select]} {
+ set row [first_real_row]
+ selectline $row 1
}
- }
- if {[info exists hlview] && $view == $hlview} {
- vhighlightmore
+ if {$commitidx($curview) > 0} {
+ #set ms [expr {[clock clicks -milliseconds] - $startmsecs}]
+ #puts "overall $ms ms for $numcommits commits"
+ #puts "[llength $varctok($view)] arcs, $commitidx($view) commits"
+ } else {
+ show_status [mc "No commits selected"]
+ }
+ notbusy layout
}
return 0
}
@@ -3064,6 +3069,7 @@ proc vhighlightmore {} {
}
}
set vhl_done $max
+ return 0
}
proc askvhighlight {row id} {
@@ -3562,15 +3568,19 @@ proc initlayout {} {
set canvxmax [$canv cget -width]
catch {unset colormap}
catch {unset rowtextx}
+ setcanvscroll
}
proc setcanvscroll {} {
global canv canv2 canv3 numcommits linespc canvxmax canvy0
+ global lastscrollset lastscrollrows
set ymax [expr {$canvy0 + ($numcommits - 0.5) * $linespc + 2}]
$canv conf -scrollregion [list 0 0 $canvxmax $ymax]
$canv2 conf -scrollregion [list 0 0 0 $ymax]
$canv3 conf -scrollregion [list 0 0 0 $ymax]
+ set lastscrollset [clock clicks -milliseconds]
+ set lastscrollrows $numcommits
}
proc visiblerows {} {
@@ -3595,33 +3605,17 @@ proc visiblerows {} {
proc layoutmore {} {
global commitidx viewcomplete curview
global numcommits pending_select selectedline curview
- global lastscrollset commitinterest
-
- set canshow $commitidx($curview)
- if {$canshow <= $numcommits && !$viewcomplete($curview)} return
- if {$numcommits == 0} {
- allcanvs delete all
- }
- set r0 $numcommits
- set prev $numcommits
- set numcommits $canshow
- set t [clock clicks -milliseconds]
- if {$prev < 100 || $viewcomplete($curview) || $t - $lastscrollset > 500} {
- set lastscrollset $t
+ global lastscrollset lastscrollrows commitinterest
+
+ if {$lastscrollrows < 100 || $viewcomplete($curview) ||
+ [clock clicks -milliseconds] - $lastscrollset > 500} {
setcanvscroll
}
- set rows [visiblerows]
- set r1 [lindex $rows 1]
- if {$r1 >= $canshow} {
- set r1 [expr {$canshow - 1}]
- }
- if {$r0 <= $r1} {
- drawcommits $r0 $r1
- }
if {[info exists pending_select] &&
[commitinview $pending_select $curview]} {
selectline [rowofcommit $pending_select] 1
}
+ drawvisible
}
proc doshowlocalchanges {} {
@@ -4714,13 +4708,15 @@ proc drawvisible {} {
if {[info exists selectedline] &&
$row <= $selectedline && $selectedline <= $endrow} {
set targetrow $selectedline
- } else {
+ } elseif {[info exists targetid]} {
set targetrow [expr {int(($row + $endrow) / 2)}]
}
- if {$targetrow >= $numcommits} {
- set targetrow [expr {$numcommits - 1}]
+ if {[info exists targetrow]} {
+ if {$targetrow >= $numcommits} {
+ set targetrow [expr {$numcommits - 1}]
+ }
+ set targetid [commitonrow $targetrow]
}
- set targetid [commitonrow $targetrow]
drawcommits $row $endrow
}
@@ -5459,6 +5455,10 @@ proc selectline {l isnew} {
unsel_reflist
stopfinding
if {$l < 0 || $l >= $numcommits} return
+ set id [commitonrow $l]
+ set targetid $id
+ set targetrow $l
+
set y [expr {$canvy0 + $l * $linespc}]
set ymax [lindex [$canv cget -scrollregion] 3]
set ytop [expr {$y - $linespc - 1}]
@@ -5497,15 +5497,12 @@ proc selectline {l isnew} {
make_secsel $l
- set id [commitonrow $l]
if {$isnew} {
addtohistory [list selbyid $id]
}
set selectedline $l
set currentid $id
- set targetid $id
- set targetrow $l
$sha1entry delete 0 end
$sha1entry insert 0 $id
$sha1entry selection from 0